(本例以 AT89S51 的 INT0 示範如何實作外部中斷)

 

中斷源

中斷的目的在特定事件的處理,事件可以由以下 5 個單元(中斷源)產生:

INT0, INT1, TIMER0, TIMER1, UART

(外部中斷0/1, 計時器中斷0/1, 序列埠中斷)

 

中斷向量

中斷發生後,程式會由原本的執行位址指向對應事件的中斷向量,中斷副程式執行完畢後才跳回原本的位址繼續執行;

各中斷源所對應的向量位址如下:

INT_VECTOR.jpg  

SFR

與 INT0 關聯的 SFR 有:

IE(0A8H): 用來致能中斷源

IP(0B8H): 設定各中斷源的處理優先權

TCON(088H): 設定負緣觸發或低準位觸發

 

(以下僅列出 INT0 使用的)

IE(Interrupt Enable (IE) Register)

ie.jpg  

EA(IE.7)

0(預設): 關閉所有中斷源

1: 使個別中斷源可以被致能

EX0(IE.0)

0(預設): 關閉外部中斷源 INT0

1: 致能外部中斷源 INT0

IP(Interrupt Priority Register)

IP.jpg 

PX0(IP.0)

0(預設): 在同一層級的優先權 INT0 > TIMER0 > INT1 > TIMER1 > UART

1: 提高 INT0 優先權

TCON(Timer/Counter Control Register)

TCON.jpg  

IE0(TCON.1)

0(預設): 當中斷請求被執行後,會自動被 MCU 清除

1: 每個機械週期都會檢查中斷有無發生,若有,則 MCU 會自動設定為 1

IT0(TCON.0)

0(預設): 設定 INT0 為低準位觸發

1: 設定 INT0 為負緣觸發

 

INT0 最小化實作

(注意:這個最小化模型有開關彈跳 ISSUE)

接線方式:

SCH.jpg  

 

程式範例:

ORG00H

JMPMAIN_ROUTING

ORG03H

JMPINT0_HANDLING

 

MAIN_ROUTING:

SETBEA;打開中斷總開關

SETBEX0;致能 INT0

...

...

...

LOOP:

...

...

JMPLOOP

 

;SW 按下後會執行 INT0_HANDLING 標籤內的程式

INT0_HANDLING:

...

...

...

RETI;折返回呼叫中斷副程式的地方



arrow
arrow
    文章標籤
    8051 外部中斷 8051 INT0
    全站熱搜

    eeStuff 發表在 痞客邦 留言(0) 人氣()