1. 程式人生 > >【51微控制器實驗】INT0中斷計數

【51微控制器實驗】INT0中斷計數

前言
—中斷源—

  • 52微控制器:6箇中斷源:

  • INT0:外部中斷0,P3.2,引起:低電平、下降沿

    INT1:外部中斷1,P3.3,引起:低電平、下降沿

    T0:定時器/計數器0中斷,由T0計數器計滿回零引起
    T1:定時器/計數器1中斷,由T1計數器計滿回零引起
    T2:定時器/計數器2中斷,由T2計數器計滿回零引起
    TI/RI:序列口中斷,引起:串列埠完成一幀字元傳送/接收
    中斷源及優先順序順序
    優先順序

    —51系列微控制器中用於中斷控制的暫存器為—

  • IE,中斷允許控制暫存器,各位定義如下:

  • (外定0;外定1;串;空空;C)
    EX0(IE.0),外部中斷0允許位;
    ET0(IE.1),定時/計數器T0中斷允許位;
    EX1(IE.2),外部中斷0允許位;
    ET1(IE.3),定時/計數器T1中斷允許位;
    ES (IE.4),序列口中斷允許位;
    ET2(IE.5),定時器/計數器2中斷允許位(T2:51特有)
    EA (IE.7), CPU中斷允許(總允許)位。
    有的晶片IE.5及IE.6沒用定義。
    值為1,開中斷;值為0,關中斷

    中斷允許暫存器IE
  • IP,中斷優先順序控制暫存器,各位定義如下:
  • (外定0;外定1;串定2;空空)
    PX0(IP.0),外部中斷0優先順序設定位;
    PT0(IP.1),定時/計數器T0優先順序設定位;
    PX1(IP.2),外部中斷0優先順序設定位;
    PT1(IP.3),定時/計數器T1優先順序設定位;
    PS (IP.4),序列口優先順序設定位;
    //PT2(IP.5) ,52晶片是無效位,定時/計數器T2優先順序設定位。
    IP.6和IP.7沒有定義。
    中斷優先順序暫存器IP.png


    —中斷巢狀—
     高優先順序能打斷低優先順序-》中斷巢狀;同優先順序則不能,按照預設級別響應,若設定優先順序,則按照設定順序相應。
    —中斷函式—

  • 中斷函式是硬體或者作業系統自動呼叫
    也就是說只要滿足觸發條件,就會自動呼叫中斷函式(此時主函式是停止的)。
    當中斷函式執行完畢,又返回主函式繼續執行主函式。
    然後這樣不斷的迴圈,反正只要是觸發中斷的條件一滿足。
    就會自動進入中斷(前提是你的中斷的配置是正確的)
     
    實驗一
    INT0中斷計數
    流程圖
    INT0中斷
    程式分析

  • 計數按鍵:P3.2引腳(INT0),IE=0x81(1000 0001對應:EA,EX0,ET0,EX1,ET1,ES):允許INT0中斷,

  • IT0=1:將INT0中斷觸發方式設為下降沿觸發:按鍵按下,P3.2由高到低觸發中斷;
    未釋放,則不會持續觸發;
    只有 釋放按鍵後再次按下,才會由跳變再次出發,累加計數值

  • 按鍵識別

    計數鍵:(中斷方式:interrupt 0)
    中斷觸發識別,中斷觸發即表示計數鍵按下,中斷例程EX_INT0將自動呼叫,Count累加,INT0:interrupt 0

    清零鍵(查詢方式 while();)
    while(1);實現,迴圈輪詢,不間斷檢視P3.4是否為0,若為0,清零鍵按下
    擴充套件
    可修改程式碼:交換計數鍵和清零鍵的工作方式。

    程式碼

/*每次按下計數鍵時,觸發INT0中斷,
中斷程式累加計數,
計數值顯示在3只數碼管上,按下清零鍵時數碼管清零。
*/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int

uchar code DSY_CODE[] = {
    0x3f,0x06,0x5b,0x4f,
    0x66,0x6d,0x7d,0x07,
    0x7f,0x6f,0x00
};//0~9的數字編碼,最後一位為黑屏

uint Count = 0;
sbit Clear_Key = P3 ^ 6;

void Show_Count_ON_DSY()//顯示計數值
{
    Display_Buffer[2] = Count / 100;//獲取三個數位
    Display_Buffer[1] = Count % 100 / 10;
    Display_Buffer[0] = Count % 10;

    if (Display_Buffer[2] == 0)//高位為0時不顯示
    {
        Display_Buffer[2] = 0x0a;//0x0a即是10號,對應0x00

        //高位為0時,如果第二位為0,則同樣不顯示
        if (Display_Buffer[2] == 0)
            Display_Buffer[1] = 0x0a;
    }
    P0 = DSY_CODE[Display_Buffer[0]];
    P1 = DSY_CODE[Display_Buffer[1]];
    P2 = DSY_CODE[Display_Buffer[2]];

}

void main()
{
    P0 = 0xff;
    P1 = 0xff;
    P2 = 0xff;
    IE = 0x81;
    IT0 = 1;
    while (1)
    {
        if (Clear_Key == 0)
            Count = 0;
        Show_Count_ON_DSY();
    }
}

void EX_INT0()interrupt 0
{
    Count++;
}

後語
中斷是微控制器裡的重要組成部分,在感覺學習吃力的同時,要掌控好學習進度。(學習時間:大約5小時,注意效率!)