我们设想一种状况:有一天你正在看教学♂视频,这时候你老妈突然给你发了条微信“儿砸,干嘛呢”,然后你立马暂停了你的视频,回了句“我,打钱!”。实际上上述过程中就发生了一次中断。
中断的概念
上述过程中,你本来在激动地看着视频,但是一条微信打断了这一切,那条消息就叫做中断源。引起CPU中断的根源叫做中断源,中断源向CPU提出申请,CPU暂时中断事件A(教学视频),转而处理事件B(乞讨),对事件B处理完后,再回到原来中断的地方(即断点)(视频暂停的位置)。实现该过程的部件叫做中断系统。
中断嵌套/中断优先级
上述过程中,你刚打开微信,准备向你妈乞讨,这时候你同学发来一条消息“上号”,你将选择先打把游戏,再回到微信对你妈说“刚刚在学习没看到”,然后再回到教学视频。同学找你发生在你正准备乞讨时,也就是正在执行中断响应时,那么“上号”就是嵌套的更高级的中断。如果上述两个事件同时发生,你还是会先“上号”,那么就认为“上号”的优先级高于“乞讨”。
那么如何确定两个中断哪个优先级更高呢?这取决于中断优先级寄存器的设置,我们再后面会讲到。
中断源
51单片机共有5个中断源:
- INT0:外部中断0,P3.2引脚接入,低电平或下降沿有效;
- INT1:外部中断1,P3.3接入,低电平或下降沿有效;
- T0:定时器计数器0中断,由T0计数器计满回零引起;
- T1:定时器计数器1,T1引起;
- TI/RI:串行口中断,串行端口完成一帧字符发送/接收后引起。
中断源 | 中断优先级 | 中断号 | 入口地址 |
---|---|---|---|
INT0 | 最高 | 0 | 0003H |
T0 | 第二 | 1 | 000BH |
INT1 | 第三 | 2 | 0013H |
T1 | 第四 | 3 | 001BH |
TI/RI | 最低 | 4 | 0023H |
中断允许寄存器
中断允许寄存器IE用来设置各中断源的打开与关闭。
中断请求标志TCON
控制中断及定时器。
中断系统的结构
上面我们已经介绍了TCON与IE,现在我们来讲一下该结构怎么工作。我们以INT0为例,由上知IT0用来选择外部中断0触发方式,假设我们选择了低电平有效,那当我们遇到低电平,那么进入IE0,当IE0配置为1,即允许中断,在IE寄存器中,EX0也为中断允许控制,当EX0也为1,则进入中断总开关EA,当EA也为1,则进入IP判断优先级,随后执行中断程序。
设置外部中断/编写程序
编写程序设计中断一般有以下几个步骤:
- 设置触发中断方式
- 设置允许外部中断
- 允许总中断
完成程序后,等待中断发生,机器响应中断并执行服务函数。
下面我们编写程序,目标是按下独立按键K3是LED等状态转换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#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
sbit k3=P3^2; //定义按键K3
sbit led=P2^0; //定义P20口是led
void delay(u16 i)
{
while(i--);
}
void Int0Init()
{
//设置INT0
IT0=1;//跳变沿出发方式(下降沿)
EX0=1;//打开INT0的中断允许。
EA=1;//打开总中断
}
void main()
{
Int0Init(); // 设置外部中断0
while(1);
}
void Int0() interrupt 0 //外部中断0的中断函数
{
delay(1000); //延时消抖
if(k3==0)
{
led=~led;
}
}