應(yīng)某位朋友的要求,講解一下單片機(jī)中斷的知識(shí),那今天就以51單片機(jī)的外部中斷0為例,來簡單講解一下單片機(jī)中斷的用法。
1 51單片機(jī)的中斷源
51單片機(jī)共有5個(gè)中斷源,分別為:
-
外部中斷0
-
定時(shí)器0中斷
-
外部中斷1
-
定時(shí)器1中斷
-
串口中斷
每一個(gè)中斷都對(duì)應(yīng)一個(gè)中斷向量,中斷向量表如下所示:
2 什么是中斷事件
當(dāng)中斷發(fā)生時(shí)單片機(jī)將正在執(zhí)行的程序暫時(shí)放下而去處理中斷事件,當(dāng)中斷事件處理完畢后再接著去處理之前的事情,這樣可以大大降低單片機(jī)的資源,提高執(zhí)行效率。舉個(gè)例子說明一下什么是中斷: 我很喜歡打CS,每天晚上我都會(huì)抽時(shí)間打CS,但同時(shí)廚房里正在燒水,為了不使水燒干,我每隔5分鐘就去廚房看一下水有沒開,但這就錯(cuò)過了游戲老被別人爆頭干掉,我很苦惱,怎么辦。于是我在網(wǎng)上買了一個(gè)水燒開就會(huì)叫的水壺,這樣我就不用每隔5分鐘去廚房了從而可以專心的打游戲,只有聽到水壺吱吱叫的時(shí)候,我去把水倒出來就可以了。 在這個(gè)例子里,打游戲就是主任務(wù),水燒開就是中斷,吱吱叫就是中斷向量,聽到吱吱響我就明白水燒開了,這時(shí)我要把打游戲這個(gè)主任務(wù)暫時(shí)放下,轉(zhuǎn)而去處理水燒開了這個(gè)中斷事件,水倒完后我就又回到了游戲這個(gè)主任務(wù)中。這樣是不是提高了打游戲的效率呢?
3 中斷的硬件實(shí)現(xiàn)
51單片機(jī)的外部中斷0引腳接一只按鍵,該按鍵通過上拉電阻接到電源,即沒有按鍵發(fā)生時(shí)單片機(jī)檢測(cè)到的是高電平,當(dāng)按鍵按下時(shí)單片機(jī)檢測(cè)到的是低電平。單片機(jī)的P0.0引腳以灌電流的方式接了一只LED,當(dāng)按鍵按下時(shí)LED燈點(diǎn)亮,沒按鍵時(shí)LED燈熄滅。
4 中斷的軟件實(shí)現(xiàn)
單片機(jī)中斷函數(shù)的寫法比較固定,51單片機(jī)中斷函數(shù)的寫法如下: void Initd() interrupt 0 其中:
-
void:為中斷函數(shù)的返回類型,中斷函數(shù)多為空類型;
-
Initd():是中斷函數(shù)的名稱,這個(gè)函數(shù)名符合C語言函數(shù)命名規(guī)范就可以,隨便起;
-
interrupt:為51單片機(jī)中斷的關(guān)鍵字,必須這么寫(51單片機(jī)必須這么寫);
-
0:為中斷向量,該值詳看第一個(gè)表格,如果是外部中斷1就寫2,如果是定時(shí)器1中斷就寫3;
中斷函數(shù)不用在主函數(shù)中調(diào)用,只要中斷事件發(fā)生,單片機(jī)自己主動(dòng)會(huì)調(diào)到中斷函數(shù)中。 該例子的函數(shù)如下所示:
5 仿真實(shí)現(xiàn)
當(dāng)按鍵發(fā)生時(shí),LED燈點(diǎn)亮,如下圖所示。注意對(duì)比兩種圖中按鍵的狀態(tài)。
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問題,請(qǐng)聯(lián)系我們,謝謝!