;以下程序完成各脚的预定义 p1.0 蜂鸣器 p1.1南北红 p1.2南北黄 p1.3南北绿 p1.4东西红 p1.5东西黄 p1.6 东西绿(东西三颗发光二极管 南北也只有三颗发光二极管) P0.7为发光二极管要求进入夜晚状态时点亮 p0.0为数码管的f p0.1 g p0.2 a p0.3 d p0.4 e p0.5 f p0.6 g p2.7 数码管个位 P2.6 十位
AUTCLK:
MOV P1, #0FFH ;
MOV P2, #0FFH ;
MOV DAT, #30H ;写入每一通路的通行时间
CLR QG ;南北向绿灯亮
CLR HG ;
CLR ZR ;东西向红灯亮
CLR YR ;
MOV A, DAT ;
MOV R2, #25 ;写入时间值
A1:
MOV R1, #220 ;
A2:
ACALL BCD ;BCD调整
ACALL DISPCLK ;显示
ACALL DEL1MS ;延时
ACALL DEL1MS ;
ACALL DEL1MS ;
DJNZ R1, A2 ;
SETB FMQ ;
MOV A, DAT ;完成数字的减1操作
ADD A, #99H ;
DA A ;
MOV DAT, A ;调整好的数字送显存
DJNZ R2, A1 ;
;最后5秒黄灯闪
MOV P1, #0FFH ;
MOV P2, #0FFH ;关所有灯
CLR ZY ;黄灯亮
CLR YY ;
CLR QY ;
CLR HY ;
MOV R2, #5 ;
A3:
MOV R1, #220 ;
A4:
ACALL BCD ;
ACALL DISPCLK ;
ACALL DEL1MS ;
ACALL DEL1MS ;
ACALL DEL1MS ;
DJNZ R1, A4 ;
CPL QY ;南北向绿灯亮
CPL HY ;
CPL ZY ;东西向红灯亮
CPL YY ;
CPL FMQ ;黄灯时蜂鸣器叫一声
MOV A, DAT ;
ADD A, #99H ;
DA A ;
MOV DAT, A ;
DJNZ R2, A3 ;
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
MOV P1, #0FFH ;
MOV P2, #0FFH ;
MOV DAT, #20H ;
CLR ZG ;东西向绿灯亮
CLR YG ;
CLR QR ;南北向红灯亮
CLR HR ;
MOV A, DAT ;
MOV R2, #15 ;执行15秒
A5:
MOV R1, #220 ;
A6:
ACALL BCD ;BCD调整
ACALL DISPCLK ;显示
ACALL DEL1MS ;
ACALL DEL1MS ;
ACALL DEL1MS ;
DJNZ R1, A6 ;
SETB FMQ ;
MOV A, DAT ;
ADD A, #99H ;减1操作
DA A ;
MOV DAT, A ;
DJNZ R2, A5 ;
;最后5秒黄灯闪
MOV P1, #0FFH ;
MOV P2, #0FFH ;关所有灯
CLR ZY ;黄灯亮
CLR YY ;
CLR QY ;
CLR HY ;
MOV R2, #5 ;
A7:
MOV R1, #220 ;
A8:
ACALL BCD ;
ACALL DISPCLK ;
ACALL DEL1MS ;
ACALL DEL1MS ;
ACALL DEL1MS ;
DJNZ R1, A8 ;
CPL QY ;南北向绿灯亮
CPL HY ;
CPL ZY ;东西向红灯亮
CPL YY ;
CPL FMQ ;黄灯时蜂鸣器叫一声
MOV A, DAT ;
ADD A, #99H ;
DA A ;
MOV DAT, A ;
DJNZ R2, A7 ;
AJMP AUTCLK ;
NOP ;
NOP ;
NOP ;
LJMP START
;;*********************************
;;显示子程序
;;**********************************
DISPCLK:
MOV DPTR, #TAB ;定入表头
;显示个位
MOV A, 50H ;
MOVC A, @A+DPTR ;
MOV P0, A ;
CLR SWITCH2 ;
LCALL DEL1MS ;
SETB SWITCH2 ;
;显示十位
MOV A, 51H ;
MOVC A, @A+DPTR ;
MOV P0, A ;
CLR SWITCH1 ;
LCALL DEL1MS ;
SETB SWITCH1 ;
RET ;
NOP ;
NOP ;
NOP ;
LJMP START
;************************************************************
;横向道路紧急中断程序
;************************************************************
D_X:
CLR EA ;关总中断
JNB P3.2, $ ;
MOV A, DAT ;保存显示数据
MOV 20H, A ;
MOV DAT, #50H ;
MOV 21H, P1 ;
MOV 22H, P2 ;
MOV P1, #0FFH ;
MOV P2, #0FFH ;
CLR ZG ;东西向绿灯亮
CLR YG ;
CLR QR ;南北向红灯亮
CLR HR ;
MOV R4, #50 ;
D1:
MOV R3, #220 ;
D2:
ACALL BCD ;
ACALL DISPCLK ;
ACALL DEL1MS ;
ACALL DEL1MS ;
ACALL DEL1MS ;
DJNZ R3, D2 ;
MOV A, DAT ;
ADD A, #99H ;
DA A ;
MOV DAT, A ;
DJNZ R4, D1 ;
MOV A, 20H ;恢复显示数据
MOV DAT, A ;
MOV P2, 22H ;
MOV P1, 21H ;
CLR IE0 ;
CLR IE1 ;
SETB EA ;开总中断
RETI ;中断返回
;************************************************************
;纵向道路紧急中断程序
;************************************************************
N_B:
CLR EA ;关总中断
JNB P3.3, $ ;
MOV A, DAT ;保存显示数据
MOV 20H, A ;
MOV DAT, #50H ;
MOV 21H, P1 ;
MOV 22H, P2 ;
MOV P1, #0FFH ;
MOV P2, #0FFH ;
CLR QG ;南北向绿灯亮
CLR HG ;
CLR ZR ;东西向红灯亮
CLR YR ;
MOV R4, #50 ;
N1:
MOV R3, #220 ;
N2:
ACALL BCD ;
ACALL DISPCLK ;
ACALL DEL1MS ;
ACALL DEL1MS ;
ACALL DEL1MS ;
DJNZ R3, N2 ;
MOV A, DAT ;
ADD A, #99H ;
DA A ;
MOV DAT, A ;
DJNZ R4, N1 ;
MOV A, 20H ;恢复显示数据
MOV DAT, A ;
MOV P2, 22H ;
MOV P1, 21H ;
CLR IE0 ;
CLR IE1 ;
SETB EA ;开总中断
RETI ;中断返回
;********************************************************
BCD:
;将显存中的数字分分两个BCD码存于50H和51H单元中,用于显示十位和个位
MOV A, DAT ;
MOV B,#10H
DIV AB
MOV 51H,A ;写入分十位
MOV A,B
MOV 50H,A ;写入分个位
RET
NOP
NOP
NOP
LJMP START
;数码表
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH
RET
NOP
NOP
NOP
LJMP START