1、 中断:是指中央处理器CPU正在执行程序,处理某件事情的时候,外部发生了某一事件请求CPU马上处理,CPU暂时中断当前的工作转入处理所发生的事件,处理完以后,再返回到原来被中断的地方,继续原来的工作。能够实现中断处理功能的部件称为中断系统。向CPU 提出中断请求的源称为中断源。中断源向CPU 提出的处理请求,称为中断请求或中断申请。CPU 同意处理该请求称为中断响应,处理中断请求的程序称为中断服务子程序。当CPU暂时终止正在执行的程序,转去执行中断服务子程序时,除了硬件自动把断点PC值(即下一条应执行的指令地址)压入堆栈之外,用户应注意保护有关的工作寄存器、累加器、标志位等信息,这称为保护现场
2、;在完成中断服务子程序后,恢复有关的工作寄存器、累加器、标志位的内容,称为恢复现场;最后执行中断返回指令RETI,从堆栈中自动弹出断点地址PC,继续执行被中断的程序,称为中断返回。主程序继续执行主程序执行中断服务程序主程序继续执行主程序高级中断低级中断中 断中 断返 回返 回(a)中 断 响 应 过 程(b)中 断 嵌 套 过 程RETI 优先权:给各中断源规定一个优先级别,称为优先权。当两个或者两个以上的中断源同时提出中断请求时,计算机首先为优先权最高的中断源服务,服务结束后再响应级别较低的中断源。计算机按中断源级别高低逐次响应的过程称优先权排队。这个过程可以通过硬件电路来实现,也可以通过程
3、序查询来实现。中断嵌套:当CPU响应某一中断的请求而进行中断处理时,若有优先权级别更高的中断源发出中断申请,CPU则中断正在进行的中断服务程序,并保留这个程序的断点,响应高级中断,在高级中断处理完以后,再继续执行被中断的中断服务程序(如图5-1(b)所示)。中断申请的中断源的优先权级别与正在处理的中断源同级或更低时,CPU暂时不响应这个中断申请,直至正在处理的中断服务程序执行完以后才去处理新的中断申请。5.2 MCS-51中断系统中断系统 MCS-51 单片机的中断系统结构随型号的不同而不同,包括中断源数目,中断优先级、中断控制寄存器都有差异。典型的89C51单片机有5个中断源,具有2个中断优
4、先级,可以实现二级中断嵌套。每一个中断源可以设置为高优先级或低优先级中断,允许或禁止向CPU申请中断。89C51的中断系统结构如图5-2所示。01IT001IT0IE0IE0EX0ET0EX1ET1ES0INTTF0TF11INTR ITIPX0PT0PX1PT1PS高 级 中 断 请 求低 级 中 断 请 求中 断 查 询 顺 序EAIE寄 存 器IP寄 存 器5.2.1 MCS-51中断源中断源8051有5个中断源:2个是引脚(P3.2)、(P3.3)输入的外部中断源;3个是内部中断源,它们是定时器T0、T1和串行口的中断请求源。(1)外部中断源上输入的两个外部中断标志和触发方式控制位在特
5、殊功能寄存器TCON的低4位(见表5-1)。0INT1INT IE1:外部中断1请求源(INT1,P3.3)标志。IE11表明外部中断1正在向CPU申请中断。当CPU响应该中断时由硬件清“0”IE1(边沿触发方式)。IT1:外部中断1触发方式控制位。ITl0:外部中断1为电平触发方式。这种方式下,INT1 端输入低电平时,置位IE1,CPU在每个周期都采样INT1引脚的输入电平,当采样到低电平时,置“1”IE1,采样到高电平时清“0”IE1。采用电平触发方式时,外部中断源信号必须保持低电平信号有效,直到该中断被CPU响应,同时在该中断服务程序执行完之前,外部中断源必须被清除,否则将产生另一次中
6、断。ITl1,外部中断1控制为边沿(先高后低的负跳变)触发方式。这种方式CPU在每一个周期采样引脚的输入电平。如果相继的两次采样,前一个周期采样到INT1为高电平,后一个周期采样到INT1为低电平,则置“1”IE1。IE1=1表示外部中断1正在向CPU申请中断,直到该中断CPU响应时,才由硬件清“0”IE1。因为每个机器周期采样一次外部中断输入电平,因此采用边沿触发方式时,外部中断源输入的高电平和低电平的时间必须保持12个时钟周期以上,才能保证被CPU检测到从高到低的跳变。IE0:外部中断0请求源(INT0,P3.2)标志。IE0=1外部中断0向CPU请求中断当CPU,响应该中断时由硬件清“0
7、”IE0(边沿触发方式)。IT0:外部中断0触发方式控制,其控制方式与外部中断1类似。IT0=0:外部中断0为电平触发方式。IT0=1:外部中断0为边沿触发方式。(2)定时器T0、T1中断源 TF1和TF0分别为定时器T1和T0的溢出标志。(2)定时器T0、T1中断源TF1和TF0分别为定时器T1和T0的溢出标志。TFl:T1溢出中断标志。T1被启动计数后,从初值开始加1计数,直至计满溢出后,由硬件使TFll,向CPU请求中断,此标志一直保持到CPU响应中断后,才由硬件自动清“0”。也可用软件查询该标志,并由软件清“0”。TF0:T0溢出中断标志。其操作功能类似于TF1。(3)串行口中断请求源
8、 SCON 为串行口控制寄存器,其低2 位锁定串行口的发送中断和接收中断的中断请求标志TI和RI TI:串行发送中断标志。CPU将一个字节数据写入发送缓冲器SBUF后启动发送,每发送完一个串行帧,硬件置位TI。TI标志由软件清除。RI:串行接收中断标志。在串行口允许接收时,每接收完一个串行帧,硬件置位RI。RI标志由软件清除。5.2.2 中断控制中断控制 1中断允许寄存器中断允许寄存器IE(某位某位“1允许,允许,“0”禁止)禁止)EA:中断允许总控制:中断允许总控制 ES:串行口中断允许位:串行口中断允许位 ET1:定时:定时/计数器计数器T1的溢出中断允许位。的溢出中断允许位。EX1:外部
9、中断:外部中断1中断允许位中断允许位 ET0:定时:定时/计数器计数器T0 的溢出中断允许位。的溢出中断允许位。EX0:中断:中断0中断允许位。中断允许位。2中断优先级寄存器中断优先级寄存器IP MCS51 单片机有两个中断优先级,对于每一个中断请求源可编程为高优先级中断或低优先级中断。专用寄存器IP统一管理中断优先级,它具有两个中断优先级,由软件设置每个中断源为高优先级中断或低优先级中断,并可实现两级中断嵌套。高优先级中断源可以中断正在执行的低优先级中断服务程序,除非在执行低优先级中断服务程序时设置了CPU关中断或禁止某些高优先级中断源的中断。同级或低优先级的中断源不能中断正在执行的中断服务
10、程序。如果IP中优先级别相同,CPU将采用默认优先级处理中断。默认优先级由硬件形成,排列次序如下:中断源 默认优先级外部中断0 最高级定时器T0 外部中断1 定时器T0串行口中断 最低级 当重新设置优先级时,则顺序查询逻辑电路将会改变相应排队顺序。例如,给中断优先级寄存器IP中设置的优先级控制字为11H,则PS和PX0均为高优先级中断。当这两个中断源同时发出中断申请时,CPU将先响应自然优先级高的PX0的中断申请,而后响应自然优先级低的PS的中断申请。中断优先级寄存器IP 各位的功能如表5-4所列(某位为1,设置为高优先级)PS:串行口中断优先级控制位PT1:定时/计数器T1中断优先级控制位P
11、X1:外部中断1中断优先级控制位PT0:定时器T0中断优先级控制位PX0:外部中断0 中断优先级控制位5.2.3 中断处理中断处理 1中断响应过程中断响应过程 CPU 在每一个机器周期顺序检查每一个中断源。并按优先级处理每个被激活的中断请求,如果没有被下述条件所阻止,将在下一个机器周期响应激活了的最高级中断请求。(1)CPU 正在处理相同的或更高优先级的中断;(2)现行的机器周期不是所执行指令的最后个机器周期;(3)正在执行的指令是RETI 或是访问IE或IP的指令(CPU 在执行RETI 或访问IE、IP 的指令后,至少需要再执行一条指令才会响应新的中断请求)。如果上述条件中有一个存在,CP
12、U将丢弃中断查询结果;若一个条件都不存在,将在紧接着的下一个周期执行中断查询结果。CPU响应中断时,先置位相应的中断优先级状态触发器(该触发器指出CPU开始处理中断的级别),然后执行一条硬件子程序调用,使控制转移到相应的中断入口,清“0”中断请求源申请标志(TI、RI除外)。接着把PC值压入堆栈,将被响应的中断服务程序的入口地址送入PC。MCS-51系列单片机5个中断服务程序入口地址如表5-4,由于5个地址之间仅隔8个单元,用于存放中断服务程序往往不够用,因此通常也在这里放一条绝对转移指令,转到真正的中断服务程序。CPU执行中断服务程序一直到RETI指令为止。RETI指令是表示中断服务程序的结
13、束,CPU执行完这条指令后,清“0”响应中断时所设置的优先级触发器,然后从堆栈中弹出栈顶的两个字节到PC,CPU从原来被中断处继续执行被中断的程序。由此可见,用户的中断服务程序必须加上返回指令RETI指令,CPU的现场保护和恢复必须由用户中断服务程序处理。CPU响应某中断请求后,在中断返回前,应该撤消该中断请求,否则会引起另一次中断。(1)定时器0或1溢出中断,CPU在响应中断后,中断请求由硬件自动撤除。(2)边沿激活的外部中断,CPU在响应中断后,硬件自动清除有关的中断请求。(3)串行口中断,CPU响应中断后,靠软件来清除相应的标志。(4)电平触发的外部中断撤除。在电平触发方式下,外部中断标
14、志IE0或IE1是依靠CPU检测 或 上的低电平置位的。尽管CPU在响应中断时能由硬件自动复位IE0或IE1,但若外部中断源不能及时撤除或上的低电平,就会使已经复位的IE0或IE1再次置位,这是绝对不允许的。因此电平触发型外部中断请求的撤除必须使或随着其中断的响应而变为高电平。图5-3是撤除电平触发中断的可行的方案。0INT1INTQDSDCPP1.00INT中断请求(外部中断请求)图中触发器的作用是锁存外部中断请求的低电平信号,并由Q端输出到供CPU检测。D触发器的异步置位端接单片机的P1.0,此端口平时为“1”,对D触发器输出无影响。当中断响应后,为了撤除中断请求,只要在P1.0上输出一个
15、负脉冲,使触发器置“1”,就可以撤除低电平的中断请求。负脉冲信号可以用下面两条指令实现。ANL Pl,#0FEHORL P1,#01H 执行第一条指令使P1.0输出为“0”,其持续时间为2个机器周期,足以使D触发器置位,从而撤除中断请求。执行第二条指令使P1.0变为“1”,否则D触发器的S端始终有效,INT0端始终为“1”,无法再次申请中断。5.3 中断应用程序举例中断应用程序举例 中断程序一般包含中断控制程序(即中断初始化程序)和中断服务程序两部分。(1)中断初始化程序 中断初始化程序实质上就是对TCON、SCON、IE和IP寄存器的管理和控制。只要这些寄存器的相应位按照要求进行了状态预置,
16、CPU就会按照用户的意图对中断源进行管理和控制。中断初始化程序一般不独立编写,而是包含在主程序中,根据需要进行编写。中断初始化程序需完成以下操作:1)开中断;2)某一中断源中断请求的允许与禁止(屏蔽);3)确定各中断源的优先级别;4)若是外部中断请求,则要设定触发方式是电平触发还是边沿触发。【例5.1】假设规定外部中断0为电平触发方式,高优先级,试写出有关的初始化程序。解:可用两种方法完成。方法1,用位操作指令完成:SETB EA ;开中断允许总控制位SETB EX0 ;外中断0开中断SETB PX0;外中断0高优先级CLR IT0;电平触发 方法2,用其它指令也可完成同样功能:MOV IE,
17、#81H;同时置位EA和EX0ORL IP,#01H;置位PX0ANL TCON,#0FEH;使IT0为0(2)中断服务程序 中断服务程序是一种为中断源的特定任务而编写的独立程序,以中断返回指令RETI结束。中断服务程序结束后返回到原来被中断的地方(即断点),继续执行原来的程序。中断服务程序和子程序一样,在调用和返回时,也有一个保护断点和现场的问题。在中断响应过程中,断点的保护主要由硬件电路自动实现。它将断点压人堆栈,再将中断服务程序的入口地址送入程序计数器PC,使程序转向中断服务程序。中断处理时现场保护由中断服务程序来完成。现场一般包括累加器A、工作寄存器R0R7以及程序状态字PSW等。保护
18、现场和恢复现场一般采用 PUSH和POP指令来实现。此外,在编写中断服务程序时还应注意以下三点:1)各中断源入口地址之间只相隔8个字节。中断服务程序放在此处,一般容量是不够的。常用的方法是在中断入口地址单元处,存放条无条件转移指令,如“LJMP Address”,使程序跳转到用户安排的中断服务程序起始地址去。2)在执行当前中断程序时,为了禁止更高优先级中断源的中断请求,可先用软件关闭CPU中断,或屏蔽更高级中断源的中断,在中断返回前再开放被关闭或被屏蔽的中断。3)在多级中断情况下,应在保护现场之前关掉中断,在恢复现场之后打开中断。如果在中断处理时允许有更高级的中断打断它,则在保护现场之后开中断
19、,恢复现场之前关中断。【例5.2】设在主程序中用到了寄存器PSW、ACC、B、DPTR,而在执行中断服务程序时需要用到这些寄存器。试编写程序在中断服务程序中对这些寄存器加以保护。SERVICE:PUSHPSW;保护程序状态字PUSHACC;保护累加器APUSHB;保护寄存器BPUSHDPL;保护数据指针低字节PUSHDPH;保护数据指针高字节 ;中断处理POPDPH;恢复现场 POPDPL POP BPOPACCPOPPSW RETI 5.3】图5-4为多个故障显示电路,当系统无故障时,4个故障源输入端X1X4全为低电平,显示灯全灭;当某部分出现故障,其对应的输入由低电平变为高电平,从而引起M
20、CS51单片机中断,中断服务程序的任务是判定故障源,并用对应的发光二极管LED1LED4进行显示。+0INTP1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7X0X1X3X4MCS-51ORG 0000H;程序开始AJMP MAIN;转主程序ORG 0003H;外部中断INT0入口地址 AJMP SERVICE ;转中断服务程序MAIN:0RL P1,#0FFH;灯全灭,准备读入 SETB IT0 ;选择边沿方式 SETB EX0;允许INT0中断 SETB EA;CPU开中断 AJMP$;等待中断 SERVICE:JNB P1.3,N1;若X1无故障转CLR P1.4;若X1有故障,LED1亮N1:JNB P1.2,N2;若X2无故障转CLR P1.5;若X2有故障,LED2亮N2:JNB P1.1,N3;若X3无故障转CLR P1.6;若X3有故障,LED3亮N3:JNB P1.0,N4;若X4无故障转CLR P1.7;若X4有故障,LED4亮N4:RETI