第5章MCS-51中断系统第5章MCS-51中断系统:5.1中断的概念5.2MCS-51单片机的中断源5.3~~~中断控制5.4~~~中断处理过程5.5~~~中断请求的撤销5.6~~~外部中断的应用引起CPU中断的根源,称为中断源。中断源向CPU提出的中断申请,称为中断请求。CPU暂时中断原来的事务A,转去处理事件B的过程称为中断响应。CPU处理事件B的过程称为中断服务或中断处理。对事件B处理完毕后,再回到原来被中断的地方(断点),称为中断返回。整个过程称为中断。主程序A响应返回断点RETI……中断服务程序B5.1中断的概念实现中断功能而配置的软件与硬件称统为中断系统。5.2MCS-51单片机的中断源5.3~~~中断控制•80C51的中断系统有5个中断源,2个优先级,可实现二级中断嵌套。中断系统PX0IE0PT0TF0PX1IE1PT1TF1PS1010101010TIRITCONIEIPEX0ET0EX1ET1ESEAIT0=0IT0=1INT0INT1IT1=0IT1=1T0T1TXRX自然优先级矢量地址自然优先级矢量地址高级中断请求PC低级中断请求PC源允许总允许优先级SCON中断标志硬件查询•正在进行的中断过程不能被新的同级或低优先级的中断请求所中断,但能被更高优先级中断请求所中断----嵌套。CPU同时接收到几个不同优先级的中断时,CPU首先响应优先级别最高的中断请求。CPU同时接收到几个同一优先级的中断申请时,则CPU通过内部硬件查询逻辑按自然优先级顺序决定响应哪个中断请求。自然优先级顺序排列如下所示:•正在进行的中断过程不能被新的同级或低优先级的中断请求所中断,但能被更高优先级中断请求所中断----嵌套。5.4~~~中断处理过程5.4.1中断采样-----对外部中断源信号5.4.2中断查询-----对中断源标志位5.4.3中断响应、处理5.4.4中断返回S1保护断点,长调用至入口中断服务S2S3S4S5S6S1S2S3S4S5S6S1S2S3S4S5S6S1S2S3S4S5S6S1S2S3S4S5S6标志查询标志锁存ε中断有效M1M2M3M4M55.4.1中断采样在每个机器周期的S5P2期间,中断系统对各个外部中断源信号进行检测,根据检测结果,设置相应中断标志位IE0IE1的状态。电平触发方式的外部中断请求:由一次检测结果来决定若为高电平,表明没有中断请求,将对应的标志位IE0IE1清零。若为低电平,表明有中断请求,将对应的标志位IE0IE1置1。边沿触发方式的外部中断请求:由相邻两次检测结果来决定若为先高后低电平,表明有中断请求,将对应的标志位IE0、IE1置1。否则,表明没有中断请求,不改变IE0、IE1的状态5.4.2中断查询CPU执行程序过程中,在每个机器周期的最后一个状态S6期间,按先后顺序对上一机器周期各个中断标志位的状态进行查询。中断标志位为1:表明有中断请求在接下来的机器周期S1期间按优先级进行中断处理。中断标志位为0:表明没有中断请求中断查询由硬件自动完成,先后顺序为:IE0→TF0→IE1→TF1→RI和TIS1保护断点,长调用至入口中断服务S2S3S4S5S6S1S2S3S4S5S6S1S2S3S4S5S6S1S2S3S4S5S6S1S2S3S4S5S6标志查询标志锁存ε中断有效M1M2M3M4M55.4.3中断响应CPU执行程序过程中,对中断源提出的中断请求进行的接受响应处理1、中断响应的条件(1)有中断源请求信号,中断源标志位为1。(2)中断允许开放即EA=1,且中断源对应的中断允许位置位1。(3)无同级或更高级中断正在服务。(4)当前的指令周期已经结束。(5)如果当前指令为RETI、RET或访问IE和IP的指令,至少需要再执行完一条指令。当同时满足以上5个条件时CPU将对中断请求进行响应。5.4.3中断响应2、中断响应将相应的优先级状态触发器置1(以阻断后来的同级或低级的中断请求)。执行一条硬件LCALL指令:硬件清零相应中断请求标志(TI、RI除外)将当前PC内容压入堆栈——保护断点将中断服务子程序入口地址送PC——转移中断响应是由中断系统内部自动完成的。5.4.3中断响应3、中断的响应时间是指从中断请求标志位置1,到进入相应的中断服务程序开始执行第一条指令所持续的时间。S1保护断点,长调用至入口中断服务S2S3S4S5S6S1S2S3S4S5S6S1S2S3S4S5S6S1S2S3S4S5S6S1S2S3S4S5S6标志查询标志锁存ε中断有效M1M2M3M4M5•若M1周期的S5P2前某中断生效,在S5P2期间其中断请求被锁存到相应的标志位中去;•M2恰逢指令的最后一个机器周期,且该指令不是RETI或访问IE、IP的指令。于是,M3和M4便可以执行硬件LCALL指令,M5周期将进入了中断服务程序。•80C51的中断响应时间,至少要3个完整的机器周期。5.4.3中断响应4、中断处理中断处理就是执行中断服务子程序。从中断入口地址开始执行程序,直到返回指令RETI为止。5.4.4中断返回中断返回是指中断服务程子序执行完后,CPU返回原来断开的位置(断点),继续执行原来的程序的过程;由RETI指令来完成,具体过程为:将相应中断优先级状态触发器清0,通知中断系统,中断服务程序已执行完毕,可以响应其他同级或更低级的中断。将断点地址从栈顶弹出送回PC——恢复断点,CPU从原来中断的地方继续执行程序;注意,不能用RET指令代替RETI指令。在中断服务程序中PUSH指令与POP指令必须成对使用,否则不能正确返回断点。5.5中断请求的撤销CPU响应某中断请求后,在中断返回之前,应撤除该中断请求标志,否则会再次中断。对定时计数器T0、T1的溢出中断,CPU响应中断后,硬件自动清除中断请求标志TF0和TF1。用户对此不必考虑。对于串行口中断,CPU响应中断后,没有用硬件清除中断请求标志TI、RI,即这些中断标志不会自动清除,必须用软件清除CLRRI;CLRTI,这是在编串行通信中断服务中应该注意的。5.5中断请求的撤销对电平触发的外部中断,CPU在响应中断时硬件不会自动清除中断标志,也不能用软件清除中断标志,因此,在CPU响应中断后应立即撤除INT1或INT0的低电平信号,需要外加硬件电路和软件配合才能实现。P95对边沿触发的外部中断INT1和INT0,CPU响应中断后硬件自动清除中断请求标志IE0和IE1。用户对此不必考虑。5.6外部中断的应用5.6.1中断程序设计5.6.2单外部中断源举例5.6.3多外部中断源举例5.6.1中断程序设计主、子程序结构中断服务子程序的主程序设计中断初始化用户对中断的控制和管理,实际是对4个与中断有关的寄存器TCON、SCON、IE、IP进行控制或管理。在中断初始化编制中应注意:开中断总控开关EA,置位中断源的中断允许位。对外部中断INT0、INT1应选择中断触发方式。多个中断源中断,应设定中断优先级,预置IP。中断服务子程序设计入口地址固定中断服务程序的主程序设计框架ORG0000H;0000H为PC复位地址LJMPMAIN;MAIN为主程序入口地址ORG0003H;为外部中断0服务子程序硬件入口地址LJMPINT_0;INT_0为外部中断0服务程序真正入口地址ORG000BH;为定时器0中断服务子程序硬件入口地址LJMPT_0;T_0为定时器0服务程序真正入口地址ORG0013H;为外部中断1服务子程序硬件入口地址LJMPINT_1;INT_1为外部中断1服务程序真正入口地址…..ORG0100H;真正的主程序开始MAIN:MOVSP,#60H;堆栈初始化;中断初始化:对TCON、SCON、IE、IP的初始化SETBIT0;将外部中断0设置为下降沿触发方式SETBEA;CPU开中断SETBEX0;外部中断0开中断SJMP$;等待中断,此处也可以放置其他处理程序。中断服务子程序设计框架INT_0:;INT_0为外部中断0服务程序真正入口地址CLREA;关中断PUSHPSW;保护现场PUSHA…SETBEA;开中断,允许CPU响应高级中断…;中断服务子程序…;中断服务子程序CLREA;关中断POPA;恢复现场POPPSW…SETBEA;开中断RETI;中断返回5.6.2单外部中断源举例例程序单步执行方式的外部中断实现,每按一次按钮产生一个正脉冲,只执行一条指令。P34把一个外部中断(设为INT0)设置为高优先级和低电平触发方式。ORG0000H;0000H为PC复位地址LJMPMAIN;MAIN为主程序入口地址ORG0003H;外部中断0入口地址INT_0:JNBP3.2,$;在INT0变高前=0原地等待(死循环),不往下执行JBP3.2,$;在INT0变低前=1原地等待(死循环)RETI;INT0=0返回主程序,并执行下一条指令ORG0100H;真正的主程序开始MAIN:MOVSP,#60H;堆栈初始化SETBPX0;设置外部中断0为高优先级CLRIT0;将外部中断0设置为低电平触发方式SETBEA;CPU开中断SETBEX0;外部中断0开中断INCAINCA;需要单步执行的程序。。。SJMP$;等待中断,此处也可以放置其他处理程序。5.6.2单外部中断源举例【例5-1】用一个按钮控制8个发光二极管,每按动一次按钮,使发光二级管按L1→L2→….→L8→L1的顺序循环移动点亮一位。ORG0000HSETBP3.3;将P3.3口设置为输入状态MOVA,#0FEH;设置L1~L8的初始状态LOOP:MOVP1,AJBP3.3,$;若按钮未动作,则原地等待JNBP3.3,$;等待按钮释放,保证按动一次;发光二极管只移动一位RLASJMPLOOPEND1、采用查询方式实现P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.0INT1MCS-51K+5V5.6.2单外部中断源举例【例5-1】用一个按钮控制8个发光二极管,每按动一次按钮,使发光二级管按L1→L2→….→L8→L1的顺序循环移动点亮一位。P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.0INT1MCS-51K+5VORG0000H;PC复位地址AJMPMAIN;MAIN为主程序入口地址ORG0013HAJMPINT_1;INT_1为外部中断1服务程序入口地址ORG0100H;真正的主程序开始MAIN:MOVSP,#60H;堆栈初始化MOVA,#0FEH;设置L1~L8的初始状态MOVP1,A;点亮二极管L1SETBIT1;将外部中断1设置为下降沿触发方式SETBEA;CPU开中断SETBEX1;外部中断1开中断SJMP$;等待中断,此处也可以放置其他处理程序。ORG0200H;真正的外部中断1服务程序INT_1:RLA;修改灯的状态MOVP1,ARETI;中断返回END2、采用中断方式实现利用外中断0实时显示多个外部系统故障状态。要求:a、当系统工作正常时,四个故障源输入全为低电平,显示灯全熄灭;b、当某部分出现故障时,对应的输入线由低电平变为高电平,从而引起8031中断;c、在中断服务程序中查询故障源,并对相应的发光二极管LED输出低电平,进行相应的故障显示。5.6.3多外部中断源举例INT0P1.0P1.4P1.1P1.5P1.2P1.6P1.3P1.78031LEDRLEDRLEDRLEDR故障信号输入端³1X4X3X2X1Vcc•ORG0000H•AJMPMAIN;跳转主程序•ORG0003H•AJMPPITO;跳转外部中断0服务程序•ORG0030HMAIN:ORLP1,#0FFH;(主程序开始)灯全灭,准备好•SETBEA;开放总中断•SETBEX0;开放外部中断0•SETBIT0;设外部中断0为边沿触发方式WAIT:SJMPWAIT;等待中断或其他程序PITO:ORLP1,#0F0H;关闭所有的灯•JNBP1.0,L1;(中断服务程序开始)•CLRP