图3.10 按键示意图
首先程序不断扫描模式设置键,分别记为:S键,J键,F键,低电平有效,按键顺序是指定的,若直接按F键,则为自动调整模式,然后进入下一程序;若先按S键,再按J键,F键则为设置时间模式,然后进入下一程序。
程序的开始要判断是否有键按下,可以不断将S键值和F键值相与,与值为1则表示没有键按下,为0则表示有键按下。
接下来要判断具体是那个键,若为F键,则将自动标志位置1,进入下一程序,否则为S键,则表示设置南北绿灯时间,用R0存值,按1下加1,同时还需判断此时J键是否按下,若按下,则表示南北绿灯时间设置完毕,开始设置东西绿灯时间,用R1存值,同样按1下加1 ,同时判断此时F键是否按下,若按下,则表示时间设置完毕,进入下一程序。
在这个过程中,S,J键的计数是循环的,从初值20开始,加到40则循环回到20。
(4) 电源电路设计
由于单片机工作时需要的+5V电压,所以在设计电源电路时,需要一个电子元件能提供+5V电压,由于7805能够提供5V电压的三端稳压电源,在实际的电路控制中应用其作为电源电路较为广泛,在普通的电子元器件商场都有销售易于购买,并且技术相对成熟.7805一脚为电源输入端,二脚为公共接地端,三脚即为我们所需要的+5V电压输出端.本文采用最典型的7805提供电压的电路,即在7805的1脚和公共接地端(即2脚)之间接入0.3μF的电容,在公共接地端和三脚+5V电压输出端之间接入0.1μF的电容.
第27页 共43页
1D1LM78052+21.6v10.22μfVinVout3+5v0.1μfvcc220v交流U1U24C4GNDC523
图3.11 +5V电源电路
(5)7448七段显示译码器
7448七段显示译码器输出高电平有效,用以驱动共阴极显示器。该集成显示译码器设有多个辅助控制端,以增强器件的功能,可将单片机输出的四位二进制数转换成10进制数与七段数码管显示对应,用于显示0—9的数字。
图3.12 7448芯片
第28页 共43页
4 系统软件程序的设计
4.1程序主体设计流程
全部控制程序实际上分为若干模块:键盘设置处理程序,状态灯控制程序,LED显示程序,消抖动延时程序,次状态判断及处理程序,紧停或违规判断程序,中断服务子程序,车流量计数程序,红绿灯时间调整程序等。
整个软件程序方面主要分两大部分:按键处理程序和50ms扫描程序。流程图如图4.1所示。
第29页 共43页
图4.1 系统总流程图
首先是按键处理程序,89S51通过对IO扫描,确定是否有键按下,再判断具体是那个键按下,根据键值跳转到按键处理程序。按键处理结果可设置两种工作模式:红绿灯时间设置模式和红绿灯时间自动模式,次程序相当于系统的模式设置,若想重新设置则要按下复位键。设置过后进入50ms扫描程序。
50ms扫描程序开始后,先刷新显示模块,若为自动模式则接下来要计数车流量,然后扫描紧停信号和违规信号,若捕获则调用中断,中断服务子程序主要启动蜂鸣器,直至恢复键按下。50ms已到则重新扫描。扫描20次之后计时到达1s则时间数据减1,在显示模块中修改显示缓冲区内容。在半个状态对换时,车流量计数程序在一个状态变换循环先后计数两个方向的车流量,然后调用红绿灯时间调整程序,更新红绿灯时间。当前状态时间已到,则判断次状态装入相应数
第30页 共43页
据,然后进入下一状态。
4.2理论基础知识 4.2.1定时器原理
定时器工作的基本原理其实就是给初值,让它不断加1直至减完为模值,这个初值是送到TH和TL中的。它是以加法记数的,并能从全1到全0时自动产生溢出中断请求。因此,我们可以把计数器记满为零所需的计数值,即所要求的计数值设定为C,把计数初值设定为TC 可得到如下计算通式:
TC=M-C
式中,M为计数器模值。计数值并不是目的,目的是时间值,设计1次的时间,即定时器计数脉冲的周期为T0,它是单片机系统主频周期的12倍,设要求的时间值为T,则有C=T/T0。计算通式变为:
T=(M-TC)T0
模值和计数器工作方式有关。在方式0时M为8192;在方式1时M的值为65536;在方式2和3为256。就此可以算出各种方式的最大延时。如单片机的主脉冲频率为12MHZ,经过12分频后,若采用方式0最大延时只有8.129毫秒,采用方式1最大延时也只有65.536毫秒。这就是为什么扫描周期为50ms的原因,
若使用软件则会耽搁程序流程,显然不可行。相反,时间计时方面却不可能只用计数器,因为显然1秒钟已经超过了计数器的最大定时间,所以我们还必须采用定时器和软件相结合的办法才能解决这个问题。
4.2.2软件延时原理
MCS-51的工作频率为12MHZ,机器周期与主频有关,机器周期是主频的12倍,所以一个机器周期的时间为12*(1/12MHZ)=1us。我们可以知道具体每条指令的周期数,这样我们就可以通过指令的执行条数来确定1秒的时间,但同时由于单片机的运行速度很快其他的指令执行时间可以忽略不计。
我们设定一个初值为20的软件计数器和使T0定时50毫秒。这样每当T0到50毫秒时CPU就响应它的溢出中断请求,进入他的中断服务子程序。在中断服务子程序中,CPU先使软件计数器减1,然后判断它是否为零。为零表示1秒
第31页 共43页