任务一交通灯控制系统设计思维导图任务一完成交通灯控制系统的设计学会单片机定时器的用法,理解中断系统的原理与设置情境导入十字路口车辆穿梭,行人熙攘,车行车道,人行人道,有条不紊。那么靠什么来实现这井然秩序呢?靠的就是交通信号灯的自动指挥系统。交通信号灯控制方式很多。本次实训利用单片机ATSC51来设计交通灯控制器,实现红绿黄灯的转换。任务描述本控制系统以生活中的红绿灯为设计蓝本,要求实现以下控制效果:东西方向南北方向东西方向放行30s绿灯亮红灯亮东西方向警告3s黄灯闪烁(10Hz)红灯亮南北方向放行40s红灯亮绿灯亮南北方向警告3s红灯亮黄灯闪烁(10Hz)知识准备中断系统的原理与应用1.中断系统的基本概念PU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生);CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务);待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断。2.中断源引起CPU中断的根源,称为中断源。中断源向CPU提出的中断请求。CPU暂时中断原来的事务A,转去处理事件B。对事件B处理完毕后,再回到原来被中断的地方(即断点),称为中断返回。实现上述中断功能的部件称为中断系统(中断机构)。知识准备MCS-51单片机提供了5个中断源,其中两个为外部中断请求源(P3.2)和(P3.3),两个片内定时器/计数器T0和T1的溢出请求中断源TF0(TCON的第5位)和TF1(TCON的第7位),1个片内串口发送或接收中断请求源TI(SCON的第1位)和RI(SCON的第0位)。3.中断的书写格式函数类型函数名(形式参数列表)[interruptn][usingm]其中,interrupt后面的n是中断编号,取值范围0~4,0代表外部中断0;1代表定时器中断0;2代表外部中断1;3代表定时器中断1;4代表串口中断。using中的m表示使用的工作寄存器组号(如不声明,则默认用第0组)。知识准备4.中断系统的控制定时器/计数器控制寄存器TCONTCON的功能是接收外部中断源(INT0、INT1)和定时器(T0、T1)送来的中断请求信号。字节地址为88H,可以进行位操作。表4-1列出了TCON的格式。8FH8EH8DH8CH8BH8AH89H88HTF1TR1TF0TR0IT0IT1IE0IT0•IT0和IT1分别为外部中断和的触发方式控制位,可以进行置位和复位。•TF0和TF1分别为定时器/计数器T0和T1的中断请求标志。•TR0和TR1分别为定时器/计数器T0和T1的启动/停止位。•IE0和IE1分别为外部中断和的中断请求标志位。知识准备中断允许控制寄存器IECPU对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE控制。中断允许寄存器IEEA××ESET1EX1ET0EX0。•EX0(IE.0),外部中断0允许位;•ET0(IE.1),定时/计数器T0中断允许位;•EX1(IE.2),外部中断0允许位;•ET1(IE.3),定时/计数器T1中断允许位;•ES(IE.4),串行口中断允许位;•EA(IE.7),CPU中断允许(总允许)位知识准备中断优先级控制寄存器IPMCS-51单片机有两个中断优先级,即可实现二级中断服务嵌套。每个中断源的中断优先级都是由中断优先级寄存器IP中的相应位的状态来规定的。×××PSPT1PX1PT0PX0串口T1INT1T0INT0PX0(IP.0),外部中断0优先级设定位;PT0(IP.1),定时/计数器T0优先级设定位;PX1(IP.2),外部中断0优先级设定位;PT1(IP.3),定时/计数器T1优先级设定位;PS(IP.4),串行口优先级设定位;PT2(IP.5),定时/计数器T2优先级设定位。串行通信控制寄存器SCONSCON的功能主要是接收串行通信口送到的中断请求信号知识准备MCS-51单片机的中断优先级有三条原则:CPU同时接收到几个中断时,首先响应优先级别最高的中断请求。正在进行的中断过程不能被新的同级或低优先级的中断请求所中断。正在进行的低优先级中断服务,能被高优先级中断请求所中断。为了实现上述后两条原则,中断系统内部设有两个用户不能寻址的优先级状态触发器。其中一个置1,表示正在响应高优先级的中断,它将阻断后来所有的中断请求;另一个置1,表示正在响应低优先级中断,它将阻断后来所有的低优先级中断请求。知识准备定时器的原理与设置定时器T0由两个8位计数器TH0和TL0构成,定时器T1也由两个8位计数器TH1和TL1构成,TMOD寄存器控制定时器的工作方式,TCON寄存器控制定时器的启动和停止以及定时器的状态。在作定时器使用时,输入的时钟脉冲是由晶体振荡器的输出经12分频后得到的。实际上,定时器就是单片机机器周期的计数器。因为每个机器周期包含晶体振荡器的12个振荡周期,而每一个机器周期定时器加1,故其频率为晶振频率的1/12。如果晶振频率为12MHz,则定时器每接收一个输入脉冲的时间为1µs。选择计数器工作方式时,计数脉冲来自相应的外部输入引脚T0(P3.4)或T1(P3.5)。在这种情况下,当检测到输入引脚上的电平由高跳变到低时,计数器就加1。知识准备在单片机中有两个特殊功能寄存器与定时/计数有关,这就是TMOD和TCON。TMOD和TCON是名称,我们在写程序时就可以直接用这个名称来指定它们,也可以直接用它们的地址89H和88H来指定它们(其实用名称也就是直接用地址,编译软件帮你翻译一下而已)。从图2中我们可以看出,TCON也被分成两部份,高4位用于定时/计数器,低4位则用于中断(我们暂不管)。而TF1(0)我们上面已提到了,当计数溢出后TF1(0)就由0变为1。知识准备:定时器/计数器功能选择位,=0时,设置为定时功能;从图中我们可以看出,TMOD被分成两部份,每部份4位。分别用于控制T1和T0。GATE:门控位,当GATE=1时,只有INT0或INT1引脚为高电平,且TR0或TR1置1时,定时器/计数器才工作。当GATE=0时,定时器/计数器仅受TR0或TR1的控制,而不管INT0或INT1引脚的电平是高还是低。M1M0:工作方式选择位。由M1M0共2位形成4种编码,对应以下4种工作方式。M1M0=00:工作方式0(13位方式)。M1M0=01:工作方式1(16位方式)。M1M0=10:工作方式2(8位自动装入时间常数方式)。MlM0=11:工作方式3(2个8位方式——仅对T0)。定时器/计数器的定时/计数范围工作方式0:13位定时/计数方式,因此,最多可以计到2的13次方,也就是8192次。工作方式1:16位定时/计数方式,因此,最多可以计到2的16次方,也就是65536次。工作方式2和工作方式3,都是8位的定时/计数方式,因此,最多可以计到2的8次方,也说是256次=1时,设置为计数功能。知识准备10KVCCEA/VP31X119X218RESET9RD17WR16INT012INT113T014T115P10/T1P11/T2P123P134P145P156P167P178P0039P0138P0237P0336P0435P0534P0633P0732P2021P2122P2223P2324P2425P2526P2627P2728PSEN29ALE/P30TXD11RXD10VCC40GND2080C5112MHZ20pF20pF10uF1KVCC100RXDTXDVCCCOM91B11C162B22C153B33C144B44C135B55C126B66C117B77C10ULN2003GND8VCCA1B2Q03Q14Q25Q36Q410Q511Q612Q713CLK8MR974LS164abfcgdeDPY1234567abcdefg8dpdp10920VCCA1B2Q03Q14Q25Q36Q410Q511Q612Q713CLK8MR974LS164abfcgdeDPY1234567abcdefg8dpdp10920VCCA1B2Q03Q14Q25Q36Q410Q511Q612Q713CLK8MR974LS164abfcgdeDPY1234567abcdefg8dpdp10920VCCA1B2Q03Q14Q25Q36Q410Q511Q612Q713CLK8MR974LS164abfcgdeDPY1234567abcdefg8dpdp10920VCCDINCLK电路原理图任务处理1.使用十字路口交通灯控制模块。2.打开KeiluVision2仿真软件,首先建立本实验的项目文件,根据项目要求编写项目源程序,进行编译,直到编译无误。3.进行软件设置,生成HEX文件。4.利用下载器将程序下载到单片机中,并上电观察程序结果是否正确任务处理参考程序:/**************************************//*交通灯*//**************************************///-------------------------------------库函数声明,管脚定义------------#includereg51.h#defineucharunsignedcharsbitLED_G1=P2^1;//东西绿灯sbitLED_Y1=P2^2;//东西黄灯sbitLED_R1=P2^3;//东西红灯sbitLED_G2=P2^4;//南北绿灯sbitLED_Y2=P2^5;//南北黄灯sbitLED_R2=P2^6;//南北红灯ucharsec,js,ms;任务处理/**************主程序*********************/voidmain(){P2=0x00;//熄灭所有灯EA=1;//开总中断ET0=1;//开定时器中断0允许位TMOD=0x01;//设置定时器0工作方式1TH0=(65536-50000)/256;//赋初值,定时时长为50msTL0=(65536-50000)%256;js=0;//初始化寄存器sec=0;ms=0;TR0=1;//开定时器0while(1){switch(ms){case0:LED_G1=1;LED_Y1=0;LED_R1=0;//东西向绿灯亮LED_G2=0;LED_Y2=0;LED_R2=1;//南北向红灯亮任务处理if(sec=30)//持续30s{sec=0;ms=1;}break;case1:LED_G1=0;LED_R1=0;//东西向黄灯闪烁if(js/2)LED_Y1=0;elseLED_Y1=1;LED_G2=0;LED_Y2=0;LED_R2=1;//南北向红灯亮if(sec=3)//持续3s{sec=0;ms=2;}break;case2:LED_G1=0;LED_Y1=0;LED_R1=1;//东西向红灯亮LED_G2=1;LED_Y2=0;LED_R2=0;//南北向绿灯亮任务处理if(sec=40)//持续40s{sec=0;ms=3;}break;case3:LED_G2=0;LED_R2=0;//南北向黄灯闪烁if(js/2)LED_Y2=0;elseLED_Y2=1;LED_G1=0;LED_Y1=0;LED_R1=1;//东西向红灯亮if(sec=3){sec=0;ms=0;}break;default:sec=0;ms=0;break;//出现故障回到初始状态}voidtime_0()interrupt1//定时器0服务子程序{任务处理TH0=(65536-50000)/256;//重装初值TL0=(65536-50000)%256;js++;//定时器进入次数自加一if(js=20)//计20次为1s{js=0;//清空,重新计数sec++;//秒加一}}同步训练1.AT89S51有级中断,个中断源。2.关于定时器,若振荡频率为12MHz,在方式2下最大定时时间为。3.关于定时器,若振荡频率为6MHz,在工作方式1下,