<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 關(guān)于中斷部分的小結(jié)

          關(guān)于中斷部分的小結(jié)

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

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

          二、主程序
          主程序部分為你需要實現(xiàn)的功能,這部分和中斷幾乎沒什么太大關(guān)聯(lián),只不過,在執(zhí)行主程序時,如果從外部來一個外部中斷信號,不得不放棄現(xiàn)在執(zhí)行的任務(wù)而轉(zhuǎn)而執(zhí)行中斷子程序;

          三、中斷子程序
          這部分主要便是對請求中斷成功后進入中斷后,你需要執(zhí)行什么任務(wù);
          外部中斷子程序?qū)懛ㄈ缦拢?BR>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下降沿觸發(fā)方式
          IT1 = 0; //外部中斷1電平的觸發(fā)方式
          }

          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;
          }
          實現(xiàn)功能:初始燈1和2全滅;
          當(dāng)按下P3.2對應(yīng)鍵盤1(矩陣鍵盤第三行第三列),向下降沿觸發(fā)外部中斷0子程序,按一次鍵1松手燈1亮,再按一次鍵1松手燈1滅;
          當(dāng)按下P3.3對應(yīng)鍵盤2(矩陣鍵盤第四行第三列),送入低電平信號觸發(fā)外部中斷1子程序,按下鍵2燈2亮,松手燈2滅。

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

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

          51單片機相關(guān)文章:51單片機教程




          關(guān)鍵詞: 中斷部分 中斷擴展 初始化

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();