目录一、设计背景及意义当今,红绿灯安装在个个道口上,已经成为疏导交通车辆最常见和最有效的手段。
单片机具有性价比高、集成度高、可靠性好、抗干扰性强等特点,广泛运用于各种智能仪器中。
基于新型规则的可编程交通控制系统,可以实现对车辆、行人的控制,使的交通便于管理。
所以,采用单片机自动控制交通灯有现实的社会意义。
二、设计任务1. 采用AT89C51芯片;2. 使用发光二极管(红,黄,绿)代表各个路口的交通灯;3. 用8段数码管对转换时间进行倒时;4、带紧急按钮功能,当紧急按钮按下时,所有方向均亮起红灯;5. 控制程序采用C语言编程。
三、控制系统设计原理3.1 设计思路利用单片机实现交通灯的控制,该任务分以下几个方面:a、实现红、绿、黄灯的循环控制。
要实现此功能需要表示三种不同颜色的LED灯分别接在P1个管脚,用软件实现。
b、用数码管显示倒计时。
可以利用动态显示或静态显示,串行并出或者并行并出实现。
c、紧急状况功能。
这需要人工实现,编程时利用到中断才能带到目的,只要有按钮按下,那么四个方向全部显示红灯,禁止车辆通行。
当情况解除(再次按下按钮),重新回到初始状态。
3.2 总体设计图图13.2.1 交通灯循环控制使用AT89C51单片机完成对十字路口交通灯的控制,十字路口的工作过程分为东西方向和南北方向两个干道的红绿黄灯工作状态(红灯亮表示禁止通行,绿灯亮表示允许通行,黄灯亮表示提醒红绿灯之间状态的切换)的控制,每个工作状态的时间设为40s,采用循环的控制方式,具体控制过程如下(如图2):1、系统工作开始后,首先进入初始设定阶段,东西方向亮红灯,南北方向亮绿灯;2、进入状态1的倒计时阶段,东西方向的红灯开始40s倒计时,南北方向绿灯开始35s倒计时;3、进入状态1过渡阶段,东西方向红灯开始最后5s倒计时,南北方向黄灯亮并开始5s倒计时;4、过渡阶段1完成后,东西方向亮绿灯,南北方向亮红灯;5、进入状态2的倒计时阶段,南北方向的红灯开始40s倒计时,东西方向绿灯开始35s倒计时;6、进入状态2过渡阶段,南北方向红灯开始最后5s倒计时,东西方向黄灯亮并开始5s倒计时;7、过渡阶段2完成后,进入状态1,开始循环。
图23.2.2 倒计时显示使用8段LED数码管进行倒计时的显示此处采用LED静态显示方式,当显示器显示某个字符时,相应的段恒定的导通或截止,直到显示另个字符为止。
89C51的串行口RXD和TXD为一个全双工串行通信口,但工作在方式0下可作同步移位寄存器,其数据由RXD端串行输出或输入;而同步移位时钟由TXD端串行输出,在同步时钟的作用下,实现由串行到并行的数据通信。
在不需要使用串行通信的场合,利用串行口加外围芯片74LS164就可构成一个或多个并行输入\输出口,用于串——并转换或显示器LED驱动。
此利用后者。
3.2.3 紧急状况当遇到紧急情况如救护车通过、交通事故等时,可按下紧急状况按钮,是东西方向和南北方向全部亮红灯,保证紧急情况得到及时解决。
待情况解决后,交通灯的工作情况回到初始设定阶段,从而保证交通流畅。
为了实现此功能,利用单片机中断达到目的。
利用一个手动按钮开关接至单片机外部中断0,同时在软件设计时将其设为最高优先级。
当有按键按下,四方全为红灯,当再按下按钮,回到初始位置继续执行。
3.3 AT89C51AT89C51是一种带4K字节闪存可编程可擦除只读存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。
单片机的可擦除只读存储器可以反复擦除1000次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器。
AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
3.3.1 AT89C51单片机的主要特性与MCS-51 兼容,4K字节可编程闪烁存储器,可以反复擦除1000次,数据保留时间可达10年,全静态工作,三级程序存储器锁定,128*8位内部RAM,32可编程I/O线,两个16位定时器/计数器,5个中断源(两个外部中断源和3个内部中断源),可编程串行通道,低功耗的闲置和掉电模式,片内振荡器和时钟电路(时钟电路的作用是产生单片机工作所需要的时钟脉冲序列),中断系统(中断系统的作用主要是对外部或内部的终端请求进行管理与处理)。
AT89S51共有5个中断源,其中又2个外部中断源和3个内部中断源。
图3 AT89C51系列单片机的内部结构示意图3.3.2 AT89C51 引脚功能图4 AT89C51引脚图·VCC:电源电压·GND:接地·P0口:P0口是一组8位双向I/0口。
P0口即可作地址/数据总线使用,又可以作为通用的I/O口使用。
当CPU访问片外存储器时,P0口分时先作低8位地址总线,后作双向数据总线,此时,P0口就不能再作I/O口使用了。
在访问期间激活要使用上拉电阻。
·P1口:Pl 是一个带内部上拉电阻的8准位双向I/O口,P1作为通用的I/O 口使用。
·P2 口:P2 是一个带有内部上拉电阻的8 位准双向I/O 口,P2即可作为通用的I/O口使用,也可以作为片外存储器的高8位地址总线,与P0口配合,组成16位片外存储器单元地址。
·P3 口:P3 口是一组带有内部上拉电阻的8 位准双向I/0 口。
P3 口除了作为通用的I/O口使用之外,每个引脚还具有第二功能,具体分配如表1表1 具有第二功能的P3口引脚·RST:复位输入。
当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。
WDT 溢出将使该引脚输出高电平,设置SFR AUXR的DISRT0 位(地址8EH)可打开或关闭该功能。
DISRT0位缺省为RESET输出高电平打开状态。
·ALE/PROG:当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。
即使不访问外部存储器,ALE 仍以时钟振荡频率的1/6 输出固定的正脉冲信号,因此它可对外输出时钟或用于定时目的。
·PSEN:程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当AT89S51 由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲。
当访问外部数据存储器,没有两次有效的PSEN信号。
·EA/VPP:外部访问允许。
·XTAL1:振荡器反相放大器及内部时钟发生器的输入端。
3.3.3 AT89C51中断源AT89C51有5个中断源,它们是两个外中断INT0(P3.2)和INT1(P3.3)、两个片内定时/计数器溢出中断TF0和TF1,一个是片内串行口中断TI或RI,这几个中断源由TCON和SCON两个特殊功能寄存器进行控制,其中5个中断源的程序入口地址如表2所示:表2 中断源的服务程序入口地址3.4 LED数码管LED显示器有两中工作方式:静态显示方式和动态显示方式。
静态显示的特点是每个数码管必须接一个8位锁存器用来锁存待显示的字型码。
送入一次字型码显示自行一直保持,直到送入新字型码为止。
这种方法的优点是占用CPU时间少,显示便于监测和控制。
缺点是硬件电路比较复杂,成本较高。
各数码管在显示过程中持续得到显示信号,与各数码管接口的I/O口是专用的。
动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。
这样一来,就没有必要每一位数码管配一个锁存器,从而大大地简化了硬件电路。
选亮数码管采用动态扫描显示。
所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。
动态显示的亮度比静态显示要差一些,所以在选择限流电阻时应略小于静态显示电路中的。
各数码管在显示过程中轮流得到显示信号,与各数码管接口的I/O口是共用的。
该设计采用如下所示的数码管,分别显示南北和东西灯的剩余时间。
片选部分和数码段显示部分,分别接单片机管脚的P2口和P0口,具体的共阴数码管下见图。
其中,A到G为码段控制端口,1,2为片选端口。
四、硬件设计4.1时钟部分电路设计时钟电路用于产生MCS-51单片机工作时所必须的时钟控制信号。
其内部电路在时钟信号控制下,严格地按时序执行指令进行工作。
在执行指令时,CPU首先要到程序存储器中取出需要执行的指令操作码,然后译码,并由时序电路产生一系列控制信号去完成指令所规定操作。
本设计采用12MHz晶振和两个33Pf瓷片电容,他们构成一个稳定的自激振荡器。
该电容的大小影响振荡器频率的高低、振荡器的稳定性和起振的快速性。
为单片机提供标准时钟。
其中两个瓷片电容起微调作用。
如图所示:4.2复位部分电路设计复位引脚RST通过一个斯密特触发器与复位电路相连,斯密特触发器用来抑制噪声,在每个机器周期的S5P2,斯密特触发器的输出电平由复位电路采样一次,然后才能得到内部复位操作所需要的信号。
复位电路通常采用上电自动复位和按钮复位两种方式。
该设计采用加电直接复位,复位电容采用10uF,电阻10000欧,为了节省元件,没有采用上电加按键模式。
加电瞬间,RES管脚为高电平。
通过电阻回路放电,使电压逐渐降为零,从而实现了复位功能。
其连接图如下图所示:4.3 硬件设计总电路图五、软件设计5.1 设计流程图5.2 程序清单#include <reg52.h>sbit ADDR3 = P1^3;sbit ENLED = P1^4;unsigned char code LedChar[] = { //数码管显示字符转换表0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};unsigned char LedBuff[7] = { //数码管+独立LED显示缓冲区0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};bit flag1s = 1;unsigned char T0RH = 0;unsigned char T0RL = 0;void ConfigTimer0(unsigned int ms);void TrafficLight();void main(){TMOD = 0x01;TH0 = (65536 - DELAY) / 256;TL0 = (65536 - DELAY) % 256;EA = 1; //开总中断ET0 = 1;TR0 = 1;P0=0xff;P1=0x00; //设置定时器为中断工作模式ENLED = 0; //使能数码管和LEDADDR3 = 1;ConfigTimer0(1); //配置T0定时1mswhile(NSEMERGENCY&&EWEMERGENCY) //紧急情况处理{timeDisplay_Blue();timeDisplay_Red();if(flag)stateChange();stateChange_Glint();}while (1){if (flag1s) //每秒执行一次交通灯刷新{flag1s = 0;TrafficLight();}}}void ConfigTimer0(unsigned int ms){unsigned long tmp; //临时变量tmp = 11059200 / 12; //定时器计数频率tmp = (tmp * ms) / 1000; //计算所需的计数值tmp = 65536 - tmp; //计算定时器重载值tmp = tmp + 18; //补偿中断响应延时造成的误差T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节T0RL = (unsigned char)tmp;TMOD &= 0xF0; //清零T0的控制位TMOD |= 0x01; //配置T0为模式1TH0 = T0RH; //加载T0重载值TL0 = T0RL;ET0 = 1; //使能T0中断TR0 = 1; //启动T0}void TrafficLight(){static unsigned char color = 2;static unsigned char timer = 0;if(timer == 0){switch(color){case 0:color = 1;timer = 2;LedBuff[6] = 0xE7;break;case 1:color = 2;timer = 29;LedBuff[6] = 0xFC;break;case 2:color = 0;timer = 39;LedBuff[6] = 0x3F;break;default:break;}}else{timer--;}LedBuff[0] = LedChar[timer%10];LedBuff[1] = LedChar[timer/10];}void LedScan(){static unsigned char i = 0; //动态扫描索引P0 = 0xFF; //关闭所有段选位,显示消隐P1 = (P1 & 0xF8) | i; //位选索引值赋值到P1口低3位P0 = LedBuff[i]; //缓冲区中索引位置的数据送到P0口if (i < 6) //索引递增循环,遍历整个缓冲区i++;elsei = 0;}void InterruptTimer0() interrupt 1{static unsigned int tmr1s = 0; //1秒定时器TH0 = T0RH; //重新加载重载值TL0 = T0RL;LedScan(); //LED扫描显示tmr1s++; //1秒定时的处理if (tmr1s >= 1000){tmr1s = 0;flag1s = 1; //设置秒定时标志}}六、总结经过三个星期的努力,终于完成了自己的计算机控制课程设计。