📄 exandtimerint.asm
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;实例十五:外部中断与Timer中断同时存在实验 external and timer interrupts (《51单片机应用从零开始》 11.5小节实例)
;
;现象:当外部中断模拟开关INT1(模拟外部中断INT1)向系统产生外部中断(边沿触发),单片机将优先服务外部中断1--闪烁5次
;,从而打断用于流水灯的延时控制的Timer 0中断
;
;作者:杨欣,刘长焕,张延强 电路飞翔网 eedesign@163.com
;
; http://www.circuitfly.com
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 00H ; 起始地址00H
JMP MAIN ; 跳转到MAIN
ORG 0BH ; Timer 0中断向量地址
JMP TIM0 ; 跳转到TIM0
ORG 13H ; 外部中断1向量地址
JMP EXT1 ; 跳转到EXT1
; 这里是主程序段,使能中断、中断优先级、装载计数初始值等
MAIN:
MOV IE, #86H ; 使能Timer 0中断和外部中断1
SETB TCON.2 ; 设置 中断的边沿触发方式
MOV IP, #04H ; 设置外部中断1优先级较高
MOV TMOD, #01H ; 使用Timer 0工作在模式1下
MOV TH0, #0D8H ; 装载计数初始值,10000?s延时
MOV TL0, #0F0H ;
MOV R1, #100 ; Timer 0中断次数为100次,即延时1秒
MOV R2, #0FEH ; 流水灯初始值
SETB TR0 ; 启动Timer 0
LOOP:
; 这里可放置主程序的执行功能
JMP LOOP ; 循环
; 这里是Timer 0中断服务子程序
TIM0:
MOV TH0, #0D8H ; 重新装载计数初始值
MOV TL0, #0F0H ;
DJNZ R1, WAIT_SEC ; 如果中断没到100次,则跳到WAIT_SEC返回
MOV R1, #100 ; 如果到达100次,重新设置中断次数为100次
MOV A, R2 ; 流水灯初始值载入ACC
MOV P1, A ; 从P0口输出显示
RL A ; 向左流动一位
MOV R2, A ; 将流水灯值保存在R2中
WAIT_SEC:
RETI ; 返回主程序
; 这里是外部中断1服务子程序
EXT1:
MOV A, #00H ; ACC=00H
MOV R3, #10 ; 亮+灭共10次
FLASH:
MOV P1, A ; P0=00H,全亮
CALL DELAY ; 调延时子程序
CPL A ; ACC反相
DJNZ R3, FLASH ; 如果R3=0,闪烁完成,否则循环
RETI ; 返回主程序
DELAY: MOV R4, #20 ; 延时200ms子程序
D1: MOV R5, #20
D2: MOV R6, #248
DJNZ R6, $
DJNZ R5, D2
DJNZ R4, D1
RET
END ; 程序结束
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -