1、 第第6 6章章 AT89S51AT89S51单片机的中断系统单片机的中断系统1 6.1 AT89S516.1 AT89S51中断技术概述中断技术概述 中断技术主要用于实时监测与控制,要求单片机能及时地响中断技术主要用于实时监测与控制,要求单片机能及时地响应中断请求源提出的服务请求,并快速响应与及时处理。应中断请求源提出的服务请求,并快速响应与及时处理。当中断请求源发出中断请求时,如中断请求被允许,单片机当中断请求源发出中断请求时,如中断请求被允许,单片机暂时中止当前正在执行的主程序,转到中断服务处理程序处理中暂时中止当前正在执行的主程序,转到中断服务处理程序处理中断服务请求,处理完中断服务请
2、求后,再回到原来被中止的程序断服务请求,处理完中断服务请求后,再回到原来被中止的程序之处(断点),继续执行被中断的主程序。之处(断点),继续执行被中断的主程序。图图6-16-1显示单片机对外设中断服务请求整个中断响应和处理显示单片机对外设中断服务请求整个中断响应和处理过程。过程。图图6-16-1 中断响应和处理过程中断响应和处理过程 如没有中断系统,单片机大量时间可能会浪费在查询是否有如没有中断系统,单片机大量时间可能会浪费在查询是否有服务请求的定时查询操作上,即不论是否有服务请求,都必须服务请求的定时查询操作上,即不论是否有服务请求,都必须去查询。去查询。采用中断技术完全消除查询方式的等待,
3、大大提高单片机工采用中断技术完全消除查询方式的等待,大大提高单片机工作效率和实时性。作效率和实时性。6.2 AT89S516.2 AT89S51中断系统结构中断系统结构中断系统结构见中断系统结构见图图6-26-2。中断系统有。中断系统有5 5个中断请求源(简称中个中断请求源(简称中断源),断源),2 2个中断优先级,可实现个中断优先级,可实现2 2级中断服务程序嵌套。每一级中断服务程序嵌套。每一中断源可用软件独立控制为允许中断或关闭中断状态;每一个中断源可用软件独立控制为允许中断或关闭中断状态;每一个中断源的优先级均可用软件设置。中断源的优先级均可用软件设置。图图6-26-2 AT89S51
4、AT89S51的中断系统结构的中断系统结构 6.2.1 6.2.1 中断请求源中断请求源 由图由图6-26-2,中断系统共有,中断系统共有5 5个中断请求源,它们是:个中断请求源,它们是:(1 1)INT0INT0*外部中断请求外部中断请求0 0,外部中断请求信号(低电平或,外部中断请求信号(低电平或负跳变有效)由负跳变有效)由INT0INT0*引脚输入,中断请求标志为引脚输入,中断请求标志为IE0IE0。(2 2)INT1INT1*外部中断请求外部中断请求1 1,外部中断请求信号(低电平或,外部中断请求信号(低电平或负跳变有效)由负跳变有效)由INT1INT1*引脚输入,中断请求标志为引脚输
5、入,中断请求标志为IE1IE1。(3 3)定时器)定时器/计数器计数器T0T0计数溢出的中断请求,标志为计数溢出的中断请求,标志为TF0TF0。(4 4)定时器)定时器/计数器计数器T1T1计数溢出的中断请求,标志为计数溢出的中断请求,标志为TF1TF1。(5 5)串行口中断请求,标志为发送中断)串行口中断请求,标志为发送中断TITI或接收中断或接收中断RIRI。6.2.2 6.2.2 中断请求标志寄存器中断请求标志寄存器5 5个中断请求源的中断请求标志分别由个中断请求源的中断请求标志分别由特殊功能寄存器特殊功能寄存器TCONTCON和和SCONSCON相应位锁存(见图相应位锁存(见图6-26
6、-2)。)。1 1TCONTCON寄存器寄存器为定时器为定时器/计数器的控制寄存器,计数器的控制寄存器,字节地址为字节地址为88H88H,可位寻址。,可位寻址。既包括定时器既包括定时器/计数器计数器T0T0、T1T1溢出中断请求标志位溢出中断请求标志位TF0TF0和和TF1TF1,也,也包括两个外部中断请求的标志位包括两个外部中断请求的标志位IE1IE1与与IE0IE0,还包括两个外部中断,还包括两个外部中断请求源的中断触发方式选择位。请求源的中断触发方式选择位。TCONTCON格式见格式见图图6-36-3。图图6-3 特殊功能寄存器特殊功能寄存器TCON的格式的格式 TCONTCON寄存器中
7、与中断系统有关各标志位功能如下:寄存器中与中断系统有关各标志位功能如下:(1 1)TF1TF1定时器定时器/计数器计数器T1T1的溢出中断请求标志位。的溢出中断请求标志位。当启动当启动T1T1计数后,计数后,T1T1从初值开始加从初值开始加1 1计数,当最高位产生溢出计数,当最高位产生溢出时,硬件时,硬件 置置TF1TF1为为“1”1”,向,向CPUCPU申请中断,申请中断,响应响应TF1TF1中断时,中断时,TF1TF1标志硬件自动清标志硬件自动清“0”“0”,TF1TF1也可由软件清也可由软件清“0”“0”。(2 2)TF0TF0定时器定时器/计数器计数器T0T0溢出中断请求标志位,与溢出
8、中断请求标志位,与TF1TF1类似类似。(3 3)IE1IE1外部中断请求外部中断请求1 1中断请求标志位。中断请求标志位。(4 4)IE0IE0外部中断请求外部中断请求0 0中断请求标志位,与中断请求标志位,与IE1IE1类似。类似。(5 5)IT1IT1选择外中断请求选择外中断请求1 1为跳沿触发还是电平触发方式。为跳沿触发还是电平触发方式。0-0-电平触发电平触发方式,加到方式,加到INT0INT0*脚脚上的外中断请求输入信号为上的外中断请求输入信号为低电平有效,并把低电平有效,并把IE1IE1置置“1”1”。转向中断服务程序时,则。转向中断服务程序时,则由硬件由硬件自动把自动把IE1I
9、E1清清“0”0”。1-1-跳沿触发跳沿触发方式,加到方式,加到INT1INT1*脚脚上的外中断请求输入信号从上的外中断请求输入信号从高到低的负跳变高到低的负跳变有效,并把有效,并把IE1IE1置置“1”1”。转向中断服务程序时,。转向中断服务程序时,则则由硬件自动把由硬件自动把IE1IE1清清“0”0”。(6 6)IT0IT0选择外中断请求选择外中断请求0 0为跳沿触发方式还是电平触发方为跳沿触发方式还是电平触发方式,与式,与IT1IT1类似。类似。当当AT89S51AT89S51复位后复位后,TCONTCON被清被清“0”0”,5 5个中断源的中断请求标个中断源的中断请求标志均为志均为0
10、0。TR1TR1(D6D6位)、位)、TR0TR0(D4D4位)这位)这2 2位与中断系统无关,仅与位与中断系统无关,仅与定时器定时器/计数器计数器T1T1和和T0T0有关,将在第有关,将在第6 6章定时器章定时器/计数器中介绍。计数器中介绍。2 2SCONSCON寄存器寄存器串行口控制寄存器,串行口控制寄存器,字节地址字节地址为为98H98H,可位寻址。,可位寻址。SCONSCON的低的低二位锁存二位锁存串口的串口的发送中断发送中断和和接收中断接收中断的中断请求标志的中断请求标志TITI和和RIRI,格格式见式见图图6-46-4。图图6-46-4 SCON SCON中的中断请求标志位中的中断
11、请求标志位 SCON SCON标志位功能:标志位功能:(1 1)TITI串口发送中断请求标志位。串口发送中断请求标志位。CPUCPU将将1 1字节的数据写字节的数据写入串口的发送缓冲器入串口的发送缓冲器SBUFSBUF时,就启动一帧串行数据的发送,每时,就启动一帧串行数据的发送,每发送完一帧串行数据后,硬件使发送完一帧串行数据后,硬件使TITI自动置自动置“1 1”。CPUCPU响应串口响应串口发送中断时,并不清除发送中断时,并不清除TITI中断请求标志,中断请求标志,TITI标志标志必须在中断服必须在中断服务程序中用指令对其清务程序中用指令对其清“0”0”。(2 2)RIRI串行口接收中断请
12、求标志位。在串口接收完一个串行口接收中断请求标志位。在串口接收完一个串行数据帧,硬件自动使串行数据帧,硬件自动使RIRI中断请求标志置中断请求标志置“1”1”。CPUCPU在响应在响应串口接收中断时,串口接收中断时,RIRI标志并不清标志并不清“0”0”,须,须在中断服务程序中在中断服务程序中用指令对用指令对RIRI清清“0”0”。6.3 6.3 中断允许中断允许与与中断优先级的控制中断优先级的控制实现中断允许控制和中断优先级控制分别用中实现中断允许控制和中断优先级控制分别用中断允许寄存器断允许寄存器IEIE和和中断优先级寄存器中断优先级寄存器IPIP实现。下面介绍两个特殊功能寄存器实现。下面
13、介绍两个特殊功能寄存器。6.3.1 中断允许寄存器中断允许寄存器IE 各中断源开放或屏蔽,是由片内中断允许寄存器各中断源开放或屏蔽,是由片内中断允许寄存器IE控制。控制。IE字节地址为字节地址为A8H,可进行位寻址,格式见,可进行位寻址,格式见图图6-5。图图6-56-5 中断允许寄存器中断允许寄存器IEIE的格式的格式 IEIE对对中断开放中断开放和和关闭关闭实现两级控制实现两级控制。两级控制就是有一个总的。两级控制就是有一个总的中断开关控制位中断开关控制位EAEA(IE.7IE.7位),当位),当EA=0EA=0,所有中断请求被屏蔽,所有中断请求被屏蔽,CPUCPU对任何中断请求都不接受;
14、当对任何中断请求都不接受;当EA=1EA=1时,时,CPUCPU开中断,但开中断,但5 5个中个中断源的中断请求是否允许,还要由断源的中断请求是否允许,还要由IEIE中的低中的低5 5位所对应的位所对应的5 5个中断个中断请求允许控制位的状态来决定(见图请求允许控制位的状态来决定(见图6-56-5)。)。IEIE中各位的功能如下:中各位的功能如下:(1 1)EAEA中断允许总开关控制位。中断允许总开关控制位。EA=0EA=0,所有的中断请求被屏蔽。,所有的中断请求被屏蔽。EA=1EA=1,所有的中断请求被开放。,所有的中断请求被开放。(2 2)ESES串行口中断允许位。串行口中断允许位。ES=
15、0 ES=0,禁止串行口中断。,禁止串行口中断。ES=1 ES=1,允许串行口中断。,允许串行口中断。(3 3)ET1ET1定时器定时器/计数器计数器T1T1溢出中断允许位。溢出中断允许位。ET1=0 ET1=0,禁止,禁止T1T1溢出中断。溢出中断。ET1=1 ET1=1,允许,允许T1T1溢出中断。溢出中断。(4 4)EX1EX1外部中断外部中断1 1中断允许位。中断允许位。EX1=0EX1=0,禁止外部中断,禁止外部中断1 1中断。中断。EX1=1EX1=1,允许外部中断,允许外部中断1 1中断。中断。(5 5)ET0ET0定时器定时器/计数器计数器T0T0的溢出中断允许位。的溢出中断允
16、许位。ET0=0ET0=0,禁止,禁止T0T0溢出中断。溢出中断。ET0=1ET0=1,允许,允许T0T0溢出中断。溢出中断。(6 6)EX0EX0外部中断外部中断0 0中断允许位。中断允许位。EX0=0EX0=0,禁止外部中断,禁止外部中断0 0中断。中断。EX0=1EX0=1,允许外部中断,允许外部中断0 0中断。中断。AT89S51AT89S51复位后,复位后,IEIE被清被清“0”“0”,所有中断请求被禁止。,所有中断请求被禁止。IEIE中中与各个中断源相应位可用指令置与各个中断源相应位可用指令置“1”“1”或清或清“0”“0”,即可允许或禁,即可允许或禁止各中断源的中断申请。若使某一
17、个中断源被允许中断,除了止各中断源的中断申请。若使某一个中断源被允许中断,除了IEIE相应位被置相应位被置“1”“1”外,还必须使外,还必须使EAEA位置位置“1”“1”。6.3.2 6.3.2 中断优先级寄存器中断优先级寄存器IPIP 中断请求源有两个中断优先级,每一个中断请求源可由软件中断请求源有两个中断优先级,每一个中断请求源可由软件设置为高优先级中断或低优先级中断,也可实现两级中断嵌套。设置为高优先级中断或低优先级中断,也可实现两级中断嵌套。所谓两级中断嵌套,就是所谓两级中断嵌套,就是AT89S51AT89S51正在执行低优先级中断的服正在执行低优先级中断的服务程序时,可被高优先级中断
18、请求所中断,待高优先级中断处理务程序时,可被高优先级中断请求所中断,待高优先级中断处理完毕后,再返回低优先级中断服务程序。完毕后,再返回低优先级中断服务程序。两级中断嵌套见两级中断嵌套见图图6-66-6。图图6-6 两级中断嵌套过程两级中断嵌套过程 各中断源的中断优先级关系,可归纳为下面两条基本规则:各中断源的中断优先级关系,可归纳为下面两条基本规则:(1 1)低优先级可被高优先级中断,高优先级不能被低优先级)低优先级可被高优先级中断,高优先级不能被低优先级中断。中断。(2 2)任何一种中断(不管是高级还是低级)一旦得到响应,)任何一种中断(不管是高级还是低级)一旦得到响应,不会再被它的同级中
19、断源所中断。如果某一中断源被设置为高优不会再被它的同级中断源所中断。如果某一中断源被设置为高优先级中断,在执行该中断源的中断服务程序时,则不能被任何其先级中断,在执行该中断源的中断服务程序时,则不能被任何其他的中断源的中断请求所中断。他的中断源的中断请求所中断。AT89S51AT89S51片内有一个中断优先级寄存器片内有一个中断优先级寄存器IPIP,字节地址为,字节地址为B8HB8H,可位寻址。只要用程序改变其内容,即可进行各中断源中断优先可位寻址。只要用程序改变其内容,即可进行各中断源中断优先级设置,级设置,IPIP寄存器格式寄存器格式见图见图6-76-7。图图6-7 IP寄存器的格式寄存器
20、的格式中断优先级寄存器中断优先级寄存器IPIP各位含义:各位含义:(1 1)PSPS串行口中断优先级控制位,串行口中断优先级控制位,11高级;高级;00低级。低级。(2 2)PT1T1PT1T1中断优先级控制位,中断优先级控制位,11高级;高级;00低级。低级。(3 3)PX1PX1外部中断外部中断1 1中断优先级控制位,中断优先级控制位,11高级;高级;00低级。低级。(4 4)PT0T0PT0T0中断优先级控制位,中断优先级控制位,11高级;高级;00低级。低级。(5 5)PX0PX0外部中断外部中断0 0中断优先级控制位,中断优先级控制位,11高级;高级;00低级。低级。中断优先级控制寄
21、存器中断优先级控制寄存器IPIP各位都可由程序置各位都可由程序置“1”“1”和清和清“0”“0”,用位操作指令或字节操作指令可更新用位操作指令或字节操作指令可更新IPIP的内容,改变各中断源的的内容,改变各中断源的中断优先级。中断优先级。AT89S51AT89S51复位后,各中断源均为低优先级中断。复位后,各中断源均为低优先级中断。IPIP内容为内容为0 00 0下面介绍下面介绍AT89S51AT89S51的中断优先级结构。的中断优先级结构。中断系统有中断系统有两个不可寻址两个不可寻址的的“优先级激活优先级激活触发器触发器”,其中一其中一个指示某高优先级中断正在执行,所有后来中断均被阻止;另一
22、个指示某高优先级中断正在执行,所有后来中断均被阻止;另一个触发器指示某低优先级中断正在执行,所有同级中断都被阻止个触发器指示某低优先级中断正在执行,所有同级中断都被阻止,但不阻断高优先级的中断请求。,但不阻断高优先级的中断请求。在同时收到几个同优先级的中断请求时,哪一个中断请求能在同时收到几个同优先级的中断请求时,哪一个中断请求能优先得到响应,取决于优先得到响应,取决于内部查询顺序内部查询顺序。这相当于在同一个优先级。这相当于在同一个优先级还存在另一辅助优先级结构,其还存在另一辅助优先级结构,其查询顺序见表查询顺序见表6-16-1。由表由表6-16-1,各中断源在同一优先级条件下,外部中断,各
23、中断源在同一优先级条件下,外部中断0 0中断优中断优先权最高,串行口中断的优先权最低。先权最高,串行口中断的优先权最低。6.4 6.4 响应中断请求的条件响应中断请求的条件一个中断源中断请求被响应,须满足以下必要条件:一个中断源中断请求被响应,须满足以下必要条件:(1 1)总中断允许开关接通,即)总中断允许开关接通,即IEIE寄存器中的中断总允许位寄存器中的中断总允许位EA=1EA=1。(2 2)该中断源发出中断请求,即该中断源对应的中断请求标)该中断源发出中断请求,即该中断源对应的中断请求标志为志为“1”“1”。(3 3)该中断源的中断允许位)该中断源的中断允许位=1=1,即该中断被允许。,
24、即该中断被允许。(4 4)无同级或更高级中断正在被服务。)无同级或更高级中断正在被服务。中断响应就是中断响应就是CPUCPU对中断源提出的中断请求的接受,当查询到对中断源提出的中断请求的接受,当查询到有效的中断请求时,满足上述条件时,紧接着就进行中断响应。有效的中断请求时,满足上述条件时,紧接着就进行中断响应。中断响应过程首先由硬件自动生成一条长调用指令中断响应过程首先由硬件自动生成一条长调用指令“LCALL“LCALL addr16”addr16”。即程序存储区中相应的中断入口地址。例如,对于外。即程序存储区中相应的中断入口地址。例如,对于外部中断部中断1 1的响应,硬件自动生成的长调用指令
25、为:的响应,硬件自动生成的长调用指令为:LCALL 0013H LCALL 0013H生成生成LCALLLCALL指令后,紧接着就由指令后,紧接着就由CPUCPU执行该指令。首先将程序计执行该指令。首先将程序计数器数器PCPC内容压入堆栈以保护断点,再将中断入口地址装入内容压入堆栈以保护断点,再将中断入口地址装入PCPC,使,使程序转向响应中断请求的中断入口地址。各中断源服务程序入口程序转向响应中断请求的中断入口地址。各中断源服务程序入口地址是固定的,见地址是固定的,见表表6-26-2。其中两个中断入口间只相隔其中两个中断入口间只相隔8 8字节,一般情况下难以安放一个字节,一般情况下难以安放一
26、个完整的中断服务程序。完整的中断服务程序。因此,通常总是在中断入口地址处放置一条无条件转移指令,使因此,通常总是在中断入口地址处放置一条无条件转移指令,使程序执行转向在其他地址存放的中断服务程序入口。程序执行转向在其他地址存放的中断服务程序入口。中断响应是有条件的,并不是查询到的所有中断请求都能被中断响应是有条件的,并不是查询到的所有中断请求都能被立即响应,当遇到下列立即响应,当遇到下列3 3种情况之一时,中断响应被封锁:种情况之一时,中断响应被封锁:(1 1)CPUCPU正在处理同级或更高优先级的中断。正在处理同级或更高优先级的中断。因为当一个中断因为当一个中断被响应时,要把对应的中断优先级
27、状态触发器置被响应时,要把对应的中断优先级状态触发器置“1”“1”(该触发(该触发器指出器指出CPUCPU所处理的中断优先级别),从而封锁了低级中断请求所处理的中断优先级别),从而封锁了低级中断请求和同级中断请求。和同级中断请求。(2 2)所查询的机器周期不是当前正在执行指令的最后一个机所查询的机器周期不是当前正在执行指令的最后一个机器周期器周期。设定这个限制的目的是只有在当前指令执行完毕后,才。设定这个限制的目的是只有在当前指令执行完毕后,才能进行中断响应,以确保当前指令执行的完整性。能进行中断响应,以确保当前指令执行的完整性。(3 3)正在执行的指令是正在执行的指令是RETIRETI或是访
28、问或是访问IEIE或或IPIP的指令。的指令。因为因为按中断系统的规定,在执行完这些指令后,需再执行完一条指按中断系统的规定,在执行完这些指令后,需再执行完一条指令,才响应新的中断请求。令,才响应新的中断请求。如存在上述如存在上述3 3种情况之一,种情况之一,CPUCPU将丢弃中断查询结果,不能将丢弃中断查询结果,不能对中断进行响应。对中断进行响应。外中断外中断最短响应时间最短响应时间为为3 3个机器周期个机器周期。其中中断请求标志。其中中断请求标志位查询占位查询占1 1个机器周期,而这个机器周期恰好处于指令的最后个机器周期,而这个机器周期恰好处于指令的最后一个机器周期。在这个机器周期结束后,
29、中断即被响应,一个机器周期。在这个机器周期结束后,中断即被响应,CPUCPU接着执行接着执行1 1条硬件子程序调用指令条硬件子程序调用指令LCALLLCALL以转到相应的中断服务以转到相应的中断服务程序入口,这需要程序入口,这需要2 2个机器周期。个机器周期。外部中断响应外部中断响应最长时间最长时间为为8 8个机器周期个机器周期。这种情况发生在。这种情况发生在CPUCPU进行中断标志查询时,刚好才开始执行进行中断标志查询时,刚好才开始执行RETIRETI或访问或访问IEIE或或IPIP的指令,则需把当前指令执行完再继续执行一条指令后,才能的指令,则需把当前指令执行完再继续执行一条指令后,才能响
30、应中断。响应中断。执行上述的执行上述的RETIRETI或访问或访问IEIE或或IPIP的指令,最长需要的指令,最长需要2 2个机器周个机器周期。而接着再执行期。而接着再执行1 1条指令,我们按最长的指令(乘法指令条指令,我们按最长的指令(乘法指令MULMUL和除法指令和除法指令DIVDIV)来算,也只有)来算,也只有4 4个机器周期。再加上硬件子程个机器周期。再加上硬件子程序调用指令序调用指令LCALLLCALL的执行,需要的执行,需要2 2个机器周期,所以,外部中断个机器周期,所以,外部中断响应的最长时间为响应的最长时间为8 8个机器周期。个机器周期。如已在处理同级或更高级中断,外部中断请求
31、响应时间取如已在处理同级或更高级中断,外部中断请求响应时间取决于正在执行的中断服务程序的处理时间,此情况下,响应时决于正在执行的中断服务程序的处理时间,此情况下,响应时间无法计算。间无法计算。这样,在一单一中断系统,这样,在一单一中断系统,AT89S51AT89S51 对外部中断请求响应时对外部中断请求响应时间总是在间总是在3 38 8个机器周期间。个机器周期间。6.6 6.6 外部中断的触发方式选择外部中断的触发方式选择 外部中断有两种触发方式:外部中断有两种触发方式:电平触发电平触发方式和方式和跳沿触发跳沿触发方式。方式。6.6.1 6.6.1 电平触发方式电平触发方式 若外中断定义为电平
32、触发方式,外部中断申请触发器状态随若外中断定义为电平触发方式,外部中断申请触发器状态随着着 CPU CPU 在每个机器周期采样到的外部中断输入引脚电平变化而在每个机器周期采样到的外部中断输入引脚电平变化而变化,这能提高变化,这能提高CPUCPU对外部中断请求的响应速度。当外部中断源对外部中断请求的响应速度。当外部中断源被设定为电平触发方式时,在中断服务程序返回之前,外部中断被设定为电平触发方式时,在中断服务程序返回之前,外部中断请求输入必须无效(即外部中断请求输入已由低电平变为高电平请求输入必须无效(即外部中断请求输入已由低电平变为高电平),否则),否则CPUCPU返回主程序后会再次响应中断。
33、返回主程序后会再次响应中断。所以电平触发适合于外部中断以低电平输入且中断服务程所以电平触发适合于外部中断以低电平输入且中断服务程序能清除外部中断请求源(即外部中断输入电平又变为高电平序能清除外部中断请求源(即外部中断输入电平又变为高电平)的情况。如何清除电平触发的外部中断请求源的电平信号,)的情况。如何清除电平触发的外部中断请求源的电平信号,本章后将介绍。本章后将介绍。6.6.2 6.6.2 跳沿触发方式跳沿触发方式 外部中断若定义为跳沿触发方式,外部中断申请触发器能外部中断若定义为跳沿触发方式,外部中断申请触发器能锁存外部中断输入线上的负跳变。即便是锁存外部中断输入线上的负跳变。即便是CPU
34、CPU暂时不能响应,暂时不能响应,中断请求标志也不会丢失。在这种方式下,如果相继连续两次中断请求标志也不会丢失。在这种方式下,如果相继连续两次采样,一个机器周期采样到外部中断输入为高,下一机器周期采样,一个机器周期采样到外部中断输入为高,下一机器周期采样为低,则中断申请触发器置采样为低,则中断申请触发器置“1”“1”,直到,直到CPUCPU响应此中断时响应此中断时,该标志才清,该标志才清“0”“0”。这样就不会丢失中断,但输入的负脉冲。这样就不会丢失中断,但输入的负脉冲宽度至少要保持宽度至少要保持1 1个机器周期(若晶振频率为个机器周期(若晶振频率为6MHz6MHz,则为,则为2s2s),才能
35、被,才能被CPUCPU采样到。外部中断的跳沿触发方式适合于以采样到。外部中断的跳沿触发方式适合于以负脉负脉冲形式输入冲形式输入的外部中断请求。的外部中断请求。6.7 6.7 中断请求的撤销中断请求的撤销 某中断请求被响应后,就存在着一个中断请求撤销问题。某中断请求被响应后,就存在着一个中断请求撤销问题。下面按中断请求源的类型分别说明中断请求的撤销方法。下面按中断请求源的类型分别说明中断请求的撤销方法。1 1定时器定时器/计数器中断请求的撤销计数器中断请求的撤销 定时器定时器/计数器中断的中断请求被响应后,硬件会自动把中计数器中断的中断请求被响应后,硬件会自动把中断请求标志位(断请求标志位(TF
36、0TF0或或TF1TF1)清)清“0”“0”,因此定时器,因此定时器/计数器中断计数器中断请求是自动撤销的。请求是自动撤销的。2 2外部中断请求的撤销外部中断请求的撤销(1 1)跳沿方式外部中断请求的撤销)跳沿方式外部中断请求的撤销 中断请求撤销两项内容:中断标志位清中断请求撤销两项内容:中断标志位清“0”“0”和外中断信号的和外中断信号的撤销。其中,中断标志位(撤销。其中,中断标志位(IE0IE0或或IE1IE1)清)清“0”“0”是在中断响应后是在中断响应后由硬件自动完成的。而外中断请求信号的撤销,由于跳沿信号过由硬件自动完成的。而外中断请求信号的撤销,由于跳沿信号过后也就消失了,所以跳沿
37、方式的外部中断请求也是自动撤销的。后也就消失了,所以跳沿方式的外部中断请求也是自动撤销的。(2 2)电平方式外中断请求撤销)电平方式外中断请求撤销 中断请求标志自动撤销,但中断请求信号低电平可能继续存中断请求标志自动撤销,但中断请求信号低电平可能继续存在,在以后的机器周期采样时,又会把已清在,在以后的机器周期采样时,又会把已清“0”“0”的的IE0IE0或或IE1IE1标标志位重新置志位重新置“1”“1”。要彻底解决电平方式外部中断请求撤销,除。要彻底解决电平方式外部中断请求撤销,除标志位清标志位清“0”“0”之外,还需在中断响应后把中断请求信号输入引之外,还需在中断响应后把中断请求信号输入引
38、脚从低电平强制改变为高电平。为此,可增加脚从低电平强制改变为高电平。为此,可增加图图6-86-8所示电路。所示电路。图图6-8 电平方式的外部中断请求的撤销电路电平方式的外部中断请求的撤销电路由图由图6-86-8,D D触发器锁存外来的中断请求低电平,并通过其触发器锁存外来的中断请求低电平,并通过其输出端输出端Q Q接到(接到(INT0INT0*或或INT1INT1*)。所以,增加的)。所以,增加的D D触发器不影响触发器不影响中断请求。中断响应后,为撤销中断请求,可利用中断请求。中断响应后,为撤销中断请求,可利用D D触发器直接触发器直接置置“1”SD“1”SD端实现,即把端实现,即把SDS
39、D端接端接AT89S51AT89S51的的P1.0P1.0。因此,只要。因此,只要P1.0P1.0端输出一个负脉冲就可以使端输出一个负脉冲就可以使D D触发器置触发器置“1”“1”,从而就撤销,从而就撤销低电平的中断请求信号。负脉冲可在中断服务程序中先低电平的中断请求信号。负脉冲可在中断服务程序中先P1.0P1.0置置1 1,再让,再让P1.0P1.0为为0 0,再把,再把P1.0P1.0置置1 1。3 3串行口中断请求的撤销串行口中断请求的撤销只有标志位清只有标志位清“0”“0”的问题。串行口中断标志位是的问题。串行口中断标志位是TITI和和RIRI,但,但对这两个中断标志对这两个中断标志C
40、PUCPU不自动清不自动清“0”“0”。因为响应串口中断后,因为响应串口中断后,CPUCPU无法知道是接收中断还是发送中断无法知道是接收中断还是发送中断,还需测试这两个中断标志位来判定,然后才清除。所以串口中,还需测试这两个中断标志位来判定,然后才清除。所以串口中断请求撤销只能使用软件在中断服务程序中把串行口中断标志位断请求撤销只能使用软件在中断服务程序中把串行口中断标志位TITI、RIRI清清0 0。6.8 6.8 中断函数中断函数 为直接使用为直接使用C51C51编写中断服务程序,编写中断服务程序,C51C51中定义了中断函数。中定义了中断函数。这在第这在第3 3章中已简要介绍。由于章中已
41、简要介绍。由于C51C51编译器在编译时对声明为中断编译器在编译时对声明为中断服务程序的函数自动添加相应现场保护、阻断其他中断、返回时服务程序的函数自动添加相应现场保护、阻断其他中断、返回时自动恢复现场等处理的程序段,因而在编写中断函数时可不必考自动恢复现场等处理的程序段,因而在编写中断函数时可不必考虑这些问题,减小编写中断服务程序烦琐程度。虑这些问题,减小编写中断服务程序烦琐程度。中断服务函数的一般形式为:中断服务函数的一般形式为:函数类型函数类型 函数名(形式参数表)函数名(形式参数表)interrupt n using ninterrupt n using n 关键字关键字interru
42、ptinterrupt后面的后面的 n n是中断号,对于是中断号,对于80518051单片机,单片机,n n的的取值取值为为0 04 4,编译器从,编译器从8 8n+3n+3处产生中断向量。处产生中断向量。AT89S51AT89S51中断源中断源对应的中断号和中断向量见对应的中断号和中断向量见表表6-36-3。AT89S51 AT89S51内部内部RAMRAM中可使用中可使用4 4个工作寄存器区,每个工作寄存个工作寄存器区,每个工作寄存器区包含器区包含8 8个工作寄存器(个工作寄存器(R0R0R7R7)。)。关键字关键字usingusing后面的后面的n n专门专门用来选择用来选择4 4个工作
43、寄存器区。个工作寄存器区。usingusing是一选项,如不选,中断函数是一选项,如不选,中断函数中的所有工作寄存器内容将被保存到堆栈中。中的所有工作寄存器内容将被保存到堆栈中。关键字关键字usingusing对函数目标代码的影响如下:对函数目标代码的影响如下:在中断函数的入口处将当前工作寄存器区内容保护到堆栈中在中断函数的入口处将当前工作寄存器区内容保护到堆栈中,函数返回前将被保护的寄存器区内容从堆栈中恢复。使用,函数返回前将被保护的寄存器区内容从堆栈中恢复。使用usingusing在函数中确定一个工作寄存器区须十分小心,要保证任何在函数中确定一个工作寄存器区须十分小心,要保证任何工作寄存器
44、区的切换都只在指定的控制区域中发生,否则将产生工作寄存器区的切换都只在指定的控制区域中发生,否则将产生不正确的函数结果。不正确的函数结果。例如,例如,外中断外中断1 1()中断服务函数如下:()中断服务函数如下:void int1()interrupt 2 using 0/void int1()interrupt 2 using 0/中断号中断号n=2n=2,选择,选择0 0区工区工作寄存器区作寄存器区中断调用与标准中断调用与标准C C的函数调用是不一样的,当中断事件发生的函数调用是不一样的,当中断事件发生后,对应的中断函数被自动调用,即没有参数,也没有返回值,后,对应的中断函数被自动调用,即
45、没有参数,也没有返回值,会带来如下影响。会带来如下影响。(1 1)编译器会为中断函数自动生成中断向量。)编译器会为中断函数自动生成中断向量。(2 2)退出中断函数时,所有保存在堆栈中的工作寄存器及特)退出中断函数时,所有保存在堆栈中的工作寄存器及特殊功能寄存器被恢复。殊功能寄存器被恢复。(3 3)在必要时特殊功能寄存器)在必要时特殊功能寄存器AccAcc、B B、DPHDPH、DPLDPL以及以及PSWPSW的内的内容被保存到堆栈中。容被保存到堆栈中。编写中断程序,应遵循以下规则:编写中断程序,应遵循以下规则:(1 1)中断函数没有返回值,如果定义一个返回值,将会得到)中断函数没有返回值,如果
46、定义一个返回值,将会得到不正确结果。不正确结果。建议建议将中断函数定义为将中断函数定义为voidvoid类型类型,明确说明无返回,明确说明无返回值。值。(2 2)中断函数不能进行参数传递,如果中断函数中包含任何)中断函数不能进行参数传递,如果中断函数中包含任何参数声明都将导致编译出错。参数声明都将导致编译出错。(3 3)任何情况下都不能直接调用中断函数任何情况下都不能直接调用中断函数,否则会产生编译,否则会产生编译错误。因为中断函数的返回是由汇编语言指令错误。因为中断函数的返回是由汇编语言指令RETIRETI完成的。完成的。RETIRETI指令指令会影响会影响AT89S51AT89S51硬件中
47、断系统内的不可寻址的中断优先级寄硬件中断系统内的不可寻址的中断优先级寄存器的状态。如没有实际中断请求情况下,直接调用中断函数,存器的状态。如没有实际中断请求情况下,直接调用中断函数,也就不会执行也就不会执行RETIRETI指令,其操作结果有可能产生一个致命错误。指令,其操作结果有可能产生一个致命错误。(4 4)如在中断函数中再调用其他函数,则被调用的函数所用)如在中断函数中再调用其他函数,则被调用的函数所用的寄存器区必须与中断函数使用的寄存器区不同。的寄存器区必须与中断函数使用的寄存器区不同。6.9 6.9 中断系统应用举例中断系统应用举例本节通过几个例程介绍有关中断应用程序的编写。本节通过几
48、个例程介绍有关中断应用程序的编写。6.9.16.9.1 单一外中断的应用单一外中断的应用【例【例6-16-1】在单片机在单片机P1P1口上接有口上接有8 8只只LEDLED。在外部中断。在外部中断0 0输入输入引脚(引脚(P3.2P3.2)接一只按钮开关)接一只按钮开关K1K1。要求将外部中断。要求将外部中断0 0设置为电平设置为电平触发。程序启动时,触发。程序启动时,P1P1口上的口上的8 8只只LEDLED全亮。每按一次按钮开关全亮。每按一次按钮开关K1K1,使引脚接地,产生一个低电平触发的外中断请求,在中断服务,使引脚接地,产生一个低电平触发的外中断请求,在中断服务程序中,让低程序中,让
49、低4 4位的位的LEDLED与高与高4 4位的位的LEDLED交替闪烁交替闪烁5 5次。然后从中断次。然后从中断返回,控制返回,控制8 8只只LEDLED再次全亮。原理电路及仿真结果见图再次全亮。原理电路及仿真结果见图6-96-9。图图6-96-9 利用中断控制利用中断控制8 8只只LEDLED交替闪烁交替闪烁1 1次的电路次的电路参考程序如下:参考程序如下:#include#include#define uchar unsigned char#define uchar unsigned charvoid Delay(unsigned int i)void Delay(unsigned int
50、 i)/延时函数延时函数Delay()Delay(),i i形式参数,不能赋初值形式参数,不能赋初值 unsigned int j;unsigned int j;for(;i 0;i-)for(;i 0;i-)for(j=0;j333;j+)/for(j=0;j333;j+)/晶振为晶振为12MHz12MHz,j j选择与晶振频率有关选择与晶振频率有关 ;/空函数空函数 void main()void main()/主函数主函数 EA=1;EA=1;/总中断允许总中断允许 EX0=1;EX0=1;/允许外部中断允许外部中断0 0中断中断 IT0=1;IT0=1;/选择外部中断选择外部中断0 0