單片機中斷問題30例
定時器1中斷:當定時器1計數到FFFF溢出時
串口中斷:串口接收到一幀。或發送完一幀數據都會產生中斷。
你網上找一下TCON和SCON。什么條件讓中斷標志位的值改變。 那么就會進入中斷服務程序去。
23、51單片機,如果中斷函數比較長,執行到一半又觸發了這個中斷,程序會停止從頭執行,還是執行結束后響應中
答:
51單片機中,中斷分高低兩個優先級,高優先級的中斷能打斷低優先級的中斷。
但同級中斷是不能打斷同級中斷的!無論該中斷函數有多長,在執行到一半這個中斷又發生了,還是要等到該中斷函數執行完畢,并再執行了一條主程序指令后才會再次進入該中斷。
不過,若樓主恰好在這個低優先級中斷服務程序中修改了該中斷為高優先級,那么如果該中斷函數比較長,執行到一半又觸發了這個中斷,則該中斷函數就會被重新從頭開始執行(中斷嵌套)。這是因為除串口中斷以外的其他中斷,在 CPU 響應該中斷,程序轉入該中斷函數前就已經將該中斷的中斷標志清零了。
另外,51的串口中斷比較特別,因為需要軟件清除串口中斷標志,所以只要在未清串口中斷標志前,是不會發生上述這樣的中斷嵌套的。
24、求51單片機程序,兩個計數器,主要是中斷函數的函數名以及初始化設置
答:
void into_into() interrupt 1 定時器0中斷入口函數
{
。。。。中斷服務程序。。。。
TH0=0;//
TL0=0;// 重新給T0賜值
}
void into_into() interrupt 3 定時器1中斷入口函數
{
。。。。中斷服務程序。。。。
TH1=0;//
TL1=0;// 重新給T1賜值
}
void to_to()
{
TMOD=0x11; //頂時器T0和T1工作方式1
TH0=0;//
TL0=0;// T0賜初值
TH1=0;//
TL1=0// T1賜初值
TR0=1;// 開始記數
ET0=1;// 允許T0中斷
TR1=1;// 開始記數
ET1=1;// 允許T1中斷
EA=1; // 打開總中斷
}
void main()
{
INIT_T0(); //定時器中斷初始化
while(1)
{
...........
}
25、請教一個單片機中斷的問題:比如來了一個脈沖,開始中斷,但中斷里的程序執行到一半時,又來了一個脈沖,請問這時中斷里的程序是從頭開始呢還是繼續呢?
我的意思是程序就一個中斷A,來了一個脈沖,A執行,A執行到一半時,又來了一個脈沖,通知A執行。這時A是從頭執行還是先不理會呢?
答:
需要具體情況具體分析,因為不同的單片機在中斷機制上有細微的差別,需要查他的資料。
一般來說,一個中斷源請求中斷,對CPU來說,是一次性的做了一個“中斷掛號”。假如當時因條件不滿足(例如CPU正在“關中斷”,即沒有打開“中斷允許”),而沒有響應中斷,則掛號信息還在,這樣,將來一旦打開了中斷允許,仍然會響應,只是晚了一點而已。
而中斷響應以后,必須有辦法把這個“中斷掛號”消除掉。有的CPU的功能是:只要響應了這個中斷,掛號就自動消除了。也有的CPU不能自動清除掛號,必須在中斷服務程序中編入“清除中斷掛號”的操作,否則,一旦打開了中斷允許,它又會重復發生中斷。
現在的大多數單片機里,中斷控制器和CPU是在同一個芯片中,它可以做到自動消除中斷掛號。而過去許多種CPU,所配用的中斷控制器是另外一個芯片,自然就無法自動消除了。
也有的CPU中有另外一種“不掛號”的中斷請求。它必須由外界(發出中斷請求的那個設備)來保持一直不停申請,等到響應中斷的時候,再設法(例如,在中斷服務程序中發出一個輸出信號)通知那個設備撤銷申請。
大多數的CPU中,一旦響應中斷進入了服務程序,就把“中斷允許”關掉了。故此時如果又有下一個中斷請求來了,不能立即響應,只能掛一個號,等以后“開中斷”時才能再響應。如果程序員希望能夠“嵌套中斷”(即在一次中斷服務程序的執行中途又進入了另一個中斷服務程序),就需要在服務程序內編入“開中斷”的操作。
“嵌套中斷”原則上允許“自己嵌套自己”,也就是說,一次中斷服務程序的執行中途又被打斷并進入了和自己一樣的中斷服務程序,并從頭到尾執行一遍,結束后返回到先前打斷的那一點,并繼續執行后半截服務程序。這種情況會產生什么效果,是需要程序員自己考慮的。
也有的CPU具有“優先次序”機制,可以在某一級的中斷服務程序里禁止優先級不比自己高的其他中斷來打斷自己。同時,也提供給程序員有“放棄優先權”以及“修改優先級”的靈活性。
而被優先機制暫時“屏蔽”的那些較低優先級的中斷申請,同樣掛號仍在,以后高優先級的中斷結束以后,還能響應。
不過需要注意,大多數的CPU中,“中斷掛號”是只能掛一個的。也就是說,在前一次的中斷申請所掛的號還沒有被清除以前,又來了下一個中斷申請,那么,第二個掛號是掛不上的。
不過某些處理器中,中斷掛號可能分成幾個層次:CPU里面是一層,外圍針對各個具體的設備,還有另外一級“預備掛號”,那就比較復雜了。
另外多說幾句:上面已經說,程序員可以自己決定你的中斷服務程序允許還是不允許“嵌套”。
如果不允許,您可以采用關中斷的辦法,或者利用優先機制,來屏蔽同一中斷源的第二個中斷請求。
這樣,第二個中斷就不會被響應。但它仍可以掛上一個號(只要它發生在上一個中斷掛號已經被清除掉以后的時間)。然后,中斷服務程序結束時,一般都會開中斷并釋放優先級屏蔽。然后,第二個中斷請求就會被響應,于是再一次執行中斷服務程序。
如果允許“嵌套”,那就會如我上面所說:
一次中斷服務程序的執行中途又被打斷并進入了和自己一樣的中斷服務程序,并從頭到尾執行一遍,結束后返回到先前打斷的那一點,并繼續執行后半截服務程序。
評論