概述
中断
中断是一种计算机内部机制,常用于处理突发事件(优先级高的事件)。
下图是中断机制的原理图,计算机自动检测五个中断标志,判断是否有中断请求,再判断是否允许响应该中断请求,最后去执行中断响应函数。
我们可以把中断机制理解为一间房子,首先我们需要记住两道门:小门和大门。小门有五扇,指的是5个源允许位;大门只有一扇,指的是总允许位。大门不开,谁都进不来,大门开了,小门锁上,对应的房间也进不去;因此只有当大门和小门同时打开,才能完成一次中断响应(中断允许)。其次这房子还有一个特点,就是同一个时间只能进去一个人,因此如果有两个人(两个中断请求)同时要求进入,且两扇门都是打开的,这时管家(单片机)就会把这两人分为等级,等级高的先进入,我们也可以不按照管家的分级(默认优先级),自己为五个人分级(优先级控制器)。至此,中断机制就差不多了。
中断源
中断机制由中断源和中断响应函数组成,AT89C52单片机的中断源有两个外部中断,三个内部中断
中断源(默认优先级):
- 外部中断0 (外部中断)
最高优先级
- 定时器0中断 (内部中断)
- 外部中断1 (外部中断)
- 定时器1中断 (内部中断)
- 串口中断 (内部中断)
最低优先级
本篇主要讲外部中断,不考虑自定优先级,不考虑同时发生。
中断寄存器
-
中断控制寄存器
外部中断0/1:- IE0/1:外部中断0/1请求标志位,如果出现中断信号,该位由硬件置1。
- IT0/1:外部中断0/1触发方式控制位,0为低电平触发,1为高电平触发。
定时器0/1:
- TF0/1:定时器0/1溢出标志位,计数器溢出则该位由硬件置1.
- TR0/1:定时器0/1启动位,0不允许运行,1允许运行。
串口中断:
- RI:接收中断
- TI:发送中断
- 中断允许控制寄存器
- EA:中断总允许
- EX0:外部中断0中断允许位
- ET0:定时器0中断允许位
- EX1:外部中断1中断允许位
- ET1:定时器1中断允许位
- ES:串口中断允许位
以上各位置1为允许
- 中断优先级控制寄存器(本篇不讲)
中断地址
一旦触发了中断,单片机就会到指定的地点去寻找中断响应函数,这个固定的地方就叫做中断地址。
地址 | 功能 |
---|---|
0003H—000AH | 外部中断0 |
000BH—0012H | 定时/计数器0中断 |
0013H—001AH | 外部中断1 |
001BH—0022H | 定时/计数器1中断 |
0023H—002AH | 串行中断 |
002BH—0032H | 定时/计数器2中断 |
外部中断
外部中断有两种触发方式,分别为低电平触发和下降沿触发(我们通常使用下降沿触发),具体到单片机就是P3.2(外部中断0),P3.3(外部中断1)。
配置外部中断0:
- 设置下降沿触发,打开两扇门(允许位置1)
SETB IT0
SETB EX0
SETB EA
- 中断响应函数
ORG 03H
AJMP EX0_INTERRUPT
……
……
EX0_INTERRUPT:
PUSH ACC
PUSH PSW
……
……
POP PSW
POP ACC
RETI
例程:
ORG 0000H
AJMP START
ORG 0003H ;外部中断0中断地址
AJMP EX0_INTERRUPT ;外部中断0响应函数
ORG 0013H ;外部中断1中断地址
AJMP EX1_INTERRUPT ;外部中断1响应函数
;MAIN-------------------------------------------------
ORG 0030H
START:
;VIDEO MEMORY-----------------------------------------
MOV 30H, #1
MOV 31H, #2
MOV 32H, #3
MOV 33H, #4
ACALL EX_INIT
MIANLOOP:
ACALL DISPLAY
AJMP MIANLOOP
;EX INIT---------------------------------------------
EX_INIT:
SETB IT0
SETB IT1
SETB EX0
SETB EX1
SETB EA
RET
;EX0_INTERRUPT----------------------------------------
EX0_INTERRUPT:
PUSH ACC
PUSH PSW
INC 33H
MOV A, 33H
CJNE A, #10, EX0_EXIT
MOV 33H, #0
INC 32H
MOV A, 32H
CJNE A, #10, EX0_EXIT
MOV 32H, #0
EX0_EXIT:
POP PSW
POP ACC
RETI
;EX1_INTERRUPT----------------------------------------
EX1_INTERRUPT:
PUSH ACC
PUSH PSW
DEC 33H
MOV A, 33H
CJNE A, #0, EX0_EXIT
MOV 33H, #9;
DEC 32H
MOV A, 32H
CJNE A, #0, EX0_EXIT
MOV 32H, #0
EX1_EXIT:
POP PSW
POP ACC
RETI
;显示函数---------------------------------------------------------
;段选:P0.0->P0.7
;位选:P2.0->P2.3
DISPLAY:
MOV DPTR, #1000H ;码表起始地址
MOV R0, #30H ;显存起始地址
MOV R1, #01H ;位选码 P2.7-> 0 0 0 0 0 0 0 1 ->P2.0
;四位循环----------------------------------------------------------
DISPLAYLOOP:
MOV P0, #0FFH ;消影
;查表,将显存中的数字映射到段码
MOV A, @R0
MOVC A, @A+DPTR
MOV P0, A ;段选赋值
MOV P2, R1 ;位选赋值
ACALL DELAY ;延时
INC R0 ;显存自加,切换到下一位数字的显存
;位选左移切换
MOV A, R1
RL A
MOV R1, A
CJNE R1, #10H, DISPLAYLOOP ;根据位选码,判断是否完成四位切换
RET
;延时函数----------------------------------------------------------
DELAY:
MOV R7, #2
DELAYLOOP1:
MOV R6, #2
DELAYLOOP2:
MOV R5, #10
DELAYLOOP3:
NOP
DJNZ R5, DELAYLOOP3
DJNZ R6, DELAYLOOP2
DJNZ R7, DELAYLOOP1
RET
;码表-------------------------------------------------------------
ORG 1000H
DB 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90
END
最后
以上就是执着篮球为你收集整理的51汇编(八):外部中断中断中断源中断寄存器中断地址外部中断的全部内容,希望文章能够帮你解决51汇编(八):外部中断中断中断源中断寄存器中断地址外部中断所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复