在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 單片機(jī)外部中斷詳解及程序

            單片機(jī)外部中斷詳解及程序

            作者: 時間:2016-12-01 來源:網(wǎng)絡(luò) 收藏
            單片機(jī)在自主運(yùn)行的時候一般是在執(zhí)行一個死循環(huán)程序,在沒有外界干擾(輸入信號)的時候它基本處于一個封閉狀態(tài)。比如一個電子時鐘,它會按時、分、秒的規(guī)律來自主運(yùn)行并通過輸出設(shè)備(如液晶顯示屏)把時間顯示出來。在不需要對它進(jìn)行調(diào)校的時候它不需要外部干預(yù),自主封閉地運(yùn)行。如果這個時鐘足夠準(zhǔn)確而又不掉電的話,它可能一直處于這種封閉運(yùn)行狀態(tài)。但事情往往不會如此簡單,在時鐘剛剛上電、或時鐘需要重新校準(zhǔn)、甚至?xí)r鐘被帶到了不同的時區(qū)的時候,就需要重新調(diào)校時鐘,這時就要求時鐘就必須具有調(diào)校功能。因此單片機(jī)系統(tǒng)往往又不會是一個單純的封閉系統(tǒng),它有些時候恰恰需要外部的干預(yù),這也就是外部中斷產(chǎn)生的根本原由。
            實(shí)際上在第二個示例演示中,就已經(jīng)舉過有按鍵輸入的例子了,只不過當(dāng)時使用的方法并不是外部中斷,而是用程序查詢的方式。下面就用外部中斷的方法來改寫一下第二個示例中,通過按鍵來更改閃爍速度的例子(第二個例子)。電路結(jié)構(gòu)和接線不變,僅把程序改為下面的形式。
            #include
            unsigned int t=500; //定義一個全局變量t,并設(shè)定初始值為500次
            //===========延時子函數(shù),在8MHz晶振時約1ms=============
            void delay_ms(unsigned int k)
            {
            unsigned int i,j;
            for(i=0;i{
            for(j=0;j<1140;j++)
            ;
            }
            }
            //============主函數(shù)==================================
            void main( void )
            {
            DDRB = 0xFF; //設(shè)置端口B為輸出方向
            PORTB = 0xFF; //設(shè)置端口B的輸出為全高電平
            DDRD = 0x00; //設(shè)置端口D為輸入方向
            PORTD = 0xFF; //設(shè)定端口D為內(nèi)部上拉方式,無信號輸入時處于高電平狀態(tài)
            MCUCR = 0x0A; //設(shè)定INT0、INT1為下降沿觸發(fā)
            GICR = 0xC0; //使能INT0、INT1中斷
            SREG = 0x80; //使能總中斷
            while(1)
            {
            PORTB = 0x55; //讓接在端口B上的LED顯示01010101
            delay_ms(t); //延時t個ms
            PORTB = 0xAA; //讓接在端口B上的LED顯示01010101
            delay_ms(t); //延時t個ms
            }
            }
            //============中斷函數(shù)(外部0)==========================
            #pragma vector = INT0_vect
            __interrupt void INT0_Server(void)
            {
            t = 100; //設(shè)定t的值為100次
            }
            //============中斷函數(shù)(外部1)==========================
            #pragmavector= INT1_vect
            __interrupt void INT1_Server(void)
            {
            t = 500; //設(shè)定t的值為500次
            }
            把上述程序進(jìn)行編譯并下載到單片機(jī)中,可以看到結(jié)果與第二個示例中的完全一致。下面就來分析一下鍵盤中斷的程序原理。
            在分析程序之前,先來了解一下什么叫“外部中斷”。前面已講述過,在沒有打擾的情況下,單片機(jī)的程序在封閉狀態(tài)下自主運(yùn)行,但如果在某一時刻需要響應(yīng)一個外部事件(比如有按鍵被按下),這時就需要用外部中斷。具體來講,外部中斷就是在單片機(jī)的一個引腳上,由于外部因素導(dǎo)致了一個電平的變化(比如由高變低),而通過捕獲到這個變化,單片機(jī)內(nèi)部自主執(zhí)行的程序就被暫時打斷,轉(zhuǎn)而去執(zhí)行相應(yīng)的中斷處理程序,執(zhí)行完后又回到原來中斷的地方繼續(xù)執(zhí)行原程序。這個引腳上的電平變化,就申請了一個外部中斷事件,而這個能申請外部中斷的引腳就是外部中斷的觸發(fā)引腳。在上面的例子中,可以看到兩個按鍵S1、S2被接到了ATMega16的PD3和PD2引腳,而這兩個引腳正是該單片機(jī)的兩個外部中斷(INT1和INT0)的觸發(fā)引腳(第二功能)。當(dāng)按鍵沒有按下時,這兩個引腳都為高電平(執(zhí)行過PORTD=0xFF),當(dāng)按鍵被按下時,引腳電平跳變?yōu)榈碗娖?,這時若單片機(jī)設(shè)置成允許中斷申請,就會觸發(fā)外部中斷事件,從而轉(zhuǎn)去執(zhí)行中斷服務(wù)程序。明白了這個過程之后,接下來就可以分析程序了。
            程序執(zhí)行后,主程序就一直在不停的運(yùn)行while(1)內(nèi)的這個死循環(huán),讓LED以t=500ms的初始值來交替閃爍,直到有外部中斷來打斷它。假設(shè)某一時刻按鍵S2被按下,這時由于引腳PD2上的電平突然被拉低,申請了一個外部中斷0(INT0),這時的程序就轉(zhuǎn)去執(zhí)行外部中斷0的中斷服務(wù)程序(即__interrupt void INT0_Server(void)函數(shù))。這時全局變量t的值被該函數(shù)重新賦值為100(即延時為100ms),完成后又回到主函數(shù)中的while(1)內(nèi)去繼續(xù)執(zhí)行,因此LED閃爍的速度就變快了。
            觀察程序可看出,如果沒有中斷去調(diào)用中斷服務(wù)子程序,在主程序中是沒有語句去調(diào)動它的。也就是說如果沒有外部中斷,中斷服務(wù)子程序(即__interrupt void INT0_Server(void)函數(shù))是永遠(yuǎn)不會被執(zhí)行的。這也說明,中斷服務(wù)子程序是一類特殊的子程序,它不能被主程序調(diào)用,只能被中斷申請調(diào)用。因此,中斷服務(wù)子程序有它固定的格式和寫法。在不同的編譯系統(tǒng)中的寫法不完全一樣,下面給出IAR下的中斷服務(wù)子程序的格式。
            #pragmavector= INT0_vect
            __interrupt void INT0_Server(void)
            {
            中斷服務(wù)程序代碼
            }
            以上是固定格式,除斜體部分外,其余部分不可更改。斜體部分中的INT0_vect表示中斷的向量號,不同的中斷名稱不一樣(原型在頭文件iom16.h中)。斜體部分中的INT0_Server是中斷函數(shù)的名稱,是由開發(fā)者自己定義的。雖然可以自定義,但名稱還是要取得“見名知義”,這樣一看就知道是什么中斷服務(wù)了。


            評論


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

            關(guān)閉