由单片机,交通灯状态显示系统、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黄灯闪烁显示
单片机源程序如下:
- #include<reg51.h>
- #include<intrins.h>
- #defineuintunsignedint
- #defineucharunsignedchar
- uchartemp,aa,nn;
- sbitrn=P2^0; //南北红灯
- sbitnb=P2^1; //南北黄灯
- sbitgn=P2^2; //南北绿灯
- sbitrw=P2^3; //东西方向红灯
- sbitdx=P2^4; //东西方向黄灯
- sbitgw=P2^5; //东西方向绿灯
- sbitshi=P3^6; //十位
- sbitge=P3^7;//个位
- bitflag=0;
- ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,
- 0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,
- 0x79,0x71};/*将数字0123456789的16进制数定义成数组用以显示*/
- voiddelay(uintz);//延迟
- voiddisp(uintn);
- voidnb_flash(void);
- voiddx_flash(void);
- voidxint0();
- voidtimer0();
- voidLED_ON();
- voidxint1();
- voidnanbei();
- voiddongxi();/*将所使用的子函数定义*/
- voidmain()
- {
- uintnum;
- num=0;
- aa=0;
- TMOD=0x01; //方式116位定时器
- TH0=(65536-50000)/256;//定义装入定时器高8位的时间常数
- TL0=(65536-50000)%256;//定义装入定时器低8位的时间常数
- EA=1; //开关总中断
- ET0=1; //允许定时器T0中断
- TR0=1; //打开定时器T0
- EX0=1; //允许外部中断0中断
- IT0=0; //禁止T0溢出中断
- EX1=1; //允许外部中断1中断
- IT1=1;/*中断初始化*/ //允许T1溢出
- while(1)
- {
- nanbei();
- nb_flash();
- dongxi();
- }
- }
- voiddelay(uintz) //延迟
- {uintx,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- voidtimer0()interrupt1
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- aa++;
- if(aa==9)
- {
- aa=0;
- flag=1;
- }
- }
- voiddisp(uintn)/*显示子函数*/
- {
- while(!flag) //flag=0
- {
- ge=0;
- P0=table[n%10];
- delay(50);
- shi=1;
- ge=1;
- shi=0;
- P0=table[n/10];
- delay(50);
- shi=1;
- ge=1;
- }
- if(flag==1)
- flag=0;
- }
- voidnanbei()/*南北方向的红绿灯和数码管显示子函数*/
- {
- uintnum;
- num=30;
- disp(num);
- while(num<=30&&num>15)
- {
- num--;
- P2=0xf3;
- disp(num);
- }
- while(num<=15&&num>4)/*南北方向及转弯的红绿灯和数码管显示子函数*/
- {
- num--;
- P2=0xb3;
- disp(num);
- }
- }
- voidnb_flash(void)/*南北方向的黄灯和数码管显示子函数*/
- {
- uinta;
- for(a=3;a>0;a--)
- {
- P2=0xf5;
- nb=1; //
- delay(100);
- nb=0; //
- disp(a);
- }
- }
- voiddongxi()/*东西方向的红绿灯和数码管显示子函数*/
- {
- uintnum;
- num=30;
- while(num<=30&&num>15)
- {
- P2=0xde;
- disp(num);
- num--;
- }
- while(num<=15&&num>3)/*东西方向及转弯的红绿灯和数码管显示子函数*/
- {
- num--;
- P2=0x5e;
- disp(num);
- }
- while(num<=3&&num>0)/*东西方向的黄灯和数码管显示子函数*/
- {
- P2=0xee;
- dx=1; //
- delay(100);
- dx=0; //
- disp(num);
- num--;
- }
- }
- voidxint0()interrupt2/*中断定义*/
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- LED_ON(); //
- }
- voidLED_ON() //中断2全红灯
- {
- uintb;
- rn=0; //南北红
- rw=0; //东西红
- gn=1; //南北绿
- gw=1; //东西绿
- nb=1; //南北黄
- dx=1; //东西黄
- for(b=5;b>0;b--)
- {
- ge=0;
- shi=1;
- P0=table[b];
- delay(1000);
- ge=1;
- shi=1;
- }
- return;
- }
复制代码
全部资料51hei下载地址:
基于单片机交通显示系统的设计与仿真.zip
(522.66 KB, 下载次数: 11)
|