|
一個51單片機做的停車位管理系統,是用紅外來實現探測的,下面是仿真原理圖:
0.png (336.45 KB, 下載次數: 127)
下載附件
2016-9-26 15:28 上傳
0.png (337.91 KB, 下載次數: 92)
下載附件
2016-9-26 15:28 上傳
0.png (57.92 KB, 下載次數: 100)
下載附件
2016-9-26 15:29 上傳
停車位管理系統的所有資料下載(包含proteus仿真和單片機源代碼):
停車位管理系統.rar
(234.44 KB, 下載次數: 263)
2016-9-26 15:31 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
源程序:
- /********************************************************************************
- * 描述: *
- * 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;
- }
- }
-
復制代碼
|
評分
-
查看全部評分
|