图3-4 LED连接图
3.3.4其它器件
(1)发光二极管
根据本设计的特点,红绿灯的显示不可少,红绿灯的显示采用普通的发光二极 管。每个方向上设置红绿黄灯,总共4组。如果东西红灯亮,那南北方向就是绿灯 亮,反之亦然,所以在硬件上连接图上也是对称分布的,如下图(图3-6)所示:
图3-6 信号灯的连接
(2)按键控制
本设计设置了有3个键:S键P3.2,J键P3.2,F键P3.7。每个按键一端接地,另一端接上拉电阻。低电平有效,当按键按下端口接地,单片机捕获到低电平,从而知道相应的输入信息。如下图(图3-7)所示。
图3-7 按键示意
14
第四章 系统软件程序的设计
4.1程序主体设计流程
全部控制程序实际上分为若干模块:键盘设置处理程序,状态灯控制程序,LED显示程序,消抖动延时程序,次状态判断及处理程序,紧停或违规判断程序,中断服务子程序,车流量计数程序,红绿灯时间调整程序等。
整个软件程序方面主要分两大部分:按键处理程序和50ms扫描程序。流程图如图(图4-1)所示。
图4-1系统总的流程图
15
4.2子程序模块设计
4.2.1按键扫描程序
首先程序不断扫描模式设置键,分别记为:S键,J键,F键对应IO端口的P3.6,P3.2,P3.7,低电平有效,按键顺序是指定的,若直接按F键,则为自动调整模式,然后进入下一程序;若先按S键,再按J键,F键则为设置时间模式,然后进入下一程序。
程序的开始要判断是否有键按下,可以不断将S键值和F键值相与,与值为1则表示没有键按下,为0则表示有键按下,程序如下: K1: MOV C, P0.0
ANL C, P0.1 JB C, K1 ……
接下来要判断具体是那个键,若为F键,则将自动标志位置1,进入下一程序,否则为S键,则表示设置南北绿灯时间,用R0存值,按1下加1,同时还需判断此时J键是否按下,若按下,则表示南北绿灯时间设置完毕,开始设置东西绿灯时间,用R1存值,同样按1下加1 ,同时判断此时F键是否按下,若按下,则表示时间设置完毕,进入下一程序。 在这个过程中,S,J键的计数是循环的,从初值20开始,加到40则循环回到20。如判断S键程序如下: CJNZ R0, #40, V1 MOV R0, #20 V1: INC R0 ……
4.2.2状态灯显示及判断
在本设计中,实际控制的灯只有6个,即:东西红灯,东西绿灯,东西黄灯,南北红灯,南北绿灯,南北黄灯。定义IO端口如下,其中均是低电平有效。 H_GREEN BIT P2.2
H_YELLOW BIT P2.3 L_RED BIT P2.4 L_GREEN BIT P2.5 L_YELLOW BIT P2.6
共有4钟状态:东西红灯亮,南北绿灯亮(11011101/DDH);东西红灯亮,南北黄灯亮(10111101/BDH);东西绿灯亮,南北红灯亮(11101101/EDH);东西黄灯亮,南北红灯亮(11100111/E7H)。
括号中是P2端口8个引脚值P2.7,P2.6,P2.5,P2.4,P2.3,P2.2,P2.1,P2.0以及对应的十六进制码。
在用于显示发光二极管时,直接由MOV指令将十六进制码送入P2口。
刚才的4个状态是依次变换的,这就要涉及到状态的判断和衔接了。先把P2端口的值与所有的4个状态码比较,若相同则判断成功当前状态,再把下一状态的状态码送显P2即
16
可。程序如下:
MOV A, P2
CJNZ A, #0DDH,D1 MOV P2, #BDH
D1: CJNZ A, BDH,D2 MOV P2, #EDH
D2: CJNZ A, #EDH,D3 MOV P2, #E7H
D3: CJNZ A, #E7H,Y MOV R2, #DDH
??
4.2.3 LED倒计时显示
LED计时每1秒都要刷新1次,那么计时满1秒时就要将存储时间的工作寄存器R4减1,然后送入LED显示程序中显示。下面要将时间数据R4的十位,个位分开送显P1,P0端口,首先将R4除以10,整数即十位放在A中,余数即个位放在B中,设置7段LED显示数据的数据表,用数据指针寄存器DPTR指向数据表的首地址,再加上A中的偏移量,就可以指向十位数字,然后送显即可,个位显示同理。具体程序如下: MOV A, R4 MOV B, #10 DIV A, B
MOV DPTR, #LEDMAP MOVC A, @A+DPTR MOV P1, A MOV A, B
MOVC A, @A+DPTR
MOV P3, A
LEDMAP: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ……
4.2.4车流量检测中断服务子程序
车流量检测是用外部中断引脚P3.3即INT1捕获到一个低电平,则进入相应的中断服务子程序,在子程序中,用R5计南北向车流量,用R6计东西向车流量,设车向标志位为01H,判断车向,程序如下: JNB 01H, U INC R5
U: INC R6 ……
17
4.2.5紧停及违规中断服务子程序
紧停按键和违规信号传感器均连接到外部中断引脚P3.2,即INT0捕获到一个低电平,则进入该中断,中断程序中先把蜂鸣器P3.4端口置0,启动蜂鸣。并且等待恢复键F键P3.7按下,然后关闭蜂鸣返回。 INT0: SETB P0.5 JB P0.0, $ LCALL DELAY CLR P0.5 RETI
??
4.2.6红绿灯时间调整程序
根据红绿灯时间调整原理,一个周期下来,R5,R6中分别存储着南北,东西的车流量,接下来求单位时间车流量,此时南北向时间,东西向时间分别存储在R0,R1中,则两个方向的流量比例为(R5/R0)/(R6/R1)=(R5*R1)/(R6*R0),显然该比例是1左右带小数的值,然而单片机程序中只取整数,重要的数据信息就会丢失,所以本设计中首先将(R5*R1)乘以10,比例就变为10左右的值。将该比例值放在A,然后进行时间调整。
由于受到多方面的限制,时间调整在此只划定3个范围。比例0到0.7为一个范围,0.8到1.5为一个范围,1.5以上为一个范围。第一范围显然表明东西向交通严重,应将时间调长;第二范围表明两向相当,可设置一样的时间,第三范围表明南北向交通严重,应将该向时间调长。具体设置如下表(表4-1)
表4-1 比例及调整时间 南北与东西向比例 调整南北向时间 调整东西向时间 0—0.7 20 40 0.8—1.5 30 30 1.5及以上 40 20
由表可知,对应的时间调整也只有三种,分别是20,40;30,30;40,20.显然在实际应用中这样简单的处理难以尽如人意,但在此处,本设计只是模拟大致的调整过程,以上要求的程序如下: CJNZ A, #7 M1 M2: MOV R2, #20 MOV R1, #40 SJMP OUT
M1: JB C, M2 CJNZ A, #15 N1 N2: MOV R0, #30 MOV R1, #30 SJMP OUT
N1: JB C, N2
18