找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于单片机交通显示系统源代码与Proteus仿真

[复制链接]
跳转到指定楼层
楼主
ID:833815 发表于 2020-12-30 22:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
由单片机,交通灯状态显示系统、LED数码显示系统等几大部分组成。系统除基本的交通灯功能外,还具有倒计时、紧急情况处理等功能,较好的模拟实现了十字路口可能出现的状况。
本系统采用单片机C语言编写,主要编写了主程序,LED数码管显示程序等。总体上完成了软件的编写。

交通显示系统
1.
  设计要求
  • 东西干道和南北干道的通行分左行,右行,直行,其中左行,右行固定15秒;直行固定30秒。

(2)信号灯分绿灯,红灯,黄灯,每次绿灯换红灯时,黄灯亮3秒。

(3)东西干道和南北干道交替控制,每次干道绿灯交替时,有3秒钟所有干道的交通灯都是黄灯闪烁3秒钟,提示已经进入路口的车辆迅速通过。

(4)当遇到突发状况时,各个方向静止通行,显示红灯,并维持5秒倒计时。

2.分析

(1)分析目前交通路口的基本控制技术以及各种通行方案,并以此为基础提出自己的交通控制的初步方案。

(2)及系统应拥有的各项功能,在这里,本设计除了有信号灯状态控制能实现基本的交通功能,还增加了倒计时显示提示。

(3)进行显示电路,灯状态电路,按键电路的设计和各器件的选择及连接,大体分配各个器件及模块的基本功能要求。

(4)进行软件系统的设计,对于本系统,本人采用C语言编写,对单片机内部结构和工作情况做了充足的研究,了解定时器,中断以及延时原理,总体上完成了软件的设计。

图1系统框图
3. 硬件设计分析
3.1单片机选型:AT89C51

与MCS-51单片机产品兼容,8k字节在系统可编程Flash存储器,1000次可檫写周期,全静态操作:0Hz~33Hz,三级加密程序存储器,32个可编程I/O口线,三个16位定时器/计数器八个中断源、全双工UART串行通道、低功耗空闲和掉电模式、掉电后中断可唤醒、看门狗定时器、双数据指针、掉电标识符。

当8051的ALE及/PSEN两引脚输出高电平,RST引脚高电平到时,单片机复位。RST/VPD端的高电平,若直接由启动瞬间产生,则为启动复位,若通过按动按钮产生高电平复位称手动复位。图中,上电时,接通电源,电容器C相当于瞬间短路,+5V加到了RST/VPD端,该高电平使8051全机复位。若运行过程中,需要程序从头执行,只需按动按钮S,则直接把+5V加到了RST/VPD端,从而复位。显然,该电路即可以上电复位,也可以手动复位,是常用复位电路之一[5]。

3.3数码管显示
图4数码管显示

此处采用的数码管时共阴极数码管,G、F、E、D、C、B、A七个端口是输入端口,对其各位进行赋值,置位则亮,复位则灭,用此来显示出相应的数字;1、2两端用来控制高位和低位的选通显示,只要对端口置位,便可以选择该端口,并对其所代表的位进行赋值,显示。正常通行状况下,数码管从30秒开始倒计时,各个方向,对应点亮红绿黄灯。遇到突发状况,数码管从5秒开始倒计时,各方向禁止通行,点亮红灯。

3.4红绿灯显示
图5红绿灯显示

每个路口都采用了3个LED灯来显示,分别代表红绿黄三种灯,来模拟路口交通的变换。其中D7和D8表示转弯模块[6]。

以南北方向举例,正常状况下,从30秒开始倒计时,南北方向可直行,即绿灯(D6)亮起,东西方向禁止通行,亮红灯(D2)。当显示至15秒时,南北方向可直行和转弯,即两个绿灯(D6和D7)亮起,东西方向禁止通行,亮红灯(D2)。当显示至3秒时,通知车辆快速通过,南北黄灯(D5)闪烁,东西方向禁止通行,亮红灯(D2)。

3.5键盘:独立键盘+中断
图6独立键盘+中断

采用开关来控制进入中断,可以在路口出现紧急情况时,拉动开关。使红绿灯发生相应的改变,已处理紧急情况下车辆通行。

当发生突发情况时,如救护车通过,接通上面的按键,各个方向中止当前状态,即禁止通行,各个方向点亮红灯,并维持5秒倒计时。当结束5秒倒计时,各个方向恢复到中止前的状态。





3.6系统原理图
图7总电路图
4. 软件设计
4.1总体流程
图8流程图





4.2循环流程控制思路
图9流程控制图
  仿真分析
5.1正常运行状态
图10正常运行状态














5.2左右行显示
图11左右行显示
5.3黄灯闪烁显示
图12黄灯闪烁显示

