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 ;查询30MS到否 CLR TF0
MOV TH0, #3CH ; MOV TL0, #0B0H
DJNZ R2,WAIT3 ; MOV R2,#20 ; DEC SECOND1 ; DEC SECOND2 ; LCALL DISPLAY
DJNZ R3,WAIT3 ; MOV R2,#20 ; MOV R3,#20 ; MOV SECOND1,#25 ; MOV SECOND2,#25 ; LCALL DISPLAY
WAIT4: LCALL STATE4 ; JNB TF0,WAIT4 ; CLR TF0
MOV TH0, #3CH ; MOV TL0, #0B0H
DJNZ R2,WAIT4 ; MOV R2,#20 ; DEC SECOND1 ; DEC SECOND2 ; LCALL DISPLAY
DJNZ R3,WAIT4 ; MOV R2,#5 ; MOV R4,#4 ; MOV R3,#3 ; MOV SECOND1,#5 ; MOV SECOND2,#5 ; LCALL DISPLAY
WAIT5: LCALL STATE5 ; JNB TF0,WAIT5 ; CLR TF0
MOV TH0, #3CH ;恢复T0定时初值50MS 判1S到否?未到继续状态3
置50MS计数初值 东西秒显示减一 南北秒显示减一 状态3维持2S 置50MS计数初值 红灯20S
东西秒显示初值25S 南北秒显示初值25S 调用状态4 查询50MS到否 恢复T0定时初值50MS 判1S到否?未到继续状态4 置50MS计数初值 东西秒显示减一 南北秒显示减一 状态4维持20S
置50MS计数初值 5*4=20 闪烁间隔200MS 绿灯闪3S
东西秒显示初值5S 南北秒显示初值5S 调用状态5
查询50MS到否 恢复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 ;东西秒显示减一 DEC SECOND2 ;南北秒显示减一 LCALL DISPLAY
DJNZ R3,WAIT5 ; MOV R2,#20 ; MOV R3,#2 ; MOV SECOND1,#2 ; MOV SECOND2,#2 ; LCALL DISPLAY
WAIT6: LCALL STATE6 ; JNB TF0,WAIT6 ; CLR TF0
MOV TH0, #3CH ; MOV TL0, #0B0H
DJNZ R2,WAIT6 ; MOV R2,#20 ; DEC SECOND1 ; DEC SECOND2 ; LCALL DISPLAY
DJNZ R3,WAIT6 ; LJMP LOOP ;STATE0: ; MOV P1,#0 CLR LED_G1
SETB LED_R1 ; CLR LED_G2
SETB LED_R2 ; RET
STATE1: ; SETB LED_G1 ; CLR LED_R1
CLR LED_G2
SETB LED_R2 ; RET
STATE2: ; CLR LED_R1
CLR LED_G2 SETB LED_R2 ;状态5维持3S 置50MS计数初值 黄灯2S
东西秒显示初值2S 南北秒显示初值2S 调用状态6
查询100MS到否 恢复T0定时初值100MS 判1S到否?未到继续状态6 置100MS计数初值 东西秒显示减一 南北秒显示减一 状态6维持2S 大循环 状态0 东西红灯亮 南北红灯亮 状态1
东西绿灯亮 南北红灯亮 状态2
南北红灯亮
RET
STATE3: ;状态3 SETB LED_G1
SETB LED_R1 ;东西黄灯亮 CLR LED_G2
SETB LED_R2 ;南北红灯亮 RET
STATE4: ;状态4 CLR LED_G1
SETB LED_R1 ; SETB LED_G2 ; CLR LED_R2
RET
STATE5: ; CLR LED_G1
SETB LED_R1 ; CLR LED_R2 RET
STATE6: ; CLR LED_G1
SETB LED_R1 ; SETB LED_G2
SETB LED_R2 ; RET
DISPLAY: ; MOV A, SECOND1 ; MOV B, #10 ;16 DIV AB
MOV DBUF+1,A MOV A,B
MOV DBUF, A
MOV A, SECOND2 ; MOV B, #10 ;16 DIV AB MOV DBUF+3, A MOV A,B
MOV DBUF+2, A MOV R0,#DBUF MOV R1,#TEMP MOV R7,#4
DP10: MOV DPTR,#LEDMAP MOV A,@R0
MOVC A,@A+DPTR
MOV @R1,A
东西红灯亮 南北绿灯亮 状态5 东西红灯亮 状态6 东西红灯亮 南北黄灯亮 数码显示
东西秒寄存器
进制数拆成两个10进制数南北秒寄存器
进制数拆成两个10进制数 DP12: DP13:
INC R0 INC R1
DJNZ R7,DP10 MOV R0,#TEMP MOV R1,#4 MOV R7,#8 MOV A,@R0 RLC A
MOV DIN,C CLR CLK SETB CLK DJNZ R7,DP13 INC R0
DJNZ R1,DP12
RET
LEDMAP: DB 3FH,6,5BH,4FH,66H,6DH ;0,1,2,3,4,5 DB 7DH,7,7FH,6FH,77H,7CH ;6,7,8,9,A,B DB 58H,5EH,7BH,71H,0,40H ;C,D,E,F, , - DELAY: MOV R5, #5 DLOOP0:MOV R6, #0 DLOOP1:MOV R7, #0 DLOOP2: NOP NOP
DJNZ R7, DLOOP2 DJNZ R6, DLOOP1
DJNZ R5, DLOOP0 RET END
六、实验结果
程序开始运行后,B5区模拟的东西红灯亮,南北绿灯亮,同时两个方向的数码管分别从25秒开始倒计时,当倒计时到5秒时,南北绿灯闪亮3秒后变黄,再过2秒,即倒计时到0时,变为东西绿灯亮,南北红灯亮,同时两个方向的数码管分别同时从25秒开始倒计时,但倒计时到5秒时,东西绿灯闪亮3秒后变黄,再过2秒之后又回到初始状态,继续循环运行。
七、结果分析
本实验通过双色的LED模拟交通灯的显示状态,并用静态数码管结合定时器实现定时及显示功能,将交通灯的显示分为六个不同的状态,程序运行之后进行计数显示,当计时时间到达某一个状态之后,跳转进入相应的状态执行,执行完之后继续进入下一个状态,实验通过程序模拟了交通灯的显示。