设置应急控制键,即强制某一方向的绿灯常亮(另一方向红灯)
再按一次先闪绿3秒黄2秒再红灯 沿袭以前的规律变化。
NB_RED BIT P2.0;定义南北方向红灯
NB_GREEN BIT P2.1;定义南北方向绿灯
NB_YELLOW BIT P2.2;定义南北方向黄灯
DX_RED BIT P2.3;定义东西方向红灯
DX_GREEN BIT P2.4;定义东西方向绿灯
DX_YELLOW BIT P2.5;定义东西方向黄灯
FLAG BIT 4FH;时间溢出标志位,当FLAG=1;则表示所需要时间到
ORG 0000H ;
LJMP INITIAL ;转至初始化程序
ORG 000BH ;定时器0的入口地址
LJMP TOUVER ;转至定时器0入口程序
ORG 0030H ;
INITIAL:MOV TMOD,#01H;设置T0为模式1
MOV TH0,#3CH ;定时50MS
MOV TL0,#0B0H ;
MOV DPTR,#TABLE ;将数码管的编码值的首地址给DPTR
MOV 60H,#20H ;使用60单元用于计数20次,20到则表示定时1S到(50*20MS)=1S
CLR FLAG ;除标志位
MOV IE,#82H ;开中断
MOV P0,#0ffH ;初始化显示
MOV P2,#0FFH;LED MIE
SETB TR0;起动定时器
MAIN:;主程序
LCALL GREEN_TIME;东西绿灯亮30秒
LCALL RED_TIME;南北红灯亮20秒
LJMP MAIN ;循环执行主程序
GREEN_TIME:;东西绿灯时间
MOV P2,#0FFH;让所有LED灯灭,防止干扰
CLR DX_GREEN ;东西绿灯亮
CLR NB_RED ;南北红灯亮
MOV 6AH,#30;定时30S
LOOP_GREEN:LCALL DISP;循环显示
JNB FLAG,LOOP_GREEN;等待30S的到来
CLR FLAG;清除标志位
RET;退出中断程序
RED_TIME:;南北红灯时间
MOV P2,#0FFH;
CLR NB_GREEN;
CLR DX_RED;
MOV 6aH,#20;
LOOP_RED:LCALL DISP
JNB FLAG,LOOP_RED;
CLR FLAG
RET
TABLE:DB 0C0H,0F9H,0A4H,0B0H,99H ;
DB 92H,82H,0F8H,80H,90H ;
TOUVER:MOV TH0,#3CH ; 定时器中断子程序
MOV TL0,#0B0H ;
DJNZ 60H,TT1 ;
MOV 60H,#20 ;到1S重置初值
MOV R2,6AH
CJNE R2,#0,TIME_SUB;
SETB FLAG ;所需要的时间到,则置位标志位
RETI ;中断返回
TT1:
RETI
TIME_SUB:
DEC 6AH;减一操作,相当于对定时时间计数,时间到则为零
RETI;退出中断子程序
DISP: ;数码管显示子程序
MOV A,6AH ;
MOV B,#10 ;
DIV AB ;
MOV 20H,A ;分解
MOV 21H,B
DISP1:MOV A,20H ;显示东西的十位
MOVC A,@A+DPTR ;
MOV P0,A ;
SETB P3.0 ;
LCALL DELAY ;
CLR P3.0 ;
DISP2:MOV A,21H ;显示东西的个位
MOVC A,@A+DPTR ;
MOV P0,A
SETB P3.1 ; ;
LCALL DELAY ;
CLR P3.1
DISP3:MOV A,20H ;显南北秒的十位
MOVC A,@A+DPTR ;
MOV P0,A ;
SETB P3.2 ;
LCALL DELAY ;
CLR P3.2 ;
DISP4:MOV A,21H ;显示南北秒的个位
MOVC A,@A+DPTR ;
MOV P0,A
SETB P3.3 ; ;
LCALL DELAY ;
CLR P3.3
RET
DELAY:MOV R5,#25 ;延时子程序25ms
D3:MOV R4,#25 ;
D4:DJNZ R4,D4 ;
DJNZ R5,D3 ;
RET ;
END

