|
一个51单片机做的停车位管理系统,是用红外来实现探测的,下面是仿真原理图:
停车位管理系统的所有资料下载(包含proteus仿真和单片机源代码):
停车位管理系统.rar
(234.44 KB, 下载次数: 263)
源程序:
- /********************************************************************************
- * 描述: *
- * lcd1602显示 P0口 *
- * 按键 个位P32 十位P33 *
- * 红外光对管 int1.....int4 接 P10...P13 *
- * 有空位 LED-B 接 P14 *
- * 无空位 LED-R 接 P15 *
- * *
- ********************************************************************************/
- #include <reg51.h>
- #include <intrins.h>
- #include <stdio.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
- sbit int1 = P2^4;
- sbit int2 = P2^5;
- sbit int3 = P2^6;
- sbit int4 = P2^7;
- sbit LEDB = P1^4;
- sbit LEDR = P1^5;
- sbit KEYG = P3^2;
- sbit KEYS = P3^3;
- sbit KEYB = P3^5;
- sbit CLC = P3^4;
- sbit HY = P3^6;
- sbit LCD_RS = P2^0;
- sbit LCD_RW = P2^1;
- sbit LCD_EN = P2^2;
- uchar code cdis1[ ] = {" Welcome "};
- uchar code cdis2[ ] = {"Place vacant:---"};
- /*********************************************************/
- void delay1(int ms)
- {
- unsigned char y;
- while(ms--)
- {
- for(y = 0; y<250; y++)
- {
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- }
- }
- /*******************************************************************/
- /* */
- /*检查LCD忙状态 */
- /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */
- /* */
- /*******************************************************************/
- bit lcd_busy()
- {
- bit result;
- LCD_RS = 0;
- LCD_RW = 1;
- LCD_EN = 1;
- delayNOP();
- result = (bit)(P0&0x80);
- LCD_EN = 0;
- return(result);
- }
- /*******************************************************************/
- /* */
- /*写指令数据到LCD */
- /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
- /* */
- /*******************************************************************/
- void lcd_wcmd(uchar cmd)
- {
- while(lcd_busy());
- LCD_RS = 0;
- LCD_RW = 0;
- LCD_EN = 0;
- _nop_();
- _nop_();
- P0 = cmd;
- delayNOP();
- LCD_EN = 1;
- delayNOP();
- LCD_EN = 0;
- }
- /*******************************************************************/
- /* */
- /*写显示数据到LCD */
- /*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
- /* */
- /*******************************************************************/
- void lcd_wdat(uchar dat)
- {
- while(lcd_busy());
- LCD_RS = 1;
- LCD_RW = 0;
- LCD_EN = 0;
- P0 = dat;
- delayNOP();
- LCD_EN = 1;
- delayNOP();
- LCD_EN = 0;
- }
- /*******************************************************************/
- /* */
- /* LCD初始化设定 */
- /* */
- /*******************************************************************/
- void lcd_init()
- {
- delay1(10);
- lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据
- delay1(5);
- lcd_wcmd(0x38);
- delay1(5);
- lcd_wcmd(0x38);
- delay1(5);
- lcd_wcmd(0x0c); //显示开,关光标
- delay1(5);
- lcd_wcmd(0x06); //移动光标
- delay1(5);
- lcd_wcmd(0x01); //清除LCD的显示内容
- delay1(5);
- }
- /*******************************************************************/
- /* */
- /* 设定显示位置 */
- /* */
- /*******************************************************************/
- void lcd_pos(uchar pos)
- {
- lcd_wcmd(pos | 0x80); //数据指针=80+地址变量
- }
- /****************************加减运算******************************/
- uint j=0,i=0,k=0;
- uchar DATA1[11] = {'0','1','2','3','4','5','6','7','8','9','0'};
- /*******************************************************************/
- void LCD_X()
- {
- uchar m;
- lcd_pos(0); //设置显示位置为第一行的第1个字符
- m = 0;
- while(cdis1[m] != '\0')
- { //显示字符
- lcd_wdat(cdis1[m]);
- m++;
- }
- lcd_pos(0x40); //设置显示位置为第二行第1个字符
- m = 0;
- while(cdis2[m] != '\0')
- {
- lcd_wdat(cdis2[m]); //显示字符
- m++;
- }
- }
- /*******************************************************************/
- /*******************************************************************/
- void main()
- {
- CLC =1;
- KEYG =1;
- KEYS =1;
- KEYB =1;
- int1=1,int2=1,int3=1,int4=1;
- while(1)
- {
- lcd_init(); //初始化LCD
- LCD_X();
- if(CLC==0)
- delay1(10);
- if(CLC==0)
- {
- lcd_pos(0x4d); lcd_wdat(DATA1[4]); lcd_pos(0x4e); lcd_wdat(DATA1[0]); lcd_pos(0x4f); lcd_wdat(DATA1[0]);LEDR=0;LEDB=1;
- }
- else
- {
- if()
- if(KEYB==0)
- delay1(10);
- if(KEYB==0) {k++;}
- if(k==5) {k=0;}
- if(KEYS==0)
- delay1(10);
- if(KEYS==0) {i++;}
- if(i==10) {i=0;}
- if(KEYG==0)
- delay1(10);
- if(KEYG==0) {j++;}
- if(j==7) {j=0;}
- if(int1==1&int2==1&int3==1&int4==1) {lcd_pos(0x4d); lcd_wdat(DATA1[4-k]); lcd_pos(0x4e); lcd_wdat(DATA1[0+i]); lcd_pos(0x4f); lcd_wdat(DATA1[4+j]);LEDR=0;LEDB=1;}
- if(int1==0&int2==1&int3==1&int4==1|int1==1&int2==0&int3==1&int4==1|int1==1&int2==1&int3==0&int4==1|int1==1&int2==1&int3==1&int4==0)
- {lcd_pos(0x4d); lcd_wdat(DATA1[4-k]); lcd_pos(0x4e); lcd_wdat(DATA1[0+i]); lcd_pos(0x4f); lcd_wdat(DATA1[3+j]);LEDR=0;LEDB=1;}
- if(int1==0&int2==0&int3==1&int4==1|int1==0&int2==1&int3==0&int4==1|int1==0&int2==1&int3==1&int4==0|int1==1&int2==0&int3==0&int4==1|int1==1&int2==0&int3==1&int4==0|int1==1&int2==1&int3==0&int4==0)
- {lcd_pos(0x4d); lcd_wdat(DATA1[4-k]); lcd_pos(0x4e); lcd_wdat(DATA1[0+i]); lcd_pos(0x4f); lcd_wdat(DATA1[2+j]);LEDR=0;LEDB=1;}
- if(int1==1&int2==0&int3==0&int4==0|int1==0&int2==1&int3==0&int4==0|int1==0&int2==0&int3==1&int4==0|int1==0&int2==0&int3==0&int4==1)
-
- {lcd_pos(0x4d); lcd_wdat(DATA1[4-k]); lcd_pos(0x4e); lcd_wdat(DATA1[0+i]); lcd_pos(0x4f); lcd_wdat(DATA1[1+j]);LEDR=0;LEDB=1;}
- if(int1==0&int2==0&int3==0&int4==0) {lcd_pos(0x4d); lcd_wdat(DATA1[4-k]); lcd_pos(0x4e); lcd_wdat(DATA1[0+i]); lcd_pos(0x4f); lcd_wdat(DATA1[0+j]);LEDR=1;LEDB=0;}
-
- if(CLC==0)
- delay1(10);
- if(CLC==0) {lcd_pos(0x4d); lcd_wdat(DATA1[4]); lcd_pos(0x4e); lcd_wdat(DATA1[0]); lcd_pos(0x4f); lcd_wdat(DATA1[0]);LEDR=0;LEDB=1; }
- }
-
-
-
-
- IT1=1;
- EX1=1;
- EA=1;
- }
- }
-
复制代码
|
评分
-
查看全部评分
|