中断/Interrupt

中断/Interrupt

什么是中断?

中断是一种特殊的触发信号,它可以让单片机暂停现在正在执行的普通程序。根据系统设置,单片机在中断信号发生后,会执行一个特殊的被称作“中断服务子程序”的应用程序,待中断服务子程序执行完毕后,系统继续执行普通程序。

中断源

单片机有五个中断源

中断源名称 默认优先级 中断号
外部中断请求0(INT0) 最高 0
定时器/计数器0(T0) · 1
外部中断请求1(INT1) · 2
定时器/计数器1(T1) · 3
串口中断 最低 4

INT0、INT1为外部中断,T0、T1以及串口为内部中断。

中断源涉及到的特殊功能寄存器

寄存器名称 主要功能
TCON Timer的启停标志,外中断的触发方式控制,Timer和外中断的中断触发标志
SCON 串行通信控制寄存器,里面有涉及串行通信的中断标志位
IE 中断允许控制寄存器,可以控制是否启用某个中断源,或一次性控制所有中断源(EA位)
IP 中断优先级控制寄存器,更改这个寄存器可以修改中断源之间默认的优先级

均可按位寻址

定时器控制寄存器/TCON

位名称 功能
IT0 INT0的中断触发方式
IE0 INT0的中断标志
IT1 INT1的中断触发方式
IE1 INT1的中断标志
TR0 T0的启停标志
TF0 T0的中断标志
TR1 T1的启停标志
TF0 T1的中断标志

ITx:外部中断的触发方式。分为低电平触发和下降沿(负跳变)触发,当ITx为1时即为中断触发方式为下降沿触发,为0时为低电平触发。

下降沿与低电平的相关知识请查阅数电,此处不再赘述

IEx、TFx:外部中断、定时器的中断标志,当其向CPU申请中断时,对应的中断标志会置1,若有中断服务子程序,就会在中断触发时进入子程序,并且中断标志会自动硬件置0。

TRx:定时器/计数器启动的标志,置1即启动定时器/计数器。

串行口控制寄存器/SCON

SCON中最低两位TI、RI为串行口的中断标志,在串行口发送/接收数据完毕时,就会向CPU申请中断,对应的TI/RI位也会自动置1,但是需要注意的时,不同于ITx、TFx,TI、RI在进入中断服务子程序后不会硬件置0,需要软件手动置0

中断允许寄存器/IE

IE EA 无效位 ET2 ES ET1 EX1 ET0 EX0
总控制 52子系列,不用管 串行口 T1 INT1 T0 INT0

EA:总开关,必须当EA=1时,其他的中断允许位才有效

其他为也都为高电平有效,当需要某一个功能在中断时能够进入中断服务子程序,就需要把对应的IE位置1。

对于记忆方法(同时适用于IP):

位的顺序为:从低到高分别是外内外内串,序号依次升高

外部中断为X,定时器为T(timer),串行口为S(serial)

中断优先级寄存器/IP

PS PT1 PX1 PT0 PX0
串行口 T1 INT1 T0 INT0

当某一位为1时,对应的中断优先级为高。

当优先级处于同级时,同时申请中断的优先级按照本节开头的表格中默认优先级来决定。(外内外内串)。

当一个中断进行的时候,若再触发一个中断:

  1. 新的中断优先级高:打断正在进行的中断,等新中断执行完毕再回到原中断继续执行;

  2. 新的中断优先级一样:不会打断正在进行的中断,等正在进行的中断执行完毕再执行新中断。

编写中断服务子程序

中断服务子程序的编写遵循以下规则

void 函数名() interrupt 中断号 { //程序主体 }

void:子程序没有返回值,即全部子程序均为void。但是需要注意的是,在汇编中,所有中断子程序均有一条RETI返回指令。

第七、八、九章客观题中有一道题:

在中断服务程序中,至少应有一条:A. 传送指令; B. 转移指令; C. 加法指令; D. 中断返回指令。

由此可知本题答案为D。

interrupt 中断号:这里的interrupt关键字是中断子程序必须加的,且应在函数名的小括号后面,中断号即为本节开头表格中的中断号(从0到1:外内外内串)。

除了必要的中断服务子程序,还需要在主程序中进行中断点的初始化

中断的初始化

中断的初始化即在主程序中对各中断的特殊功能寄存器进行设置,例如中断的允许(IE),是否需要设置中断的优先级(IP),外部中断的触发方式(ITx)等等。

下面是单片机中断实验中第三个程序中的初始化例子

1
2
3
4
5
6
7
8
IT0 = 1; //INT0 下降沿触发
IT1 = 1; //INT1 下降沿触发
EX0 = 1; //INT0 允许中断
EX1 = 1; //INT1 允许中断
/*在这强制修改INT0、INT1的优先级*/
PX0 = 0; //INT0低优先级
PX1 = 1; //INT1高优先级
EA = 1; //中断允许总开关

应用举例

本例为单片机中断实验中第一个程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <reg52.h>

sbit led=P1^4;

void delay(unsigned int n);

void main(void) {
IT0=1; //INT0 下降沿触发
EX0=1; //INT0 允许中断
EA=1; //中断允许总开关

while(1) {
led=1;
delay(65535);
led=0;
delay(65535);
}
}

void int0_int() interrupt 0 {
unsigned char i;
IE0=0; //clear int0 int flag
EX0=0; //disable int0 int
led=0; //低电平时LED点亮
for(i=0;i<50;i++) {
delay(65535);
}
EX0=1; //enable int0 int
}

void delay(unsigned int n) {
while(n--);
}

中断的撤销

在进入中断服务程序后,中断请求标志由硬件自动复位;

若外部中断为电平触发方式时,中断请求标志需要软件清”0”,且需要设计中断请求信号撤销电路,即需外部电路来进行撤销,因此一般不使用低电平触发。

第七、八、九章客观题中有一道题:

在AT89S51的中断请求源中,需要外加电路实现中断撤销的是。A. 电平方式的外部中断请求;B. 跳沿方式的外部中断请求;C. 外部串行中断;D. 定时中断。

由此可知,答案为A. 电平方式的外部中断请求。

中断/Interrupt

https://mere.pt/dpj-int/

作者

MerePT

发布于

2022-05-17

许可协议