標(biāo)題: 單片機(jī)停車(chē)位管理系統(tǒng)proteus仿真及源程序 [打印本頁(yè)]

作者: 51黑ff    時(shí)間: 2016-9-26 15:31
標(biāo)題: 單片機(jī)停車(chē)位管理系統(tǒng)proteus仿真及源程序
一個(gè)51單片機(jī)做的停車(chē)位管理系統(tǒng),是用紅外來(lái)實(shí)現(xiàn)探測(cè)的,下面是仿真原理圖:


停車(chē)位管理系統(tǒng)的所有資料下載(包含proteus仿真和單片機(jī)源代碼):
停車(chē)位管理系統(tǒng).rar (234.44 KB, 下載次數(shù): 263)


源程序:

  1. /********************************************************************************
  2. *         描述:                                                                 *
  3. *         lcd1602顯示 P0口                                                      *
  4. *         按鍵                  個(gè)位P32     十位P33                                                                                *
  5. *         紅外光對(duì)管  int1.....int4   接  P10...P13                             *
  6. *         有空位      LED-B           接  P14                                                                         *
  7. *         無(wú)空位      LED-R           接  P15                                   *
  8. *                                                                               *
  9. ********************************************************************************/

  10. #include <reg51.h>
  11. #include <intrins.h>
  12. #include <stdio.h>
  13. #define uchar unsigned char
  14. #define uint  unsigned int
  15. #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};

  16. sbit int1 = P2^4;
  17. sbit int2 = P2^5;
  18. sbit int3 = P2^6;
  19. sbit int4 = P2^7;
  20. sbit LEDB = P1^4;
  21. sbit LEDR = P1^5;
  22. sbit KEYG = P3^2;
  23. sbit KEYS = P3^3;
  24. sbit KEYB = P3^5;
  25. sbit CLC  = P3^4;
  26. sbit HY  =  P3^6;

  27. sbit LCD_RS = P2^0;            
  28. sbit LCD_RW = P2^1;
  29. sbit LCD_EN = P2^2;

  30. uchar code  cdis1[ ] = {"    Welcome    "};
  31. uchar code  cdis2[ ] = {"Place vacant:---"};

  32. /*********************************************************/
  33. void delay1(int ms)
  34. {
  35. unsigned char y;
  36.   while(ms--)
  37. {
  38.   for(y = 0; y<250; y++)
  39.   {
  40.    _nop_();
  41.    _nop_();
  42.    _nop_();
  43.    _nop_();
  44.   }
  45. }
  46. }
  47. /*******************************************************************/
  48. /*                                                                 */
  49. /*檢查L(zhǎng)CD忙狀態(tài)                                                    */
  50. /*lcd_busy為1時(shí),忙,等待。lcd-busy為0時(shí),閑,可寫(xiě)指令與數(shù)據(jù)。      */
  51. /*                                                                 */
  52. /*******************************************************************/

  53. bit lcd_busy()
  54. {                          
  55.     bit result;
  56.     LCD_RS = 0;
  57.     LCD_RW = 1;
  58.     LCD_EN = 1;
  59.     delayNOP();
  60.     result = (bit)(P0&0x80);
  61.     LCD_EN = 0;
  62.     return(result);
  63. }

  64. /*******************************************************************/
  65. /*                                                                 */
  66. /*寫(xiě)指令數(shù)據(jù)到LCD                                                  */
  67. /*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。                             */
  68. /*                                                                 */
  69. /*******************************************************************/

  70. void lcd_wcmd(uchar cmd)

  71. {                          
  72.    while(lcd_busy());
  73.     LCD_RS = 0;
  74.     LCD_RW = 0;
  75.     LCD_EN = 0;
  76.     _nop_();
  77.     _nop_();
  78.     P0 = cmd;
  79.     delayNOP();
  80.     LCD_EN = 1;
  81.     delayNOP();
  82.     LCD_EN = 0;  
  83. }

  84. /*******************************************************************/
  85. /*                                                                 */
  86. /*寫(xiě)顯示數(shù)據(jù)到LCD                                                  */
  87. /*RS=H,RW=L,E=高脈沖,D0-D7=數(shù)據(jù)。                               */
  88. /*                                                                 */
  89. /*******************************************************************/

  90. void lcd_wdat(uchar dat)
  91. {                          
  92.    while(lcd_busy());
  93.     LCD_RS = 1;
  94.     LCD_RW = 0;
  95.     LCD_EN = 0;
  96.     P0 = dat;
  97.     delayNOP();
  98.     LCD_EN = 1;
  99.     delayNOP();
  100.     LCD_EN = 0;
  101. }

  102. /*******************************************************************/
  103. /*                                                                 */
  104. /*  LCD初始化設(shè)定                                                  */
  105. /*                                                                 */
  106. /*******************************************************************/

  107. void lcd_init()
  108. {
  109.     delay1(10);                  
  110.     lcd_wcmd(0x38);      //16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)
  111.     delay1(5);
  112.     lcd_wcmd(0x38);         
  113.     delay1(5);
  114.     lcd_wcmd(0x38);         
  115.     delay1(5);

  116.     lcd_wcmd(0x0c);      //顯示開(kāi),關(guān)光標(biāo)
  117.     delay1(5);
  118.     lcd_wcmd(0x06);      //移動(dòng)光標(biāo)
  119.     delay1(5);
  120.     lcd_wcmd(0x01);      //清除LCD的顯示內(nèi)容
  121.     delay1(5);
  122. }

  123. /*******************************************************************/
  124. /*                                                                 */
  125. /*  設(shè)定顯示位置                                                   */
  126. /*                                                                 */
  127. /*******************************************************************/

  128. void lcd_pos(uchar pos)
  129. {                          
  130.   lcd_wcmd(pos | 0x80);  //數(shù)據(jù)指針=80+地址變量
  131. }

  132. /****************************加減運(yùn)算******************************/
  133. uint j=0,i=0,k=0;
  134. uchar DATA1[11] = {'0','1','2','3','4','5','6','7','8','9','0'};


  135. /*******************************************************************/
  136. void LCD_X()
  137. {
  138.    uchar m;
  139.    lcd_pos(0);                //設(shè)置顯示位置為第一行的第1個(gè)字符
  140.          m = 0;
  141.         while(cdis1[m] != '\0')
  142.          {                         //顯示字符
  143.            lcd_wdat(cdis1[m]);
  144.            m++;
  145.          }
  146.         lcd_pos(0x40);             //設(shè)置顯示位置為第二行第1個(gè)字符
  147.          m = 0;
  148.         while(cdis2[m] != '\0')
  149.          {
  150.            lcd_wdat(cdis2[m]);      //顯示字符
  151.            m++;
  152.          }

  153. }

  154. /*******************************************************************/


  155. /*******************************************************************/

  156. void main()
  157. {
  158.      CLC  =1;
  159.      KEYG =1;
  160.      KEYS =1;
  161.          KEYB =1;
  162.            int1=1,int2=1,int3=1,int4=1;
  163.    while(1)
  164.         {   
  165.              lcd_init();                //初始化LCD            
  166.              LCD_X();
  167.          if(CLC==0)
  168.                      delay1(10);        
  169.                             if(CLC==0)
  170.                                 {     
  171.                                      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;
  172.                             }
  173.                                 else
  174.                                 {
  175.                                   if()
  176.                                   if(KEYB==0)
  177.                      delay1(10);
  178.                            if(KEYB==0) {k++;}
  179.                              if(k==5) {k=0;}

  180.                   if(KEYS==0)
  181.                      delay1(10);
  182.                            if(KEYS==0) {i++;}
  183.                              if(i==10) {i=0;}

  184.                    if(KEYG==0)
  185.                      delay1(10);
  186.                        if(KEYG==0) {j++;}
  187.                              if(j==7) {j=0;}
  188.                    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;}

  189.                   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)

  190.                                                                    {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;}

  191.                   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)

  192.                                                                   {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;}

  193.                   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)
  194.                              
  195.                                                             {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;}

  196.                   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;}
  197.                   
  198.                    if(CLC==0)
  199.                      delay1(10);        
  200.                             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; }
  201.                                 }
  202.                   
  203.          
  204.                            
  205.                   
  206.                  IT1=1;
  207.              EX1=1;
  208.              EA=1;
  209.                  }
  210. }
  211.         
