📄 zhongduan.asm
字号:
;通信0502 落红
;实验六 中断实验(在交通控制的基础上)(主程序和中断服务程序的延时程序独立)
;2007.08.12
C_addr equ 0000h
C_1 equ C_addr+0031h
C_2 equ C_addr+0032h
C_3 equ C_addr+0032h
org C_addr
ajmp main
org C_addr+0003h ;外部中断0入口地址
ljmp inser
org C_addr+0060h
main: mov sp,C_addr+0040h ;设置堆栈指针初始值
setb ea ;CPU开中断
setb ex0 ;开外部中断0
setb it0 ;设置触发方式为边沿触发
mov dptr,#1b03h ;写控制字1000 0000B,方式0,输出
mov a,#80h
movx @dptr,a
start: lcall red ;初始状态1234红灯全亮,调用0.5秒延时子程序延时2秒
mov r0,#4
del_0: lcall delay
djnz r0,del_0
light_13: ;13路口通行
mov r0,#0
acall light
light_24: ;24路口通行
inc r0
acall light
ajmp light_13 ; 上两种状态循环
light: ;红绿黄灯亮灭控制
light_green: lcall output ; 绿灯亮,调用0.5秒子程序,延时5S
mov r1,#10
del_green: lcall delay
djnz r1,del_green
light_yellow: mov C_3,r0
mov r1,#8 ; 黄灯闪烁8次,每次亮0.2s,灭0.2s
yellow_again: mov r0,C_3 ;暂存r0的值
inc r0
lcall output;黄灯亮
lcall delay1 ;两次调用0.1秒延时程序
inc r0
lcall output ;黄灯灭
lcall delay1
djnz r1,yellow_again
light_red: ;1234红灯全亮,调用0.5秒延时子程序,延时0.5秒
lcall red
lcall delay
ret ;一次循环结束,
red: mov dptr,#1b01h ;1234红灯全亮
mov a,#90h
movx @dptr,a
mov dptr,#1b02h
mov a,#24h
movx @dptr,a
ret
output: mov a,r0 ;输出函数子程序
mov dptr,#b_tab
movc a,@a+dptr
mov C_1,a ;保存B口输出变量
mov dptr,#1b01h ;指向B口
movx @dptr,a
mov a,r0
mov dptr,#C_tab
movc a,@a+dptr
mov C_2,a ;保存C口输出变量
mov dptr,#1b02h ;指向C口
movx @dptr,a
ret
delay: mov r5,#5 ;0.5秒延时子程序
d_00: mov r6,#200
d_01: mov r7,#126
d_02: djnz r7,d_02
djnz r6,d_01
djnz r5,d_00
ret
delay1:mov r5,#2 ;0.2秒延时子程序
d_10: mov r6,#200
d_11: mov r7,#126
d_12: djnz r7,d_12
djnz r6,d_11
djnz r5,d_10
ret
inser: push a ;相关数据压栈
push psw
push dph
push dpl
lcall red ;1234红灯全亮
mov r4,#12
d_20: lcall delay ;延时6秒
djnz r4,d_20
mov a,C_1 ;恢复原显示状态
mov dptr,#1b01h
movx @dptr,a
mov a,C_2
mov dptr,#1b02h
movx @dptr,a
pop dpl
pop dph
pop psw
pop a
setb ex0 ; 外部中断允标志位置位
reti
b_tab: db 0c0h,0a0h,80h,90h,10h,10h,10h,90h
c_tab: db 30h,28h,20h,24h,86h,45h,04h,24h
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -