1基于STC90C51单片机的交通灯设计1、设计题目基于STC90C51单片机的智能交通灯设计2、设计要求2.1、系统功能(1)按照交通规则,控制宝田路和前进路方向及其人行道的交通信号灯(红﹑黄﹑绿)的通断。(2)设置信号灯的通断时间。(3)可人工干预,使交通信号灯开启不同模式。2.2、性能参数:(1)电源:5VDC(2)LED灯电流:10mA(3)定时时间:10s-200s3、总体设计根据系统功能和设计要求,系统采用单片机控制的方案,基于HC6800S开发板,由STC90C51,74HC573,交通灯模块,动态数码显示管以及4*2独立按键组成。3.1系统工作原理在十字路口,分为宝田路和前进路,正常情况下,在任一时刻只有一个方向通行,另一方向禁行,持续一定时间,经过短暂的过渡时间,将通行禁行方向对换。其具体状态如下:(1)普通模式:状态一:宝田路通行阶段(宝田路及其人行道亮绿灯30秒、前进路及其人行道亮红灯30秒);状态二:黄灯阶段(宝田路和前进路亮黄灯5秒、两侧人行道亮红灯5秒);状态三:前进路通行阶段(前进路及其人行道亮绿灯30秒、宝田路及其人行道亮红灯30秒);状态四:黄灯阶段(宝田路和前进路亮黄灯5秒、两侧人行道亮红灯5秒);返回到状态一。(2)高峰期模式(设宝田路为主干道):按下按键2(key2),开启高峰期模式;状态一:宝田路通行阶段(宝田路及其人行道亮绿灯60秒、前进路及其人行道亮红灯230秒);状态二:黄灯阶段(宝田路和前进路亮黄灯5秒、两侧人行道亮红灯5秒);状态三:前进路通行阶段(前进路及其人行道亮绿灯30秒、宝田路及其人行道亮红灯30秒);状态四:黄灯阶段(宝田路和前进路亮黄灯5秒、两侧人行道亮红灯5秒);返回到状态一;按键2释放,回到普通模式。(3)紧急模式:按下按键1(key1),开启紧急模式,所有道路及其人行道均红灯亮,数码管不显示。释放按键1,回到普通模式。3.2单片机交通控制系统的功能要求本设计能模拟基本的交通控制系统,用红绿黄灯表示禁行,通行和等待的信号发生,还能进行倒计时显示,通行时间调整功能和紧急情况全面禁行。(1)倒计时显示倒计时显示可以提醒驾驶员在信号灯灯色发生改变的时间、在“停止”和“通过”两者间作出合适的选择。驾驶员和行人普遍都愿意选择有倒计时显示的信号控制方式,并且认为有倒计时显示的路口更安全。倒计时显示是用来减少驾驶员在信号灯色改变的关键时刻做出复杂判断的一种方法,它可以提醒驾驶员灯色发生改变的时间,帮助驾驶员在“停止”和“通过”两者间作出合适的选择。(2)时间的设置本设计中对时间进行了人为控制设置,正常情况下宝田路和前进路的绿灯通行与红灯禁行时间均设置为30秒、黄灯等待时间设置为5秒。假设前进路为主干道,考虑到主干道在上下班高峰期车流量和人流量较大,人为增加开关K2。当K2开启时,主干道前进路上绿灯通行时间和宝田路上的红灯禁行时间更改为60秒,其余设置均不变;当K1关闭时,又恢复正常情况下的时间设置。(3)紧急情况全面禁行本设计中在紧急情况下增加了全面禁行状态,增加开关K1。当K1开启时,宝田路和前进路及其各自人行道均量红灯禁行;当K1关闭时,交通灯恢复正常状态。4、详细设计—硬件设计为了实现本设计要求的具体功能,选用STC90C51单片机及外围器件构成最小控制系统,10个发光二极管分别分成两组红黄绿和两组红绿灯构成信号灯指示模块,4个LED动态数码管构成各个方向倒计时显示模式,两个按键分别用来设置高峰期模式和紧急模式。4.1、单片机系统设计3单片机设计交通灯控制系统,可用单片机直接控制信号灯的状态变化,基本上可以指挥交通的具体通行,当然,接入LED数码管就可以显示倒计时以提醒行使者,更具人性化。单片机上电后,系统进入正常工作状态,执行交通灯状态显示控制,同时将时间数据倒计时输入到LED数码管上实时显示。HC6800S整体结构视图:STC90C51内部结构图:4STC90C51芯片引脚图:4.2、LED数码管显示屏设计LED动态数码管的显示原理为:2位8段数码管电路采用“共阳”连接驱动代码,如右图所示。段码和位码,段码即段选信号SEG,它负责数码管显示的内容,图中a~g、dp组成的数据(a为最低位,dp为最高位)就是段码。位码即位选信号DIG,它决定哪个数码管工作,哪个数码管不工作。LED数码管显示代码表如下表所示:显示数值dp,g,f,e,d,c,b,a代码0011111110x3f1000001100x062010110110x5b3010011110x4f4011001100x665011011010x6d6011111010x7d7000011010x078011111110x7f9011011110x6fHC6800S开发板中动态数码管模块原理图如下图所示:54.3、交通灯设计HC6800S开发板中交通灯模块原理图如下图所示,宝田路红黄绿灯及其人行道上的红绿灯和前进路上的红黄绿灯由JP1控制,前进路人行道上的红绿灯由J22控制。65、详细设计—软件设计5.1、软件开发工具和环境keilC51μVision6.125.2、软件总体设计5.2.1总体结构流程图如下NYYNNYYN5.2.2子结构软件设计(1)普通模式主程序,即普通模式开始检测是否为紧急模式?检测是否为高峰模式?检测按键1是否按下?检测按键2是否按下?执行相应程序,即紧急模式执行相应程序,即高峰期模式7程序流程简图如下:程序源代码如下:while(1){if(S==71)S=0;/*宝田路通行,宝田路绿灯亮30秒*/if(S31){Data[0]=0x00;Data[1]=0x00;Data[2]=duan[(30-S)/10];Data[3]=duan[(30-S)%10];Data[4]=0x00;Data[5]=0x00;Data[6]=Data[2];Data[7]=Data[3];开始初始化设定初值红灯闪烁,倒计时30秒结束黄灯闪烁,倒计时5秒绿灯闪烁,倒计时30秒黄灯闪烁,倒计时5秒8Display();led=0xFF;//将所有的灯都熄灭RED00=1;GREEN00=1;GREEN10=0;//宝田路人行道绿灯亮GREEN11=0;//宝田路绿灯亮RED00=0;//前进路人行道红灯亮RED01=0;//前进路红灯亮}/*黄灯阶段,5秒*/elseif(S36){Data[0]=0x00;Data[1]=0x00;Data[2]=duan[(35-S)/10];Data[3]=duan[(35-S)%10];Data[4]=0x00;Data[5]=0x00;Data[6]=Data[2];Data[7]=Data[3];Display();led=0xFF;//将所有的灯都熄灭RED00=1;GREEN00=1;RED10=0;//宝田路人行道红灯亮YELLOW11=0;//宝田路黄灯亮RED00=0;//前进路人行道红灯亮YELLOW01=0;//前进路黄灯亮}/*前进路通行,前进路绿灯亮30秒*/elseif(S66){Data[0]=0x00;Data[1]=0x00;Data[2]=duan[(65-S)/10];Data[3]=duan[(65-S)%10];Data[4]=0x00;9Data[5]=0x00;Data[6]=Data[2];Data[7]=Data[3];Display();led=0xFF;RED00=1;GREEN00=1;RED10=0;RED11=0;GREEN00=0;GREEN01=0;}/*黄灯阶段,5秒*/else{Data[0]=0x00;Data[1]=0x00;Data[2]=duan[(70-S)/10];Data[3]=duan[(70-S)%10];Data[4]=0x00;Data[5]=0x00;Data[6]=Data[2];Data[7]=Data[3];Display();led=0xFF;RED00=1;GREEN00=1;RED10=0;YELLOW11=0;RED00=0;YELLOW01=0;}}10(2)按键检测流程图如下:NYNYNY所需延时子函数源代码如下:voiddelayms(){//延时子函数,延时约10msuinta,b;for(a=10;a0;a--)for(b=110;b0;b--);}开始寄存器初始化I/O端口初始化检测是否有按键按下?去抖延时检测是否有按键按下?检测是否有按键释放?执行相应代码11(3)紧急模式程序流程简图如下:NY程序源代码如下:/*按下按键1,开启紧急模式,所有红灯亮,数码管不显示*/if(key1==0){delayms();//去抖延时if(key1==0){Data[0]=0x00;Data[1]=0x00;Data[2]=0x00;Data[3]=0x00;Data[4]=0x00;Data[5]=0x00;Data[6]=0x00;Data[7]=0x00;Display();led=0xFF;RED00=1;GREEN00=1;RED10=0;RED11=0;RED00=0;开始普通模式紧急模式按下按键1?12RED01=0;while(!key1);//按键1释放}}keyscan();}}(4)高峰模式程序流程简图如下:NY程序源代码如下:/*按下按键2,开启上下班高峰期模式,主干道宝田路绿灯时间为60秒*/voidkeyscan(){if(key2==0){delayms();//去抖延时if(key2==0){while(1){if(key2!=0)break;//当按键2释放,跳出循环if(M==101)M=0;if(M61){Data[0]=0x00;Data[1]=0x00;Data[2]=duan[(60-M)/10];普通模式高峰模式按下按键2?开始13Data[3]=duan[(60-M)%10];Data[4]=0x00;Data[5]=0x00;Data[6]=Data[2];Data[7]=Data[3];Display();led=0xFF;RED00=1;GREEN00=1;GREEN10=0;GREEN11=0;RED00=0;RED01=0;}elseif(M66){Data[0]=0x00;Data[1]=0x00;Data[2]=duan[(65-M)/10];Data[3]=duan[(65-M)%10];Data[4]=0x00;Data[5]=0x00;Data[6]=Data[2];Data[7]=Data[3];Display();led=0xFF;RED00=1;GREEN00=1;RED10=0;YELLOW11=0;RED00=0;YELLOW01=0;}elseif(M96){Data[0]=0x00;Data[1]=0x00;Data[2]=duan[(95-M)/10];14Data[3]=duan[(95-M)%10];Data[4]=0x00;Data[5]=0x00;Data[6]=Data[2];Data[7]=Data[3];Display();led=0xFF;RED00=1;GREEN00=1;RED10=0;RED11=0;GREEN00=0;GREEN01=0;}else{Data[0]=0x00;Data[1]=0x00;Data[2]=duan[(100-M)/10];Data[3]=duan[(100-M)%10];Data[4]=0x00;Data[5]=0x00;Data[6]=Data[2];Data[7]=Data[3];Display();led=0xFF;RED00=1;GREEN00=1;RED10=0;YELLOW11=0;RED00=0;YELLOW01=0;}}while(!key2);//等待按键释放}}15}5.3、定时程序设计进入主程序后,首先要对定时器和中断有关的寄存器初始化。初始化过程如下:(1)对TMOD赋值,