基于仿真文件电路图结尾有设计的汇编代码
实验代码:12MHZ晶振
ORG 0000H
AJMP START
ORG 0003H ;外部中断来临
AJMP URGENCY;紧急情况处理
ORG 000BH
AJMP TIMING
START:MOV TMOD,#01H ;T0定时器
MOV TH0,#3CH ;定时50ms
MOV TL0,#0B0H ;定时50ms
MOV R0,#00H
MOV R1,#03H ;南北晶体管
MOV R2,#05H ;东西晶体管
MOV R3,#40;紧急情况T1定时器实现25ms×40=1秒
MOV R4,#06H ;紧急6S
SETB P3.2
MOV P1,#00H;高三位东西红黄绿,低三位南北红黄绿
SETB ET0;开内部TF0中断
SETB EX0;开外部IE0中断
SETB EA
SETB PX0;设置高一级中断
AJMP MAIN
MAIN:
SETB TR0;启动计时器
ACALL LOOP1 ;东西红灯,南北绿灯
SETB TR0;启动计时器
ACALL LOOP2 ;东西红灯,南北黄灯
SETB TR0;启动计时器
ACALL LOOP3 ;东西绿灯,南北红灯
SETB TR0;启动计时器
ACALL LOOP4 ;东西黄灯,南北红灯
SJMP MAIN ;回到循环
LOOP1:
CJNE R0,#20,LOOP11 ;50MS*20=1S,够1S顺序执行
MOV R0,#00H ;对R0清零,为下次计时1S做准备
DEC R1 ;南北送显时间-1
DEC R2 ;东西送显时间-1
CJNE R1,#00H,LOOP1 ;判断南北绿灯是否结束
CLR TR0 ;停止计数器
MOV R1,#02H ;下个状态黄灯2S
RET ;回到主程序
LOOP11:
MOV P1,#14H ;东西红灯,南北绿灯
ACALL DISPLAY ;数码管显示
AJMP LOOP1
LOOP2:
CJNE R0,#20,LOOP21
MOV R0,#00H
DEC R1
DEC R2
CJNE R1,#00H,LOOP2 ; 判断南北黄灯2S是否结束
CLR TR0
MOV R1,#05H ;下个状态南北红灯
MOV R2,#03H ;下个状态东西绿灯3S
RET
LOOP21:
MOV P1,#0CH ;东西红灯,南北黄灯
ACALL DISPLAY
AJMP LOOP2
LOOP3:
CJNE R0,#20,LOOP31
MOV R0,#00H
DEC R1
DEC R2
CJNE R1,#02H,LOOP3
MOV R2,#02H
RET
LOOP31:
MOV P1,#22H ;东西绿灯,南北红灯
ACALL DISPLAY
AJMP LOOP3
LOOP4:
CJNE R0,#20,LOOP41
MOV R0,#00H
DEC R1
DEC R2
CJNE R1,#00H,LOOP4
MOV R1,#03H
MOV R2,#05H
RET
LOOP41:
MOV P1,#21H ; 东西黄灯,南北红灯
ACALL DISPLAY
AJMP LOOP4
;紧急情况处理
URGENCY:
CLR TR0
MOV A,P1
PUSH A ;保护现场
MOV A,TH0
PUSH A
MOV A,TL0
PUSH A
MOV A,TMOD
PUSH A
MOV A,R2
PUSH A
MOV A,R1
PUSH A
MOV A,R0
PUSH A ;保护现场
MOV A,R4 ;将R4紧急秒数送显
MOV R1,A
MOV R2,A
MOV TMOD,#10H ;T1定时器,方式一
MOV TH1,#9EH ;定时25ms
MOV TL1,#50H ;定时25ms
SETB TR1
WAIT:JBC TF1,URG1
MOV P1,#24H;两个红灯
ACALL DISPLAY
SJMP WAIT
URG1:
MOV TH1,#9EH ;定时25ms,赋初值
MOV TL1,#50H ;定时25ms,赋初值
DEC R3
CJNE R3,#00H,WAIT
MOV R3,#40
DEC R4
MOV A,R4
MOV R1,A
MOV R2,A
CJNE R4,#00H,WAIT
MOV R3,#40
MOV R4,#06H
POP A
MOV R0,A
POP A ; 恢复中断前
MOV R1,A
POP A
MOV R2,A
POP A
MOV TMOD,A
POP A
MOV TL0,A
POP A
MOV TH0,A
POP A
MOV P1,A ;恢复中断前
SETB TR0 ;启动T0计时器
RETI ;返回中断前位置
;正常情况计时器中断跳转
TIMING:
INC R0
MOV TH0,#3CH ;重装
MOV TL0,#0B0H ;
RETI
;送显函数
DISPLAY:
MOV 60H,R1;南北晶体管放在60H
MOV 61H,R2;东西晶体管放在61H
MOV DPTR,#8002H
MOV A,#04H;选择南北晶体管位置
MOVX @DPTR,A
MOV DPTR,#TAB
MOV A,60H;
DEC A
MOVC A,@A+DPTR
MOV DPTR,#8004H
MOVX @DPTR,A
ACALL DELAY
MOV DPTR,#8002H
MOV A,#01H;选择东西晶体管位置
MOVX @DPTR,A
MOV DPTR,#TAB
MOV A,61H;
DEC A
MOVC A,@A+DPTR
MOV DPTR,#8004H
MOVX @DPTR,A
ACALL DELAY
RET
;延时程序,时间R6×(R7×2)×一个机器周期,若出现鬼影,适当增加一下延时时间
DELAY:
MOV R6,#2
L1:MOV R7,#250
DJNZ R7,$
DJNZ R6,L1
RET
;数码管段码表
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;共阴数码管0-9显示
;TAB: DB 0C0H 0F9H 0A4H 0B0H 99H 92H 82H 0F8H 80H 90H ;共阳数码管0-9显示
使用伟福编译器,设置如下:
proteus仿真文件:
https://share.weiyun.com/RRviPhOM