第7章中断系统提要中断基本概念中断源及入口地址各SFR的结构、控制作用和设置方法中断响应过程中断应用程序的编写2020年1月4日27.1中断概述中断的概念:中断,中断系统,中断源,主程序,中断服务子程序,断点。中断服务程序与调用子程序之区别中断技术的优点分时操作实时处理故障处理7.1中断概述中断系统的功能实现中断及返回:中断源,中断请求,中断允许,中断响应,中断返回。实现优先权排队:当两个或两个以上的中断源同时提出中断请求时,计算机按优先级高低逐次响应的过程称为优先级排队。实现中断嵌套:在响应某一中断、进行中断处理过程中,能够响应优先级更高的中断源发出的中断请求。7.289C51单片机的中断系统IE0IE1EX0ET0EX1ET1ESET2PX0PT0PX1PT1PT2PSEATF0TF1RITITF2EXF2/INT0/INT10011IE寄存器IP寄存器高级中断请求低级中断请求中断查询顺序中断源开放中断开放IT0IT17.289C51单片机的中断系统5个中断请求源2个外部中断源:INT0、INT13个内部中断源:片内定时器/计数器T0、T1的溢出中断源;串行口的发送/接收中断4个与中断有关的特殊功能寄存器中断请求:定时和外中断控制寄存器TCON、串行控制寄存器SCON;中断允许控制寄存器IE;中断优先级控制寄存器IP;中断入口地址和硬件查询电路等2020年1月4日6中断请求:TCON,SCON定时和外中断控制寄存器TCON串行控制寄存器SCON2020年1月4日7TF1TR1TF0TR0IE1IT1IE0IT0SM0SM1SM2RENTB8RB8TIRITCON寄存器地址为88H,位地址为8FH~88H。TF1:T1的溢出中断标志。由硬件置1/清0(也可软件清0)。TF0:T0的溢出中断标志。(同TF1,只是针对T0的)IE1:外部中断1(/INT1)请求标志。外部有中断请求时,硬件使IE1置1,硬件清0。IE0:外部中断0(/INT0)请求标志。IT1:外部中断1(/INT1)触发类型控制位。IT1=0,低电平触发。IT1=1,下降沿触发。IT0:外中断0(/INT0)触发类型控制位,用法同IT1。2020年1月4日8TF1TR1TF0TR0IE1IT1IE0IT0SCON寄存器地址为98H,位地址为9FH~98H。TI:串口发送中断标志位。发送完数据,硬件使TI置1,软件清0(CLRTI)RI:串行口接收中断标志位。硬件置1,软件清0。2020年1月4日9SM0SM1SM2RENTB8RB8TIRI中断控制:IE,IP中断允许寄存器IE—控制中断的开放或屏蔽中断优先级寄存器IP—决定中断优先级2020年1月4日10EA---ET2ESET1EX1ET0EX01:CPU开放中断T2SIOT1INT1T0INT00:屏蔽所有中断1:允许中断,0:禁止中断------PT2PSPT1PX1PT0PX0T2SIOT1INT1T0INT01:高优先级,0:低优先级IE寄存器地址为A8H,位地址为AFH—A8H。EA:中断允许总控制位,EA=1,CPU开放中断。EA=0,CPU禁止所有中断。ES:串行中断允许控制位,ES=1允许串行口中断,ES=0,屏蔽串行口中断。ET1:定时/计数器T1中断允许控制位。ET1=1,允许T1中断,ET1=0,禁止T1中断。EX1:外中断1允许控制位,EX1=1,允许外中断1中断,EX1=0,禁止外中断1中断。ET0:定时/计数器T0中断控制位。ET1=1,允许T0中断,ET1=0,禁止T0中断。EX0:外中断0允许控制位,EX1=1,允许外中断0中断,EX1=0,禁止外中断0中断。2020年1月4日11EA---ET2ESET1EX1ET0EX0IE控制字的理解IE=93H,IE=84H,IE=92H,IE=17H?初始化:允许/INT0和T1中断?例:设置相关控制的位操作INT0为边沿触发方式:SETBIT0INT1为电平触发方式:CLRIT1INT1为高优先级:SETBPX1允许INT1中断:SETBEX1SETBEA2020年1月4日13例:一条指令实现控制字设置INT1、T0开中断,其余禁中断:MOVIE,#86HT1、串口开中断,其余禁中断:MOVIE,#98H全部开中断:MOVIE,#0FFH全部禁中断:MOVIE,#00H或CLREAINT0、T0开中断,其余保持不变:ORLIE,#83HINT1、T1开中断,其余禁中断:ANLIE,#8CH2020年1月4日14IP寄存器地址为B8H,位地址为BFH~B8H。PS:串行口中断口优先级控制位,PS=1,串口定义为高优先级中断,PS=0,串口定义为低优先级中断。PT1:定时器1优先级控制位。PT1=1,声明定时器1为高优先级中断,PT1=0定义定时器1为低优先级中断。PX1:外中断1优先级控制位。PT1=1,声明外中断1为高优先级中断,PX1=0定义外中断1为低优先级中断。PT0:定时器0优先级控制位。PT1=1,声明定时器0为高优先级中断,PT1=0定义定时器0为低优先级中断。PX0:外中断0优先级控制位。PT1=1,声明外中断0为高优先级中断,PX1=0定义外中断0为低优先级中断。2020年1月4日15------PT2PSPT1PX1PT0PX0中断优先级控制原则高优先级可以中断低优先级。同优先级中断不能互相中断。同级的多个中断请求出现,按CPU查询次序确定哪个请求被响应。查询次序由高到低依次为:/INT0中断T0中断/INT1中断T1中断串口中断例:IP=06H,如果5个中断请求同时发生,求中断响应的次序。2020年1月4日16SFR的控制位和标志位控制位是用来设置各种工作方式的,通过编程写入(如IT1,IT0,EX0等)。标志位是系统运行时自动形成的标志,可供程序运行时查询(如IE1,IE0,TF1,TF0等)。3个阶段:中断响应、中断处理和中断返回。一、中断响应1.中断响应条件1)有中断源发出中断请求;2)中断总允许位EA=1,即CPU开中断;3)相应的中断允许位为1,即没有屏蔽。4)不存在中断响应阻断,包括:CPU未执行完一条指令,有同级或高级中断服务,正在执行RETI或是对IE、IP的写操作指令。7.3中断处理过程一、中断响应2.中断响应过程1)置优先级状态触发器。2)清0中断请求源申请标志。3)将程序计数器的内容(断点地址)压入堆栈。4)将被响应的中断服务程序的入口地址送程序计数器PC。一、中断响应MCS-51机中,各中断源及与之对应的入口地址分配如下:各入口地址之间只相隔8个字节,一般的中断服务程序容纳不下。实际使用时,通常在这些入口地址处存放一条绝对跳转指令,使程序跳转到用户安排的中断服务程序起始地址上去。2020年1月4日20中断源入口地址外部中断00003H定时器T0中断000BH外部中断10013H定时器T1中断001BH串行口中断0023H主程序如何避开中断入口地址主程序需要让出中断源所占用的向量地址。ORG0000HLJMPSTARTORG0030HSTART:XXXXXX;主程序开始程序中没用中断时,直接从0000H开始写程序,在原理上并没有错,但在实际工作中最好不这样做。2020年1月4日21包含中断功能的程序结构ORG0000HLJMPSTARTORG0003HLJMPINT0;转外中断0ORG000BHRETI;没有用定时器0中断,也可在此放一条RETIORG0030HSTART:XXXXXXX;主程序从这里开始了,包括………………;功能模块及中断的初始化等SJMP$INT0:XXXXXXX;中断服务程序从这里开始………………END;源程序结束2020年1月4日22二、中断处理和返回如果中断响应条件满足,CPU自动把断点地址压入堆栈,给出中断入口地址,程序计数器PC自动装入中断入口地址,执行相应的中断服务程序。保护现场,为了使中断处理不影响主程序的运行,需要把断点处有关寄存器的内容和标志位的状态压入堆栈区进行保护。现场保护要在中断服务程序开始处通过编程实现。处理中断源的请求,执行相应的中断服务。二、中断处理和返回恢复现场。在中断服务结束之后、返回主程序之前,把保存在堆栈区的现场数据从堆栈区弹出,送回原来的位置。恢复现场也需要通过编程实现。中断返回。执行中断返回指令RETI,清除优先级状态触发器将堆栈内保存的断点地址弹给PC,程序则恢复到中断前的位置三、中断请求的撤除CPU响应某中断请求后,TCON或SCON中的中断请求标志应及时清除,否则会引起另一次中断:定时器/计数器的中断和边沿触发的外部中断:CPU在响应器中断后,硬件会自动清除有关的中断请求。串行口中断:必须在中断服务程序中用软件的方法清除(即写一条清除的指令)。电平触发的外部中断:由于引起中断的低电平信号在外部引脚上,需要做特殊处理2020年1月4日25电平触发的外部中断的清除对于电平触发的外部中断,CPU响应中断后,虽然由硬件清除了相应的标志位,但不能对外部引脚上的电平进行处理。外部引脚上低电平的存在,会造成重复中断。可以在电路上增加对外部引起中断的信号进行处理。P148图7-5。通过I/O口输出一个信号,使得外部引脚上的中断请求信号变为高电平。7.4中断系统的应用中断程序一般包含有两个部分:主程序中的中断初始化。实现中断操作任务的中断服务程序。2020年1月4日27中断入口地址转跳开中断中断初始化中断转向ORGxxxxH;中断入口地址LJMPINTSEV;中断入口转跳IE、IP、TCON、SCON、TMOD等特殊功能寄存器的设置,及其它必要的设置。INTSEV:……;中断服务程序……RETI;中断返回主程序中断初始化:用户对中断控制的相关特殊功能寄存器中的各有关控制位进行赋值。基本步骤:开中断:置位相应中断源的中断允许标志及EA。设定所用中断源的中断优先级。对外部中断应设定中断请求信号形式(电平触发/脉冲下降沿触发)。对于定时/计数中断应设置工作方式(定时/计数)。初始化相应中断源所对应的功能模块定时器/串行口的设置注:在主程序中任何地点都可设置中断初始化。只有在中断初始化开中断后,有中断源请求中断时才响应中断,将程序转移到该中断源的入口地址处,进入中断服务操作。2020年1月4日28中断服务程序主要任务:保护现场,处理中断请求,恢复现场,中断返回将ACC、PSW及与主程序有关的寄存器入栈处理相关事件,中断要实现的主要功能出栈RETI中断服务程序的一般格式CLREA;关中断PUSHPSW;保护现场PUSHA…SETBEA;开中断,允许CPU响应高级中断…;服务程序CLREA;关中断,如果没有高级中断斜体部分不要。POPA;恢复现场POPPSW…SETBEA;开中断RETI;中断返回2020年1月4日30中断服务程序的注意事项各中断源的入口矢量地址之间,相隔8个单元,通常是在中断入口矢量地址单元处存放一条无条件转移指令,转至存储器其他的任何空间去执行中断服务程序。若要在执行当前中断程序时禁止更高优先级中断,应用软件关闭CPU中断,或屏蔽更高级中断源的中断,在中断返回前再开放中断。在保护现场和恢复现场时,为了不使现场信息受到破坏或造成混乱,一般应关CPU中断,使CPU暂不响应新的中断请求。2020年1月4日31关于现场保护原因中断响应是对主程序的随机插入型操作,在主程序断点前后资源必须连续使用。若该资源会被中断服务程序占用时,必须将主程序中的该资源压入堆栈保护,待中断返回前恢复该资源。做法在中断服务程序开始之处,用push指令将数据压入堆栈,在中断返回之前用pop指令将数据从堆栈中弹出。注意正常情况下,中断服务程序中压入堆栈的数据在返回中断返回前必须如数退出,保证断点地址在堆栈顶部以实现正确的中断返回。2020年1月4日32TheEnd