找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3832|回復(fù): 1
收起左側(cè)

單片機(jī)紅外避障傳感器停車場(chǎng)管理系統(tǒng)程序電路設(shè)計(jì) 1602顯示車輛進(jìn)出情況

[復(fù)制鏈接]
ID:322115 發(fā)表于 2021-3-27 10:06 | 顯示全部樓層 |閱讀模式
一個(gè)基于單片機(jī)設(shè)計(jì)的停車場(chǎng)管理系統(tǒng)的全套設(shè)計(jì)資料,可以用來(lái)學(xué)習(xí)單片機(jī)技術(shù),很簡(jiǎn)單

制作出來(lái)的實(shí)物圖如下:
照片.jpg 照片.png

電路原理圖如下:
1.png

元件清單:
元件型號(hào)    元件名稱    元件標(biāo)號(hào)    數(shù)量
蜂鳴器    蜂鳴器    B1    1
10uF    電容    C1    1
20PF    電容    C2, C3    2
紅    發(fā)光二極管    D2    1
綠    發(fā)光二極管    D3    1
LCD1602    液晶     LCD1    1
電源輸入    電耗接口    P1    1
紅外避障傳感器    E18-D80NK    P2, P3    2
9012    三極管    Q1    1
2K    電阻    R1, R2, R5    3
10K    電阻    R3    1
SW-PB    按鍵    S1, S2, S3, S4    4
電源開關(guān)    電源開關(guān)    SW1    1
單片機(jī)    單片機(jī)    U1    1
12M    晶振     Y1    1

