色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 51單片機(jī)之寄存器-3.2單片機(jī)中斷

          51單片機(jī)之寄存器-3.2單片機(jī)中斷

          作者: 時間:2016-11-21 來源:網(wǎng)絡(luò) 收藏
          單片機(jī)中斷之前,先來個通俗的例子。假如今天有快遞來,你要知道快遞什么時候到有兩種方式,第一種,每隔一分鐘你到樓下看快遞到了沒,這樣總有一次能碰到快遞。第二種,快遞來了,給打電話,然后你去取快遞。第一種稱為查詢法,很明顯這種方式很浪費(fèi)體力。第二種就是中斷了,比較輕松。這樣我們來詳細(xì)的探討一下這個過程。假如你在家里正在看電影,忽然電話響了通知你取快遞,于是你把電影暫停,下樓取快遞,然后回來繼續(xù)看電影,如下圖所示
          圖1 日常生活中的中斷?

          這個就是日常生活中的中斷場景。我們再概述一下這個過程,當(dāng)你正在處理某件事情的時候(看電影),外界發(fā)生了比較急的事件請求(電話通知快遞到了), 你暫停當(dāng)前的工作(看電影),轉(zhuǎn)而去處理這個比較急的事件(取快遞),處理完以后,再回到原來的地方,繼續(xù)原來的工作(看電影)。把前面這句話中的”你”換成CPU就是單片機(jī)的中斷過程了。電話鈴響就是中斷源用來通知你(CPU), 然后你(CPU)暫停當(dāng)前事情,去取快遞。取快遞表示CPU進(jìn)入中斷服務(wù)程序,也就是你接受中斷請求源后決定做什么。日常生活中的中斷源多種多樣,比如水燒開了,敲門聲,鬧鐘響了等等。同樣單片機(jī)中也有多種中斷源,STC89C52單片機(jī)有8種中斷源,外部中斷(外部中斷0-3),定時器中斷(0-2),串口中斷. 那么問題又來了,既然這么多中斷源,如果同時發(fā)生應(yīng)該處理哪個呢?比如電話響起的時候,家里的水也燒開了,你該優(yōu)先處理哪個,當(dāng)然要把燒水的先關(guān)掉,這個可能產(chǎn)生危險(xiǎn),因此水燒開了的優(yōu)先級要于取快遞。同樣在單片機(jī)中斷源也有優(yōu)先級高低之分,這樣同時向CPU發(fā)出請求的時候,CPU能判斷回復(fù)哪一個。而且這些中斷源可以通過軟件來設(shè)置,一共可以設(shè)置成四個優(yōu)先級。

          本文引用地址:http://cafeforensic.com/article/201611/319547.htm

          如上表所示,你可以通過IPH,IP來設(shè)置中斷源的優(yōu)先級,比如Timer0通過設(shè)置PT0H,PT0為1,1,那么Timer0就是最高優(yōu)先級3了。這樣又有一個問題,如果現(xiàn)在我把Timer1也設(shè)置成最高優(yōu)先級3,Timer0和Timer1同時向CPU發(fā)出請求,CPU該怎么辦呢?同樣在上表中給出了答案,通過相同優(yōu)先級內(nèi)的查詢次序來解決。每個中斷都有兩個開關(guān),一個總開關(guān)和一個分開關(guān)控制。CPU要能順利進(jìn)入中斷服務(wù)程序,每個中斷對應(yīng)的兩個中斷允許控制位必須打開。如上表中的Timer0中斷允許位ET0/EA,其中EA為總中斷開關(guān),EA如果關(guān)閉,所有中斷均無效,另外ET0為分開關(guān)。關(guān)于中斷中的中斷(中斷嵌套),我們后面討論,現(xiàn)在我們舉個例子體驗(yàn)一下。

          例3-2通過定時器0中斷來控制LED亮1秒,滅1秒

          現(xiàn)在來分析一下這個例子,題目中說要通過定時器中斷來控制LED0。既然是中斷,那么中斷誰?CPU怎么知道發(fā)生中斷了,如何處理?很容易得出如下解決步驟:

          (1) CPU正在干什么(看電影)

          (2) 發(fā)生了什么比較急的事情(快遞來了)

          (3) 如何通知CPU(電話鈴響)

          (4) CPU如何處理(取快遞)

          (5)處理完后回到原來的工作(看電影)

          第1步,CPU正在干什么。這里可以讓CPU什么都不干,或者點(diǎn)亮另外一個LED1等待. 第2步,定時器計(jì)時并溢出。第3步,硬件TF0置1,通知CPU。第4步,CPU如何處理?就是指CPU進(jìn)入中斷服務(wù)程序。在中斷服務(wù)程序中,我們判斷如果定時1秒則點(diǎn)亮或者熄滅LED0. 這里需要注意定時器0的中斷號為interrupt 1,其他中斷號如下:

          • void MyInt0(void) interrupt 0;//外部中斷0
          • //MyInt0中斷函數(shù)名,可以自己修改,interrupt 0中斷號,不能修改,以下類似
          • void MyTimer0(void) interrupt 1;//定時器0中斷
          • void MyInt1(void) interrupt 2;//外部中斷1
          • void MyTimer1(void) interrupt 3;//定時器1中斷
          • void MyUART(void) interrupt 4;//串口中斷
          • void MyTimer2(void) interrupt 5;//定時器2中斷
          • void MyInt2(void) interrupt 6;//外部中斷2
          • void MyInt3(void) interrupt 7;//外部中斷3
          參考代碼如下:
          • #include "reg52.h"
          • void timer0_init(void);
          • sbit LED0=P1^0;//設(shè)置LED0引腳
          • sbit LED1=P1^6;//設(shè)置LED1引腳
          • unsigned char i=0;
          • void main(void)
          • {
          • ET0=1;//打開定時器0中斷
          • EA=1;//打開總中斷
          • timer0_init();//發(fā)生了什么事件
          • while(1)//CPU正在干什么?
          • {
          • LED0=0;
          • }
          • }
          • void timer0_init(void)
          • {
          • TMOD=0X01;//定時器模式選擇16bit
          • TH0=0X4C;
          • TL0=0X00;//TH0,TL0初始值
          • TR0=1;//開啟定時器
          • }
          • void timer0_intrrupt () interrupt 1//定時器0中斷服務(wù)程序
          • {
          • TH0=0X4C;
          • TL0=0X00;
          • i++;
          • if(i==20)//定時次數(shù)達(dá)到20,那么總定時為1秒
          • {
          • i=0;
          • LED1=~LED1;
          • LED0=1;
          • }
          • }



          評論


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

          關(guān)閉