📄 traffic light.asm
字号:
ORG 0000H
LJMP MAIN ;转向主程序
ORG 0003H
LJMP INT0 ;转向紧急车辆中断服务程序
ORG 0013H
LJMP INT1 ;转向有车车道中断服务程序
ORG 0200H
MAIN:
MOV SP ,#30H
SETB PX0 ;置外部中断0为高优先级中断
MOV TCON,#00H ;置外部中断0、1为电平触发
MOV TMOD,#10H ;置定时器1为方式1
MOV IE,#85H ;开CPU中断,开外中断0、1中断
LOOP:
MOV P1,#0F3H ;A道绿灯放行,B道红灯禁止
MOV R1,#90 ;置0.5秒循环次数(0.5×90=45S)
DIP1:
ACALL DELAY ;调用0.5秒延时子程序
DJNZ R1,DIP1 ;45秒不到继续循环
MOV R1,#06 ;置A绿灯闪烁循环次数
WAN1:
CPL P1.2 ;A绿灯闪烁
ACALL DELAY
DJNZ R1,WAN1 ;闪烁次数未到继续循环
MOV P1,#0F5H ;A黄灯警告,B红灯禁止
MOV R1,#04H ; 置0.5秒循环次数(0.5×4=2S)
YL1:
ACALL DELAY
DJNZ R1,YL1 ;2秒未到继续循环
MOV P1,#0DEH ;A红灯,B绿灯
MOV R1,#32H ; 置0.5秒循环次数(0.5×50=25S)
DIP2:
ACALL DELAY
DJNZ R1,DIP2 ;25秒未到继续循环
MOV R1,#06H
WAN2:
CPL P1.5 ;B绿灯闪烁
ACALL DELAY
DJNZ R1,WAN2
MOV P1,#0EEH ;A红灯,B黄灯
MOV R1,#04H
YL2:
ACALL DELAY
DJNZ R1,YL2
AJMP LOOP ;循环执行主程序
INT0:
PUSH P1 ;P1口数据压栈保护
; PUSH R3 ;R3寄存器压栈保护
PUSH TH1 ;TH1压栈保护
PUSH TL1 ;TL1压栈保护
MOV P1,#0F6H ;A、B道均为红灯
MOV R2,#30 ;置0.5秒循环初值(15S)
DEY0:
ACALL DELAY
DJNZ R2,DEY0 ;15秒未到继续循环
POP TL1 ;弹栈恢复现场
POP TH1
; POP R3
POP P1
RETI ;返回主程序
INT1:
CLR EA ;关中断
PUSH P1 ;压栈保护现场
;PUSH R3
PUSH TH1
PUSH TL1
SETB EA ;开中断
JNB P3.0,BOP ;A道无车转向B道
MOV P1,#0F3H ;A道绿灯,B道红灯
SJMP DEL1 ;转向15秒延时
BOP:
JNB P3.1,EXIT ;B道无车退出中断
MOV P1,#0DEH ;A红灯,B绿灯
DEL1:
MOV R5,#30 ;置0.5秒循环初值(15S)
NEXT:
ACALL DELAY
DJNZ R5,NEXT ;15秒未到继续循环
EXIT:
CLR EA
POP TL1 ;弹栈恢复现场
POP TH1
; POP R3
POP P1
SETB EA
RETI
DELAY:
MOV R3,#0AH ; 0.5秒子程序(50ms×10=0.5s)
MOV TH1,#3CH ; 置50ms初值X=3CB0H
MOV TL1,#0B0H
SETB TR1 ;启动T1
LP1:
JBC TF1,LP2 ;查询计数溢出
SJMP LP1
LP2:
MOV TH1,#3CH ;置50ms初值X=3CB0H
MOV TL1,#0B0H
DJNZ R3,LP1
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -