中断是单片机中一个十分重要的功能,它的出现能够让我们的单片机在顺序执行命令时,具备应对特殊情况的能力。
目录
通信方式
无条件传送
有条件传送
DMA通信
中断传送
中断系统结构
中断类型
中断入口
中断寄存器
中断处理过程
应用案例
在我们学习中断之前,我们需要去了解一下数据在51单片机两个通信端之间通信的方式,通信的方式分为4类。
所谓无条件信息传输就是指信息的发送端不会照顾信息的接收端,差不多就是:我只负责发送,你能不能收到不归我管,就算你收不到和我也无关,反正我的工作完成了。这种传送方式不需要检查通信双方的状态,直接利用访问指令就可以实现通信,类似于UDP协议,这种通信方式最简单最快捷。
而有条件传输与无条件相反,它会在通信的时候检查接收端的状态以保证信息的正确性。它在发送信息前会向接收端发送检查信息询问接收端是否已经开启可接收状态。发送端只有在确定接收端可以后才发送数据。
DMA是在单片机和外设进行信息传输的一种特殊方式,当选择DMA通信时,CPU会让出数据总线,让外设的数据直接和存储器进行连接,这样就跳过了CPU这个中介。这种情况只符合于外设的运行速度很快,并且需要大量的数据传输的情况下。
接下来就是大头:中断传送。当CPU按顺序将我们存储器内的程序执行时,如果外部的某个特定的事件发生,并且向CPU发送处理请求,那么CPU会停下当前的工作而转而去处理某个指令,当处理完后CPU会继续回去之前跳转的地方继续按顺序执行,这个外部的请求就是中断请求。这种跳跃到外部处理事件的方式就被称为中断响应。
并且中断也会进行分类,不然的话会造成不必要的麻烦。例如我们有2个中断源,在某一个时刻它们都被同时触发了,那么系统会选择去执行哪一个呢?这是一个不可避免的问题。为了解决这个问题,51单片机系统给中断进行了分类,按照重要性分好类(有高级的中断和低级的中断),当主程序运行时,高级中断和低级中断同时触发,那么优先响应高级中断。而当高级中断和高级中断都被触发,那么按照中断优先权来决定,具体的优先级顺序如下:
优先权顺序:、T0、、T1、串行口
同时如果在我们处理低级中断的时候有一个高级中断被触发,那么我们会停下当前的中断程序而去执行高级中断程序的内容;不同的是,如果高级中断响应程序执行时,有低级中断被触发那么就不会去执行低级中断;但是中断不会打断之前同优先级的中断,这就体现出中断的优先级问题。
⭐中断响应和转进子程序的差异
既然中断响应和转进子程序都是从主程序跳转到某一个响应程序中执行的动作,那么他们之间有什么不同呢?中断响应是未知的,就是我们不知道中断何时会发生,何时会到来,而子程序跳转是定死的,我们设定主程序走到这一步后就会跳进子程序。所以两者的意义差异是巨大的。
在我们考虑中断结构之前,我们先来看看有什么东西可以触发中断。单片机统计起来总共有5个中断源,包括2个外部中断和3个内部中断。
首先是外部的输入;AT89C51芯片有两个引脚(P3.2)、(P3.3),这两个引脚是中断输入的引脚,当从该引脚输入的外部的信号发生某种特定的变化时就会触发中断。而这种特殊的变化是低电平或则下降沿,至于是哪一种则是由TCON特殊寄存器里面的ITx决定。
其次是内部的中断触发;内部的中断触发有定时器Tx两个和串行IO口中断一个。其中定时器中断则是定时器计数溢出后引起的,而串行IO口中断则是完成字符的传输后引起的。
但是又有问题了,中断响应后系统怎么知道将要执行的中断响应程序在哪里呢?其实中断响应后系统会进入的程序的首地址会被放到中断入口那里。即一旦响应中断就会转入到固定的入口地址。
不同的中断对应不同的入口地址:
中断源 | 入口地址 |
外部中断0 | 0003H |
定时器T0中断 | 000BH |
外部中断1 | 0013H |
定时器T1中断 | 001BH |
串行口中断 | 0023H |
我们可以直接将中断响应程序写在这里,但是这几个地方都比较相近,所以我们一般选择在这里放一个跳转指令,然后再跳转到某个地方去执行。内容管理
8051中和中断有关的特殊功能寄存器有3-4个。其中包括定时器和外部中断发送中断请求的TCON,还有进行串行发送中断的控制寄存器SCON。以及终端开启寄存器IE、设置中断优先级寄存器IP。我们来仔细看一下这几个寄存器和这几个寄存器中比较重要的几个位以及它们的名称(下图来自老师课件)
TCON寄存器
我们看前面知道TCON寄存器还用于定时器中设置溢出标志位,在前一篇定时器中我们说过留着后面的4位用于中断用。现在我们就来看看这几个中断位是怎么使用的:
TCON寄存器只用于定时器和外部中断标志位的设置,其中定时器0、1的中断标志位就是TF0和TF1,当T1计数溢出就让TF1=1、T0计数溢出就TF0=1
而外部中断、的标志位就是IE0和IE1。也就是说TCON寄存器里面的TF0、TF1、IE0和IE14个位分别就用于设置5个中断源里面4个的标志位,4个中一旦有一个中断被触发,它所对应的标志位就会被置1。
而IT0和IT1就是用于设置、的中断触发方式,因为只有外部中断才分下降沿触发或者低电平触发,而内部中断一般都由下降沿触发。相对应的,当T1=1是下降沿触发而当T1=0低电平触发,而采集方式依旧是CPU在每个机器周期的S5P2期间采集。(我们常用的是下降沿触发方式,因为电平触发如果一直是低电平会导致一直中断被检测到开启)
SCON寄存器
而SCON寄存器是常用于设置串口所触发的中断,其中就是设置RI和TI位来表示中断的状态。接收完毕一个串行帧,则RI置1,当发送完毕一个串行帧,则TI置1
IE寄存器
注意这里是IE寄存器而不是IE位!!之前我们提到的IE位是TCON里面的设置的标志位,而这里的IE是一个寄存器。
该寄存器有8位,其中比较常用到的激素D7、D4、D3、D2、D1和D0位,该寄存器的作用是控制CPU对总的中断源的开关以及对单个中断源的开关。
EA表示CPU对5个中断源是否开启;
EXx表示对外部输入中断是否开启;
ETx表示对内部定时器中断是否开启;
ES表示对串口中断是否开启。
而我们要想开启一个中断源,需要设置两层数值,一层是总的中断EA要开启,另一层是我们选择要使用的中断源要开启。
IP寄存器
除了上面的寄存器外,还有一个IP寄存器,该寄存器用于设置我们的中断的优先级,既然是用来设置中断的优先级,那自然是由5个控制位(5个中断源),实际上也是,该寄存器有5位用于设置中断的优先级,并且所有设置为1的位对应的中断优先级最高,而设置为0的位中断优先级最低。
寄存器中PS位控制串行口的中断优先级;
PTx位控制定时器Tx的中断优先级;
PXx位控制外部中断的优先级。
上面我们所设置的这些中断优先级将决定当大量中断来临时我们选择使用哪个中断。
说了中断的原理和结构,下面我们来看看有一个中断来了后单片机是如何处理的:
首先是外部输入信号变化或者内部定时器溢出等导致中断源发出中断请求,然后该中断源对应的中断标志位将会被置为1(如T0就是TF0、就是IE0)
然后CPU查询到有中断标志位后,不会立即触发中断响应,而是需要查询是否满足:
①首先检查中断是否开启,IE寄存器对应的EA和相应位是否开启;
②然后再检验是否有比此时响应的中断更高级的中断正在执行;
③其次再检查CPU此时是否是上一个指令的最后一个机器周期;
④最后再检查是否没有在执行RETI或者一些访问IE和IP的指令。
只有满足了上面的所有条件才会触发中断响应。
中断响应时主程序会停止执行,首先保留断点(即跳出点)的位置,然后再撤销掉该中断的响应标志位(说明我们现在开始响应中断,如果不认为撤销该位,那么将会一直引起中断。但是对于像定时器和外部下降杨这类触发的中断,那么就不需要软件清零,因为它会硬件自动清零,而对于串行导致的中断则需要软件清除),再关闭和它一个等级的中断,最后再将相应中断源的入口发送给PC,让它下一条执行该位置,所以系统会跳到中断服务程序的地方,然后再执行中断服务函数。
最后当中断服务函数执行完后,将会有一条RETI的指令帮助我们跳回原来的断点,程序接下来将会沿着原本跳出来的断点继续往下执行,同时开启其它的中断源的中断请求。
下面举一个比较常用的定时器触发中断的案例:
我们用定时器1的工作模式1设置一个定时50ms的定时器,再设置一个50ms定时触发的中断,单片机的晶振是12MHz。
测试电路:
测试代码:
ORG 00H
LJMP MAIN
ORG 001BH
AJMP INT_1
ORG 30H
MAIN:
MOV TMOD, #10H
MOV TL1, #0B0H
MOV TH1, #03CH
SETB TR1
SETB ET1
SETB EA
LOOP:
LJMP LOOP
INT_1:
PUSH ACC
PUSH PSW
MOV TL1, #0B0H
MOV TH1, #03CH
CPL P2.2
POP ACC
POP PSW
RETI
END
测试结果:
参考资料:
老师上课的课件