微控制器在自主執行的時候一般是在執行乙個死迴圈程式,在沒有外界干擾(輸入訊號)的時候它基本處於乙個封閉狀態。比如乙個電子時鐘,它會按時、分、秒的規律來自主執行並通過輸出裝置(如液晶顯示屏)把時間顯示出來。在不需要對它進行調校的時候它不需要外部干預,自主封閉地執行。如果這個時鐘足夠準確而又不掉電的話,它可能一直處於這種封閉執行狀態。但事情往往不會如此簡單,在時鐘剛剛上電、或時鐘需要重新校準、甚至時鐘被帶到了不同的時區的時候,就需要重新調校時鐘,這時就要求時鐘就必須具有調校功能。因此微控制器系統往往又不會是乙個單純的封閉系統,它有些時候恰恰需要外部的干預,這也就是外部中斷產生的根本原由。
實際上在第二個示例演示中,就已經舉過有按鍵輸入的例子了,只不過當時使用的方法並不是外部中斷,而是用程式查詢的方式。下面就用外部中斷的方法來改寫一下第二個示例中,通過按鍵來更改閃爍速度的例子(第二個例子)。電路結構和接線不變,僅把程式改為下面的形式。
#include
unsigned int t=500; //定義乙個全域性變數t,並設定初始值為500次
//**********=延時子函式,在8mhz晶振時約1ms**********===
void delay_ms(unsigned int k)
}//**********==主函式******************************====
void main( void )
}//**********==中斷函式(外部0)*************************=
#pragma vector = int0_vect
__interrupt void int0_server(void)
//**********==中斷函式(外部1)*************************=
#pragma vector = int1_vect
__interrupt void int1_server(void)
在分析程式之前,先來了解一下什麼叫「外部中斷」。前面已講述過,在沒有打擾的情況下,微控制器的程式在封閉狀態下自主執行,但如果在某一時刻需要響應乙個外部事件(比如有按鍵被按下),這時就需要用外部中斷。具體來講,外部中斷就是在微控制器的乙個引腳上,由於外部因素導致了乙個電平的變化(比如由高變低),而通過捕獲到這個變化,微控制器內部自主執行的程式就被暫時打斷,轉而去執行相應的中斷處理程式,執行完後又回到原來中斷的地方繼續執行原程式。這個引腳上的電平變化,就申請了乙個外部中斷事件,而這個能申請外部中斷的引腳就是外部中斷的觸發引腳。在上面的例子中,可以看到兩個按鍵s1、s2被接到了atmega16的pd3和pd2引腳,而這兩個引腳正是該微控制器的兩個外部中斷(int1和int0)的觸發引腳(第二功能)。當按鍵沒有按下時,這兩個引腳都為高電平(執行過portd=0xff),當按鍵被按下時,引腳電平跳變為低電平,這時若微控制器設定成允許中斷申請,就會觸發外部中斷事件,從而轉去執行中斷服務程式。明白了這個過程之後,接下來就可以分析程式了。
程式執行後,主程式就一直在不停的執行while(1)內的這個死迴圈,讓led以t=500ms的初始值來交替閃爍,直到有外部中斷來打斷它。假設某一時刻按鍵s2被按下,這時由於引腳pd2上的電平突然被拉低,申請了乙個外部中斷0(int0),這時的程式就轉去執行外部中斷0的中斷服務程式(即__interrupt void int0_server(void)函式)。這時全域性變數t的值被該函式重新賦值為100(即延時為100ms),完成後又回到主函式中的while(1)內去繼續執行,因此led閃爍的速度就變快了。
觀察程式可看出,如果沒有中斷去呼叫中斷服務子程式,在主程式中是沒有語句去調動它的。也就是說如果沒有外部中斷,中斷服務子程式(即__interrupt void int0_server(void)函式)是永遠不會被執行的。這也說明,中斷服務子程式是一類特殊的子程式,它不能被主程式呼叫,只能被中斷申請呼叫。因此,中斷服務子程式有它固定的格式和寫法。在不同的編譯系統中的寫法不完全一樣,下面給出iar下的中斷服務子程式的格式。
#pragma vector = int0_vect
__interrupt void int0_server(void)
以上是固定格式,除斜體部分外,其餘部分不可更改。斜體部分中的int0_vect表示中斷的向量號,不同的中斷名稱不一樣(原型在標頭檔案iom16.h中)。斜體部分中的int0_server是中斷函式的名稱,是由開發者自己定義的。雖然可以自定義,但名稱還是要取得「見名知義」,這樣一看就知道是什麼中斷服務了。
51微控制器 中斷
一 中斷的概念 cpu在處理某一事件a時,發生了另一事件b請求cpu迅速去處理 中斷發生 cpu暫時中斷當前的工作,轉去處理事件b 中斷響應和中斷服務 待cpu將事件b處理完畢後,再回到原來事件a被中斷的地方繼續處理事件a 中斷返回 這一過程稱為中斷 二 中斷源 在51微控制器中有5個中斷源 中斷號...
微控制器之中斷
11月14日學習總結 時隔兩周了吧,整理了一下課上記得筆記,發現沒有當即上過課就整理筆記的後果就是老師說的很多細節都想不起來了,不過憑著我這魚的記憶還是能想起來多少就寫多少吧。首先來回顧一下基礎知識,各類資料基本型別的變數範圍,這些一定要記住,我在寫程式時有時就是因為定義的變數超出了範圍達不到想表達...
微控制器中斷編號
微控制器的中斷序號決定該中斷的中斷向量的位置 即中斷服務程式的入口位址 即 中斷序號就是中斷源在微控制器的中斷向量表中的位置序號。具體關係 中斷向量 0003h 中斷序號 8搜尋 例如 中斷0 即中斷序號為0 其中斷向量 中斷服務程式的入口位址 0003h 中斷1 即中斷序號為1 其中斷向量 中斷服...