260 likes | 508 Views
第 5 章 MCS-51 中断系统. 第 5 章 MCS-51 中断系统:. 5.1 中断 的概念 5.2 MCS-51 单片机的 中断源 5.3 ~~~ 中断控制 5.4 ~~~ 中断处理过程 5.5 ~~~ 中断请求的撤销 5.6 ~~~ 外部中断的应用. 5.1 中断 的概念. 引起 CPU 中断的根源,称为 中断源 。 中断源向 CPU 提出的中断申请,称为 中断请求 。 CPU 暂时中断原来的事务 A ,转去处理事件 B 的过程称为 中断响应 。 CPU 处理事件 B 的过程称为 中断服务 或 中断处理 。
E N D
第5章 MCS-51 中断系统: 5.1 中断的概念 5.2 MCS-51 单片机的中断源 5.3 ~~~中断控制 5.4 ~~~中断处理过程 5.5 ~~~中断请求的撤销 5.6 ~~~外部中断的应用
5.1中断的概念 • 引起CPU中断的根源,称为中断源。 • 中断源向CPU提出的中断申请,称为中断请求。 • CPU暂时中断原来的事务A,转去处理事件B的过程称为中断响应。 • CPU处理事件B的过程称为中断服务或中断处理。 • 对事件B处理完毕后,再回到原来被中断的地方(断点), 称为中断返回。 • 整个过程称为中断 。 • 实现中断功能而配置的软件与硬件称统为中断系统。
5.2 MCS-51 单 片机 的中断源5.3 ~~~中断控制 • 80C51的中断系统有5个中断源,2个优先级,可实现二级中断嵌套。
CPU同时接收到几个不同优先级的中断时, CPU首先响应优先级别最高的中断请求。 CPU同时接收到几个同一优先级的中断申请时,则CPU通过内部硬件查询逻辑按自然优先级顺序决定响应哪个中断请求。自然优先级顺序排列如下所示:
CPU先后接收到几个不同优先级的中断时 • 正在进行的中断过程不能被新的同级或低优先级的中断请求所中断,但能被更高优先级中断请求所中断--嵌套。
5.4 ~~~中断处理过程 5.4.1 中断采样-----对外部中断源信号 5.4.2 中断查询-----对中断源标志位 5.4.3 中断响应、处理 5.4.4 中断返回
5.4.1 中断采样 在每个机器周期的S5P2期间,中断系统对各个外部中断源信号进行检测,根据检测结果,设置相应中断标志位IE0IE1的状态。 • 电平触发方式的外部中断请求:由一次检测结果来决定 • 若为高电平,表明没有中断请求,将对应的标志位IE0IE1清零。 • 若为低电平,表明有中断请求,将对应的标志位IE0IE1置1。 • 边沿触发方式的外部中断请求:由相邻两次检测结果来决定 • 若为先高后低电平,表明有中断请求,将对应的标志位IE0、IE1置1。 • 否则,表明没有中断请求,不改变IE0、IE1的状态
5.4.2 中断查询 CPU执行程序过程中,在每个机器周期的最后一个状态S6期间,按先后顺序对上一机器周期各个中断标志位的状态进行查询。 中断查询由硬件自动完成,先后顺序为: IE0→TF0 →IE1 → TF1→RI和TI • 中断标志位为1:表明有中断请求 • 在接下来的机器周期S1期间按优先级进行中断处理。 • 中断标志位为0:表明没有中断请求
5.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,到进入相应的中断服务程序开始执行第一条指令所持续的时间。 • 若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,即这些中断标志不会自动清除,必须用软件清除 CLR RI;CLR TI,这是在编串行通信中断服务中应该注意的。
5.5 中断请求的撤销 • 对边沿触发的外部中断INT1和INT0,CPU响应中断后硬件自动清除中断请求标志IE0和IE1。用户对此不必考虑。 • 对电平触发的外部中断,CPU在响应中断时硬件不会自动清除中断标志,也不能用软件清除中断标志,因此,在CPU响应中断后应立即撤除INT1或INT0的低电平信号, • 需要外加硬件电路和软件配合才能实现。P95
5.6 外部中断的应用 5.6.1 中断程序设计 5.6.2 单外部中断源举例 5.6.3 多外部中断源举例
5.6.1 中断程序设计 • 主、子程序结构 • 中断服务子程序的主程序设计 • 中断初始化 • 用户对中断的控制和管理,实际是对4个与中断有关的寄存器TCON、SCON 、 IE、 IP进行控制或管理。 • 在中断初始化编制中应注意: • 开中断总控开关EA,置位中断源的中断允许位。 • 对外部中断INT0、INT1应选择中断触发方式。 • 多个中断源中断,应设定中断优先级,预置IP。 • 中断服务子程序设计 • 入口地址固定
中断服务程序的主程序设计框架 • ORG 0000H ; 0000H为PC复位地址 • LJMP MAIN ;MAIN为主程序入口地址 • ORG 0003H; 为外部中断0服务子程序硬件入口地址 • LJMP INT_0 ;INT_0为外部中断0服务程序真正入口地址 • ORG 000BH; 为定时器0中断服务子程序硬件入口地址 • LJMP T_0 ;T_0为定时器0服务程序真正入口地址 • ORG 0013H;为外部中断1服务子程序硬件入口地址 • LJMP INT_1 ;INT_1为外部中断1服务程序真正入口地址 ….. • ORG 0100H ;真正的主程序开始 • MAIN:MOV SP, #60H ;堆栈初始化 • ;中断初始化:对TCON、SCON 、 IE、IP的初始化 • SETB IT0 ;将外部中断0设置为下降沿触发方式 • SETB EA ;CPU开中断 • SETB EX0 ;外部中断0开中断 • SJMP $ ;等待中断,此处也可以放置其他处理程序。
中断服务子程序设计框架 INT_0: ; INT_0为外部中断0服务程序真正入口地址 CLR EA ;关中断 PUSH PSW ;保护现场 PUSH A … SETB EA ;开中断,允许CPU响应高级中断 … ;中断服务子程序 … ; CLR EA ;关中断 POP A ;恢复现场 POP PSW … SETB EA ;开中断 RETI ;中断返回
5.6.2 单外部中断源举例 MCS-51 P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0 INT1 +5V K 【例5-1】用一个按钮控制8个发光二极管,每按动一次按钮,使发光二级管按L1→L2 →….→L8 →L1 的顺序循环移动点亮一位。 1、采用查询方式实现 ORG 0000H SETB P3.3 ;将P3.3口设置为输入状态 MOV A, #0FEH;设置L1~L8的初始状态 LOOP:MOV P1, A JB P3.3, $;若按钮未动作,则原地等待 JNB P3.3, $;等待按钮释放,保证按动一次 ;发光二极管只移动一位 RL A SJMP LOOP END
5.6.2 单外部中断源举例 MCS-51 P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0 INT1 +5V K 【例5-1】用一个按钮控制8个发光二极管,每按动一次按钮,使发光二级管按L1→L2 →….→L8 →L1 的顺序循环移动点亮一位。 2、采用中断方式实现 ORG 0000H ;PC复位地址 AJMP MAIN ;MAIN为主程序入口地址 ORG 0013H AJMP INT_1 ;INT_1为外部中断1服务程序入口地址 ORG 0100H ;真正的主程序开始 MAIN: MOV SP, #60H;堆栈初始化 MOV A, #0FEH;设置L1~L8的初始状态 MOV P1, A ;点亮二极管L1 SETB IT1 ;将外部中断1设置为下降沿触发方式 SETB EA ;CPU开中断 SETB EX1 ;外部中断1开中断 SJMP $ ;等待中断,此处也可以放置其他处理程序。 ORG 0200H ;真正的外部中断1服务程序 INT_1: RL A ;修改灯的状态 MOV P1, A RETI ;中断返回 END
5.6.2 单外部中断源举例 例 程序单步执行方式的外部中断实现,每按一次按钮产生一个正脉冲,只执行一条指令。 P34 把一个外部中断(设为INT0)设置为高优先级和低电平触发方式。 ORG 0000H ; 0000H为PC复位地址 LJMP MAIN ;MAIN为主程序入口地址 ORG 0003H ;外部中断0入口地址 INT_0: JNB P3.2, $ ;在INT0变高前=0原地等待(死循环),不往下执行 JB P3.2, $ ; 在 INT0变低前=1原地等待(死循环) RETI ; INT0 =0返回主程序,并执行下一条指令 ORG 0100H ;真正的主程序开始 MAIN: MOV SP, #60H ;堆栈初始化 SETB PX0 ;设置外部中断0为高优先级 CLR IT0 ;将外部中断0设置为低电平触发方式 SETB EA ;CPU开中断 SETB EX0 ;外部中断0开中断 INC A INC A ;需要单步执行的程序 。。。 SJMP $ ;等待中断,此处也可以放置其他处理程序。
5.6.3 多外部中断源举例 利用外中断0实时显示多个外部系统故障状态。 要求:a、当系统工作正常时,四个故障源输入全为低电平,显示灯全熄灭; b、当某部分出现故障时,对应的输入线由低电平变为高电平,从而引起8031中断; c、在中断服务程序中查询故障源,并对相应的发光二极管LED输出低电平,进行相应的故障显示。
ORG 0000H • AJMP MAIN ;跳转主程序 • ORG 0003H • AJMP PITO ;跳转外部中断0服务程序 • ORG 0030H MAIN: ORL P1, #0FFH ;(主程序开始)灯全灭,准备好输入 • SETB EA ;开放总中断 • SETB EX0 ;开放外部中断0 • SETB IT0 ;设外部中断0为边沿触发方式 WAIT: SJMP WAIT ;等待中断或其他程序 PITO: ORL P1,#0F0H ; 关闭所有的灯 • JNB P1.0,L1 ;(中断服务程序开始) • CLR P1.4 ;若X1有故障LED1亮 • RETI ;中断返回 • L1: JNB P1.1, L2 ; • CLR P1.5 ;若X2有故障LED2亮 • RETI ;中断返回 • L2: JNB P1.2, L3 ; • CLR P1.6 ;若X3有故障LED3亮 • RETI ;中断返回 • L3: CLR P1.7 ;若X4有故障LED4亮 • RETI ;中断返回
ORG 0000H • AJMP MAIN ;跳转主程序 • ORG 0003H • AJMP PITO ;跳转外部中断0服务程序 • ORG 0030H MAIN: ORL P1, #0FFH ;(主程序开始)灯全灭,准备好输入 • SETB EA ;开放总中断 • SETB EX0 ;开放外部中断0 • SETB IT0 ;设外部中断0为边沿触发方式 WAIT: SJMP WAIT ;等待中断或其他程序 PITO: ORL P1,#0F0H ; 关闭所有的灯 JNB P1.0,L1 ;(中断服务程序开始) • CLR P1.4 ;若X1有故障LED1亮 • L1: JNB P1.1, L2 ; • CLR P1.5 ;若X2有故障LED2亮 • L2: JNB P1.2, L3 ; • CLR P1.6 ;若X3有故障LED3亮 • L3: JNB P1.3, L4 ; • CLR P1.7 ;若X4有故障LED4亮 • L4: RETI ;中断返回