單片機(jī)源程序如下:
  1. #include <reg52.h>                 //調(diào)用單片機(jī)頭文件
  2. #define uchar unsigned char  //無(wú)符號(hào)字符型 宏定義        變量范圍0~255
  3. #define uint  unsigned int         //無(wú)符號(hào)整型 宏定義        變量范圍0~65535

  4. sbit beep = P1^4; //蜂鳴器IO口定義

  5. sbit hw_jin = P2^1;   //紅外傳感器IO口定義
  6. sbit hw_chu = P2^0;   //紅外傳感器IO口定義
  7. uchar menu_1;              //設(shè)置參數(shù)用

  8. uint num;  //計(jì)的數(shù)
  9. uint jin,chu;

  10. uchar set_num = 30; // 設(shè)置總的車位         

  11. sbit red   = P1^3;           //紅色發(fā)光二極管定義
  12. sbit green = P1^5;           //綠色發(fā)光二極管定義

  13. /***********************1ms延時(shí)函數(shù)*****************************/
  14. void delay_1ms(uint q)
  15. {
  16.         uint i,j;
  17.         for(i=0;i<q;i++)
  18.                 for(j=0;j<120;j++);
  19. }

  20. sbit rs=P1^0;         //寄存器選擇信號(hào) H:數(shù)據(jù)寄存器          L:指令寄存器
  21. sbit rw=P1^1;         //寄存器選擇信號(hào) H:數(shù)據(jù)寄存器          L:指令寄存器
  22. sbit e =P1^2;         //片選信號(hào)   下降沿觸發(fā)

  23. /********************************************************************
  24. * 名稱 : delay_uint()
  25. * 功能 : 小延時(shí)。
  26. * 輸入 : 無(wú)
  27. * 輸出 : 無(wú)
  28. ***********************************************************************/
  29. void delay_uint(uint q)
  30. {
  31.         while(q--);
  32. }

  33. /********************************************************************
  34. * 名稱 : write_com(uchar com)
  35. * 功能 : 1602命令函數(shù)
  36. * 輸入 : 輸入的命令值
  37. * 輸出 : 無(wú)
  38. ***********************************************************************/
  39. void write_com(uchar com)
  40. {
  41.         e=0;
  42.         rs=0;
  43.         rw=0;
  44.         P0=com;
  45.         delay_uint(25);
  46.         e=1;
  47.         delay_uint(100);
  48.         e=0;
  49. }

  50. /********************************************************************
  51. * 名稱 : write_data(uchar dat)
  52. * 功能 : 1602寫數(shù)據(jù)函數(shù)
  53. * 輸入 : 需要寫入1602的數(shù)據(jù)
  54. * 輸出 : 無(wú)
  55. ***********************************************************************/
  56. void write_data(uchar dat)
  57. {
  58.         e=0;
  59.         rs=1;
  60.         rw=0;
  61.         P0=dat;
  62.         delay_uint(25);
  63.         e=1;
  64.         delay_uint(100);
  65.         e=0;        
  66. }

  67. /***********************lcd1602上顯示兩位十進(jìn)制數(shù)************************/
  68. void write_sfm4(uchar hang,uchar add,uint date)
  69. {
  70.         if(hang==1)   
  71.                 write_com(0x80+add);
  72.         else
  73.                 write_com(0x80+0x40+add);
  74.         write_data(0x30+date/1000%10);
  75.         write_data(0x30+date/100%10);
  76.         write_data(0x30+date/10%10);
  77.         write_data(0x30+date%10);        
  78. }


  79. /***********************lcd1602上顯示這字符函數(shù)************************/
  80. void write_string(uchar hang,uchar add,uchar *p)
  81. {
  82.         if(hang == 1)   
  83.                 write_com(0x80+add);
  84.         else
  85.                 write_com(0x80+0x40+add);
  86.         while(1)                                                                                                                 
  87.         {
  88.                 if(*p == '\0')  break;
  89.                 write_data(*p);
  90.                 p++;
  91.         }        
  92. }

  93. /***********************lcd1602初始化設(shè)置************************/
  94. void init_1602()        //lcd1602初始化
  95. {
  96.         write_com(0x38);        
  97.         write_com(0x0c);
  98.         write_com(0x06);
  99.         delay_uint(1000);
  100.         write_string(1,0,"   SY:0000       ");        
  101.         write_string(2,0," J:0000  C:0000   ");        
  102.         write_sfm4(2,2,jin);  //顯示人數(shù)
  103.         write_sfm4(1,8,num);  //顯示人數(shù)
  104.         write_sfm4(2,12,chu);  //顯示人數(shù)
  105. }

  106. /********************獨(dú)立按鍵程序*****************/
  107. uchar key_can;         //按鍵值

  108. void key()             //獨(dú)立按鍵程序
  109. {
  110.         static uchar key_new;
  111.         key_can = 20;               //按鍵值還原
  112.         P3 |= 0xf0;
  113.         if((P3 & 0xf0) != 0xf0)                //按鍵按下
  114.         {
  115.                 delay_1ms(1);                     //按鍵消抖動(dòng)
  116.                 if(((P3 & 0xf0) != 0xf0) && (key_new == 1))
  117.                 {                                                //確認(rèn)是按鍵按下
  118.                         key_new = 0;
  119.                         switch(P3 & 0xf0)
  120.                         {
  121.                                 case 0xd0: key_can = 3; break;           //得到k1鍵值
  122.                                 case 0xb0: key_can = 2; break;           //得到K2鍵值
  123.                                 case 0x70: key_can = 1; break;           //得到k3鍵值
  124.                         }
  125.                 }                        
  126.         }
  127.         else
  128.                 key_new = 1;        
  129. }

  130. /****************按鍵處理數(shù)碼管顯示函數(shù)***************/
  131. void key_with()
  132. {
  133.         if(key_can == 1)        //設(shè)置鍵
  134.         {
  135.                 menu_1 ++;
  136.                 if(menu_1 >= 2)
  137.                 {
  138.                         menu_1 = 0;
  139.                         init_1602();  //lcd1602初始化        
  140.                 }
  141.                 if(menu_1 == 1)                                 //初始化顯示
  142.                 {
  143.                         write_string(1,0,"     SET Z       ");
  144.                         write_string(2,0,"                 ");
  145.                 }
  146.         }
  147.         if(menu_1 == 0)                           //倒計(jì)時(shí)器按鍵操作開始 暫停
  148.         {                 
  149.                 if(key_can == 2)  //清零
  150.                 {
  151.                         num = 0;
  152.                         jin = 0;
  153.                         chu = 0;
  154.                         num  = set_num - jin + chu;          //計(jì)算剩余車位
  155.                         write_sfm4(2,2,jin);  //顯示人數(shù)
  156.                         write_sfm4(1,8,num);  //顯示人數(shù)
  157.                         write_sfm4(2,12,chu);  //顯示人數(shù)
  158.                 }
  159.         }
  160.         if(menu_1 == 1)                                //設(shè)置倒計(jì)時(shí)器開始數(shù)
  161.         {
  162.                 if(key_can == 2)
  163.                 {
  164.                         set_num ++ ;                // 設(shè)置數(shù)加
  165.                         if(set_num > 9999)
  166.                                 set_num = 9999;        //最大加到99        
  167.                 }
  168.                 if(key_can == 3)
  169.                 {
  170.                         set_num -- ;                // 設(shè)置數(shù)減
  171.                         if(set_num <= 1)
  172.                                 set_num = 1;        //最大減到1
  173.                 }
  174.                 write_sfm4(2,5,set_num);  //顯示人數(shù)
  175.                 write_com(0x80+0x40+7);             //將光標(biāo)移動(dòng)到秒個(gè)位
  176.                 write_com(0x0f);                    //顯示光標(biāo)并且閃爍        
  177.         }
  178.         beep = 0;          //打開蜂鳴器
  179.         delay_1ms(50);
  180.         beep = 1;          //關(guān)閉蜂鳴器
  181.         
  182. }  


  183. /******************紅外計(jì)數(shù)**********************/           
  184. void hw_jin_dis()        //紅外計(jì)數(shù)
  185. {
  186.         if(hw_jin == 0)                //計(jì)數(shù)
  187.         {
  188.                 delay_1ms(1);                     //消抖動(dòng)
  189.                 if(hw_jin == 0)
  190.                 {                                                //確認(rèn)
  191.                         jin ++;
  192.                         if(jin >= 9999)
  193.                                 jin = 9999;
  194.                         num  = set_num - jin + chu;          //計(jì)算剩余車位
  195.                         write_sfm4(2,3,jin);  //顯示人數(shù)
  196.                         write_sfm4(1,7,num);  //顯示人數(shù)
  197.                         if(num == 0)                  //為0時(shí)報(bào)警
  198.                         {
  199.                                 beep = 0;
  200.                                 delay_1ms(200);
  201.                                 beep = 1;                                                
  202.                                 delay_1ms(200);
  203.                                 beep = 0;
  204.                                 delay_1ms(200);
  205.                                 beep = 1;                                                
  206.                                 delay_1ms(200);
  207.                                 beep = 0;
  208.                                 delay_1ms(200);
  209.                                 beep = 1;                                                
  210.                         }
  211.                 }                        
  212.         }
  213. }

  214. /******************紅外計(jì)數(shù)**********************/           
  215. void hw_chu_dis()        //紅外計(jì)數(shù)
  216. {
  217.         if(hw_chu == 0)                //計(jì)數(shù)
  218.         {
  219.                 delay_1ms(1);                     //消抖動(dòng)
  220.                 if(hw_chu == 0)
  221.                 {                                                //確認(rèn)
  222.                         chu ++;
  223.                         if(chu >= 9999)
  224.                                 chu = 9999;
  225.                         num  = set_num - jin + chu;          //計(jì)算剩余車位
  226.                         write_sfm4(2,11,chu);  //顯示人數(shù)
  227.                         write_sfm4(1,7,num);  //顯示人數(shù)
  228.                 }
  229.         }
  230. }

  231. uchar nnum;

  232. /******************主程序**********************/           
  233. void main()
  234. {
  235.         init_1602();        //lcd1602初始化
  236.         while(1)
  237.         {
  238.                 key();                           //按鍵掃描函數(shù)
  239.                 if(key_can < 10)
  240.                         key_with();    //按鍵執(zhí)行函數(shù)
  241.                 hw_jin_dis();        //紅外計(jì)數(shù)        
  242.                 hw_chu_dis();        //紅外計(jì)數(shù)        
  243.                 if(num == 0)
  244.                 {
  245.                         red  = 0;  green = 1; //車位為0 紅燈亮
  246.                 }else
  247.                 {
  248.                         red  = 1;  green = 0; //綠燈亮
  249.                 }                                                
  250.                 delay_1ms(100);

  251.         }
  252. }
復(fù)制代碼

所有資料51hei提供下載(內(nèi)附文檔等):
停車場(chǎng)管理系統(tǒng) 1602.7z (2.33 MB, 下載次數(shù): 72)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:973836 發(fā)表于 2021-12-12 12:17 | 顯示全部樓層
大佬能發(fā)一下proteus的仿真圖么,我按照原理圖接完電路1602不顯示啊
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表