找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11899|回复: 6
打印 上一主题 下一主题
收起左侧

单片机停车位管理系统proteus仿真及源程序

[复制链接]
跳转到指定楼层
楼主
一个51单片机做的停车位管理系统,是用红外来实现探测的,下面是仿真原理图:


停车位管理系统的所有资料下载(包含proteus仿真和单片机源代码):
停车位管理系统.rar (234.44 KB, 下载次数: 260)


源程序:

  1. /********************************************************************************
  2. *         描述:                                                                 *
  3. *         lcd1602显示 P0口                                                      *
  4. *         按键                  个位P32     十位P33                                                                                *
  5. *         红外光对管  int1.....int4   接  P10...P13                             *
  6. *         有空位      LED-B           接  P14                                                                         *
  7. *         无空位      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. /*检查LCD忙状态                                                    */
  50. /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。      */
  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. /*写指令数据到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. /*写显示数据到LCD                                                  */
  87. /*RS=H,RW=L,E=高脉冲,D0-D7=数据。                               */
  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初始化设定                                                  */
  105. /*                                                                 */
  106. /*******************************************************************/

  107. void lcd_init()
  108. {
  109.     delay1(10);                  
  110.     lcd_wcmd(0x38);      //16*2显示,5*7点阵,8位数据
  111.     delay1(5);
  112.     lcd_wcmd(0x38);         
  113.     delay1(5);
  114.     lcd_wcmd(0x38);         
  115.     delay1(5);

  116.     lcd_wcmd(0x0c);      //显示开,关光标
  117.     delay1(5);
  118.     lcd_wcmd(0x06);      //移动光标
  119.     delay1(5);
  120.     lcd_wcmd(0x01);      //清除LCD的显示内容
  121.     delay1(5);
  122. }

  123. /*******************************************************************/
  124. /*                                                                 */
  125. /*  设定显示位置                                                   */
  126. /*                                                                 */
  127. /*******************************************************************/

  128. void lcd_pos(uchar pos)
  129. {                          
  130.   lcd_wcmd(pos | 0x80);  //数据指针=80+地址变量
  131. }

  132. /****************************加减运算******************************/
  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);                //设置显示位置为第一行的第1个字符
  140.          m = 0;
  141.         while(cdis1[m] != '\0')
  142.          {                         //显示字符
  143.            lcd_wdat(cdis1[m]);
  144.            m++;
  145.          }
  146.         lcd_pos(0x40);             //设置显示位置为第二行第1个字符
  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.         
复制代码




评分

参与人数 1黑币 +5 收起 理由
小duangduang + 5 很给力!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:171206 发表于 2017-3-17 17:13 | 只看该作者
请问为什么用了四路红外,用两路一个检测进入另外一个检测驶出,就够了吧
回复

使用道具 举报

板凳
ID:130231 发表于 2017-3-20 12:17 | 只看该作者
好技能!感谢楼主您的分享。
回复

使用道具 举报

地板
ID:185860 发表于 2017-4-3 22:07 | 只看该作者
你还,仿真图有一点没看懂。可以请教一下吗?谢谢了
回复

使用道具 举报

5#
ID:205469 发表于 2017-5-28 14:32 | 只看该作者
亲,你这仿真的无车位提示灯一直是亮着,而有车位指示灯一直是灭着的,请问这是程序的问题吗?我直接用您的程序仿真的,没做任何修改
回复

使用道具 举报

6#
ID:219811 发表于 2017-7-17 11:24 | 只看该作者
请问这个有没有红外模块啊 还是要自己动手焊
回复

使用道具 举报

7#
ID:739355 发表于 2020-4-27 15:29 | 只看该作者
楼主,可以单就这个坐一期的仿真说明吗  ,有的地方实在是看不懂
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表