再按一次先闪绿3秒黄2秒再红灯 沿袭以前的规律变化。
NB_RED BIT P2.0;定义南北方向红灯
NB_GREEN BIT P2.1;定义南北方向绿灯
NB_YELLOW BIT P2.2;定义南北方向黄灯
DX_RED BIT P2.3;定义东西方向红灯
DX_GREEN BIT P2.4;定义东西方向绿灯
DX_YELLOW BIT P2.5;定义东西方向黄灯
FLAG BIT 4FH;时间溢出标志位,当FLAG=1;则表示所需要时间到
ORG 0000H ;
LJMP INITIAL ;转至初始化程序
ORG 000BH ;定时器0的入口地址
LJMP TOUVER ;转至定时器0入口程序
ORG 0030H ;
INITIAL:MOV TMOD,#01H;设置T0为模式1
MOV TH0,#3CH ;定时50MS
MOV TL0,#0B0H ;
MOV DPTR,#TABLE ;将数码管的编码值的首地址给DPTR
MOV 60H,#20H ;使用60单元用于计数20次,20到则表示定时1S到(50*20MS)=1S
CLR FLAG ;除标志位
MOV IE,#82H ;开中断
MOV P0,#0ffH ;初始化显示
MOV P2,#0FFH;LED MIE
SETB TR0;起动定时器
MAIN:;主程序
LCALL GREEN_TIME;东西绿灯亮30秒
LCALL RED_TIME;南北红灯亮20秒
LJMP MAIN ;循环执行主程序
GREEN_TIME:;东西绿灯时间
MOV P2,#0FFH;让所有LED灯灭,防止干扰
CLR DX_GREEN ;东西绿灯亮
CLR NB_RED ;南北红灯亮
MOV 6AH,#30;定时30S
LOOP_GREEN:LCALL DISP;循环显示
JNB FLAG,LOOP_GREEN;等待30S的到来
CLR FLAG;清除标志位
RET;退出中断程序
RED_TIME:;南北红灯时间
MOV P2,#0FFH;
CLR NB_GREEN;
CLR DX_RED;
MOV 6aH,#20;
LOOP_RED:LCALL DISP
JNB FLAG,LOOP_RED;
CLR FLAG
RET
TABLE:DB 0C0H,0F9H,0A4H,0B0H,99H ;
DB 92H,82H,0F8H,80H,90H ;
TOUVER:MOV TH0,#3CH ; 定时器中断子程序
MOV TL0,#0B0H ;
DJNZ 60H,TT1 ;
MOV 60H,#20 ;到1S重置初值
MOV R2,6AH
CJNE R2,#0,TIME_SUB;
SETB FLAG ;所需要的时间到,则置位标志位
RETI ;中断返回
TT1:
RETI
TIME_SUB:
DEC 6AH;减一操作,相当于对定时时间计数,时间到则为零
RETI;退出中断子程序
DISP: ;数码管显示子程序
MOV A,6AH ;
MOV B,#10 ;
DIV AB ;
MOV 20H,A ;分解
MOV 21H,B
DISP1:MOV A,20H ;显示东西的十位
MOVC A,@A+DPTR ;
MOV P0,A ;
SETB P3.0 ;
LCALL DELAY ;
CLR P3.0 ;
DISP2:MOV A,21H ;显示东西的个位
MOVC A,@A+DPTR ;
MOV P0,A
SETB P3.1 ; ;
LCALL DELAY ;
CLR P3.1
DISP3:MOV A,20H ;显南北秒的十位
MOVC A,@A+DPTR ;
MOV P0,A ;
SETB P3.2 ;
LCALL DELAY ;
CLR P3.2 ;
DISP4:MOV A,21H ;显示南北秒的个位
MOVC A,@A+DPTR ;
MOV P0,A
SETB P3.3 ; ;
LCALL DELAY ;
CLR P3.3
RET
DELAY:MOV R5,#25 ;延时子程序25ms
D3:MOV R4,#25 ;
D4:DJNZ R4,D4 ;
DJNZ R5,D3 ;
RET ;
END
