单片机中断系统.docx
《单片机中断系统.docx》由会员分享,可在线阅读,更多相关《单片机中断系统.docx(42页珍藏版)》请在冰点文库上搜索。
单片机中断系统
第5章中断系统
1
本章介绍AT89S51片内中断系统的硬件结构和工作原理。
中断系统能够实时地响应片内功能部件和外围设备发出的中断请求并及时进入中断服务子程序进行处理。
通过本章学习,读者应重点掌握与中断系统有关的特殊功能寄存器以及中断系统的应用特性,以及熟练地进行中断系统应用的编程。
2
AT89S51中断技术概述
在单片机系统中,中断技术主要用于实时监测与控制,也就是要求单片机能及时地响应中断请求源提出的服务请求,并作出快速响应并及时处理。
这些工作就是由单片机片内的中断系统来实现的。
当中断请求源发出中断请求时,如果中断请求被允许的话,单片机暂时中止当前正在执行的主程序,转到中断服务处理程序处理中断服务请求。
中断服务处理程序处理完中断服务请求后,再回到原来被中止的程序之处(断点),继续执行被中断的主程序。
图5-1显示了单片机对外围设备中断服务请求的整个中断响
应和处理过程。
图5-1中断响应和处理过程
4
5.2AT89S51中断系统结构
中断系统结构如图5-2所示。
共有5个中断请求源(简称中断源),2个中断优先级,可实现2级中断服务程序嵌套。
每一中断源可用软件独立地控制为允许中断或关中断状态;每一
中断源的中断优先级别均可用软件来设置。
5
图5-2AT89S51的中断系统结构
6
5-2可见,中断系统共有5个中断请求源,它们是:
(1)INT0*—外部中断请求0,中断请求信号由引脚输入,中断请求标志为IE0。
(2)INT1*—外部中断请求1,中断请求信号由引脚输入,中断请求标志为IE1。
(3)定时器/计数器T0计数溢出发出的中断请求,中断请求标志为TF0。
(4)定时器/计数器T1计数溢出发出的中断请求,中断请求标志为TF1。
(5)串行口中断请求,中断请求标志为发送中断TI或接收中
断RI。
7
中断请求标志寄存器
5个中断请求源的中断请求标志分别由特殊功能寄存器TCON和SCON的相应位锁存(见图5-2)。
1.TCON寄存器
为定时器/计数器的控制寄存器,字节地址为88H,可位寻址。
该寄存器中既包括T0和T1的溢出中断请求标志位TF0和TF1,也包括了两个外部中断请求的标志位IE1与IE0,此
外还包括了两个外部中断请求源的中断触发方式选择位。
特殊功能寄存器TCON的格式如图5-3所示。
8
图5-3特殊功能寄存器TCON的格式
TCON寄存器中与中断系统有关的各标志位的功能如下:
(1)TF1—片内定时器/计数器T1的溢出中断请求标志位。
当启动T1计数后,定时器/计数器T1从初值开始加1计数,当最高位产生溢出时,由硬件使TF1置“1”,向CPU申请中
断。
CPU响应TF1中断时,TF1标志由硬件自动清“0”,TF1也可由软件清“0”。
9
(2)TF0—片内定时器/计数器T0的溢出中断请求标志位,功能与TF1类似。
(3)IE1—外部中断请求1的中断请求标志位。
(4)IE0—外部中断请求0的中断请求标志位,其功能与IE1类
似。
(5)IT1—选择外部中断请求1为跳沿触发方式还是电平触发
方式。
IT1=0,为电平触发方式,加到INT1*引脚上的外部中断请求输入信号为低电平有效,并把IE1置“1”。
转向中断服务程序时,则由硬件自动把IE1清“0”。
IT1=1,为跳沿触发方式,加到INT1*引脚上的外部中断请求输
10
IE1置“1”。
转向中断服务程序时,则由硬件自动把IE1清“0”。
(6)IT0—选择外部中断请求0为跳沿触发方式还是电平触发方式,其意义与IT1类似。
当AT89S51复位后,TCON被清“0”,5个中断源的中断请求标志均为0。
TR1(D6位)、TR0(D4位)这2位与中断系统无关,仅与定时器/计数器T1和T0有关,将在第6章介绍。
2.SCON寄存器
SCON为串行口控制寄存器,字节地址为98H,可位寻址。
SCON的低二位锁存串行口的发送中断和接收中断的中断
11
图5-4所示。
图5-4SCON中的中断请求标志位
SCON中各标志位的功能如下:
(1)TI—串行口的发送中断请求标志位。
CPU将一个字节的数据写入串行口的发送缓冲器SBUF时,就启动一帧串行数据的发送,每发送完一帧串行数据后,硬件使TI自动置“1”。
响应串行口发送中断时,并不清除TI中断请求标志,TI标志必须在中断服务程序中用指令对其清“0”。
(2)RI—串行口接收中断请求标志位。
在串行口接收完一个串行数据帧,硬件自动使RI中断请求标志置“1”。
CPU在响应串行口接收中断时,RI标志并不清“0”,必须在中断服务程序中用指令对RI清“0”。
5.3中断允许与中断优先级的控制
实现中断允许控制和中断优先级控制分别由特殊功能寄存器区中的中断允许寄存器IE和中断优先级寄存器IP来实现的。
下面介绍这两个特殊功能寄存器。
13
中断允许寄存器IE
AT89S51的CPU对各中断源的开放或屏蔽,是由片内的中断允许寄存器IE控制的。
IE的字节地址为A8H,可进行位寻址,其格式如图5-5所示。
图5-5中断允许寄存器IE的格式
14
2)ES—串行口中断允许位。
ES=0,禁止串行口中断。
ES=1,允许串行口中断。
(3)ET1—定时器/计数器T1的溢出中断允许位。
ET1=0,禁止T1溢出中断。
ET1=1,允许T1溢出中断。
(4)EX1—外部中断1中断允许位。
EX1=0,禁止外部中断1中断。
EX1=1,允许外部中断1中断
15
4)EX1—外部中断1中断允许位。
EX1=0,禁止外部中断1中断。
EX1=1,允许外部中断1中断。
(5)ET0—定时器/计数器T0的溢出中断允许位。
ET0=0,禁止T0溢出中断。
ET0=1,允许T0溢出中断。
(6)EX0—外部中断0中断允许位。
EX0=0,禁止外部中断0中断。
EX0=1,允许外部中断0中断。
AT89S51复位以后,IE被清“0”,所有的中断请求被禁止。
IE
16
“1”或清“0”,即可允许或禁止各中断源的中断申请。
若使某一个中断源被允许中断,除了IE相应的位被置“1”外,还必须使EA位置“1”。
5.3.2中断优先级寄存器IP
中断请求源有两个中断优先级,每一中断请求源可由软件设置为高优先级中断或低优先级中断,也可实现两级中断嵌套。
所谓两级中断嵌套,就是AT89S51正在执行低优先级中断的服务程序时,可被高优先级中断请求所中断,待高优先级中断处理完毕后,再返回低优先级中断服务程序。
两级中断嵌套的过程如图5-6所示。
17
图5-6两级中断嵌套的过程
18
(1)低优先级可被高优先级中断,高优先级不能低优先级
中断。
(2)任何一种中断(不管是高级还是低级),一旦得到响
应,不会再被它的同级中断源所中断。
如果某一中断源被设置为高优先级中断,在执行该中断源的中断服务程序时,则不能被任何其他的中断源的中断请求所中断。
AT89S51的片内有一个中断优先级寄存器IP,其字节地址为B8H,可位寻址。
只要用程序改变其内容,即可进行各中断源中断优先级的设置,IP寄存器的格式如图5-7所示。
19
图5-7IP寄存器的格式
中断优先级寄存器IP各位的含义如下:
(1)PS—串行口中断优先级控制位
PS=1,串行口中断为高优先级
PS=0,串行口中断为低优先级
(2)PT1—定时器T1中断优先级控制位
PT1=1,定时器T1中断为高优先级
PT1=0,定时器T1中断为低优先级
20
3)PX1—外部中断1中断优先级控制位
PX1=1,外部中断1中断为高优先级
PX1=0,外部中断1中断为低优先级
(4)PT0—定时器T0中断优先级控制位
PT0=1,定时器T0中断为高优先级
PT0=0,定时器T0中断为低优先级
(5)PX0—外部中断0中断优先级控制位
PX0=1,外部中断0中断为高优先级
PX0=0,外部中断0中断为低优先级
21
IP的各位都可由用户程序置“1”和清“0”,用位操作指令或字节操作指令可更新IP的内容,以改
变各中断源的中断优先级。
AT89S51复位以后,IP的内容为0,各个中断源均为低优先级中
断。
下面简单介绍AT89S51的中断优先级结构。
AT89S51的中断系统有两个不可寻址的“优先级激活触发器”,其中一个指示某高优先级的中断正在执行,所有后来的中断均被阻止;另一个触发器指示某低优先级的中断正在执行,所有同级的中断都被阻止,但不阻断高优先级的中断请求。
22
表5-1所示。
由此可见,各中断源在同一个优先级的条件下,外部中断0的中断优先权最高,串行口中断的优先权最低。
23
响应中断请求的条件
一个中断源的中断请求被响应,必须满足以下必要条件:
(1)总中断允许开关接通,即IE寄存器中的中断总允许位EA=1。
(2)该中断源发出中断请求,即该中断源对应的中断请求标志为
“1”。
(3)该中断源的中断允许位=1,即该中断被允许。
(4)无同级或更高级中断正在被服务。
中断响应就是CPU对中断源提出的中断请求的接受。
当CPU查询到有效中断请求时,在满足上述条件时,紧接着就进行中断响应。
24
“LCALLaddr16”。
这里的addr16就是程序存储区中相应
的中断入口地址。
例如,对于外部中断1的响应,硬件自动生成的长调用指令为
LCALL0013H
生成LCALL指令后,紧接着就由CPU执行该指令。
首先将程序计数器PC的内容压入堆栈以保护断点,再将中断入口地址装入PC,使程序转向响应中断请求的中断入口地址。
各中断源服务程序的入口地址是固定的,如表5-2所示。
其中两个中断入口间只相隔8字节,一般情况下难以安放一个完整的中断服务程序。
因此,通常总是在中断入口地址处放置一条无条件转移指令,使程序执行转向在其他地址存放的中断服务程序入口。
下列三种情况之一时,中断响应被封锁:
(1)CPU正在处理同级或更高优先级的中断。
因为当一个中断被响应时,要把对应的中断优先级状态触发器置“1”
(该触发器指出CPU所处理的中断优先级别),从而封锁了低级中断请求和同级中断请求。
(2)所查询的机器周期不是当前正在执行指令的最后一个机器
周期。
设定这个限制的目的是只有在当前指令执行完毕后,才能进行中断响应,以确保当前指令执行的完整性。
(3)正在执行的指令是RETI或是访问IE或IP的指令。
因为按照AT89S51中断系统的规定,在执行完这些指令后,需要再
27
如果存在上述三种情况之一,CPU将丢弃中断查询结果,不能对中断进行响应。
5.5外部中断的响应时间
在设计者使用外部中断时,有时需考虑从外部中断请求有效(外部中断请求标志置“1”)到转向中断入口地址所需要的响应时间。
下面来讨论这个问题。
外部中断的最短响应时间为3个机器周期。
其中中断请求标志
位查询占1个机器周期,而这个机器周期恰好处于指令的最
后一个机器周期。
在这个机器周期结束后,中断即被响应,
接着执行一条硬件子程序调用指令LCALL以转到相应的中断服务程序入口,这需要2个机器周期。
外部中断响应的最长时间为8个机器周期。
这种情况发生在CPU进行中断标志查询时,刚好才开始执行RETI或访问IE或IP的指令,则需把当前指令执行完再继续执行一条指令后,才能响应中断。
执行上述的RETI或访问IE或IP的指令,最长需要2个机器周期。
而接着再执行一条指令,我们按最长的指令(乘法指令MUL和除法指令DIV)来算,也只有4个机器周期。
再加上硬件子程序调用指令LCALL的执行,需要2个机器周期,所以,外部中断响应的最长时间为8个机器周期。
29
这样,在一个单一中断的系统里,AT89S51单片机对外部中断请求的响应时间总是在3~8个机器周期之间。
5.6外部中断的触发方式选择
外部中断有两种触发方式:
电平触发方式和跳沿触发方式。
5.6.1电平触发方式
若外部中断定义为电平触发方式,外部中断申请触发器的状态随着CPU在每个机器周期采样到的外部中断输入引脚的电平变化而变化,这能提高CPU对外部中断请求的响应速
CPU返回主程序后会再次响应中断。
所以电平触发方式适合于外部中断以低电平输入且中断服务程序能清除外部中断请求源(即外部中断输入电平又变为高电平)的情况。
如何清除电平触发方式的外部中断请求源的电平信号,将在本章的后面介绍。
5.6.2跳沿触发方式
外部中断若定义为跳沿触发方式,外部中断申请触发器能锁存外部中断输入线上的负跳变。
即便是CPU暂时不能响应,中断请求标志也不会丢失。
在这种方式下,如果相继连续两次
31
“1”,直到CPU响应此中断时,该标志才清“0”。
这样就不会丢失中断,但输入的负脉冲宽度至少保持12个时钟周期(若晶振频率为6MHz,则为2s),才能被CPU采样到。
外部中断的跳沿
触发方式适合于以负脉冲形式输入的外部中断请求。
5.7中断请求的撤销
某个中断请求被响应后,就存在着一个中断请求的撤销问题。
下面按中断请求源的类型分别说明中断请求的撤销。
32
.定时器/计数器中断请求的撤销
定时器/计数器中断的中断请求被响应后,硬件会自动把中断请求标志位(TF0或TF1)清“0”,因此定时器/计数器中断请求是自动撤销的。
2.外部中断请求的撤销
(1)跳沿方式外部中断请求的撤销
跳沿方式的外部中断请求的撤销,包括两项内容:
中断标志位清“0”和外中断信号的撤销。
其中,中断标志位(IE0或IE1)清“0”是在中断响应后由硬件自动完成的。
而外中断请求信号的撤销,由于跳沿信号过后也就消失了,所以跳沿方式的外部中断请求也是自动撤销的。
33
2)电平方式外部中断请求的撤销
对于电平方式外部中断请求的撤销,中断请求标志的撤销是自动的,但中断请求信号的低电平可能继续存在,在以后的机器周期采样时,又会把已清“0”的IE0或IE1标志位重新置“1”。
为此,要彻底解决电平方式外部中断请求的撤销,除了标志位清“0”之外,必要时还需在中断响应后把中断请求信号输入引脚从低电平强制改变为高电平。
为此,可在系统中增加如图5-8所示的电路。
34
图5-8电平方式的外部中断请求的撤销电路
35
由图5-8可见,用D触发器锁存外来的中断请求低电平,并通过D触发器的输出端Q接到INT0*(或INT1*)。
所以,增加的D触发器不影响中断请求。
中断响应后,为了撤销中断请求,可利用D触发器的直接置“1”端SD实现,即把
SD端接AT89S51的P1.0端。
因此,只要P1.0端输出一个负脉冲就可以使D触发器置“1”,从而就撤销低电平的中断请求信号。
所需的负脉冲可在中断服务程序中先把P1.0置1.再让P1.0为0,再把P1.0置1,从而产生一个负脉冲。
3.串行口中断请求的撤销
串行口中断请求的撤销只有标志位清“0”的问题。
串行口中断的标志位是TI和RI,但对这两个中断标志CPU不进行自动清“0”。
因为在响应串行口的中断后,CPU无法知36
TI、RI清0。
5.8中断函数
为直接使用C51编写中断服务程序,C51中定义了中断函数。
由于C51编译器在编译时对声明为中断服务程序的函数自动添加了相应的现场保护、阻断其他中断、返回时自动恢复现场等处理的程序段,因而在编写中断函数时可不必考虑这些问题,减小了用户编写中断服务程序的繁琐程度。
37
3章中介绍的中断服务函数的一般形式为:
函数类型函数名(形式参数表)interruptnusingn
关键字interrupt后面的n是中断号,对于51单片机,n的取值为0~4,编译器从8×n+3处产生中断向量。
AT89S51单片机的中断源对应的中断号和中断向量见表5-3。
38
单片机在内部RAM中可使用4个工作寄存器区,每个工作寄存器区包含8个工作寄存器(R0~R7)。
C51扩展了一个关键字using,using后面的n专门用来选择AT89S51的4个不同的工作寄存器区。
using是一个选项,
如果不选用该项,中断函数中的所有工作寄存器的内容将被保存到堆栈中。
关键字using对函数目标代码的影响如下:
在中断函数的入口处将当前工作寄存器区的内容保护到堆栈中,函数返回前将被保护的寄存器区的内容从堆栈中恢复。
使用关键字using在函数中确定一个工作寄存器区时须十分小心,要
保证任何工作寄存器区的切换都只在指定的控制区域中发
39
例如,外中断1的中断服务函数如下:
voidint1()interrupt2using0/*中断号n=2,选择0区工作寄存器区*/
中断调用与标准C的函数调用是不一样的,当中断事件发生后,对应的中断函数被自动调用,中断函数既没有参数,也没有返回值。
中断函数会带来如下影响。
(1)编译器会为中断函数自动生成中断向量。
(2)退出中断函数时,所有保存在堆栈中的工作寄存器及
特殊功能寄存器被恢复。
40
3)在必要时特殊功能寄存器Acc、B、DPH、DPL以及PSW的内容被保存到堆栈中。
编写AT89S51单片机中断程序时,应遵循以下规则:
(1)中断函数没有返回值,如果定义了一个返回值,将会得到不正确的结果。
因此建议将中断函数定义为void类型,以明确说明没有返回值。
(2)中断函数不能进行参数传递,如果中断函数中包含任何
参数声明都将导致编译出错。
(3)在任何情况下都不能直接调用中断函数,否则会产生编译错误。
因为中断函数的返回是由汇编语言指令RETI完成的。
RETI指令会影响AT89S51单片机中的硬件中断系统内
41
的不可寻址的中断优先级寄存器的状态。
如果在没有实际的中断请求的情况下,直接调用中断函数,也就不会执行RETI指令,其操作结果有可能产生一个致命的错误。
(4)如果在中断函数中再调用其他函数,则被调用的函数
所使用的寄存器区必须与中断函数使用的寄存器区不同。
5.9C51编程举例
本节通过几个例程介绍有关中断应用的程序的编写。
5.9.1单一外中断的应用
42
5-2】在51单片机的P1口上接有8只LED。
在外部中断0输入引脚P3.2(INT0*)引脚接有一只按钮开关K1。
程序要求将外部中断0设置为负跳沿触发。
在程序启动时,P1口上的8只LED亮。
按一次按钮开关K1,使引脚接地,产生一个负跳沿触发的外中断0中断请求,在中断服务程序中,让低4位的LED和高4位的LED交替闪烁。
具体电路如图5-9所示。
43
图5-9控制8只LED交替闪烁的电路
44
两个外中断的应用
当多个中断源时,只需增加相应的中断服务函数即可。
例5-3是处理两个外中断请求的例子
【例5-3】如图5-10所示,在51单片机的P1口上接有8只LED。
在外部中断0输入
引脚P3.2(INT0*)引脚接有一只按钮开关K1。
在外部中断1输入引脚P3.3(INT1*)引脚接有一只按钮开关K2。
程序要求K1和K2都未按下时,P1口的8只LED呈流水灯显示,仅K1(P3.2)按下时,左右4只LED交替闪烁。
仅按下
K2(P3.3),P1口的8只LED全部闪亮。
两个外中断的优先级相同。
45
图5-10两个外中断控制8只LED显示的电路
46
中断嵌套
中断嵌套只能发生在单片机正在执行一个低优先级中断服务程序的时候,此时又有一个高优先级中断产生,就会产生高优先级中断打断低优先级中断服务程序,去执行高优先级中断服务程序。
高优先级中断服务程序完成后,再继续执行低优先级中断服务程序。
【例5-4】电路仍如图5-10所示,设计一个中断嵌套程序。
要求K1和K2都未按下时,P1口的8只LED呈流水灯显示,当K1按下再松开时,产生一个低优先级的外中断0请求(跳沿触发),进入外中断0中断服务程序,左右4只LED交替闪烁。
此时按下K2再松开时,产生一个高优先级的外中断1请求
47
图5-11所示,若系统中有5个外部中断请求源IR0~IR4,它们均为高电平请求有效,这时可按中断请求的轻重缓急进行排队,把其中最高级别的中断请求源IR0直接接到AT89S51的一个外部中断请求源IR0输入端,其余的4个中断请求源IR1~IR4按图5-11通过各自的OC门(集电极开路门)连到AT89S51的另一个外中断源输入端,同时还连到P1口的P1.0~P1.3脚,供AT89S51查询。
各外部中断请求源的中断请求由外设的电路产生。
图5-11电路中,除了IR0的中断优先权级别最高外,IR1~IR4外部中断源的中断优先权取决于查询顺序,
图5-11利用外部中断和查询相结合的多外部中断请求源系统