8051单片机原理
8031、8751AH和89C51,提供了5个中断源:即2个外部中断、两个计时器中断和串列口中断。 8052AH则除了以上5个中断外另增加了第六个中断:那就是第三个计时器/计数器。底下仅将中断结构作一概略性的介绍。
中断允许暂存器(INTERRUPT ENABLES)
EA | - | ET2 | ES | ET1 | EX1 | ET0 | EX0 |
EA | IE.7 | 如果EA=0,禁止所有的中断,EA=1时,各中断是否作用,由各允许位决定 |
- | IE.6 | 不能使用 |
ET2 | IE.5 | 允许Timer2溢位或补入中断(8052) |
ES | IE.4 | 允许串行I/O |
ET1 | IE.3 | 允许Timer1 |
EX1 | IE.2 | 允许INT1 |
ET0 | IE.1 | 允许Timer0 |
EX0 | IE.0 | 允许INT0 |
透过设定或清除在SFR里名为IE(Interrupt Enable)暂存器里的位元,每个中断源都可以被各别的(Enable)或禁止(DISABLE)。这个暂存器(IE)也包含有一个整体禁止位元,它可以被清除,以禁止所有的中断。
中断优先权(Interrupt Priority)
- | PT2 | PS | PT1 | PX1 | PT0 | PX0 |
IE.7 | 不能使用 | |
- | IE.6 | 不能使用 |
PT2 | IE.5 | 定义Timer2优先权(8052) |
PS | IE.4 | 定义串行I/O优先权 |
PT1 | IE.3 | 定义Timer1优先权 |
PX1 | IE.2 | 定义INT1优先权 |
PT0 | IE.1 | 定义Timer0优先权 |
PX0 | IE.0 | 定义INT0优先权 |
每个中断源可透过设定或清除SFR内名为IP(Interrupt Priority)的暂存器内的某些位元,可个别的将它面划到两层优先权的一层里,较低优先权的中断可以被较高优先权的中断所中断,但并不能被另一个低优先权中断。而高优先权中断就不能被其它中断源中断。如果有两个不同优先权层次的中断同时到达时,则较高优先权的中断要求先被服务。如果相同优先层次的中断同时到达时,则可以用内部的轮询(polling)顺序决定那一个要求先被服务,因此在每个优先层次里有一个次优先权结构由轮询顺序来决定。
IE和IP暂存器及轮询顺序如何动作?
以决定任何中断发生时那一个会被优先服务。中断工作会在每个机械周期的状态5(S5)时,所有的中断旗号都被锁入中断控制系统中,这个取样信号会在下一个机械周期时被加以检查,如果有允许的中断,它的旗号被发现设定"1",此时中断系统就产生一个LCALL至程序记忆体的对应位址。但有某些情况会禁止中断的产生,即相同或较高优先权的中断正在执行时。
硬体所产生的LCALL动作会使得目前的程序计数器值被推入(push)堆叠区,然后将服务程序的起始位址载入PC。如前面所述每个中断服务程序都有一固定的起始位址。中断发生时仅有程序计数器(PC)被推入堆叠区,而PSW或任何一个暂存器都没有放入堆叠区。仅PC被推入堆叠区保存起来,这使得写程序的人可以自己决定要花多少时间去保存其它的暂存器,虽然这会增加程序的负担,但这样,可增快中断响应时间。在许多的中断功能里,例如控制应用时,只要将口里的接脚反相、或重新载入计时器、或读入或写资料至列口缓冲区时,这种作法通常可以比其它的CPU还短的时间完成中断服务的工作。