關(guān)于單片機(jī)中斷詳解
由于尿急這個(gè)內(nèi)部中斷的優(yōu)先級(jí)比老媽給我的外部中斷還要高,尿急了,我總得先去撒尿吧?所以我就先去執(zhí)行撒尿這個(gè)語句(小七:怎么我覺得這個(gè)比喻很別扭呢?!)。當(dāng)我撒完尿后(還是覺得很別扭。。。)我會(huì)返回來幫老媽拿東西(高優(yōu)先級(jí)的中斷處理完后返回執(zhí)行優(yōu)先級(jí)較低的中斷),拿完東西了我再回到電腦前繼續(xù)寫帖子(全部中斷處理完后繼續(xù)接手中斷前的工作)。這個(gè)就叫做中斷的返回。這么通俗的比喻,大家對(duì)中斷的概念應(yīng)該都明白了吧,那么在單片機(jī)里面,中斷有什么用呢?
當(dāng)單片機(jī)正在執(zhí)行程序的時(shí)候,突然某個(gè)按鍵按下了(產(chǎn)生外部中斷),單片機(jī)就必須得去處理那個(gè)按鍵(中斷的響應(yīng)),看看是發(fā)生了什么事,按鍵處理完后繼續(xù)回來執(zhí)行程序(中斷的返回)。
同樣,單片機(jī)正在執(zhí)行程序的時(shí)候,內(nèi)部的定時(shí)器溢出(定時(shí)器后面會(huì)單獨(dú)講到),或者檢測到單片機(jī)的電壓低于正常值等等(單片機(jī)內(nèi)部產(chǎn)生的中斷叫內(nèi)部中斷),單片機(jī)就得去處理這些事情,然后再返回來。
在單片機(jī)里面,中斷是有特殊的功能寄存器控制的,單片機(jī)里面一共有兩個(gè)中斷,一個(gè)是中斷0,一個(gè)是中斷1 ,和兩個(gè)定時(shí)器T0,T1,定時(shí)器就是你打開它后,它會(huì)自動(dòng)數(shù)數(shù),當(dāng)數(shù)到你給它限定的值時(shí),它就會(huì)溢出,產(chǎn)生中斷讓CPU處理(就像一個(gè)桶,你打開水龍頭后,水越來越多,當(dāng)達(dá)到你需要的水位時(shí),就會(huì)產(chǎn)生中斷叫你去處理它)。這些我們先不深入了解他是什么東西,我們只需知道中斷是用下面這幾個(gè)關(guān)鍵詞控制的就行了:
IT0聲明外部中斷0的類型,IT0=1是邊沿觸發(fā),0是電平觸發(fā)
邊沿觸發(fā)就是當(dāng)檢測到外部電平發(fā)生變化,即由低變高,或者由高變低時(shí),就會(huì)產(chǎn)生一個(gè)中斷
電平觸發(fā)就是檢測到高電平或者低電平時(shí),產(chǎn)生中斷
IE0 外部邊沿觸發(fā)產(chǎn)生中斷后,它的值會(huì)變1,當(dāng)CPU響應(yīng)后,會(huì)自動(dòng)變?yōu)?
IT1和IT0一樣的含義
IE1 和IT0一樣的含義
EX0外部中斷0控制器,EX0=1是允許外部中斷,0是禁止外部中斷,也就是不理會(huì)外部中斷
ET0這個(gè)是定時(shí)器中斷控制器,ET1=1是允許定時(shí)器產(chǎn)生中斷,0是禁止
EX1,ET1的含義跟上面的都一樣。
EA總中斷控制器,1是允許有中斷產(chǎn)生,0是禁止所有中斷,就算天打雷劈也不理會(huì)
另外,還有一個(gè)中斷優(yōu)先級(jí)的控制器,就是控制是去幫媽媽拿東西的優(yōu)先級(jí)高還是去撒尿的優(yōu)先級(jí)高。
PX0 外部中斷0的優(yōu)先級(jí)控制,假如內(nèi)外都產(chǎn)生了中斷,1就是優(yōu)先處理外部中斷,0就是優(yōu)先處理內(nèi)部中斷
PT0 定時(shí)器0優(yōu)先級(jí)控制器,1就是優(yōu)先相應(yīng)定時(shí)器0
PT1 定時(shí)器1優(yōu)先級(jí)控制器,1就是優(yōu)先相應(yīng)定時(shí)器1
另外還有串口的RI,TI,PS等我們先不學(xué)習(xí)了,不然大伙該亂了
(眾人:其實(shí)我們早已凌亂了。。。一頭霧水!)
還有個(gè)概念,就是中斷請(qǐng)求的撤銷,也就是說,產(chǎn)生中斷后,會(huì)產(chǎn)生一個(gè)中斷請(qǐng)求,為1,當(dāng)CPU處理完中斷后,必須清除這個(gè)請(qǐng)求,不然CPU又會(huì)認(rèn)為這個(gè)中斷沒有處理又跑去處理它……
對(duì)于兩個(gè)定時(shí)器產(chǎn)生的中斷,當(dāng)CPU響應(yīng)后,會(huì)自動(dòng)清除TF0,TF1這兩個(gè)定制器中斷請(qǐng)求,處理完后就跳出來,回到原來的地方繼續(xù)執(zhí)行。
對(duì)于外部中斷INT0,INT1,如果中斷類型是邊沿觸發(fā),單片機(jī)會(huì)自動(dòng)清除中斷請(qǐng)求IE0,IE1
若是電平觸發(fā),如果有一個(gè)電平,使中斷產(chǎn)生后,這個(gè)電平仍然還保持著,那么這個(gè)電平還會(huì)觸發(fā)中斷,這樣CPU就死在中斷的石榴裙下出不來了。。。
(眾人:說了那么多,沒例子你說個(gè)J8)
例子來啦!用外部中斷來控制一個(gè)LED的亮滅。對(duì)了,外部中斷并不是單片機(jī)的每個(gè)引腳都能產(chǎn)生,標(biāo)有INT0或INT1的才行,我們看看11F02E的引腳圖
中斷的引腳是INT0:P3^2和 INT1:P3^3,我們用邊沿觸發(fā)(由高電平變成低電平時(shí),就會(huì)觸發(fā))的中斷方式來控制LED,
當(dāng)我們沒按下按鍵的時(shí)候,由于上拉電阻(不懂的問百度姐姐哦~)的原因,P3^2是高電平,當(dāng)我們按下按鍵后,P3^2的電平就會(huì)變低,這個(gè)從高變低的過程就會(huì)產(chǎn)生一個(gè)中斷(邊沿觸發(fā)),CPU會(huì)第一時(shí)間來相應(yīng)這個(gè)中斷,看看是誰看帖不回貼,看完帖子不評(píng)分,然后根據(jù)小七寫的中斷處理程序去處理他!
O(∩_∩)O 。
程序怎么寫呢?
#include
sbit led=P1^7; //定義LED
void zhongduan() interrupt 0 using 1 //聲明中斷處理函數(shù),由于是外部中斷,所以 interrupt X 里X的值是 0
{
led=!led; //CPU響應(yīng)中斷后會(huì)跑來這里執(zhí)行(讓led的狀態(tài)取反)
}
void main() //主函數(shù),程序執(zhí)行的起點(diǎn)
{
EA=1; //允許CPU響應(yīng)所有中斷
IT0=1; //設(shè)外部中斷0的響應(yīng)模式為邊沿觸發(fā)
EX0=1; //允許中斷0產(chǎn)生中斷
while(1); //CPU不斷在這里死循環(huán),中斷產(chǎn)生后放下工作去響應(yīng)中斷,處理完后然后再返回來繼續(xù)死循環(huán)
}
按下按鍵,CPU會(huì)跑去中斷處理函數(shù)執(zhí)行,執(zhí)行完中斷處理后返回原處繼續(xù)執(zhí)行
(眾人:這個(gè)中斷跟我們前面學(xué)習(xí)的按鍵有什么區(qū)別么?)
當(dāng)然有區(qū)別啦!雖然都是控制LED,但是按鍵是當(dāng)CPU執(zhí)行到按鍵檢測如 if(key==0) 語句后,才去改變LED的狀態(tài),如果沒有執(zhí)行到,那么即使你按下按鍵單片機(jī)也不會(huì)響應(yīng)的,也就是CPU主動(dòng)去問按鍵有沒有被按下。而中斷呢,就是無論CPU在干嘛,只要觸發(fā)中斷后,CPU就會(huì)放下手中的活,第一時(shí)間趕回來處理,也就是按鍵被按下后主動(dòng)告訴CPU。。。就像windows系統(tǒng)的ctrl+alt+del組合鍵,你一按下這個(gè)組合鍵,無論系統(tǒng)在做什么,都會(huì)彈出任務(wù)管理器。
評(píng)論