汇编程序语言实现交通灯控制系统
汇编实现交通灯控制系统
运用汇编编写程序使6个灯按交通变化规律亮、灭或闪烁,且将时间显示在数码管上。十字路口交通灯变化规律要求:
(1)、南北路口的绿灯、东西路口的红灯同时亮30秒。
(2)、南北路口的黄灯闪烁3次,同时东西路口的红灯继续亮。
(3)、南北路口的红灯、东西路口的绿灯同时亮30秒。
(4)、南北路口的红灯继续亮,同时东西路口的黄灯闪烁3次。
(5)、转1重复。
设计提示:
(1)、通过对8254选择合适的信号源及计数初值,使计数器每隔1S 产生一个脉冲。
(2)、将计数器的输出端接中断源IRQ ,从而每隔1秒产生一次中断。
(3)、设计一个计数值,其初值置为33,中断服务程序每执行一次,计数值减1,根据当前计数值即可对灯的亮、灭或闪烁进行控制。
本设计是以人优先的交通灯控制系统,用来解决一个街道交通控制的问题,其目的是保证机动车辆正常通行的情况下,最大限度的满足人的通行。其控制要求如下:
(1) 没有行人过马路,机动车辆通行道路为绿灯,人行道路为红灯。
(2) 有行人过马路,机动车辆通行道路由绿灯转为黄灯,3秒钟后,再由黄灯转为红灯。此时人行道路由红灯转为绿灯,过5秒钟后,人行道路由绿灯转为黄灯(表示还没有过马路的行人禁止过马路),再过9秒钟后,人行道路由黄灯转为红灯,同时机动车辆通行道路由红灯转为绿灯。在人行道路为绿灯或黄灯时,不接受新的行人过马路请求。
设计提示:
延迟时间由8254产生,行人过马路请求用KK1模拟
SECOND1 EQU 30H ; 东西路口计时寄存器
SECOND2 EQU 31H ; 南北路口计时寄存器
DBUF EQU 40H ; 显示码缓冲区1
TEMP EQU 44H ; 显示码缓冲区2
LED_G1 BIT P2.1 ; 东西路口绿灯
LED_Y1 BIT P2.2 ; 东西路口黄灯
LED_R1 BIT P2.3 ; 东西路口红灯
LED_G2 BIT P2.4 ; 南北路口绿灯
LED_Y2 BIT P2.5 ; 南北路口黄灯
LED_R2 BIT P2.6 ; 南北路口红灯
ORG 0000H
LJMP START
ORG 0100H
START: MOV TMOD,#01H ; 置T0为工作方式1
MOV TH0,#3CH ; 置T0定时初值50ms
MOV TL0,#0B0H
CLR TF0
SETB TR0 ; 启动T0
CLR A
MOV P1,A ; 关闭不相关的LED
;***************************************************
LOOP: MOV R2,#20 ; 置1s 计数初值,50ms*20=1s MOV R3,#20 ; 红灯亮20s
MOV SECOND1,#25 ; 东西路口计时显示初值25s MOV SECOND2,#25 ; 南北路口计时显示初值25s LCALL DISPLAY
LCALL STATE1 ; 调用状态1
WAIT1: JNB TF0,WAIT1 ; 查询50ms 到否
CLR TF0
MOV TH0,#3CH ; 恢复T0定时初值50ms MOV TL0,#0B0H
DJNZ R2,WAIT1 ; 判断1s 到否?未到继续状态1 MOV R2,#20 ; 置50ms 计数初值
DEC SECOND1 ; 东西路口显示时间减1s DEC SECOND2 ; 南北路口显示时间减1s LCALL DISPLAY
DJNZ R3,WAIT1 ; 状态1维持20s
;*******************************************
MOV R2,#5 ; 置50ms 计数初值 5*4=20 MOV R3,#3 ; 绿灯闪3s
MOV R4,#4 ; 闪烁间隔200ms
MOV SECOND1,#5 ; 东西路口计时显示初值5s MOV SECOND2,#5 ; 南北路口计时显示初值5s LCALL DISPLAY
WAIT2: LCALL STATE2 ; 调用状态2
JNB TF0,WAIT2 ; 查询50ms 到否
CLR TF0
MOV TH0,#3CH ; 恢复T0定时初值50ms MOV TL0,#0B0H
DJNZ R4,WAIT2 ; 判断200ms 到否?未到继续状态2 CPL LED_G1 ; 东西绿灯闪
MOV R4,#4 ; 闪烁间隔200ms
DJNZ R2,WAIT2 ; 判1s 到否?未到继续状态2 MOV R2,#5 ; 置50ms 计数初值
DEC SECOND1 ; 东西路口显示时间减1s DEC SECOND2 ; 南北路口显示时间减1s LCALL DISPLAY
DJNZ R3,WAIT2 ; 状态2维持3s
;****************************************
MOV R2,#20 ; 置50ms 计数初值
MOV R3,#2 ; 黄灯闪2s
MOV SECOND1,#2 ; 东西路口计时显示初值2s MOV SECOND2,#2 ; 南北路口计时显示初值2s LCALL DISPLAY
WAIT3: LCALL STATE3 ; 调用状态3
JNB TF0,WAIT3 ; 查询100ms 到否
CLR TF0
MOV TH0,#3CH ; 恢复T0定时初值100ms MOV TL0,#0B0H
DJNZ R2,WAIT3 ; 判断1s 到否?未到继续状态3 MOV R2,#20 ; 置100ms 计数初值
DEC SECOND1 ; 东西路口显示时间减1s DEC SECOND2 ; 南北路口显示时间减1s LCALL DISPLAY
DJNZ R3,WAIT3 ; 状态3维持2s
;*******************************************
MOV R2,#20 ; 置50ms 计数初值
MOV R3,#20 ; 红灯闪20s
MOV SECOND1,#25 ; 东西路口计时显示初值25s MOV SECOND2,#25 ; 南北路口计时显示初值25s LCALL DISPLAY
WAIT4: LCALL STATE4 ; 调用状态4
JNB TF0,WAIT4 ; 查询100ms 到否
CLR TF0
MOV TH0,#3CH ; 恢复T0定时初值100ms MOV TL0,#0B0H
DJNZ R2,WAIT4 ; 判断1s 到否?未到继续状态4 MOV R2,#20 ; 置100ms 计数初值
DEC SECOND1 ; 东西路口显示时间减1s DEC SECOND2 ; 南北路口显示时间减1s LCALL DISPLAY
DJNZ R3,WAIT4 ; 状态4维持20s
;*******************************************
MOV R2,#5 ; 置50ms 计数初值
MOV R4,#4 ; 红灯闪20ms
MOV R3,#3 ; 绿灯闪3s
MOV SECOND1,#5 ; 东西路口计时显示初值5s MOV SECOND2,#5 ; 南北路口计时显示初值5s LCALL DISPLAY
WAIT5: LCALL STATE5 ; 调用状态5
JNB TF0,WAIT5 ; 查询100ms 到否
CLR TF0
MOV TH0,#3CH ; 恢复T0定时初值100ms MOV TL0,#0B0H
DJNZ R4,WAIT5 ; 判断200ms 到否?未到继续状态5 CPL LED_G2 ; 南北绿灯闪
MOV R4,#4 ; 闪烁200ms
DJNZ R2,WAIT5 ; 判断1s 到否?未到继续状态5 MOV R2,#5 ; 置100ms 计数初值
DEC SECOND1 ; 东西路口显示时间减1s DEC SECOND2 ; 南北路口显示时间减1s LCALL DISPLAY
DJNZ R3,WAIT5 ; 状态5维持3s
;****************************************
MOV R2,#20 ; 置50ms 计数初值
MOV R3,#2 ; 红灯闪2s
MOV SECOND1,#2 ; 东西路口计时显示初值2s MOV SECOND2,#2 ; 南北路口计时显示初值2s LCALL DISPLAY
WAIT6: LCALL STATE6 ; 调用状态6
JNB TF0,WAIT6 ; 查询100ms 到否
CLR TF0
MOV TH0,#3CH ; 恢复T0定时初值100ms MOV TL0,#0B0H
DJNZ R2,WAIT6 ; 判断1s 到否?未到继续状态6 MOV R2,#20 ; 置100ms 计数初值
DEC SECOND1 ; 东西路口显示时间减1s DEC SECOND2 ; 南北路口显示时间减1s LCALL DISPLAY
DJNZ R3,WAIT6 ; 状态6维持2s
LJMP LOOP ; 大循环
;**********************************************
STATE1: ; 状态1
SETB LED_G1 ; 东西路口绿灯亮
CLR LED_Y1
CLR LED_R1
CLR LED_G2
CLR LED_Y2
SETB LED_R2 ; 南北路口红灯亮
RET
STATE2: ; 状态2
CLR LED_Y1
CLR LED_R1
CLR LED_G2
CLR LED_Y2
SETB LED_R2 ; 南北路口红灯亮
RET
STATE3: ; 状态3
CLR LED_G1
CLR LED_R1
CLR LED_G2
CLR LED_Y2
SETB LED_R2 ; 南北路口红灯亮
SETB LED_Y1 ; 东西路口绿灯亮
RET
STATE4: ; 状态4
CLR LED_G1
CLR LED_Y1
SETB LED_R1 ; 东西路口红灯亮
SETB LED_G2 ; 南北路口绿灯亮
CLR LED_Y2
CLR LED_R2
RET
STATE5: ; 状态5
CLR LED_G1
CLR LED_Y1
SETB LED_R1 ; 东西路口红灯亮
CLR LED_Y2
CLR LED_R2
RET
STATE6: ; 状态6
CLR LED_G1
CLR LED_Y1
SETB LED_R1 ; 东西路口红灯亮
CLR LED_G2
CLR LED_R2
SETB LED_Y2 ; 南北路口红灯亮
RET
DISPLAY: ; 数码显示
MOV A,SECOND1 ; 东西路口计时寄存器 MOV B,#10 ;16进制数拆成两个10进制数 DIV AB
MOV DBUF+3,A
MOV A,B
MOV DBUF+2,A
MOV A,SECOND2 ; 南北路口计时寄存器 MOV B,#10 ;16进制数拆成两个10进制数 DIV AB
MOV DBUF+1,A
MOV A,B
MOV DBUF,A
MOV R0,#DBUF
MOV R1,#TEMP
MOV R7,#4
DP10: MOV DPTR,#LEDMAP
MOV A,@R0
MOVC A,@A+DPTR
MOV @R1,A
INC R0
INC R1
DJNZ R7,DP10
MOV R0,#TEMP
MOV R1,#4
DP12: MOV R7,#8
MOV A,@R0
DP13: RLC A
MOV P3.0,C
CLR P3.1
SETB P3.1
DJNZ R7,DP13
INC R0
DJNZ R1,DP12
RET
LEDMAP:
DB 3FH,06H,5BH,4FH,66H,6DH ;0,1,2,3,4,5 DB 7DH,07H,7FH,6FH,77H,7CH ;6,7,8,9,A ,B DB 58H,5EH,7BH,71H,0,40H ;C ,D ,E ,F , ,- END