实验源程序:
;-------------------内存分配--------------------------;
TWINKLE
TIME_500MS
TIME_1S
OUTPUT
EQU
EQU
EQU
EQU
20H
25H
30H
P0
;闪烁标志
;500ms 计时标志
;1s 计时标志
;P0 输出口标志
;-----------------------------------------------------;
ORG
0000H
SJMP MAIN
ORG
000BH
LJMP TIMEOUT
ORG
LJMP EMERGENCY0
ORG
LJMP EMERGENCY1
ORG
0003H
0013H
0030H
MAIN:
MOV
MOV
CLR
CLR
CLR
MOV
MOV
MOV
MOV
SETB
P1,#0FFH
P2,#0
TWINKLE
TIME_500MS
TIME_1S
TMOD,#01H
TH0,#3CH
TL0,#0B0H
IE,#87H
TR0
;定时器中断
;外部中断 0
;外部中断 1
;初始化 I\O 口
;初始化各标志位
;定义定时器 T0 工作于模式 1
;定时器定时 50ms
;开定时器 T0 与外部 0\1 中断
;启动定时器
;-------------状态一:南北禁行,东西直行------------------;
STATE1:
MOV
MOV
MOV
CLR
CLR
CALL
MOV
CJNE
P1,#0FFH
R6,#50
R7,#25
P1.7
P1.0
DISPLAY
A,R7
A,#0,LOOP1
LOOP1:
;送南北红灯 50s 倒计时
;送东西直行绿灯 25s 倒计时
;南北红灯亮
;东西直行绿灯亮
;调用数码管显示程序
;倒计时剩余时间数送 A
;时间是否到,到则进状态二,未到则循环显示
;-------------状态二:南北禁行,东西左转-----------------;
STATE2:
P1,#0FFH
MOV
MOV
MOV
CLR
CLR
CALL
MOV
CJNE
R6,#25
R7,#20
P1.7
P1.1
DISPLAY
A,R7
A,#0,LOOP2
LOOP2:
显示
;南北红灯剩余 25S
;送东西左转绿灯 20s 倒计时
;南北红灯亮
;东西左转绿灯亮
;调用数码管显示程序
;时间是否到,到则进状态三,未到则循环
;-------------状态三:南北禁行,东西黄灯闪烁-------------;
STATE3:
LOOP3:
MOV P1,#0FFH
MOV
MOV
CLR
CLR
JNB
CLR
AJMP
SETB
NEXT:
SHAKING: CALL
MOV
CJNE
CLR
R6,#5
R7,#5
P1.7
P1.2
TWINKLE,NEXT
P1.2
SHAKING
P1.2
DISPLAY
A,R6
A,#0,LOOP3
TWINKLE
;南北红灯剩余 5s
;送东西黄灯闪烁倒计时 5s
;南北红灯亮
;东西黄灯亮
;判断闪烁标志位,为 0 转移
;标志位为 1 时,点亮黄灯
;标志位为 0 时,熄灭黄灯
;判断 5s 时间是否到
;定时到则清闪烁标志位,进入状态四
;--------------状态四:东西禁行,南北直行-----------------;
STATE4:
MOV
MOV
MOV
CLR
CLR
CALL
MOV
CJNE
MOV
MOV
MOV
CLR
CLR
CALL
MOV
CJNE
P1,#0FFH
R6,#25
R7,#50
P1.4
P1.3
DISPLAY
A,R6
A,#0,LOOP4
P1,#0FFH
R6,#20
R7,#25
P1.3
P1.5
DISPLAY
A,R6
A,#0,LOOP5
LOOP4:
LOOP5:
显示
;--------------状态五:东西禁行,南北左转弯----------------;
STATE5:
;送南北直行 25s 倒计时
;送东西禁行 50s 倒计时
;点亮南北直行绿灯
;点亮东西禁行红灯
;时间是否到,到则进状态五,未到则循环显示
;送南北左转弯倒计时 20s
;东西禁行时间剩余 25s
;点亮东西禁行红灯
;点亮南北左转绿灯
;时间是否到,到则进状态六,未到则循环
;--------------状态六:东西禁行,南北黄灯闪烁---------------;
STATE6:
LOOP6:
P1,#0FFH
R6,#5
R7,#5
P1.3
P1.6
MOV
MOV
MOV
CLR
CLR
JNB TWINKLE,NEXT1
CLR
SJMP
SETB
NEXT1:
SHAKING1:CALL
MOV
CJNE
CLR
LJMP
P1.6
SHAKING1
P1.6
DISPLAY
A,R6
A,#0,LOOP6
TWINKLE
MAIN
;送南北黄灯闪烁 5s 倒计时
;东西红灯剩余 5s
;点亮东西禁行红灯
;点亮南北黄灯
;判断闪烁标志位,为 0 转移
;标志位为 1 时,点亮黄灯
;标志位为 0 时,熄灭黄灯
;判断 5s 时间是否到
;定时到则清闪烁标志位
;状态六执行完毕后,跳回主程序开始位置
;--------------紧急情况一:南北方向紧急通行,东西红灯常亮-----------;
EMERGENCY0: MOV
MOV
MOV
MOV
CLR
CLR
AJMP
P1,#0FFH
P2,#00H
R6,#0
R7,#0
P1.3
P1.4
$
;停留在紧急状态中,按复位按钮退出
;--------------紧急情况二:南北红灯常亮,东西方向紧急通行-----------;
EMERGENCY1: MOV
MOV
MOV
MOV
CLR
CLR
AJMP $
P1,#0FFH
P2,#00H
R6,#0
R7,#0
P1.0
P1.7
;停留在紧急状态中,按复位按钮退出
;--------------------50ms 定时器中断---------------------------------;
TIMEOUT:
CLR
MOV
MOV
INC
INC
MOV
EA
TH0,#3CH
TL0,#0B0H
TIME_500MS
TIME_1S
A,TIME_500MS
;关中断,防止计时紊乱
;重新置 50ms 计时初值
;500ms 计时单元加一
;1s 计时单元加一
CJNE
A,#0AH,NEXT3
;判断 500ms 计时是否到:未到则跳转 NEXT3
MOV
CPL
TIME_500MS,#0
TWINKLE
;到则使 500ms 计时单元清 0
;500ms 到一次,则闪烁位取反一次,该指
令用于控制黄灯的 0.5s 闪烁
NEXT3:
A,TIME_1S
A,#20,QUIT
MOV
CJNE
则中断返回主程序
MOV
DEC
DEC
SETB
RETI
QUIT:
TIME_1S,#0
R7
R6
EA
;到则使 1s 计时单元清 0
;倒计时过一秒则减一
;中断返回前开中断
;判断 1s 计时是否到:20*50=1000。未到
;东西倒计时值送 A
;B 取值 10
;利用除法分离倒计时的个位与十位
;查表,DPTR 存 TAB 表的首地址
;查表,获得东西方向十位上的显示段码
;显示段码输出到显示端口
;选通东西数码管十位数显口
;-----------------数码管显示子程序:用于显示倒计时值-----------------;
DISPLAY: MOV
A,R7
MOV
B,#0AH
DIV
AB
MOV
DPTR,#TAB
MOVC A,@A+DPTR
MOV
OUTPUT,A
CLR
P2.4
CALL
DELAY_1MS
SETB
P2.4
MOV
A,B
MOV
DPTR,#TAB
MOVC A,@A+DPTR
MOV
CLR
CALL
SETB
OUTPUT,A
P2.5
DELAY_1MS
P2.5
;延时 1ms
;关闭十位位选
;个位
;关闭个位位选
;查表,获得东西方向个位上的显示段码
;选通东西数码管个位数显口
;南北倒计时送 A
;查表,获得南北方向十位上的显示段码
;选通南北数码管十位数显口
MOV
A,R6
MOV
B,#0AH
DIV
AB
MOV
DPTR,#TAB
MOVC A,@A+DPTR
MOV
CLR
CALL
SETB
MOV
MOV
OUTPUT,A
P2.6
DELAY_1MS
P2.6
A,B
DPTR,#TAB
MOVC A,@A+DPTR
MOV
CLR
CALL
SETB
RET
OUTPUT,A
P2.7
DELAY_1MS
P2.7
;查表,获得南北方向个位上的显示段码
;选通东西数码管个位数显口
;子程序返回
;-------------------延时子程序:1ms-------------------------;
DELAY_1MS: MOV
MOV
DJNZ
DJNZ
RET
R1,#2
R2,#248
R2,NEXT4
R1,NEXT4
;2
;2
;2*248=496
;496*2=992
NEXT4:
;-----------------TAB 表:共阴极段选码-----------------------;
TAB:
3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
DB
END