51 單片機中斷處理機制詳解
單片機多用於物聯網、自動控制系統、智能家電等領域,要求單片機能夠實時響應外部觸發的事件,中斷機制是單片機響應外部事件的重要方法。
單片機多用於物聯網、自動控制系統、智能家電等領域,要求單片機能夠實時響應外部觸發的事件。例如在智能家電領域,人們可以用手機中的 APP 就可以遠程控制家電的開啓或關閉,智能家電的核心部分就是單片機,智能家電只要通電,單片機就進入工作狀態,等待外部事件的觸發,當人們通過手機 APP 發送控制信號後,智能家電的信號接收部分接收到控制信號,通過單片機的中斷機制通知單片機,對用戶發送的控制信號進行處理。
如上圖所示,智能家電通電後,執行單片機內的主程序,主程序主要用於實時響應外部事件的發生,並調用相應的事件處理程序。如用戶通過手機發送控制信號、用戶通過家電控制面板向家電發出控制指令等。
單片機如何實時響應外部事件呢?單片機通過中斷機制來實時響應外部事件,中斷是指單片機在執行主程序時,發生外部事件 A,請求單片機迅速處理(中斷請求),單片機暫停當前的主程序(中斷響應),保存當前斷點數據,然後調用事件 A 的處理程序進行事件響應,事件 A 處理完成後,主程序恢復斷點處的數據,並繼續執行主程序。
爲了更容易理解中斷的概念,我們舉一個生活中的中斷場景:你正在家中讀書或學習(主程序),快遞來電話讓你取快遞(中斷請求),於是你暫時停止讀書或學習(設置斷點,進入中斷),去取快遞(執行中斷),取完快遞後(中斷返回),你繼續讀書或學習(繼續執行主程序),在你讀書和學習過程中,就發生了一次取快遞的中斷。
引起單片機中斷的來源稱爲中斷源,中斷源向單片機發出中斷請求,單片機暫停主程序的執行,轉去處理中斷事件,對事件處理完畢,再回到原來被中斷的地方(斷點)繼續執行主程序。中斷源可以是傳感器、串口、鍵盤等外部設備,這些外部設備如何向 51 單片機發送中斷請求呢?51 單片機通過 P3.2 端口、P3.3 端口引入外部中斷,該端口爲低電平或下降沿時會引發中斷,P3.2 端口的中斷名稱爲 INT0,P3.3 端口的中斷名稱爲 INT1,外部設備可以連接這兩個端口向單片機發送中斷請求。
上圖給出了一個單片機中斷場景,按鈕接 P3.2 端口,即單片機外部中斷 INT0,按鈕的另一端接地,P3.2 端口與地接通,輸入低電平,觸發 INT0 中斷請求,單片機主程序調用 INT0 中斷函數,給 P1.0 端口送入低電平,發光二極管點亮,當按鈕再次被按下時,再次觸發 INT0 中斷請求,單片機主程序調用 INT0 中斷函數,給 P1.0 端口送入高電平,發光二極管熄滅,……,以此類推每次按下按鈕都會觸發 INT0 中斷請求,發光二極管狀態取反(點亮或熄滅)。
單片機內運行的完整 C 程序如下:
#include
sbit led0 = P1^0;
void main()
{
EA = 1;
EX0 = 1;
led0 = 1;
while(1);
}
void t1() interrupt 0
{
led0 = ~led0;
}
在上面的代碼中,函數 t1() 爲定義的外部 INT0 中斷處理函數,51 單片機中斷處理函數格式如下:
void 函數名() interrupt 中斷號using 工作組
{
中斷處理代碼
}
中斷處理函數不返回任何值,因此函數的返回類型爲 void,函數名命名規則和 C 函數相同,中斷函數不能帶任何參數,interrupt 是定義中斷處理函數關鍵字,中斷號是中斷源的序號,該序號是編譯器識別不同中斷的唯一符號,在寫中斷處理函數時必須要對應正確的中斷號,“using 工作組” 是設置該中斷處理函數使用單片機內存 4 組工作寄存器的那一組,編譯器在編譯時會自動分配寄存器工作組,因此該語句可以省略。
前面代碼的 t1() 就是中斷處理函數,中斷序號爲 0(INT0 中斷),該中斷處理函數只有一條語句,改變 P1.0 端口的電平狀態。
51 單片機一共有五個中斷源,分別對應五個中斷序號,中斷源說明如下:
INT0——外部中斷 0,中斷序號爲 0,由 P3.2 端口觸發該中斷,低電平或下降沿觸發。
T0——定時器 / 計數器 0 中斷,中斷序號爲 1,由 T0 計數器計滿回零觸發。
INT1——外部中斷 1,中斷序號爲 2,由 P3.3 端口觸發該中斷,低電平或下降沿觸發。
T1——定時器 / 計數器 1 中斷,中斷序號爲 3,由 T1 計數器計滿回零觸發。
T1/R1——串行口中斷,串行口端口完成一幀字符發送 / 接收後觸發。
根據中斷來源的類型,可將中斷劃分爲外部中斷和內部中斷,外部中斷爲 INT0、INT1、T1/R1,內部中斷爲 T0、T1。外部中斷是單片機實時地處理外部事件的一種中斷機制,當某種外部事件發生時,單片機的中斷系統將迫使 CPU 暫停正在執行的程序,轉而去進行中斷事件的處理;中斷處理完畢後.又返回被中斷的程序處,繼續執行下去。內部中斷是由單片機中斷指令引發的中斷,如 T0 和 T1 由內部中斷指令觸發。
單片機可以配置中斷功能的啓用和關閉,它通過中斷允許寄存器 IE 來設定各個中斷源的打開和關閉,IE 是特殊功能寄存器,寄存器地址是 A8H,該寄存器允許位操作,位地址由低位到高位分別是 A8H~AFH,單片機復位是 IE 寄存器的全部位都清零,即關閉所有中斷功能,若要開啓中斷功能,需要在程序中開啓。中斷允許寄存器 IE 位定義見下表。
EA 是全局中斷允許位,要開啓某個中斷源,先要設置 EA 爲 1,然後再設置該中斷源的中斷允許位。
在前面中斷場景的 main() 函數代碼中,EA = 1 語句打開全局中斷,EX0 = 1 語句開啓外部中斷 0,led0 = 1 語句設置 P1.0 端口默認爲高電平,while(1) 語句爲無限循環,讓主程序一直在運行狀態,等待外部事件的中斷請求。
下圖是前面中斷場景的電路設計圖,在 P3.2 端口(INT0 中斷)接入一個按鈕,按鈕的另一端接地。按鈕元器件的添加方法如下:打開元件庫,使用關鍵詞 “button” 搜索按鈕電子元器件,添加按鈕電路模型元器件庫。
前面中斷場景的 C 程序編譯完成,將執行程序加載到單片機內,啓動單片機,重複按下按鈕,發光二極管狀態(點亮或熄滅)將反轉。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/7FWvHFSu9yXxAONXZqHS6w