中断

当CPU(或MCU)正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作, 这样的过程称为中断。中断系统的使用使得内核拥有更好处理复杂事务的能力,减少轮询带来的资源消耗。

  • 中断请求:发送给CPU的中断事件,请求中断当前事务。
  • 中断嵌套:在CPU处理中断任务的时候,有更高优先级的中断发生。
  • 中断优先级:当若干个中断源请求中断时,CPU处理的优先次序。
  • 中断向量表:在复杂微机环境中,映射中断号与入口地址。
  • 中断服务函数:中断响应后,系统所执行的函数。

51内核中断系统

在传统的51内核中,常用的有5个中断源(STC某些单片机中拥有15个中断源),中断的自然优先级从高到低依次为:

  • 外部中断0:INT0
  • 定时/计数中断0:TF0
  • 外部中断1:INT1
  • 定时/计数中断:TF1
  • 串口中断:RI/TI

中断源对应的优先级如下:

中断源对应中断结构如下:

中断源配置

使能与优先级

中断请求标志

外部中断应用

一般对中断的操作分为三步:

  • 中断初始化:参考前文中断结构,配置中断允许;配置中断触发方式;必要时配置优先级与其他参数。
  • 中断服务函数:中断时,配置需要处理的事务,例如重载TH/TL,清除标志位或其他对系统的操作。注意服务函数的操作应当尽量简短,以保证正常中断的运行。
  • 在mian函数中调用中断初始化函数。

    实现功能:P32(S5)端口对应INT0,P33(S4)端口对应INT1。实现按下S5时L1点亮,再按下时熄灭,S4控制L2;

具体实现:

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
35
36
37
38
39
40
41
#include<reg52.h>
sbit L1 = P0^0;
sbit L2 = P0^1;
void Init_Sys() //初始化函数,涉及译码器,与非门与锁存器,可不参阅。
{
P2 = (P2&0X1F)|0XA0; //仅改变最低三位的值,而不影响其它位电平。
P0 = 0X00;
P2 = (P2&0X1F)|0X80;
P0 = 0XFF;
}

void Init_INT0()
{
EX0 = 1; //允许外部中断0,详见前文中断结构。
IT0 = 1; //配置外部中断触发方式——下降沿
EA = 1; //允许总中断
}

void Init_INT1()
{
EX1 = 1;
IT1 = 1;
EA = 1;
}

void Ser_INT0() interrupt 0
{
L1 = ~L1; //取反LED灯对应端口电平
}

void Ser_INT1() interrupt 2
{
L2 = ~L2;
}
int main()
{
Init_Sys();
Init_INT0();
Init_INT1();
while(1);
}