1. 程式人生 > >學習筆記之-51微控制器中斷

學習筆記之-51微控制器中斷

1.中斷的概念

  通俗的講,中斷就是cup正在工作的時候,突然外部來了某一請求,要求cpu轉去處理請求的事件,當事情做完之後cup再回來繼續它的工作。這一過程稱為中斷 。
微控制器中斷響應可以分為以下幾個步驟:
1、停止主程式執行。當前指令執行完後立即終止現行程式的執行;
2、保護斷點。把程式計數器PC 的當前值壓入堆疊,儲存終止的地址(即斷點地址),以便從中斷服務程式返回時能繼續執行該程式;
3、尋找中斷入口;
4、執行中斷處理程式;
5、中斷返回。執行完中斷處理程式後,就從中斷處返回到主程式,繼續往下執行。
  流程圖如下:
  這裡寫圖片描述
  
中斷技術不僅解決了快速主機與慢速I/O裝置的資料傳送問題,而且還具有如下優點:
分時操作:CPU可以分時為多個I/O裝置服務,提高了計算機的利用率;
實時響應:CPU能夠及時處理應用系統的隨機事件,系統的實時性大大增強;
可靠性高:CPU具有處理裝置故障及掉電等突發性事件能力,從而使系統可靠性提高。

2.51微控制器中斷詳解

中斷
上圖是80C51微控制器中斷系統的結構,從圖中可以看到80C51的中斷系統有5箇中斷源(補充:8052有 6個) ,分別是: 外部中斷0/1(P3.2,P3.3),內部中斷(定時計數器中斷)0/1(P3.4,P3.5),串列埠中斷(這一節先不討論)
先介紹幾個和中斷相關的暫存器:

  • TCON
    這裡寫圖片描述
    TF1:定時器T1溢位標誌,可由程式查詢和清零,TF1也是中斷請求源,當CPU響應T1中斷時由硬體清零。
    TF0:定時器T0溢位標誌,可由程式查詢和清零,TF0也是中斷請求源,當CPU響應T0中斷時由硬體清零。
    TR1:T1充許計數控制位,為1時充許T1計數(定時)。
    TR0
    :T0充許計數控制位,為1時充許T0計數(定時)。
    IE1:外部中斷1請示源(INT1,P3.3)標誌。IE1=1,外部中斷1正在向CPU請求中斷,當CPU響應該中斷時由硬體清“0”。
    IT1:外部中斷源1觸發方式控制位。為1設定為底電平觸發,為0設定為下降沿觸發。
    IE0:外部中斷0請示源(INT0,P3.2)標誌。IE0=1,外部中斷1正在向CPU請求中斷,當CPU響應該中斷時由硬體清“0”。
    IT0:外部中斷源0觸發方式控制位。為1設定為底電平觸發,為0設定為下降沿觸發。

高四位是控制內部中斷(定時計數器)的,底四位是控制外部中斷的,從中斷結構圖可以知道,外部中斷有兩種觸發方式,IT0或者IT1為外部中斷源觸發方式控制位,此位為1設定為電平觸發,為0設定為下降沿觸發。TF0,TF1,IE0,IE1這四個位都是中斷標誌位,不需要設定的。

  • 中斷允許暫存器IE:

ie

顧名思義,中斷允許暫存器就是控制中斷是否開啟,注意EA總中斷,使用任何中斷這個位都要置一,當EA=0時,所有中斷都將關閉。

  • 中斷優先順序暫存器:
    ip

80C51微控制器有兩個中斷優先順序,即可實現二級中斷服務巢狀。51微控制器中自然的優先順序為:
這裡寫圖片描述
從中斷系統結構圖中可以看到,中斷優先順序分為兩級,每一級都是按照自然優先順序排列,這樣說應該可以理解吧。IP這個暫存器預設值為xx000000b,所有的中斷都處在同一級,它就按照自然優先順序進行響應。假設我們想人為的把串列埠的優先順序設定為最高,那我們就可以在IP暫存器的PS位寫一,這樣,串列埠就被設定為更高一級,它的優先順序是最高的。

這樣,和微控制器外部中斷的幾個暫存器都講完了,定時器和串列埠的中斷會分開闡述的。這裡重點理解外部中斷。

3.中斷服務程式

  上面講中斷過程中我們知道,那5個過程都是由計算機自動完成的,與我們無關,我們的工作只是在這5 個入口地址處存放有中斷處理的程式,那麼怎麼具體寫中斷服務程式呢?
格式:
     void function(void) interrupt x using y
x=0 是外部中斷0;
x=1 是定時器中斷0;
x=2 是外部中斷1;
x=3 是定時器中斷1;
x=4 是序列口中斷;
y只能取以下值,一般我們是不用後面的using的
y=0 是第0組暫存器;
y=1 是第1組暫存器;
y=2 是第2組暫存器;
y=3 是第3組暫存器;

4.例項:外部中斷

protues環境下硬體搭建
123
實現一個外部中斷的步驟:
1.設定外部中斷源觸發方式控制位,為1設定為電平觸發。
2.開總中斷
3.開外部中斷0

#include<reg51.h>
sbit led=P1^0;
sbit s=P3^2;
void main()
{

 IT0=1; //1.設定外部中斷源觸發方式控制位,為1設定為電平觸發。
 EA=1;  //2.開總中斷
 EX0=1; //3.開外部中斷0
while(1)
{
}
}

void exterfunction(void) interrupt 0 using 1
{
 led=~led;
}