新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 關于中斷部分的小結

        關于中斷部分的小結

        作者: 時間:2012-10-27 來源:網絡 收藏
        主要是針對外部,總結外部中斷對特殊功能寄存器的設置以及程序的編寫流程。此外這里重點介紹一些的方法。
        外部中斷信號是由P3口的P3.2和P3.3兩個管腳輸入的。
        外部中斷程序編寫流程:
        一、外部中斷
        在使用外部中斷前,先要設置相關特殊功能寄存器,即過程;
        1.開CPU總中斷:EA=1;
        2.開外部中斷:
        開外部中斷0:EX0=1;
        開外部中斷1:EX1=1;
        3.設置外部中斷觸發方式:
        外部中斷0觸發控制位IT0;
        當IT0=0時,為電平觸發方式
        當IT0=1時,為邊沿觸發方式(下降沿有效)
        外部中斷1觸發控制位IT1(同上);
        4.外部中斷優先級設置(可以不設置)
        PX0=1;
        PX1=1;

        舉例如下:
        void interrupt_init(void) // 中斷
        {
        EA = 1; //開總中斷
        EX0 = 1; //開外部中斷0
        EX1 = 1; //開外部中斷0
        IT0 = 1; //外部中斷0下降沿觸發方式
        IT1 = 0; //外部中斷1電平的觸發方式
        }

        二、主程序
        主程序部分為你需要實現的功能,這部分和中斷幾乎沒什么太大關聯,只不過,在執行主程序時,如果從外部來一個外部中斷信號,不得不放棄現在執行的任務而轉而執行中斷子程序;

        三、中斷子程序
        這部分主要便是對請求中斷成功后進入中斷后,你需要執行什么任務;
        外部中斷子程序寫法如下:
        void INT_0() interrupt 0 using 0 //外部中斷0子程序
        {
        LED0 = ~LED0; //這句話代換成你所需要功能的C代碼
        }
        void INT_1() interrupt 2 using 2 //外部中斷1子程序
        {
        LED1 = 0; //這句話代換成你所需要功能的C代碼
        }

        完整外部中斷例程代碼如下:
        #includereg52.h>
        #define uchar unsigned char
        sbit wr=P3^6;
        sbit LED0 = P1^0;
        sbit LED1 = P1^1;
        void interrupt_init(void) // 中斷初始化
        {
        EA = 1; //開總中斷
        EX0 = 1; //開外部中斷0
        EX1 = 1; //開外部中斷0
        IT0 = 1; //外部中斷0下降沿觸發方式
        IT1 = 0; //外部中斷1電平的觸發方式
        }

        void main(void)
        {
        wr=0; //低電平時第三列為獨立按鍵
        interrupt_init();
        while(1)
        {
        LED1 = 1;
        }
        }

        void INT_0() interrupt 0 using 0 //外部中斷0子程序
        {
        LED0 = ~LED0;
        }

        void INT_1() interrupt 2 using 2 //外部中斷1子程序
        {
        LED1 = 0;
        }
        實現功能:初始燈1和2全滅;
        當按下P3.2對應鍵盤1(矩陣鍵盤第三行第三列),向下降沿觸發外部中斷0子程序,按一次鍵1松手燈1亮,再按一次鍵1松手燈1滅;
        當按下P3.3對應鍵盤2(矩陣鍵盤第四行第三列),送入低電平信號觸發外部中斷1子程序,按下鍵2燈2亮,松手燈2滅。

        中斷的擴展:
        一、定時器擴展為外部中斷源
        在51單片機內部有兩個定時器/計數器T0和T1,在滿足中斷響應的情況下,當T0或T1的計數值從全1(0xFFFF)狀態進入全0(0x0000)時,此時就會產生定時器溢出中斷。
        根據以上分析,我們只需要把計數器的初值設置為0xFFFF,那么只要計數輸入端再來一個脈沖就可以產生溢出中斷申請。設想我們把外部中斷輸入連接到計數器輸入端,就可以利用外部中斷申請的負脈沖產生定時器溢出中斷申請,而轉移到相應中斷服務程序入口地址。只要在(0x000B或0x001B)處存放外部中斷服務子程序,就可以達到目的。
        具體步驟如下:
        1.將定時/計數器T0或T1的計數輸入端(P3.3或P3.4)作為擴展外部中斷請求輸入端。
        2.置定時/計數器T0或T1為工作模式2,計數方式—8位自動裝載方式。
        3.定時/計數器T0或T1的高8位和低8位都預置為全1。
        4.在相應的中斷服務程序入口(0x000B或0x001B)處存放外部中斷服務子程序。

        二、軟件查詢擴展外部中斷源
        當需要的外部中斷源較多,采用第一種方法仍不能滿足實際需求,我們可以采用這種方法。
        設有四個外部中斷源,INT00、INT01、 INT02 、INT03,這四個外部中斷請求源的輸入端通過一個4路的或非門連接到51單片機的/INT0引腳輸入端。只要4個外部中斷請求源中有一個或者一個以上的有效(高電平),就會產生一個負的/INT0信號向51單片機發出中斷申請。
        為了確認在/INT0有效時究竟是INT00、INT01、 INT02 、INT03中哪個發出的中斷申請,可以通過軟件查詢的方法來確認。將四個中斷源輸入端INT00、INT01、 INT02 、INT03分別接到P1.0~P1.3這四個引腳上。一旦響應中斷,在中斷服務程序中CPU通過軟件查詢方法對P1.0~P1.3這四條線的電位進行檢測,以確認提出中斷申請的中斷源。
        當擴展的4個外部中斷源優先級不同時,軟件查詢的順序也應按照優先級的的由高到低順序進行。設擴展的4個外部中斷源的優先級由高到低的順序是INT00到INT03,則軟件查詢順序為P1.0到P1.3。

        51單片機相關文章:51單片機教程




        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 盐池县| 托里县| 奉化市| 胶南市| 仪征市| 手机| 桓台县| 乐昌市| 类乌齐县| 凤凰县| 武宁县| 界首市| 柳州市| 嘉义县| 通渭县| 贡山| 颍上县| 壶关县| 安国市| 威远县| 保靖县| 泗洪县| 阿图什市| 东源县| 扬州市| 罗甸县| 渝北区| 肃宁县| 沅江市| 中西区| 九江县| 湛江市| 咸阳市| 肃北| 静乐县| 明溪县| 资溪县| 南靖县| 原阳县| 金乡县| 周口市|