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還短的時間完成中斷服務的工作。