新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 第8課 單片機中斷

        第8課 單片機中斷

        作者: 時間:2016-12-01 來源:網絡 收藏
        這15寄存器中,根據前面講的51單片機內部四大功能模塊又可分為四大部分:
        I/O口相關:P1、P2、 P3、 P4
        中斷相關:IP、 IE
        定時器相關:TMOD、 TCON、 TL0、TH0、TL1、TH1
        串口通信相關:SCON、 PCON、 SBUF
        需要注意的是,在這四大部分中,除I/O口操作相關的P1、P2、P3、P4相對獨立外,其它11個寄存器使用時通常會相互結合使用,也就是說中斷、定時器和串口通信三者通常會結合起來用,如外部中斷時,設置邊沿觸發還是電平觸發需設置TCON寄存器中的TR0和TR1位,使用定時器時又可能用到中斷,而串口通信時設置波特率又直接跟定時器相關。
        這節里因為我們主要介紹外部中斷0,所以跟外部中斷相關的寄存器就只有IE、IP、TCON三個,而對于初學都來說,IP寄存器(中斷優先寄存器)一般用不到,所里這里只介紹IE(中斷允許寄存器)和TCON(定時器控制寄存器)。
        (1)IE中斷允許寄存器
        EA:EA=0時,所有中斷禁止(即不產生中斷);EA=1時,各中斷的產生由個別的允許位決定
        ET2:定時2溢出中斷允許(8052用1允許, 0禁止)
        ES:串行口中斷允許(1允許, 0禁止)
        ET1):定時1中斷允許(1允許, 0禁止)
        EX1:外中斷INT1中斷允許(1允許, 0禁止)
        ET0:定時器0中斷允許(1允許, 0禁止)
        EX0:外部中斷INT0的中斷允許(1允許, 0禁止)
        (2)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”IE1(邊沿觸發方式)。
        IT1:外部中斷源1觸發方式控制位。IT1=0,外部中斷1程控為電平觸發方式,當INT1(P3.3)輸入低電平時,置位IE1。此位為1設置為電平觸發,為0設置為下降沿觸發。
        IE0:外部中斷0請示源(INT0,P3.2)標志。IE0=1,外部中斷1正在向CPU請求中斷,當CPU響應該中斷時由硬件清“0”IE0(邊沿觸發方式)。
        IT0:外部中斷源0觸發方式控制位。IT0=0,外部中斷1程控為電平觸發方式,當INT0(P3.2)輸入低電平時,置位IE0。此位為1設置為電平觸發,為0設置為下降沿觸發。
        四、外部中斷程序舉例
        明白了寄存器后,下面我以外部中斷0為例寫一個程序,程序的功能為:在主程序里L1燈常亮,當外部腳P32檢測到有下降沿時,L1燈熄滅。
        我們先來分析下該程序的書寫思路。首先在主程序里我們應該讓L1燈常亮;然后需要對中斷相關的寄存器進行設置,主要為打開總中斷、打開外部中斷0,并且還需要設置外部中斷為低電平觸發方式;最后我們要寫一個中斷子函數。
        相應的程序如例一所示。
        例一 外部中斷0程序
        #include
        #define uint unsigned int
        #define uchar unsigned char
        sbit D1=P1^0;
        void delay(uint z);
        void main()
        {
        IT0=0;//設置為0低電平觸發
        Eaa=1;//開總中斷
        EX0=1;//開外部中斷0
        while(1)
        {
        D1=1;
        }
        }
        void exter0() interrupt 0
        {
        D1=0;
        delay(500);//下降沿觸發時如果不延時觀察不到再現象
        }
        void delay(uint z)
        {
        uint x,y;
        for(x=z;x>0;x--)
        for(y=110;y>0;y--);
        }
        下載到實驗板現象如圖5所示。
        這里要注意的中斷子函數的寫法。51中斷子函數的格式如下:
        void函數名()interrupt 中斷號
        {
        中斷服務子程序的內容
        }
        中斷函數不能返回任何值,所以前面用void;后面緊跟函數名,名字可以隨便取,但不要與C語言中的關鍵字相同;中斷函數不帶任何參數,所以函數名后面的小括號內為空;中斷號是指幾個中斷源的序號,每個中斷源的中斷序號如圖6所示。這個中斷號是編譯器識別不同中斷的的唯一,必須書寫正確,否者單片機進不了中斷子程序
        圖6 52單片機的中斷號
        上一頁 1 2 下一頁

        關鍵詞: 單片機中

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 桂东县| 龙川县| 贵定县| 营山县| 阜康市| 海林市| 吴堡县| 海宁市| 通许县| 城口县| 洛南县| 抚顺县| 台安县| 鞍山市| 翼城县| 明星| 富川| 工布江达县| 伊宁县| 周至县| 资中县| 江阴市| 阿合奇县| 汾西县| 剑阁县| 原平市| 新津县| 文成县| 邻水| 邯郸市| 临朐县| 图木舒克市| 南川市| 共和县| 余姚市| 将乐县| 元阳县| 水富县| 屯门区| 托克逊县| 平顺县|