8051 中断处理
正如我们所见,8051 中有五种不同的中断。这些中断是 INT0、INT1、TO、T1、TI/RI。
每个机器周期有六个状态。这些状态是 S1 到 S6。所有中断都在每个机器周期的 S5 状态结束时进行采样。当指令占用多个机器周期时,则在下一个机器周期中轮询采样。当在第一个机器周期的 S5 状态设置中断标志时,轮询周期将找到它。中断系统生成 LCALL 指令以调用相应的 ISS。
有一些条件。只有在不满足这些条件中的任何一个时,才能执行该操作。这些条件如下:
当优先级相同或更高的中断已经在进行时。
当轮询周期不是当前指令执行的最后一个机器周期时。
当当前指令不是
RETI
写入 IP 寄存器
写入 IE 寄存器
当这些条件中的任何一个为真时,将不会生成到中断服务子程序 (ISS) 的 LCALL。第二个条件表明在分支到 ISS 之前已完成当前执行。最后一个条件表明,在执行 ISS 之前,至少执行了 RETI 指令或对 IE 或 IP 寄存器的任何写入指令之后的一条或多条指令。
当一个 ISS 正在执行时,微控制器可以被更高优先级的中断打断。如果优先级已经为 1,则微控制器无法被打断。当它完成 ISS 执行后,才能发生新的中断。
当调用一个 ISS 时,程序计数器 (PC) 值将被压入堆栈。在执行 ISS 之后,执行 RETI 指令。因此,在执行 RETI 后,PC 值从堆栈中弹出以返回到切换控制的下一条指令。如果 ISS 以 RET 而不是 RETI 结束,则微控制器认为中断仍在进行中。
8051 微控制器的单步操作
此 8051 支持程序的单步执行。我们可以使用外部中断引脚作为按键输入。让我们考虑引脚 INT0 连接到一个按键。首先,当按键未按下时,中断引脚值为 0,当按下按键时,值为 1,释放按键后,它将再次变为 0。
此按键可以是单步按键。INT0 被编程为电平触发中断。中断服务子程序 (ISS) 使用以下代码终止以进行单步操作。
P3.2 位用作 INT0 引脚。
L1:JNBP3.2, L1 L2:JBP3.2, L2 RETI
第一行表示它将处于 L1 状态,直到 INT0 变为 1,第二行表示它将处于 L2 状态,直到 INT0 变为 0。RETI 表示从 ISS 返回到主程序。