目录
中断介绍
中断优先级
中断嵌套
中断技术的优点
中断的结构
中断请求源
中断优先级
5个基本中断内部的结构
INT0和INT1
T0和T1
串口
中断寄存器
IE
TCON
中断优先级列表
中断号
中断响应的条件
代码编写实例分析
外部中断硬件电路分析
这一节我们主要是介绍中断系统,为什么要单独介绍中断系统?因为对于51单片机来说,那个中断的外设还是比较多的,像定时器、串口以及外部中断都比较多,所以我们先从全局来了解这个中断。
下面我们来了解一下中断,中断它是为了使这个单片机具有对外部或者内部随机发生的事件能够实时响应处理而设置的,所以中断功能的存在,很大程度上提高了单片机处理外部或者是内部事件的能力,所以中断它是非常重要的,它可以让单片机能够实时处理一些突发事件,比如说我们正常情况下在执行功能的时候,突然有紧急的事情需要处理,就可以利用这个中断来进行处理。处理完成这些突发事件之后,再回到之前的位置继续往下执行。
我们先来用生活当中的例子来给大家讲解中断的过程,这张图我们可以看一下生活中的实例。
比如,你在打开火烧一壶水,然后就去洗衣服,在洗衣服的过程当中,突然听到这个水壶发出了水开的报警声音,这个时候水壶正在开了,爆发出报警声音,这个时候你就要停止洗衣服的这个动作了,如果说你再继续往下洗衣服,那可能就会导致水壶烧干而引引发的一些火灾这些非常危险的一些事件,所以这个水开报警事件就相当于非常紧急突发的事件,那这个时候我们就要立刻停止手上的工作,停止洗衣服的这个动作,然后,转去什么去关火,完火之后,然后将开水灌入到暖水瓶当中,执行完成这个动作之后,又回到我们刚才洗衣服的地方,继续去洗你的衣服,这个过程我们就称为中断。
中断概念对于单片机来讲,它其实也是一样的,我们来看一下单片机手册上的官方介绍:
以下是中断程序的流程图:
这就是中断,那我们再来看一下这张图,也是中断的执行流程图,可以看一下。
首先主程序在往下执行,执行过程当中,突然有事件,突然发出了中断请求,在这个中断请求这里我们通常也称为断点。引起CPU去响应中断的这个中断源,就是引起CPU中断的这个根源,我们称为中断源,那比如说我们刚才举例的洗衣服,烧水那个生活当中的例子,水壶发出这个报警声,其实它就是中断源,因为是它引起我们CPU来中断,要执行一些中断的程序。 CPU响应之后,它就会转去执行这个中断程序了,我们假设是事件B,执行中断程序完成之后回过头,它会返回到断点的这个位置,也就是刚才我们中断的这个位置,然后继续往下执行这个主程序,这个过程就是中断。
在单片机当中,中断系统一般是允许有多个中断源的,当几个中断源同时向CPU发出请求中断的时候,要求为它服务的时候,这就存在CPU优先响应哪一个中断请求的问题。
假设我们有两个中断,也就两个中断1、中断2,这两个中断同时过来,那CPU要执行哪个?
中断源有优先的级别,CPU是根据它的级别来判断优先执行哪一个中断,优先级别越高的就优先执行,越低的就最后执行,比如在中断事件1和中断事件2同时过来之后,假设它的优先级1的优先级要高,2的优先级要低,同时过来之后,那这个CPU要响应哪?当然是响应优先级高的这个事件1,执行完事件1之后再来执行低优先级的中断事件,那等这个事件执行完成,才会继续回到主程序往下执行,这也就是中断优先级的响应。
这个优先级怎么来判别?
通常在这个单片机当中,它都有对应的默认的优先级别,当然也可以通过对应的寄存器来修改的优先级,对于51单片机来说,通常我们不去修改的寄存器的值,而是通过默认的优先级别进行。
当我们CPU正在处理中断请求的时候,发生了另优先级比它还高的中断源请求,这个时候,它就有中断嵌套的问题。
我们来说明一下,假设我们主程序在执行中断事件A,突然有个中断事件过来,那我们要响应这个中断事件B,在执行这个中断事件B的时候,突然又有中断的事件C,而C优先级比B的优先级还要高,那这个时候,它就在这个地方要暂停中断优先级B,要去转去执行优先级高的事件C,然后执行完成之后,再回到这个地方继续往下执行中断服务程序B,执行完了之后,再回到主程序来继续往下执行。
这叫做中断嵌套中断嵌套。
那对于51单片机来说,通常这种的很少,对于一些高端的,像STM32,或者是DSP之类的这种高级的一些单片机来说,那中断是更加的复杂,所以在这些单片机里面,通常都会存在一些中断嵌套,经常会遇到。
对于51大来说这种很少,基本上就是处理中断处理完又回到主程序来。
随着计算机技术的应用,人们发现了中断技术不仅解决了快速主机与慢速IO设备的数据传输问题,而且还有这些优点:
CPU它可以分时为多个IO设备进行服务,提高了计算机的利用率,通过中断可以进行实现分时操作。比如说我们在使用定时器的时候,定时不同时间,并且执行不同的时间,这就可以进行分时操作。
因为我们使用了中断,当我们事件过来之后,肯定要响应中断了,然后执行完中断之后,再回到我们主程序继续执行,这是个实时响应的功能。
CPU具有处理设备故障,以及掉电等突发事件的能力,可以让这个系统可靠性可以大大的提高。
在任何的一款单片机当中,中断基基本上是必不可少的,所以中断这一块大家一定要认真的去学习。
下面我们来看一下这个中断的结构。
我们知道STC89系列51单片机提供了8个中断的请求,请求源8个。
它们分别是外部中断就是INT0(外部中断0),INT1(外部中断1),INT3(外部中断2),以及INT3(外部中断3)。
另外还有定时器0,定时器1,还有定时器2,以及串口。
这些中断总共是8个中断的请求源,这里是指STC一些增强型的一些单片机,它具备这些中断员,也就最多8个。
对于普通系列的51单片机来说,比如说8051系列的,STC89 C51/C52之类的,都具备共有就是8051内核的51单片机均有的5个中断源是INT0(外部中断0),INT1(外部中断1)和定时器0,定时器1,以及串口这五个中断源。
就是说只要是51单片机,这五个中断源是必不可少的,至于INT3T2(外部中断2),INT3(外部中断3)以及定时器2这些是根据你芯片的外设有没有增加,比如说STC90系列的,或者是一些更高级的,增强型的,它可能会增加几个资源,这些增加的资源的使用方法跟这些是完全一样的,所以我们这里重点是学习基本的这五个。
所有的中断都具备4个中断优先级。 基本型只有2个(高级和低级)。用户可以用关总中断允许位EA这个控制寄存器,它能够控制我们的总中断或者是相应的中断允许屏蔽位,屏蔽我们所有中断请求。也可以用打开相应的中断,允许CPU响应相应的中断申请,其中,有些中断源是可以用软件独立的控制开中断或者是关中断的,每中断的优先级可以通过软件来设置。
高优先级的中断级可以打断低优先级的中断,反之低优先级的中断请求是不可以打断高优先级的中断,这个在前面我们也说了。 当两个相同优先级的中断同时产生的时候,它会通过查询次序来决定系统响应哪一个中断,因为在这些中断里面它固定会有顺序的,我们这里也列出来了。
它的优先级如上图中的箭头方向,从下到上优先级变高,这是固定的。
当然也可以通过寄存器来修改它的优先级,既然可以修改优先级,那肯定有可能会把这两个,比如说我们外部中断0和定时器0设置为相同的优先级,如果是相同的优先级同时发生,那我们CPU要响应哪一个?它会根据我们默认的这个顺序,比如说外部中断0它是最高,那就响应这个。这是优先级相同的情况下的响应顺序。
当然我们通常不会去操作优先级顺序的寄存器,我们会按照它默认的优先级的顺序来使用它。
下面,我们来具体看一下51单片机5个中断内部的结构。
首先我们来看一下这个INT0,INT0对应的是P32口这个附加功能,它可以通过TCON寄存器的IT0这一位来进行选择。
IT0在芯片手册上的解释:
如果是说将这个IT0这一位设置为0,就选择的是低电平触发,经过非门变成1。
如果是将IT0设置为1的话,它是选择下降沿触发,下降沿触发之后流入到我们的IE0(中断标志)。
IE0在芯片手册上的解释:
比如说我们外部有信号,那来了下降沿之后,那如果说我们配置了IT0=1,来了下降沿的话,它就会让这个IE0置1,这就是中断的标志,说明来了中断的事件。
来了中断事件,但它还不会连到我们的CPU,它要通过IE和IP以及后面的一系列操作联络到我们的CPU,所以IE这一块也要进行设置,IE是包括了对应的外部中断的一些寄存器的设置。比如,EX0是外部中断0的中断选择,如果是说我们要使能这个外部中断的话,那EX0就要为1,也就是这个开关要闭合。
这里的开关闭合上的话,那信号就可以过来,然后,紧接着是EA总中断,前面即使全部配置好,但这个中断不打开的话,那中断的信号也是流入不到我们的CPU的,所以这个总中断也要设置为1,设置为1的话,这个中断信号就可以流入到CPU了。
默认IP是用来设置中断优先级的,这里我们就不设置,默认它是以连到这个0,连到0的话,通过我们前面说的这个中断的默认的顺序表来进行响应哪一个先出发。它就会直接流入到我们的CPU,从而触发我们的中断。
同理,我们的外部中断1也是一样的。
外部中断1是连接到P3.3引脚。
T0对应的是我们的P3.4口,T1对应的是P3.5口
我们这个定时器它是16位,后续的定时器/计数器部分我们会介绍,如果是我们使用的16位模式的话,计数到65536就会产生溢出(因为2的16次方等于65536,如果是从0开始计数,计数到65535,如果再往下计到65536就溢出)溢出的话就会有溢出的中断请求,TF0就是中断请求的标志,发出了溢出TF0就会自动置1,如果说我们开启了对应的中断,比如说ET0,和它后面的总中断开启了,然后,PT0这里也默认是已经连到了0,然后传入到我们的CPU,这样就会发出中断的请求,也就是定时器的溢出请求。
那同理我们的T1也是一样的。
然后下面是串口RX和TX,有发送和接收两个引脚,对应P3.0和P3.1引脚的附加功能。
RX(接收数据), TX(发送数据)
RX对应到RI,是SCON上的位,TX对应的是TI。 RI和TI后面是一个或门,当这两个有为1,也就相当于有发送完成或者是接收完成标志之一的话,它会发出中断请求,如果说我们开启了串口的中断功能,并且把总中断给使能,它也会向CPU发送中断请求,或者是发送中断请求,或者是接收完成中断请求这么一个信号给我们的CPU。 当串口接收完一帧串行数据的时候,RI(接收完成中断请求的标志)和,发送完成一帧数据之后,TI(发送完成的标志)都会自动置1。
也就是说这一块它是我们单片机自动完成的。
前面是我们用来设置中断的请求的条件。
然后,后面的这一块也是我们要设置的中断的开关。
这里总中断是适用于我们所有的中断,只要把总中断打开,前面我们全部配置好之后才能传入到我们的CPU。
如果说你前面配置好之后总中断没有打开,依然是不能完成这个中断请求的,单片机不会进入到中断服务程序执行。
下面我们来看一下中断相关的寄存器。
我们分析这个中断结构的时候,这里就需要我们配置这个IE。
如果说你使用的是外部中断就要对EX0和EX1进行配置。
如果你使用定时器的话,那你要对这个ET0和ET1进行配置。
如果说你是使用串口,那你要对这个ES进行配置.
这些分别都是IE的这个寄存器的某位:
对应关系:
EA是外部的总中断,也就是CPU的中断允许位,我们也称之为总中断,当我们前面把外设的一些中断的条件选择好之后,最终我们还要开启这个总中断EA,如果EA不开启,你即使前面配置好,依然是不会产生中断,进入中断的触发程序的,所以,这一块一定要注意,我们在前面结构图当中也给大家分析了EA这一块的作用。
然后ES是对应到串行口的中断允许位,如果说我们要使用串行通讯,也就串口通信的话,要使用中断,那我们就要将这个ES置1,把它的使能开关给打开。
然后ET1和ET0对应到定时计数器,T0和T1的中断允许位。 如果说我们要使用这个定时计数的功能,那我们要对这个ET1和ET0进行选择,也就是它的使能开关要打开,它是个允许的开关。
EX1和EX0是外部中断0和外部中断1的允许位,我们要使用外部中断的话,我们也要把它的开关给使能。
那现在我们再看一下中断请求标志TCON。
中断请求标志这个TCON里面就是对触发方式还有定时器的一些方面的设置。
TCON是8位的寄存器,首先我们从低4位看起。
IT0是外部中断0的触发方式控制位,它这个值有0和1的选择,如果是0的话,那我们默认是设置为低电平触发方式。而我们将这个值设置为1的话,它是选择为下降沿触发方式,下降沿就是说从我们高电频变为低电频这时刻,它就会触发中断。
通常我们使用外部中断的话,都是使用下降沿触发,也就将这个IT0或者IT1设置为1。 然后我们再来看一下IE0,它是外部中断的请求标志位,IE1也是中断请求标志位。这些中断标请求标志位是由单片机内部自动去完成。
比如,我们配置好外部中断的触发方式之后,假设IT0设置为下降沿触发,那外部来了一个下降沿脉冲到P3.2引脚,就会触发外部中断INT0发出中断请求,IE0它自动会设置为高电平。它是自动完成的,不需要我们人为的去设置,IE1也是同样的道理。
IT1跟IT0一样的。
然后就是TR0和TR1,它是定时器的初值的设置,这个在后面我们介绍这个定时器的时候会对这个TR0和TR1进行讲解。
然后这里有个TF0和TF1,它是属于定时计数器T0和T1的溢出中断请求标志,它也是自动去完成的,当我们定时计数器计数满的时候并发生溢出的时候,这个请求标志它会自动置1,这个在前面我们其实已经分析过。
接下来我们再看一下后面的中断优先级。
前面我们说了同一个优先级的中断申请可能不止一个,这个时候就有中断优先级的排队的问题。比如说两个中断过来之后,优先执行哪一个,那就根据中断的优先级执行。
如果说你不通过寄存器修改中断优先级的话,默认它会按照图中的优先次序来排列。
然后在我们编写中断的时候,它有中断的中断号,在这张图当中也给大家列出来了。
这个中断号有什么作用?
这个中断号就是指引CPU执行程序的时候,定位到哪一个中断。
如果说我们外部中断0触发引起中断的话,那你中断号必须是0。如果你这里写1,那即使你前面程序都配置好,那它也不会进入到你这个写1的这个程序当中来的,这里一定要注意。
中断号一定要记住!中断号是绝对不能搞错,你搞错了,程序是进入不了你的中断服务程序的。
接着我们来看一下中断响应的条件。 主要有3个条件,只有同时满足才能触发中断。
1.首先只有发出了中断请求,CPU才会有可能响应,所以,这个中断请求必须得满足,就是说要有中断源产生。比如我们生活当中的例子,我们水开发出报警声,那它就产生中断请求。
2.那我们要去执行它,我们首先要满足将中断源相关的一些中断允许位打开,只有打开了中断请求才能过来,才能到我们CPU这里来。
3.最后就是CPU的开中断,也就是总中断要打开,前面你这个配置好了,你这个总中断不打开的话,一样是不能响应的,这一点要注意。
满足这三个条件,CPU就能产生中断,就触发中断响应执行。
然后我们以外部中断0为例来介绍一下中断如何来使用。
根据前面说的这三个条件,首先我们要打开总中断。
当然打开总中断这个顺序都无所谓。
然后,我们选择它的EX0是用来开启外部中断的功能的允许位,我们要给允许外部中断进来。
然后,IT0是用来设置触发方式,如果我们设置为1的话,那是选择下降沿触发,也就是说外部来了下降沿,那我们就会触发这个中断。
进入中断的时候,我们有中断服务程序,中断服务程序这个函数跟我们普通的函数不一样,它增加了interrupt这个关键字。
这个关键字是51单片机特有的中断关键字,不能写错,写错了也是进入不了中断函数的。然后非常重要的一点就是这个中断号,中断号前面我们也说了,外部中断0是对应的是0。
然后后面的using 1这个可以不写,现在基本上不写这一块,可以把它给忽略掉.
中断函数通常都是没有返回值的,所以是void空类型。
当然中断函数里面也是没有入口参数的。
以上就是关于中断系统的相关介绍了,后面会继续讲到它的具体使用。
下面我们来介绍一下硬件。
其实外部中断是属于单片机内部的资源,所以,我们重点是介绍连接到外部中断的引脚的一些电路。
前面我们在介绍独立按键的时候说过,K3和K4是连接在P32和P33引脚。
而且P32和P33正好是我们连接的是外部中断INT0和INT1。
所以如果说我们对K3或者K4按键进行操作的时候,P32和P33就会收到对应的信号。
比如我们配置了外部中断0(使用的是P32引脚)下降沿的触发方式。默认独立按键是接了GND的,也就是低电平有效。并且默认P32有上拉电阻,所以P32默认是高电平。
那当按键K3按下的时候,那这个GND就输入到P32引脚了,所以按下的时候P32就是低电频。从高电平到低电平,它就有下降沿。
所以当我们配置为下降沿触发的时候,按键一按下,它就会触发外部中断,因此可以通过这个按键来模拟这个外部中断的触发的功能。 同理,K4也就是P33,它是属于外部中断1的功能,所以,我们也可以通过K4来编写外部中断1的触发的程序。
我们可以通过按键来触发这些外部中断的话,那我们要如何观察?
我们这里使用了指示灯,当我按键按下的时候触发外部中断,我就让对应的LED点亮。
LED模块我们前面好几节讲的挺多了,这里就不再赘述。
以上就是外部中断系统硬件电路的解释。
下节我们开始学习定时器!