图3.16 信号灯的连接
在本设计中,实际控制的灯只有6个,即:东西红灯,东西绿灯,东西黄灯,南北红灯,南北绿灯,南北黄灯。其中均是低电平有效。
共有3钟状态:东西红灯亮,南北绿灯亮(EEH);东西黄灯亮,南北黄灯亮(DBH);东西绿灯亮,南北红灯亮(F5H)。
括号中是PA端口8个引脚值PA0,PA1,PA2,PA3,PA4,PA5,PA6,PA7对应的十六进制码。
在用于显示发光二极管时,直接由MOV指令将十六进制码送入P0口。刚才的3个状态是依次变换的,这就要涉及到状态的判断和衔接了。
3.11 报警电路和按键控制电路
(1)报警电路
本设计采用一般蜂鸣器,蜂鸣器使用NPN三极管进行驱动控制,当连接到单片机上的引脚输出为低电平,74LS04输出为高电平,NPN导通,蜂鸣器蜂鸣;当连接到单片机上的引脚输出高电平时,74LS04输出为低电平,NPN截止,蜂鸣器停止蜂鸣。如图3.17所示。
17
图3.17 报警电路
(2)按键控制电路
本设计设置了2个独立式按键:S11键,S12键。每个按键一端接地,另一端接上拉电阻。低电平有效,当按键按下端口接地,单片机捕获到低电平,从而知道相应的输入信息。绿灯时间时,当S11键按下,显示东西方向车流量;当S12键按下,显示南北方向车流量。如图3.18所示。
图3.18 按键控制电路
4 系统软件设计
本设计的全部控制程序实际上分为若干子程序:T0中断子程序,东西、南北路口红外检测中断子程序,1ms延时子程序,时间显示子程序,黄灯闪烁5s子程序,检测车流量与显示子程序,报警子程序等。
4.1 1秒的设定和T0定时器
18
延时方法可以有两种一中是利用MCS-51内部定时器才生溢出中断来确定1秒的时间,另一种是采用软延时的方法。本设计采用T0定时器方法来设定1S时间。其中T0定时又有两种方法:中断和查询。这里采用T0定时器中断方法。
(1)定时器工作原理
定时器工作的基本原理其实就是给初值,让它不断加1直至减完为模值,这个初值是送到TH和TL中的。它是以加法记数的,并能从全1到全0时自动产生溢出中断请求。因此,我们可以把计数器记满为零所需的计数值,即所要求的计数值设定为C,把计数初值设定为TC可得到如下计算通式[14]: TC?M? (4.1)
C式中:M为计数器模值。计数值并不是目的,目的是时间值,设计1次的时间,即定时器计数脉冲的周期为T计数,它是单片机系统主频周期的12倍,设要求的时间值为T,则有C?TT计数。计算通式变为:
T??M?TC?T计数 (4.2)
模值和计数器工作方式有关。在方式0时M为8192;在方式1时M的值为65536;在方式2和3为256。就此可以算出各种方式的最大延时。如单片机的主脉冲频率为12MHZ,经过12分频后,若采用方式0最大延时只有8.129毫秒,采用方式1最大延时也只有65.536毫秒。这就是为什么扫描周期为50ms的原因,
若使用软件则会耽搁程序流程,显然不可行。相反,时间计时方面却不可能只用计数器,因为显然1秒钟已经超过了计数器的最大定时间,所以我们还必须采用定时器和软件相结合的办法才能解决这个问题。
(2)1秒的方法
我们采用在主程序中设定一个初值为20的软件计数器和使T0定时50毫秒.这样每当T0到50毫秒时CPU就响应它的溢出中断请求,进入他的中断服务子程序。在中断服务子程序中,CPU先重装入定时器初值,再使软件计数器减1,然后判断它是否为零,为零表示1秒已到可以返回到输出时间显示程序。
1)主程序:
定时器需定时50毫秒,故T0工作于方式1。初值:
TC?M?TT计数=2
16
-50ms/1us=15536=3CBOH
ORG 1000H
START: MOV TMOD,#01H ;令T0为定时器方式1 MOV TH0,#3CH ;装入定时器初值 MOV TL0,#0BOH ;
MOV IE,#82H ;开T0中断 SETB TR0 ;启动T0计数器 MOV RO,#14H ;软件计数器赋初值 LOOP: SJMP $ ;循环等待中断 2)T0中断服务子程序: ORG 000BH AJMP BRTO ORG 0300H
19
BRTO: MOV TH0,#3CH ;重装入定时器初值
MOV TL0,#0BOH ; DJNZ R0,NEXT
MOV R0,#14H ;恢复R0值
AJMP TIME ;跳转到时间及信号灯显示子程序
NEXT: RET1 END
本设计中的T0中断子程序流程图如图4.1所示。
开始T0赋50ms初值黄灯闪烁初值加1是否够1s?Y重赋50ms初值N重赋50ms初值重赋1s循环次数倒计时减1报警初值减1调时间显示子程序返回断点
图4.1 T0中断子程序流程图
4.2 东西、南北路口红外检测中断子程序
本系统主要使用了外部中断,中断信号有引脚INT0和INT1输入,低电平有效,CPU每个时钟周期都会检测INT0和INT1上的信号,89C51允许外部中断以电平方式或负边沿方式两种中断方式输入中断请求信号,可由用户通过设置TCON中IT0和IT1位的状态来实现。以IT0为例,IT0=0,为电平触发方式,IT0=1,为负边沿触发方式,本设计采用边沿触发方式,IE0为其中断标志位,有中断信号则置位,中断服务子程序响应后,IE0自动清零。IE中的EA为允许中断的总控制位,为1开启,EX0为外部中断允许控制位,为1开
20
启。
在优先级的允许下,一旦有外部中断信号产生,单片机CPU首先保护断点,PC值进栈,然后执行相应的中断服务子程序,执行完后,用RETI指令返回,此时CPU会从堆栈中取保存的断点地址,送回PC,程序再正常执行。
正常情况下,红外对管导通,INT0和INT1输入为低电平,CPU不中断;当有车辆经过时,红外对管不导通,INT0和INT1输入为高电平,向CPU输入中断请求信号,CPU中断,并执行相应的中断服务子程序,即报警或记录车流量。本设计中的东西、南北路口红外检测中断子程序流程图如图4.2所示。
开始N是否绿灯时间?Y调报警子程序调检测车流量与显示子程序返回断点
图4.2 东西、南北路口红外检测中断子程序流程图
4.3 1ms软件延时子程序
MCS-51的工作频率为12MHZ,机器周期与主频有关,机器周期是主频的12倍,所以一个机器周期的时间为12*(1/12MHZ)=1us。我们可以知道具体每条指令的周期数,这样我们就可以通过指令的执行条数来确定1ms的时间,但同时由于单片机的运行速度很快其他的指令执行时间可以忽略不计。本设计中的1ms延时子程序流程图如图4.3所示。
开始1ms延时预定值延时是否够1ms?YN结束
图4.3 1ms延时子程序流程图
4.4 时间显示子程序
21