📄 trafficlight.asm
字号:
;-----------------------------------
; 交通灯控制器实例
;功能:使用6只LED模拟交通灯控制器
;-----------------------------------
SOUTH_RED EQU P1.0
SOUTH_YELLOW EQU P1.1
SOUTH_GREEN EQU P1.2
EAST_RED EQU P1.3
EAST_YELLOW EQU P1.4
EAST_GREEN EQU P1.5
SECOND_FLAG BIT 00H
TIME_COUNT0 DATA 30H
TIME_COUNT1 DATA 31H
STATUS_FLAG DATA 32H
SECOND_COUNT DATA 33H
ORG 0000H ;伪指令,指定程序从0000H开始存放
LJMP MAIN ;跳转指令,程序跳转到MAIN处
ORG 000BH ;伪指令,指定程序从T0入口地址000BH开始存放
LJMP T0_INT ;跳转指令,程序跳转到T0_INT处
ORG 0100H
MAIN:
MOV SP,#60H ;给堆栈指针赋初值
LCALL INIT ;调用状态初始化子程序
LCALL T0_INIT ;调用定时器中断初始化子程序
LOOP:
JNB SECOND_FLAG,LOOP ;根据SECOND_FLAG值判断0.5秒是否到
LCALL STATUS_CHANGE ;每0.5秒调用交通灯状态转换子程序
CLR SECOND_FLAG ;清零SECOND_FLAG
SJMP LOOP ;跳转,程序继续
STATUS_CHANGE:
;---------------------------------
; 交通灯状态转换子程序
;---------------------------------
MOV A,STATUS_FLAG ;根据STATUS_FLAG值进行散转
ADD A,STATUS_FLAG
MOV DPTR,#STATUS_PROC_TABLE
JMP @A+DPTR
STATUS_PROC_TABLE:
AJMP STATUS1
AJMP STATUS2
AJMP STATUS3
AJMP STATUS4
AJMP STATUS5
AJMP STATUS6
STATUS1:
;---------------------------------
; 散转子程序1
;状态1:南北绿灯,东西红灯,持续20秒
;然后转到状态2
;---------------------------------
DJNZ SECOND_COUNT,STATUS1_EXIT
MOV SECOND_COUNT,#6 ;20秒定时到,转换到状态2
MOV STATUS_FLAG,#01H
STATUS1_EXIT:
RET
STATUS2:
;---------------------------------
; 散转子程序2
;状态2:南北绿灯闪,东西红灯,持续3秒
;然后转到状态3
;---------------------------------
DJNZ SECOND_COUNT,STATUS2_EXIT
MOV SECOND_COUNT,#4 ;3秒定时到,转换到状态3
MOV STATUS_FLAG,#02H
SETB SOUTH_RED ;南北红灯灭
CLR SOUTH_YELLOW ;南北黄灯亮
SETB SOUTH_GREEN ;南北绿灯灭
CLR EAST_RED ;东西红灯亮
SETB EAST_YELLOW ;东西黄灯灭
SETB EAST_GREEN ;东西绿灯灭
RET
STATUS2_EXIT:
CPL SOUTH_GREEN ;南北绿灯闪
RET
STATUS3:
;---------------------------------
; 散转子程序3
;状态3:南北黄灯,东西红灯 ,持续2秒
;然后转到状态4
;---------------------------------
DJNZ SECOND_COUNT,STATUS3_EXIT
MOV SECOND_COUNT,#40 ;2秒定时到,转换到状态4
MOV STATUS_FLAG,#03H
CLR SOUTH_RED ;南北红灯亮
SETB SOUTH_YELLOW ;南北黄灯灭
SETB SOUTH_GREEN ;南北绿灯灭
SETB EAST_RED ;东西红灯灭
SETB EAST_YELLOW ;东西黄灯灭
CLR EAST_GREEN ;东西绿灯亮
STATUS3_EXIT:
RET
STATUS4:
;---------------------------------
; 散转子程序4
;状态4:南北红灯,东西绿灯,持续20秒
;然后转到状态5
;---------------------------------
DJNZ SECOND_COUNT,STATUS4_EXIT
MOV SECOND_COUNT,#6 ;20秒定时到,转换到状态5
MOV STATUS_FLAG,#04H
STATUS4_EXIT:
RET
STATUS5:
;---------------------------------
; 散转子程序5
;状态5:南北红灯,东西绿灯闪,持续3秒
;然后转到状态6
;---------------------------------
DJNZ SECOND_COUNT,STATUS5_EXIT
MOV SECOND_COUNT,#4 ;3秒定时到,转换到状态6
MOV STATUS_FLAG,#05H
CLR SOUTH_RED ;南北红灯亮
SETB SOUTH_YELLOW ;南北黄灯灭
SETB SOUTH_GREEN ;南北绿灯灭
SETB EAST_RED ;东西红灯灭
CLR EAST_YELLOW ;东西黄灯亮
SETB EAST_GREEN ;东西绿灯灭
RET
STATUS5_EXIT:
CPL EAST_GREEN ;东西绿灯闪
RET
STATUS6:
;---------------------------------
; 散转子程序6
;状态6:南北红灯,东西黄灯 ,持续2秒
;然后转到状态1
;---------------------------------
DJNZ SECOND_COUNT,STATUS6_EXIT
MOV SECOND_COUNT,#40 ;2秒定时到,转换到状态1
MOV STATUS_FLAG,#00H
SETB SOUTH_RED ;南北红灯灭
SETB SOUTH_YELLOW ;南北黄灯灭
CLR SOUTH_GREEN ;南北绿灯亮
CLR EAST_RED ;东西红灯亮
SETB EAST_YELLOW ;东西黄灯灭
SETB EAST_GREEN ;东西绿灯灭
STATUS6_EXIT:
RET
INIT:
;---------------------------------
; 状态初始化子程序
;---------------------------------
SETB SOUTH_RED ;南北红灯灭
SETB SOUTH_YELLOW ;南北黄灯灭
CLR SOUTH_GREEN ;南北绿灯亮
CLR EAST_RED ;东西红灯亮
SETB EAST_YELLOW ;东西黄灯灭
SETB EAST_GREEN ;东西绿灯灭
MOV TIME_COUNT0,#250 ;变量TIME_COUNT0赋初值250
MOV TIME_COUNT1,#8 ;变量TIME_COUNT1赋初值8
MOV SECOND_COUNT,#40 ;变量SECOND_COUNT赋初值40
MOV STATUS_FLAG,#00H ;变量STATUS_FLAG赋初值00H
CLR SECOND_FLAG ;清零位变量SECOND_FLAG
RET
T0_INT:
;---------------------------------
; T0中断服务程序
;每0.5秒置一SECOND_FLAG
;---------------------------------
DJNZ TIME_COUNT0,T0_INT_EXIT
MOV TIME_COUNT0,#250
DJNZ TIME_COUNT1,T0_INT_EXIT
MOV TIME_COUNT1,#8
SETB SECOND_FLAG ;定时0.5秒到,置一SECOND_FLAG
T0_INT_EXIT:
RETI
T0_INIT:
;---------------------------------
; 定时器T0的初始化
;---------------------------------
MOV TMOD,#00000010B ;定时器T0工作在方式2
MOV TL0,#06H ;设定定时器T0的初始值
MOV TH0,#06H ;设定定时器T0的自动重装入值
MOV TCON,#00010000B ;定时器T0使能
SETB EA ;中断允许总控制位使能
SETB ET0 ;T0中断使能
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -