(本例以 AT89S51 的 INT0 示範如何實作外部中斷)
中斷源
中斷的目的在特定事件的處理,事件可以由以下 5 個單元(中斷源)產生:
INT0, INT1, TIMER0, TIMER1, UART
(外部中斷0/1, 計時器中斷0/1, 序列埠中斷)
中斷向量
中斷發生後,程式會由原本的執行位址指向對應事件的中斷向量,中斷副程式執行完畢後才跳回原本的位址繼續執行;
各中斷源所對應的向量位址如下:
SFR
與 INT0 關聯的 SFR 有:
IE(0A8H): 用來致能中斷源
IP(0B8H): 設定各中斷源的處理優先權
TCON(088H): 設定負緣觸發或低準位觸發
(以下僅列出 INT0 使用的)
IE(Interrupt Enable (IE) Register)
EA(IE.7)
0(預設): 關閉所有中斷源
1: 使個別中斷源可以被致能
EX0(IE.0)
0(預設): 關閉外部中斷源 INT0
1: 致能外部中斷源 INT0
IP(Interrupt Priority Register)
PX0(IP.0)
0(預設): 在同一層級的優先權 INT0 > TIMER0 > INT1 > TIMER1 > UART
1: 提高 INT0 優先權
TCON(Timer/Counter Control Register)
IE0(TCON.1)
0(預設): 當中斷請求被執行後,會自動被 MCU 清除
1: 每個機械週期都會檢查中斷有無發生,若有,則 MCU 會自動設定為 1
IT0(TCON.0)
0(預設): 設定 INT0 為低準位觸發
1: 設定 INT0 為負緣觸發
INT0 最小化實作
(注意:這個最小化模型有開關彈跳 ISSUE)
接線方式:
程式範例:
ORG00H
JMPMAIN_ROUTING
ORG03H
JMPINT0_HANDLING
MAIN_ROUTING:
SETBEA;打開中斷總開關
SETBEX0;致能 INT0
...
...
...
LOOP:
...
...
JMPLOOP
;SW 按下後會執行 INT0_HANDLING 標籤內的程式
INT0_HANDLING:
...
...
...
RETI;折返回呼叫中斷副程式的地方
留言列表