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计数初值