51微控制器之中斷

2021-10-01 15:27:18 字數 2971 閱讀 5085

現在假設乙個情況,微控制器在迴圈點亮led,也就是實現了乙個流水燈,現在有乙個按鍵作為輸入,我們希望通過這個按鍵來實現不同的流水燈效果,當然了,你可以把點亮led和檢測按鍵放在同乙個迴圈裡面,假設這時候你又通過串列埠傳送字串,隨著主程式任務量的增大,迴圈一次的時間也會越來越長,這就會導致按鍵檢測失效,或者有時主程式沒有迴圈,按鍵檢測根本就塞不進去,這個時候就需要使用中斷的方式。

很多微控制器教程裡面都會舉這樣乙個例子,假設你在家裡寫作業(主程式),廚房裡正在燒著水,這時候有人來敲門。我們不可能一邊寫作業,一邊看水燒開沒有,一邊看有沒有人敲門,這樣效率太低了。用中斷的方式就是:當你聽見水燒開了(中斷訊號),立馬去關煤氣,把熱水灌暖壺裡(中斷服務);當你聽見敲門聲也是同理。處理完這些之後安安靜靜的寫作業。這樣效率才是最高的。

51微控制器的中斷源如下圖所示

中斷源預設中斷級別

序號(c語言用)

入口位址(彙編用)

int0外部中斷010

0003h

t0定時器/計數器0中斷21

000bh

int1外部中斷132

0013h

t1定時器/計數器1中斷43

001bh

ti/ri-序列口中斷54

0023h

t2定時器/計數器2中斷(89c52系列有)65

002bh

可以將上面的六個中斷源分為三類:

外部中斷

定時器中斷

序列口中斷

在說一說它們的觸發條件:

外部中斷的觸發和某乙個io的電平有關係,可以通過設定相關暫存器,實現低電平或者是下降沿觸發。

定時器中斷的觸發和相關的計數暫存器有關,溢位時便會觸發中斷。

序列口中斷的觸發條件為當串列埠傳送或者接收到資料時。這裡需要注意的是,傳送和接收都會共用這乙個中斷服務函式。所以當觸發中斷時,在中斷服務函式裡面需要查詢相關標誌位來判斷到底是傳送觸發的還是接收觸發。

當設定有多個中斷在工作時,必然涉及到中斷優先順序的問題。在上面的**裡已經列出了預設的中斷級別,數字越小,優先順序越高。

舉個例子,當執行優先順序為1 的中斷時(int0外部中斷0),優先順序為3的中斷(int1外部中斷1)來了,這時候只能等待前者執行完畢才能執行後者。反過來,執行優先順序為3 的中斷時來了優先順序為1的中斷,這時會立即執行後者,執行完後又會返回執行前者。簡單說,優先順序高的可以打斷優先順序低的。

51微控制器設定優先順序的方法是這樣的,假設上面所說的中斷都在乙個預設的梯隊裡面,裡面有先後之說。那麼其實還有另外乙個高優先順序的梯隊,對51各個中斷優先順序的設定,其實就是放在哪乙個梯隊的問題。但無論放在哪乙個梯隊,相對位置不變,也就是說,某些優先順序組合是不可能做到的。

一般來說,乙個中斷服務函式裡不會放太多需要執行的內容,這是一條應該遵循的原則。所以中斷執行的很快,很少會有兩個中斷同時到達或者執行的情況,所以大多數情況下,我們並不需要太在意中斷優先順序的問題。

中斷允許暫存器ie

位序號d7d6

d5d4

d3d2

d1d0

位符號ea

\et2

eset1

ex1et0

ex0d0至d5分別與上面**的中斷源對應,設定相應位置為1即開啟相應中斷。ea(enable all)為總開關,使用中斷必須開啟。

中斷優先順序暫存器ip

位序號d7d6

d5d4

d3d2

d1d0

位符號\\\

pspt1

px1pt0

px0通過設定相應的位置為1,把該中斷設定為高優先順序序列。

定時器/計數器控制暫存器tcon

位序號d7d6

d5d4

d3d2

d1d0

位符號tf1

tr1tf0

tr0ie1

it1ie0

it0高4位(d4到d7)與定時器/計數器0、1有關,詳細介紹請檢視博主的定時器一文

低4位(d0到d3)與外部中斷0、1有關,具體為:位功能

it0外部中斷0觸發方式選擇位,0低電平觸發,1下降沿觸發

ie0外部中斷0請求標誌位,觸發中斷置1,進入中斷函式硬體置0

it1外部中斷1觸發方式選擇位,同it0

ie1外部中斷1請求標誌位,同ie0

外部中斷0(int0)連線在引腳p3^2

外部中斷1(int1)連線在引腳p3^3

關於定時器/計數器和串列埠中斷的配置,我會在後面的部落格中再詳細介紹。下圖展示了51的中斷系統的大致結構。

乙個中斷服務函式(中斷函式 )應該類似於下面這樣:

void

interrupt_service

(void

) interrupt x [using y]

函式名可以自定義,但是引數和返回值必須是 void 。

interrupt 指明了中斷源,x可以取0~4( 89c52可以用到5 )。

using 指明了中斷函式使用的暫存器組,取值0~3。這個可以不用理會。

下面這個程式展示了外部中斷0和1的兩種不同用法

#include

"reg52.h"

void

main()

}void

int0

() interrupt 0

void

int1

() interrupt 2

外部中斷並不適合連線按鍵,通常是用來連線一些模組的irq引腳使用。如紅外置收,超聲波hc-04,無線模組nrf24l01。

51微控制器之中斷使用

include void delay unsigned int xms void main void low interrupt 0 1.關於p1八位流水燈引腳,引腳有乙個上拉的5v電源,所以程式寫時p1的八位,為1時燈不亮,為0時燈亮,電路圖如下 2.關於it1 0 1中斷方式 it0表示int0...

微控制器之中斷

11月14日學習總結 時隔兩周了吧,整理了一下課上記得筆記,發現沒有當即上過課就整理筆記的後果就是老師說的很多細節都想不起來了,不過憑著我這魚的記憶還是能想起來多少就寫多少吧。首先來回顧一下基礎知識,各類資料基本型別的變數範圍,這些一定要記住,我在寫程式時有時就是因為定義的變數超出了範圍達不到想表達...

PIC微控制器之中斷

1 微控制器在任何情況下的復位,均會導致總遮蔽位和其他的中斷遮蔽位清0,即在預設狀態下,禁止cpu響應所有的中斷。2.中斷標誌位的狀態與該所有的終端遮蔽位無關,即不管是否允許cpu響應中斷源的中斷請求,只要滿足了中斷條件,中斷標誌位就會被置1 3.當系統開放某一中斷源時候,中斷源就通過過中斷標誌位向...