復(fù)制代碼





作者: 隨感    時(shí)間: 2017-3-17 17:13
請(qǐng)問(wèn)為什么用了四路紅外,用兩路一個(gè)檢測(cè)進(jìn)入另外一個(gè)檢測(cè)駛出,就夠了吧
作者: zqy181818    時(shí)間: 2017-3-20 12:17
好技能!感謝樓主您的分享。
作者: zbj904960056    時(shí)間: 2017-4-3 22:07
你還,仿真圖有一點(diǎn)沒(méi)看懂。可以請(qǐng)教一下嗎?謝謝了
作者: czy1121016    時(shí)間: 2017-5-28 14:32
親,你這仿真的無(wú)車(chē)位提示燈一直是亮著,而有車(chē)位指示燈一直是滅著的,請(qǐng)問(wèn)這是程序的問(wèn)題嗎?我直接用您的程序仿真的,沒(méi)做任何修改
作者: 77qfy    時(shí)間: 2017-7-17 11:24
請(qǐng)問(wèn)這個(gè)有沒(méi)有紅外模塊啊 還是要自己動(dòng)手焊

作者: 小小小黑白    時(shí)間: 2020-4-27 15:29
樓主,可以單就這個(gè)坐一期的仿真說(shuō)明嗎  ,有的地方實(shí)在是看不懂




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1