单片机的中断处理机制详解

控制/MCU

1814人已加入

描述

前言

单片机多用于物联网、自动控制系统、智能家电等领域,要求单片机能够实时响应外部触发的事件,中断机制是单片机响应外部事件的重要方法。

单片机多用于物联网、自动控制系统、智能家电等领域,要求单片机能够实时响应外部触发的事件。例如在智能家电领域,人们可以用手机中的APP就可以远程控制家电的开启或关闭,智能家电的核心部分就是单片机,智能家电只要通电,单片机就进入工作状态,等待外部事件的触发,当人们通过手机APP发送控制信号后,智能家电的信号接收部分接收到控制信号,通过单片机的中断机制通知单片机,对用户发送的控制信号进行处理。

单片机

如上图所示,智能家电通电后,执行单片机内的主程序,主程序主要用于实时响应外部事件的发生,并调用相应的事件处理程序。如用户通过手机发送控制信号、用户通过家电控制面板向家电发出控制指令等。

单片机如何实时响应外部事件呢?单片机通过中断机制来实时响应外部事件,中断是指单片机在执行主程序时,发生外部事件A,请求单片机迅速处理(中断请求),单片机暂停当前的主程序(中断响应),保存当前断点数据,然后调用事件A的处理程序进行事件响应,事件A处理完成后,主程序恢复断点处的数据,并继续执行主程序。

为了更容易理解中断的概念,我们举一个生活中的中断场景:你正在家中读书或学习(主程序),快递来电话让你取快递(中断请求),于是你暂时停止读书或学习(设置断点,进入中断),去取快递(执行中断),取完快递后(中断返回),你继续读书或学习(继续执行主程序),在你读书和学习过程中,就发生了一次取快递的中断。

引起单片机中断的来源称为中断源,中断源向单片机发出中断请求,单片机暂停主程序的执行,转去处理中断事件,对事件处理完毕,再回到原来被中断的地方(断点)继续执行主程序。中断源可以是传感器、串口、键盘等外部设备,这些外部设备如何向51单片机发送中断请求呢?51单片机通过P3.2端口、P3.3端口引入外部中断,该端口为低电平或下降沿时会引发中断,P3.2端口的中断名称为INT0,P3.3端口的中断名称为INT1,外部设备可以连接这两个端口向单片机发送中断请求。

单片机

上图给出了一个单片机中断场景,按钮接P3.2端口,即单片机外部中断INT0,按钮的另一端接地,P3.2端口与地接通,输入低电平,触发INT0中断请求,单片机主程序调用INT0中断函数,给P1.0端口送入低电平,发光二极管点亮,当按钮再次被按下时,再次触发INT0中断请求,单片机主程序调用INT0中断函数,给P1.0端口送入高电平,发光二极管熄灭,……,以此类推每次按下按钮都会触发INT0中断请求,发光二极管状态取反(点亮或熄灭)。

单片机内运行的完整C程序如下:

#include
sbit led0 = P1^0;
void main()
{
       EA = 1;
       EX0 = 1;
       led0 = 1;
       while(1);
}


void t1() interrupt 0
{
       led0 = ~led0;
}

在上面的代码中,函数t1()为定义的外部INT0中断处理函数,51单片机中断处理函数格式如下:

void 函数名() interrupt 中断号using 工作组

{

中断处理代码

}

中断处理函数不返回任何值,因此函数的返回类型为void,函数名命名规则和C函数相同,中断函数不能带任何参数,interrupt是定义中断处理函数关键字,中断号是中断源的序号,该序号是编译器识别不同中断的唯一符号,在写中断处理函数时必须要对应正确的中断号,“using 工作组”是设置该中断处理函数使用单片机内存4组工作寄存器的那一组,编译器在编译时会自动分配寄存器工作组,因此该语句可以省略。

前面代码的t1()就是中断处理函数,中断序号为0(INT0中断),该中断处理函数只有一条语句,改变P1.0端口的电平状态。

51单片机一共有五个中断源,分别对应五个中断序号,中断源说明如下:

INT0——外部中断0,中断序号为0,由P3.2端口触发该中断,低电平或下降沿触发。

T0——定时器/计数器0中断,中断序号为1,由T0计数器计满回零触发。

INT1——外部中断1,中断序号为2,由P3.3端口触发该中断,低电平或下降沿触发。

T1——定时器/计数器1中断,中断序号为3,由T1计数器计满回零触发。

T1/R1——串行口中断,串行口端口完成一帧字符发送/接收后触发。

根据中断来源的类型,可将中断划分为外部中断和内部中断,外部中断为INT0、INT1、T1/R1,内部中断为T0、T1。外部中断是单片机实时地处理外部事件的一种中断机制,当某种外部事件发生时,单片机的中断系统将迫使CPU暂停正在执行的程序,转而去进行中断事件的处理;中断处理完毕后.又返回被中断的程序处,继续执行下去。内部中断是由单片机中断指令引发的中断,如T0和T1由内部中断指令触发。

单片机可以配置中断功能的启用和关闭,它通过中断允许寄存器IE来设定各个中断源的打开和关闭,IE是特殊功能寄存器,寄存器地址是A8H,该寄存器允许位操作,位地址由低位到高位分别是A8H~AFH,单片机复位是IE寄存器的全部位都清零,即关闭所有中断功能,若要开启中断功能,需要在程序中开启。中断允许寄存器IE位定义见下表。

单片机

EA是全局中断允许位,要开启某个中断源,先要设置EA为1,然后再设置该中断源的中断允许位。

在前面中断场景的main()函数代码中,EA = 1语句打开全局中断,EX0 = 1语句开启外部中断0,led0 = 1语句设置P1.0端口默认为高电平,while(1)语句为无限循环,让主程序一直在运行状态,等待外部事件的中断请求。

下图是前面中断场景的电路设计图,在P3.2端口(INT0中断)接入一个按钮,按钮的另一端接地。按钮元器件的添加方法如下:打开元件库,使用关键词“button”搜索按钮电子元器件,添加按钮电路模型元器件库。

单片机

前面中断场景的C程序编译完成,将执行程序加载到单片机内,启动单片机,重复按下按钮,发光二极管状态(点亮或熄灭)将反转。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分