单片机源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #defineuintunsignedint
  4. #defineucharunsignedchar
  5. uchartemp,aa,nn;
  6. sbitrn=P2^0;              //南北红灯
  7. sbitnb=P2^1;              //南北黄灯
  8. sbitgn=P2^2;              //南北绿灯
  9. sbitrw=P2^3;              //东西方向红灯
  10. sbitdx=P2^4;              //东西方向黄灯
  11. sbitgw=P2^5;              //东西方向绿灯
  12. sbitshi=P3^6;              //十位
  13. sbitge=P3^7;//个位
  14. bitflag=0;
  15. ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,
  16. 0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,
  17. 0x79,0x71};/*将数字0123456789的16进制数定义成数组用以显示*/
  18. voiddelay(uintz);//延迟
  19. voiddisp(uintn);
  20. voidnb_flash(void);
  21. voiddx_flash(void);
  22. voidxint0();
  23. voidtimer0();
  24. voidLED_ON();
  25. voidxint1();
  26. voidnanbei();
  27. voiddongxi();/*将所使用的子函数定义*/
  28. voidmain()
  29. {
  30. uintnum;
  31. num=0;
  32. aa=0;
  33. TMOD=0x01;                                          //方式116位定时器
  34. TH0=(65536-50000)/256;//定义装入定时器高8位的时间常数                                         
  35. TL0=(65536-50000)%256;//定义装入定时器低8位的时间常数                                                                                                                                                         
  36. EA=1;                                                        //开关总中断
  37. ET0=1;                                                        //允许定时器T0中断
  38. TR0=1;                                                        //打开定时器T0
  39. EX0=1;                                                        //允许外部中断0中断
  40. IT0=0;                                                        //禁止T0溢出中断
  41. EX1=1;                                                        //允许外部中断1中断
  42. IT1=1;/*中断初始化*/              //允许T1溢出
  43. while(1)
  44. {
  45. nanbei();
  46. nb_flash();
  47. dongxi();
  48. }
  49. }
  50. voiddelay(uintz)                                                                      //延迟
  51. {uintx,y;
  52. for(x=z;x>0;x--)
  53. for(y=110;y>0;y--);
  54. }
  55. voidtimer0()interrupt1
  56. {
  57. TH0=(65536-50000)/256;
  58. TL0=(65536-50000)%256;
  59. aa++;
  60. if(aa==9)
  61. {
  62. aa=0;
  63. flag=1;
  64. }
  65. }
  66. voiddisp(uintn)/*显示子函数*/
  67. {
  68. while(!flag)              //flag=0
  69. {
  70. ge=0;
  71. P0=table[n%10];
  72. delay(50);
  73. shi=1;
  74. ge=1;
  75. shi=0;
  76. P0=table[n/10];
  77. delay(50);
  78. shi=1;
  79. ge=1;
  80. }
  81. if(flag==1)
  82. flag=0;
  83. }
  84. voidnanbei()/*南北方向的红绿灯和数码管显示子函数*/
  85. {
  86. uintnum;
  87. num=30;
  88.               disp(num);
  89. while(num<=30&&num>15)
  90. {
  91. num--;
  92. P2=0xf3;
  93. disp(num);
  94. }
  95. while(num<=15&&num>4)/*南北方向及转弯的红绿灯和数码管显示子函数*/
  96. {
  97. num--;
  98. P2=0xb3;
  99. disp(num);
  100. }
  101. }
  102. voidnb_flash(void)/*南北方向的黄灯和数码管显示子函数*/
  103. {
  104. uinta;
  105. for(a=3;a>0;a--)
  106. {
  107. P2=0xf5;
  108. nb=1;                            //
  109. delay(100);
  110. nb=0;                            //
  111. disp(a);
  112. }
  113. }
  114. voiddongxi()/*东西方向的红绿灯和数码管显示子函数*/
  115. {
  116. uintnum;
  117. num=30;
  118. while(num<=30&&num>15)
  119. {
  120. P2=0xde;
  121.               disp(num);
  122. num--;
  123. }
  124. while(num<=15&&num>3)/*东西方向及转弯的红绿灯和数码管显示子函数*/
  125. {
  126. num--;
  127. P2=0x5e;
  128. disp(num);
  129. }
  130. while(num<=3&&num>0)/*东西方向的黄灯和数码管显示子函数*/
  131. {
  132. P2=0xee;
  133. dx=1;                            //
  134. delay(100);
  135. dx=0;                                          //
  136. disp(num);
  137. num--;
  138. }
  139. }
  140. voidxint0()interrupt2/*中断定义*/
  141. {
  142. TH0=(65536-50000)/256;
  143. TL0=(65536-50000)%256;
  144. LED_ON();                                          //
  145. }
  146. voidLED_ON()                            //中断2全红灯
  147. {
  148. uintb;
  149. rn=0;                                          //南北红
  150. rw=0;                                          //东西红
  151. gn=1;                                          //南北绿
  152. gw=1;                                          //东西绿
  153. nb=1;                                          //南北黄
  154. dx=1;                                          //东西黄
  155. for(b=5;b>0;b--)
  156. {
  157. ge=0;
  158. shi=1;
  159. P0=table[b];
  160. delay(1000);
  161. ge=1;
  162. shi=1;
  163. }
  164. return;
  165. }
复制代码

全部资料51hei下载地址:
基于单片机交通显示系统的设计与仿真.zip (522.66 KB, 下载次数: 11)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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