- ORG 0000H
- AJMP MAIN
- ORG 000BH //T0中断入口地址
- LJMP INT_T0
- ORG 0030H
- RRR EQU 0F6H ;红红都亮
- GR EQU 0DEH ;东西绿灯亮,南北红灯亮
- YR EQU 0EEH ;东西黄灯亮,南北红灯亮
- RG EQU 0F3H ;东西红灯亮,南北绿灯亮
- RY EQU 0F5H ;东西红灯亮,南北黄灯亮
- EW_TIME EQU R0 ;东西方向时间
- SN_TIME EQU R1 ;南北方向时间
- MAIN: //I/0口,寄存器初始化
- MOV P1,#RRR
- MOV P3,#0FFH
- LCALL DELAY_1S
- MOV R2,#20 //定时计数器T0定时50ms,循环20次获得一秒定时
- MOV 50H,#20 //红灯时间
- MOV 51H,#16 //绿灯时间
- /*************T0初始化**************/
- MOV TMOD,#11H //定时计数器T0,模式1,16位
- MOV TH0,#3CH //50ms定时初值
- MOV TL0,#0B0H
- SETB EA //开总中断
- SETB ET0 //开T0中断
- SETB TR0 //T0启动
- /**********************************
- 状态1:
- 东西绿灯亮16s
- 南北红灯亮20s
- **********************************/
- START: MOV P1 , #GR
- MOV EW_TIME,50H //东西方向倒计时初值15
- MOV SN_TIME,51H //南北方向倒计时初值12
- D0: LCALL DISPLAY //调用显示子程序
- CJNE SN_TIME,#00H,D0
- /**********************************
- 状态2:
- 东西黄灯闪烁4S
- 南北还是红灯
- **********************************/
- MOV A,50H
- SUBB A,51H
- MOV SN_TIME,A //黄灯倒计时初值4
- MOV P1 , #YR
- D1:LCALL DISPLAY
- CJNE SN_TIME,#03H,D1
- SETB P1.4 //闪烁
- D2:LCALL DISPLAY
- CJNE SN_TIME,#02H,D2
- CLR P1.4
- D3:LCALL DISPLAY
- CJNE SN_TIME,#01H,D3
- SETB P1.4
- D4:LCALL DISPLAY
- CJNE SN_TIME,#00H,D4
- /**********************************
- 状态3:
- 南北绿灯亮12s
- 东西红灯亮15s
- **********************************/
- MOV P1 , #RG
- MOV SN_TIME,50H
- MOV EW_TIME,51H
- D5:LCALL DISPLAY
- CJNE EW_TIME,#00H,D5
- /**********************************
- 状态4:
- 东西持续红灯
- 南北黄灯亮3s
- **********************************/
- MOV P1 , #RY
- MOV A,50H
- SUBB A,51H
- MOV EW_TIME,A //东西绿灯灭,黄灯倒计时初值3s
- MOV P1,#RY
- D6:LCALL DISPLAY
- CJNE SN_TIME,#03H,D6
- SETB P1.1 //闪烁
- D7:LCALL DISPLAY
- CJNE SN_TIME,#02H,D7
- CLR P1.1
- D8:LCALL DISPLAY
- CJNE SN_TIME,#01H,D8
- SETB P1.1
- D9:LCALL DISPLAY
- CJNE SN_TIME,#00H,D9
- /**********************************/
- LJMP START //返回初始状态
- //********显示子程序*******//
- DISPLAY:MOV DPTR,#TABLE
- MOV A,EW_TIME
- MOV B,#10
- DIV AB
- MOVC A,@A+DPTR
- MOV P3,#0FFH
- MOV P2,A
- MOV P3,#0FEH
- LCALL DELAY_5MS
- MOV A,B
- MOVC A,@A+DPTR
- MOV P3,#0FFH
- MOV P2,A
- MOV P3,#0FDH
- LCALL DELAY_5MS
- MOV A,SN_TIME
- MOV B,#10
- DIV AB
- MOVC A,@A+DPTR
- MOV P3,#0FFH
- MOV P2,A
- MOV P3,#0FBH
- LCALL DELAY_5MS
- MOV A,B
- MOVC A,@A+DPTR
- MOV P3,#0FFH
- MOV P2,A
- MOV P3,#0F7H
- LCALL DELAY_5MS
- RET
- //******T0中断子程序*******//
- INT_T0: DJNZ R2,NT0 //计数寄存器不为0则跳转,T0重新赋初值
- MOV R2,#20 //计数器重新赋值
- DEC EW_TIME //南北方向倒计时数值减1
- DEC SN_TIME //东西方向倒计时数值减1
- NT0: MOV TH0,#3CH //T0赋50ms初值
- MOV TL0,#0B0H
- SETB TR0 //启动T0
- RETI
- TABLE:DB 3FH ,06H, 5BH ,4FH ,66H ,6DH ,7DH ,07H ,7FH ,6FH //段码
- DELAY_5MS:MOV TMOD,#11H //定时计数器T1,模式1,16位
- MOV TH1,#0F8H;#0D8H; //5ms定时初值
- MOV TL1,#2FH;#0F0H;
- SETB TR1 //T1启动
- DD1: JBC TF1 ,TRE
- AJMP DD1
- TRE: RET
- DELAY_1S:MOV R3 , #250
- DD2: LCALL DELAY_5MS
- DJNZ R3 ,DD2
- RET
- END
|