MOV 67H,R0;东西方向绿灯时间存入67H中,也是南北方向红灯时间 MOV 68H,#00H ; 68H单元清零,用来记录车流量
CLR 08H ;通过检测位地址08H来判断外部中断是用来报警还
;是用来检测车流量 MOV R3,66H
N01: LCALL DISP1 ;东西方向数码管显示红灯时间 LCALL DISP2 ; 南北方向数码管显示绿灯时间
MOV DPTR,#0000H ;置8255A口,东西方向红灯亮,南北方向绿灯亮 MOV A,#0EEH
MOVX @DPTR, A
CJNE R3,#00H,N01 ;比较R3中的值是否为0,不为0转到N01处执行 ;----------黄灯闪烁5秒---------------------------------------------------------- SETB P3.0
LCALL F0 ;调黄灯闪烁5s子程序
;-----东西方向绿灯倒计时显示,南北方向红灯倒计时显示-------------- SETB 08H
MOV 68H,#00H ; 68H单元清零
MOV R3,67H
N1: L CALL DISP1 ;东西方向数码管显示绿灯时间
LCALL DISP2; 南北方向数码管显示红灯时间
MOV DPTR,#0000H ;置8255A口,东西方向绿灯亮,南北方向红灯亮 MOV A,#0F5H MOVX @DPTR, A
CJNE R3,#00H,N1 ;判断倒计时是否结束
;------黄灯闪烁5秒-----------------------------------------------------------
SETB P3.0
LCALL F0 ;调黄灯闪烁5s子程序
LJMP AGAIN ;反复循环执行
;----------------主程序完,以下为子程序------------------------------------- ;--------1S中断子程序-------------------------------------------------------- T0_INT: INC R4 ;R4每50ms加1 MOV TH0,#3CH ;重装定时器T0初值
MOV TL0,#0B0H
DJNZ 65H,NEXT ;判断计时是否到1s,不到转NEXT
MOV 65H,#14H ;恢复65H存储器中的值 DEC R3 ;倒计时初值减1 DEC R2 ;报警初值减1 LCALL DISP1 LCALL DISP2
;调时间显示子程序
NEXT: RETI
;---------- 东西路口红外对管检测中断程序--------------------------- B0: JB 08H,B01
LCALL D0 ;调用报警子程序
SJMP B02
32
B01: LCALL E0 ;调用车流量与显示子程序 B02: RETI
;---------- 南北路口红外对管检测中断程序------------------------ C0: JB 08H,C01
LCALL E0 ;调用车流量与显示子程序 SJMP C02
C01: LCALL D0 ;调用报警子程序
C02: RETI
;------------东西方向时间显示子程序--------------------------------- DISP1: MOV B,#0AH
MOV A,R3 ;R3中值二转十显示转换 DIV AB
MOV 68H,A MOV 69H,B
DS1: MOV A,68H ;显示十位 MOV DPTR,#TAB MOV A,@A+DPTR MOV DPTR,#0002H MOVX @DPTR,A MOV DPTR,#0001H MOV A,#02H
MOVX @DPTR,A LCALL DELAY
DS2: MOV A,69H ;显示个位 MOV DPTR,#TAB MOV A,@A+DPTR MOV DPTR,#0002H MOVX @DPTR,A MOV DPTR,#0001H MOV A,#01H MOVX @DPTR,A
LCALL DELAY
RET
;------------南北方向时间显示子程序---------------------------------- DISP1: MOV B,#0AH
MOV A,R3 ;R3中值二转十显示转换 DIV AB
MOV 68H,A MOV 69H,B
DS1: MOV A,68H ;显示十位 MOV DPTR,#TAB MOV A,@A+DPTR MOV DPTR,#0002H MOVX @DPTR,A
33
MOV DPTR,#0001H
MOV A,#08H
MOVX @DPTR,A LCALL DELAY
DS2: MOV A,69H ;显示个位 MOV DPTR,#TAB MOV A,@A+DPTR MOV DPTR,#0002H MOVX @DPTR,A MOV DPTR,#0001H MOV A,#04H
MOVX @DPTR,A
LCALL DELAY
RET
;------------黄灯闪烁5s子程序------------------------------------------ F0: MOV R3,#05H ;赋5s初值
F01: LCALL DISP1
LCALL DISP2
MOV DPTR,#0000H ;置8255A口,东西,南北方向黄灯亮 MOV A,#0DBH MOVX @DPTR,A
MOV R4,#00H
CJNE R4,#0AH,$ ;黄灯持续亮0.5秒
MOV DPTR,#0000H ;置8255A口,东西,南北方向黄灯灭 MOV A,#0FFH
MOVX @DPTR,A
MOV R4,#00H
CJNE R4,#0AH,$ ;黄灯持续灭0.5秒
CJNE R3,#00H, F01 ;闪烁时间达5秒则退出 RET
;-------------检测车流量与显示子程序---------------------------------- E0:PUSH R3 ;将R3压入堆栈
MOV A,R3
JZ E04 ;若绿灯倒计时完毕,不再检测车流量 INC 68H ;68H存入车流量 CJNE 68H,#64H,E01 ;中断100次则清零 MOV 68H,#00H
AJMP E04 E01:JB 08H,E02
JNB P2.5 E03 ;是否显示南北方向车流量 AJMP E04
E02:JNB P2.4,E03 ;是否显示东西方向车流量 AJMP E04 E03:MOV R3,68H
34
JB 08H,E030
LCALL DISP2 ;显示东西方向车流量 AJMP E04
E030: LCALL DISP1 ;显示南北方向车流量 E04: POP R3 ;R3出栈
RET
;-----------------报警子程序------------------------------------------ D0: MOV R2,#03H ;报警持续时间3秒 D01: MOV A,R3
JZ D02 ;若倒计时完毕,不再报警 CLR P3.0 ;报警
CJNE R2,#00H,D01 ;判断3秒是否结束 SETB P3.0 D02: RET
;---------1ms延时子程序------------------------------------------- DELAY: MOV R6,#0FAH ;1ms延时预定值 DL1: NOP NOP
DJNZ R6,DL1 ;1ms延时循环
RET
;------------------------字形表----------------------------------------- TAB:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH END
35