【藍橋杯單片機07】徹底理解51單片機的中斷系統
廣東職業技術學院 歐浩源
在接下來的教程中,將會介紹定時器、串口通信等外設的基本使用,而這些外設的使用都要涉及中斷,而且中斷是單片機或嵌入式開發中一個相當重要的概念。不能掌握中斷系統,就無法靈活應用這些外設。
1、什么是中斷?
你正在追電視劇《神雕俠侶》,正看得入迷的時候,電話響了,你暫停電視劇,去接電話,在接電話的過程中,門鈴又響了,你暫時放下電話,去把門打開。如果追電視劇是在執行主程序,那么電話就是中斷源,電話鈴響了就是中斷請求,暫停電視就是現場保護,接電話就是中斷響應,門鈴響了是更高一級的中斷請求,去把門打開,那就是中斷嵌套。開完門回來接着聊電話,那是中斷返回,接完電話把電視劇暫停打開就是現場恢復。
內核與外設之間的主要交互方式有兩種:輪詢和中斷。輪詢的方式貌似公平,但實際工作效率很低,且不能及時響應緊急事件;中斷系統使得內核具備了應對突發事件的能力。
中斷有個特點,就是你不知道中斷什么時候發生。因此,每個中斷都需要有一個中斷入口地址,也成為中斷向量。這樣,不管中斷在什么時候發生,它都有一個確定的程序執行起始點。中斷響應之后,執行的那段程序,我們稱作中斷服務函數,也就是這個函數專門是為該中斷服務的。
2、關於51單片機的中斷系統
一般來說,51單片機有5個中斷源(忽略定時/計數器2),分2個優先級,這個5個中斷源按照自然優先級從高到低依次為:
外部中斷0:INT0
定時/計數器0:TF0
外部中斷1:INT1
定時/計數器1:TF1
串口中斷:RI/TI
下面一圖將充分說明51單片機的中斷系統結構:
每個中斷源都對應着一個固定的入口地址,也就是中斷向量,它們依次是:
0 0x0003: INT0
1 0x000B: TF0
2 0x0013: INT1
3 0x001B: TF1
4 0x0023: RI/TI
也就是說,不管主程序執行到什么地方,只要外部中斷1產生請求,內核要響應該中斷,就會到0x0013這個地址去執行代碼。如果你是在使用匯編語言進行程序開發的時候,你需要記住每個中斷源對應的地址;如果你使用的是C語言,你只需要記住中斷源的順序就可以了,也就是最左邊的中斷號。
3、中斷相關的寄存器
中斷相關的寄存器有4個,每個寄存器都是可以位尋址的,這該編程帶來了方便。
其中2個為控制寄存器:IE寄存器與IP寄存器:
另外2個為中斷請求標志:TCON寄存器與SCON寄存器:
4、關於中斷服務函數程序的編寫
一般情況下,中斷的處理函數有兩個,其一為中斷初始化函數,其二為中斷服務函數。初始化函數就是一個普通的函數,而中斷服務函數卻有特殊的格式要求:
<1> 中斷函數沒有返回值,也不能帶參數。
<2> 函數名后面要跟一個關鍵字interrupt,說明這是一個中斷服務函數。
<3> 在關鍵字interrupt后面要跟上中斷號,說明這個中斷服務函數是為那個中斷服務的。
中斷服務函數的格式為:
void 函數名() interrupt 中斷號
{
----函數體----
}
我們要利用定時器0來進行間隔定時,中斷程序架構我們C語言可以這樣寫:
5、結束語
中斷系統很重要,務必徹底理解,熟練掌握,對於每一個款微處理器都是這樣!!!