具有倒计时的单片机交通灯模拟控制系统
摘要:本文应用单片机的定时器/计数器、中断和动态显示技术,模拟十字路口交通灯的控制过程。通过89C51单片机控制12只红、绿、黄发光二极管,按照特定的时间和规律进行点亮,用两位LED数码管动态显示倒计时,出现特殊情况时,能拨动开关,及时调整交通灯的指示状态,进行应急处理。
关键词:单片机 交通灯 定时 中断 倒计时
马路上的十字路口,车辆穿梭,行人熙攘,人来车往,有条不紊。靠的是交通信号灯的自动指挥系统来实现这么井然的秩序。交通信号灯控制方式很多。本文采用AT89C51为核心器件来设计交通灯模拟控制系统,应用单片机的定时器/计数器、中断和动态显示技术,实现了正常情况下东西与南北两个方向轮流点亮红、绿信号灯,每次持续时间60s,中间有2s的黄灯过渡。特殊情况时,可以拨动东西或南北方向的紧急开关,使该方向紧急切换为绿灯,以利于特种车辆通过。当车辆稀少时,可以通过拨动开关,使东西南北两个方向的交通灯均置为闪烁黄灯,闪烁周期为2秒。另外还设计了用LED数码管动态显示已点亮灯的剩余时间。
电路如图1所示。
图1 具有倒计时的单片机交通灯模拟控制系统电路图
图中交通灯由红、黄、绿3种颜色的发光二极管代替,单片机P2口输出的控制信号,驱动发光二极管亮灭。
LED数码管(共阴)由两片具有译码与驱动双重功能的芯片CD4511驱动,CD4511的输入信号为来自P1口的4位BCD码。紧急切换和车辆稀少可采用查询P0.0、P0.1和P0.2是否为低电平的方法实现。
程序设计思路:由主程序负责向P2口发出交通灯显示数据,用寄存器R2存放调用1S延时子程序的次数,只要修改调用次数就可获得不同的延时时间。
延时50ms子程序采用单片机内部定时器T1产生中断来实现。T1工作在方式1,每50ms产生一次中断,用寄存器R3存放循环中断的次数,循环20次就实现了1S的延时。然后送出信号去控制相应的交通灯点亮。
用单片机内部的定时器T1实现延时,第一步:对TMOD赋值,确定工作方式:TMOD的高4位是控制定时器/计数器T1的,当GATE=0时,通过”SETB TR1″指令即可启动定时器/计数器工作;C/T=0时,T1被设置为定时工作方式。
因此,可得到定时器T1,工作在方式1,作定时器使用,并且用软件启动运行的TMOD赋值为10H。第二步:预置定时器初值X,将初始值写入TH1、TL1中。设单片机的晶振频率为12MHZ。定时器初值得计算公式为:
(最大计数值M-初始值X)*机器周期=定时时间
当晶振频率为12MHZ时,机器周期则为1us。在方式1中,定时器T1的最大计数值M为65536,现要求定时50ms,由以上公式可计算出计数器的初始值X。
(65536-X)*1us=50ms=50000us 所以,初始值X=65536-50000=15536D=3CB0H
所以在子程序DELAY_50MS中确定定时器的初值指令为:
MOV TH1,#3CH
MOV TL1,#0B0H
软件程序中使用内部定时器1中断实现50ms延时。循环20次中断,就可以得到1S的延时。交通灯的控制信号由P2.7~P2.5和P2.3~P2.1口输出,其中,P2.7低电平对应南、北红灯,P2.6低电平对应南北绿灯,P2.5低电平对应南北黄灯,P2.3低电平对应东西红灯,P2.2低电平对应东西绿灯,P2.1低电平对应东西黄灯。
为了显示亮灯的剩余秒数,程序中安排了十进制转换程序。剩余秒数的BCD码由P1口输出,通过2个CD4511驱动2个LED,实现动态显示。
紧急切换拨动开关1和2分别接在P0.0、P0.1上,为东西、南北两个方向的紧急切换拨动开关,某方向拨动开关按下(接地)时,该方向紧急切换为绿灯,以利于特种车辆通过。可以通过在主程序中查询这两个端口的状态来决定是否进行紧急切换,查询到为低电平时进行紧急切换处理。
拨动开关3用于当车辆稀少时按下,当查询到P0.2为低电平时,设置东西南北两个方向的交通灯均为黄灯闪烁(1S亮,1S灭)。
主程序流程如图1-2所示。
图2 主程序流程图
程序如下
;变量定义区
COUNT DATA 26H ;50ms计数单元
SECOND DATA 27H ;秒计数单元
STORE DATA 2BH ;存放计时秒数
NUMBER1 EQU 60 ;红绿灯计时秒数60S
NUMBER2 EQU 2 ;黄灯计时秒数2S
ORG 0000H
LJMP MAIN ;转主程序
ORG 001BH
LJMP CLOCK ;转定时器T1中断
;主程序
ORG 0030H
MAIN: MOV SP,#5AH ;堆栈指针
MOV STORE,#NUMBER1 ;调计时秒数
MOV COUNT,#00H ;50ms计数单元清0
MOV SECOND,STORE ;计时秒数进秒计数单元
MOV TMOD,#01H ;设定时器1工作方式1
MOV TL1,#0B0H ;置T1初值
MOV TH1,#3CH
SETB EA ;开中断
SETB ET1 ;定时器T1中断允许
MOV TCON,#40H ;启动定时器T1
MOV R2,#01H ;先设东西向绿灯亮
MOV P2,#7BH ;输出东西绿灯、南北红灯控制码
QIEH: JB P0.0,QIEH1
MOV P2,#7BH ;输出东西绿灯、南北红灯控制码
SJMP QIEH
QIEH1: JB P0.1,QIEH2
MOV P2,#0B7H ;输出南北绿灯、东西红灯控制码
QIEH2: JB P0.2,QIEH3
MOV P2,#0DDH ;输出南北东西黄灯亮控制码
LCALL DE1S ;调用软件延时1S子程序
MOV P2,#0FFH ;输出南北东西黄灯灭控制码
LCALL DE1S ;调用软件延时1S子程序
QIEH3: SJMP QIEH
DE1S: MOV R7 ,#04H ;延时1S子程序
A3: MOV R6 ,#0FFH
A2: MOV R5 ,#0F4H
A1: NOP
NOP
DJNZ R5 ,A1
DJNZ R6 ,A2
DJNZ R7 ,A3
RET
;定时器T1中断程序
ORG 0400H
CLOCK: PUSH PSW ;保护
PUSH ACC
SETB RS0
MOV R0,#00H
MOV R1,#00H
MOV TL1,#0B0H ;再置T1初值
MOV TH1,#3CH
INC COUNT
MOV A,COUNT
CJNE A,#14H,DONE ;50ms计数单元不满20则转
MOV COUNT,#00H ;50ms计数单元满20则清0
DJNZ SECOND,OUT2 ;秒计数单元减1不为0则转十进制转换程序
MOV A,SECOND
JMP OUT
OUT2: MOV A,SECOND ;开始十进制转换程序
OUT0: CLR C
SUBB A,#0AH
JC OUT1
INC R0
JMP OUT0
OUT1: ADD A,#0AH
MOV R1,A
MOV A,R0
SWAP A
ANL A,#0F0H
ADD A,R1
OUT: MOV P1,A ;剩余秒数BCD码由P1口输出
CJNE A,#00H,DONE ;剩余秒数不为0则转
MOV A,STORE ;剩余秒数为0则转换计时秒数
CJNE A,#NUMBER1,LOOP0
MOV STORE,#NUMBER2
MOV SECOND,STORE
MOV P2,#0DDH ;输出黄灯控制码
LJMP DONE
LOOP0: MOV STORE,#NUMBER1
MOV SECOND,STORE
MOV A,R2
CJNE A,#00H,LOOP1
INC R2
MOV P2,#7BH ;输出东西绿灯、南北红灯控制码
LJMP DONE
LOOP1: MOV R2,#00H
MOV P2,#0B7H ;输出南北绿灯、东西红灯控制码
DONE: POP ACC
POP PSW
RETI
END