第5章單片機(jī)的中斷系統(tǒng)_第1頁
第5章單片機(jī)的中斷系統(tǒng)_第2頁
第5章單片機(jī)的中斷系統(tǒng)_第3頁
第5章單片機(jī)的中斷系統(tǒng)_第4頁
第5章單片機(jī)的中斷系統(tǒng)_第5頁
已閱讀5頁,還剩39頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第5章單片機(jī)的中斷系統(tǒng)51單片機(jī)的中斷系統(tǒng)是8位機(jī)中功能較強(qiáng)的,可以提供5個(gè)中斷源(52系列是6個(gè)),具有兩個(gè)中斷優(yōu)先級,可以實(shí)現(xiàn)兩級中斷嵌套。5.1中斷的基本知識

5.1.1中斷源及中斷結(jié)構(gòu)MCS-51單片機(jī)的5個(gè)中斷源分為兩種類型:一類是外部中斷源,包括

;一類是內(nèi)部中斷源,包括兩個(gè)定時(shí)器/計(jì)數(shù)器(T0和T1)的溢出中斷和串行口的發(fā)送/接收中斷。MCS-51單片機(jī)中斷系統(tǒng)結(jié)構(gòu)圖5-1所示。1講圖5-1MCS-51單片機(jī)中斷系統(tǒng)結(jié)構(gòu)

1.外部中斷

它們的中斷請求信號有效方式分為電平觸發(fā)和脈沖觸發(fā)兩種。電平方式是低電平有效,脈沖方式為負(fù)跳變觸發(fā)有效。對于電平方式,只要檢測到低電平信號即為有效申請。對于脈沖方式,則需要比較兩次檢測到的信號,才能確定中斷請求信號是否有效。中斷請求信號高低電平的狀態(tài)都應(yīng)該至少維持一個(gè)機(jī)器周期,以確保電平變化能被單片機(jī)檢測到。2.內(nèi)部中斷除外部中斷外,內(nèi)部還有TF0、TF1、TI/RI分別為定時(shí)/計(jì)數(shù)器溢出中斷和串行口的發(fā)送/接收中斷的中斷源。5.1.2中斷控制

MCS-51單片機(jī)設(shè)置了4個(gè)專用寄存器用于中斷控制,用戶通過設(shè)置其狀態(tài)來管理中斷系統(tǒng)。1.定時(shí)器控制寄存器(TCON)TCON的格式如圖5-2所示。

IT0IE0IT1IE1TR0TF0TR1TF1D7D6D5D4D3D2D1D0TCON(88H)圖5-2TCON的格式在該寄存器中,TR1、TR0用于定時(shí)/計(jì)數(shù)器的啟動(dòng)控制,其余6位用于中斷控制,其作用如下:1)IT0為外中斷0請求信號方式控制位。IT0=1為脈沖觸發(fā)方式(負(fù)跳變有效),IT0=0為電平方式(低電平有效)。2)IE0為外部中斷0請求標(biāo)志位。當(dāng)CPU檢測到(P3.2)端有中斷請求信號時(shí),由硬件置位,使IE0=1請求中斷,中斷響應(yīng)后轉(zhuǎn)向中斷服務(wù)程序時(shí),由硬件自動(dòng)清零。3)IT1為外部中斷1請求信號方式控制位,其作用同IT0。4)IE1為外部中斷1請求標(biāo)志位,其作用同IE0。5)TF0(TF1)為定時(shí)/計(jì)數(shù)器溢出標(biāo)志位,此標(biāo)志的作用將在5.3節(jié)說明。

2.串行口控制寄存器(SCON)SCON的格式如圖5-3所示。RITIRB8TB8RENSM2SM1SM0D7D6D5D4D3D2D1D0TCON(98H)圖5-3SCON的格式

SCON中的高6位用于串行口控制,低2位(RI、TI)用于中斷控制,其作用如下:1)TI為串行口發(fā)送中斷請求標(biāo)志位,發(fā)送完一幀串行數(shù)據(jù)后,由硬件置1,其清零必須由軟件完成。2)RI為串行口接收中斷請求標(biāo)志位,接收完一幀串行數(shù)據(jù)后,由硬件置1,其清零必須由軟件完成。

在MCS-51單片機(jī)串行口中,以TI和RI的邏輯“或”作為一個(gè)內(nèi)部中斷源,二者之一置位就可以產(chǎn)生串行口中斷請求,然后在中斷服務(wù)程序中測試這兩個(gè)標(biāo)志位,以決定是發(fā)送中斷還是接收中斷。3.中斷允許控制寄存器(IE)中斷允許控制寄存器的格式如圖5-4所示。EX0ET0EX1ET1ES————EAD7D6D5D4D3D2D1D0IE(A8H)圖5-4中斷允許控制寄存器的格式

寄存器中用于控制中斷的共6位,實(shí)現(xiàn)中斷管理,其作用如下。EA為中斷允許總控制位。EA=1時(shí),CPU開放中斷;EA=0時(shí),CPU屏蔽所有中斷請求。

ES、ET1、EX1、ET0、EX0為對應(yīng)的串行口中斷、定時(shí)/計(jì)數(shù)器1中斷、外部中斷1中斷、定時(shí)器/計(jì)數(shù)器0中斷、外部中斷0中斷的中斷允許位。對應(yīng)位為1時(shí),允許其中斷,對應(yīng)位為0時(shí),禁止其中斷。MCS-51單片機(jī)中斷系統(tǒng)的管理是由中斷允許總控制EA和各中斷源的控制位聯(lián)合作用實(shí)現(xiàn)的,缺一不可。MCS-51單片機(jī)系統(tǒng)復(fù)位后,IE各位均清零,即禁止所有中斷。4.中斷優(yōu)先級控制寄存器(IP)中斷優(yōu)先級控制寄存器的格式如圖5-5所示。PX0PT0PX1PT1PS——————D7D6D5D4D3D2D1D0IP(B8H)圖5-5中斷優(yōu)先級控制寄存器的格式圖5-5中斷優(yōu)先級控制寄存器的格式MCS-51單片機(jī)規(guī)定了兩個(gè)中斷優(yōu)先級:高級中斷和低級中斷。用中斷優(yōu)先級寄存器(IP)的5位狀態(tài)管理5個(gè)中斷源的優(yōu)先級別,即PS、PT1、TX1、PT0、PX0分別對應(yīng)串行口中斷、定時(shí)器/計(jì)數(shù)器1中斷、外部中斷1中斷、定時(shí)器/計(jì)數(shù)器0中斷、外部中斷0中斷。當(dāng)相應(yīng)位為1時(shí),設(shè)置其為高級中斷;相應(yīng)位為0時(shí),設(shè)置其為低級中斷。5.1.3中斷優(yōu)先級結(jié)構(gòu)MCS-51中斷系統(tǒng)具有兩級優(yōu)先級(由IP寄存器把各中斷源的優(yōu)先級分為高優(yōu)先級和低優(yōu)先級),它們遵循下列兩條基本原則:1).為了實(shí)現(xiàn)中斷嵌套,高優(yōu)先級中斷請求可以中斷低優(yōu)先級的中斷服務(wù),反之,則不允許;2).同等優(yōu)先級中斷源之間不能中斷對方的中斷服務(wù)過程。為了實(shí)現(xiàn)上述兩條原則,中斷系統(tǒng)內(nèi)部包含兩個(gè)不可尋址的優(yōu)先級狀態(tài)觸發(fā)器。其中一個(gè)用來指示某個(gè)高優(yōu)先級的中斷源正在得到服務(wù),并阻止所有其他中斷的響應(yīng);另一個(gè)觸發(fā)器則指出某低優(yōu)先級的中斷正得到服務(wù),所有同級的中斷都被阻止,但不阻止高優(yōu)先級中斷源。當(dāng)同時(shí)收到幾個(gè)同一優(yōu)先能的中斷時(shí),響應(yīng)哪一個(gè)中斷源取決于內(nèi)部查詢順序。其優(yōu)先級排列如圖5-6所示。中斷源外部中斷0定時(shí)器/計(jì)數(shù)器0溢出定時(shí)器/計(jì)數(shù)器1溢出串行口外部中斷1同級內(nèi)中斷優(yōu)先級別最高最低圖5-6中斷優(yōu)先級排列5.1.4中斷服務(wù)程序入口地址

MCS-51單片機(jī)5個(gè)中斷源的中斷服務(wù)程序入口地址如表5-1所示。表5-1MCS-51中斷服務(wù)程序入口地址表5.1.5中斷請求的撤除在中斷請求被響應(yīng)前,中斷源發(fā)出的中斷請求由CPU鎖存在特殊功能寄存器TCON和SCON的相應(yīng)中斷標(biāo)志位中。一旦某個(gè)中斷請求得到響應(yīng),CPU必須把它的響應(yīng)標(biāo)志位復(fù)位成0狀態(tài),否則MCS-51就會(huì)因中斷未能得到及時(shí)撤除而重復(fù)響應(yīng)同一中斷請求,這是絕對不允許的。MCS-51單片機(jī)有5個(gè)中斷源,但實(shí)際上只分屬于3種中斷類型。這3種類型是:外部中斷、定時(shí)器溢出中斷和串行口中斷。對于這3種中斷類型的中斷請求,其撤除方法是不同的。1.定時(shí)器溢出中斷請求的撤除TF0和TF1是定時(shí)器溢出中斷標(biāo)志位,它們因定時(shí)器溢出中斷請求的輸入而置位,因定時(shí)器溢出中斷得到響應(yīng)而自動(dòng)復(fù)位成0狀態(tài)。因此,定時(shí)器溢出中斷源的中斷請求是自動(dòng)撤除的,用戶根本不必專門為它們撤除。

2.串行口中斷請求的撤除TI和RI是串行口中斷的標(biāo)志位,中斷系統(tǒng)不能自動(dòng)將它們撤除,這是因?yàn)镸CS-51進(jìn)入串行口中斷服務(wù)程序后常需要對它們進(jìn)行檢測,以測定串行口發(fā)生了接收中斷還是發(fā)送中斷。為了防止CPU再次響應(yīng)這類中斷,用戶應(yīng)在中斷服務(wù)程序的適當(dāng)位置處通過指令將它們撤除:CLRTI;撤除發(fā)送中斷

CLRRI;撤除接收中斷若采用字節(jié)指令,則也可采用如下指令:ANLSCON,#0FCH;撤除發(fā)送和接收中斷或采用位判斷清除指令:

JBCTI,rel;判斷TI標(biāo)志是否置位,若置位則跳轉(zhuǎn)并撤除發(fā)送中斷

JBCRI,rel;判斷RI標(biāo)志是否置位,若置位則跳轉(zhuǎn)并撤除接收中斷

3.外部中斷的撤除外部中斷請求有兩種觸發(fā)方式:電平觸發(fā)和負(fù)邊沿觸發(fā)。對于這兩種不同的中斷觸發(fā)方式,MCS-51撤除它們的中斷請求的方法是不相同的。在負(fù)邊沿觸發(fā)方式下,外部中斷標(biāo)志IE0和IE1是依靠CPU兩次檢測

上觸發(fā)電平狀態(tài)而設(shè)置的。因此,芯片設(shè)計(jì)者使CPU在響應(yīng)中斷時(shí)自動(dòng)復(fù)位IE0或IE1,就可撤除

上的中斷請求,因?yàn)橥獠恐袛嘣丛谥袛喾?wù)程序時(shí)是不可能再在

上產(chǎn)生負(fù)邊沿,而使相應(yīng)的中斷標(biāo)志IE0或IE1置位。

在電平觸發(fā)方式下,外部中斷標(biāo)志IE0和IE1是依靠CUP檢測或上低電平而置位的。盡管CPU響應(yīng)中斷時(shí)相應(yīng)中斷標(biāo)志IE0或IE1,能自動(dòng)復(fù)位成0狀態(tài),但若外部中斷源不能及時(shí)撤除它在或上的低電平,就會(huì)再次使已經(jīng)變0的中斷IE0或IE1置位,這是絕對不允許的。因此,電平觸發(fā)型外部中斷請求的撤除必須使或上的低電平隨著其中斷被CPU響應(yīng)而變?yōu)楦唠娖?。一種可供采用的電平型外部中斷的撤除電路如圖5-7所示。INT08051P1.0QDSDCP1外部中斷信號圖5-7電平型外部中斷的撤除電路由圖可見,當(dāng)外部中斷源產(chǎn)生中斷請求時(shí),D觸發(fā)器的復(fù)位成0狀態(tài),Q端的低電平被送到

,該低電平被8051檢測后就使中斷標(biāo)志IE0置1。8051響應(yīng)

上的中斷請求可使

中斷服務(wù)程序執(zhí)行,故可以在中斷服務(wù)程序開頭安排如下程序來使

上的電平拉高。INSVR:ORLP1,#01H

ANL

P1,#0FEH CLR

IE0

… END8051執(zhí)行上述程序就可使P1.0上產(chǎn)生一個(gè)寬度為兩個(gè)機(jī)器周期的負(fù)脈沖。在該負(fù)脈沖作用下,D觸發(fā)器被置位成1狀態(tài),

上的電平也因此而變高,從而撤除了其上的中斷請求。5.1.6中斷系統(tǒng)的初始化MCS-51中斷系統(tǒng)功能,是可以通過上述特殊功能寄存器進(jìn)行統(tǒng)一管理的,中斷系統(tǒng)初始化是指對這些特殊功能的寄存器中各控制位進(jìn)行賦值。中斷系統(tǒng)初始化步驟如下:1).置位相應(yīng)中斷源的中斷允許;2).設(shè)定所有中斷源的中斷優(yōu)先級;

3).若為外部中斷,則應(yīng)規(guī)定低電平還是負(fù)邊沿的中斷觸發(fā)方式。例如,用

為低電平觸發(fā)的中斷系統(tǒng)初始化程序。

1.采用位操作指令

SETBEA; SETBEX0;開

中斷

中斷 SETBPX0;令

高優(yōu)先級 CLRIT0;

電平觸發(fā)2.采用字節(jié)操作指令

MOVIE,#81H;開

中斷 ORLIP,#01H;令

為高優(yōu)先級

ORLTCON,#0FEH;令

電平觸發(fā)

顯然,采用位操作指令進(jìn)行中斷系統(tǒng)初始化是比較簡單的。因?yàn)橛脩舨槐赜涀「骺刂莆辉诩拇嫫髦械奈恢?,只需按各控制位名稱來設(shè)置,而各控制位名稱是比較容易記憶的。5.2中斷的編程及應(yīng)用實(shí)例

C51語言編譯器支持在C語言源程序中直接編寫51單片機(jī)的中斷服務(wù)函數(shù)程序,從而減輕了采用匯編語言編寫中斷服務(wù)程序的煩瑣程序。為了能在C語言源程序中直接編寫中斷服務(wù)函數(shù),C51語言編譯器對函數(shù)的定義有所擴(kuò)展,增加了一個(gè)擴(kuò)展關(guān)鍵字interrupt。關(guān)鍵字interrupt是函數(shù)定義時(shí)的一個(gè)選項(xiàng),加上這個(gè)選項(xiàng)即可將函數(shù)定義成中斷服務(wù)函數(shù)。

定義中斷服務(wù)函數(shù)的一般形式為:

函數(shù)類型函數(shù)名(形式參數(shù)表)interruptn[usingm]interrupt后面的n是中斷號,n的取值范圍為0~31。編譯器從8n+3處產(chǎn)生中斷向量,具體的中斷號n和中斷向量取決于不同的51系列單片機(jī)芯片。對于MCS-51單片機(jī)而言,外部中斷0中斷、定時(shí)器/計(jì)數(shù)器0溢出中斷、外部中斷1中斷、定時(shí)器/計(jì)數(shù)器1溢出中斷、串行口發(fā)送/接收中斷對應(yīng)的中斷號分別為0、1、2、3、4。using后面的m是選擇哪個(gè)工作寄存器區(qū),分別為0、1、2、3。

【例5-1】外部中斷在本實(shí)例中,首先通過P1.7口點(diǎn)亮發(fā)光二極管,然后外部輸入一脈沖串,則發(fā)光二極管亮、暗交替。電路如圖5-8所示。+5VP1.7AT89C51圖5-8發(fā)光二極管交替亮、暗

編寫程序如下:

#include<reg51.h>sbitP1_7=P1^7;voidinterrupt0(

)interrupt0using0//定義定時(shí)器0{ P1_7=!P1_7;}voidmain(

){ EA=1; //開中斷 IT0=1; //外部中斷0脈沖觸發(fā) EX0=1; //外部中斷0 P1_7=0; do

{

} while(1);}

【例5-2】如圖5-9所示,8只LED陰極接至單片機(jī)P0口,兩開關(guān)S0、S1分別接至單片機(jī)引腳P3.2和P3.3。

編寫程序控制LED狀態(tài):按下S0后,如果8只LED為熄滅狀態(tài),則點(diǎn)亮,如果8只LED為點(diǎn)亮狀態(tài),則保持;按下S1后,不管8只LED是熄滅狀態(tài)還是點(diǎn)亮狀態(tài),都變?yōu)殚W爍狀態(tài)。P0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.78051

P3.2

P3.3…+5V圖5-9利用中斷控制發(fā)光二極管2講S0S1程序代碼如下:#include<reg51.h>voiddelay(unsignedintd)

//定義延時(shí)子函數(shù){ while(--d>0);}voidmain(){ P0=0xff; //熄滅LED EA=1; //開總中斷 EX0=1; //開外中斷0 EX1=1; //開外中斷1 IT0=1; //外中斷0脈沖觸發(fā)方式 IT1=1; //外中斷1脈沖觸發(fā)方式 for(;;) //延時(shí)等待中斷發(fā)生 {;}}

voidINT0_ISR(

)interrupt0//外中斷0中斷服務(wù)函數(shù){ P0=0x00; PX0=0; PX1=1;}voidINT1_ISR(

)interrupt2//外中斷1中斷服務(wù)函數(shù){ while(1) {

delay(5000);

P0=0x00;

delay(5000);

P0=0xff; }

}

在本例中,外中斷0、外中斷1均設(shè)為脈沖觸發(fā)方式,且為滿足功能要求。注意:中斷的優(yōu)先級別是不同的

【例5-3】利用外中斷控制外設(shè)的數(shù)據(jù)傳送如圖5-10所示,外設(shè)數(shù)據(jù)經(jīng)P1口輸入單片機(jī),每準(zhǔn)備好一個(gè)數(shù)據(jù),發(fā)出選通信號,使觸發(fā)器輸出1再經(jīng)非門得0至外中斷/INT0,向CPU發(fā)出中斷請求,CPU響應(yīng)這個(gè)中斷請求后,在中斷處理程序中先撤除中斷請求信號,(通過P3.0=0,使/INT0=1),再由P1口輸入數(shù)據(jù)到單片機(jī)內(nèi)部。P1P3.0INT0——8051選通信號1QCLRDCLK+5V數(shù)據(jù)

圖5-10利用中斷控制數(shù)傳送程序代碼如下:#include<reg51.h>unsignedchartemp; //定義臨時(shí)變量,來存取送到P1口的數(shù)據(jù)sbitP3_0=P3^0;

//定義位變量voidmain(

){ P3_0=1; //初始化外中斷0引腳,其為高電平 EA=1; //開總中斷 EX0=1; //開外中斷0 IT0=1; //外中斷脈沖觸發(fā)方式 for(;;) //延時(shí)等待中斷發(fā)生 {;}}voidINT0_ISR()interrupt0

//外中斷0中斷服務(wù)函數(shù){ P3_0=0; //恢復(fù)外中斷0引腳電平,除中斷請求信號 P1=0xff; //初始化P1 temp=P1; //讀取送至P1口的數(shù)據(jù) …}

MCS-51單片機(jī)的外部中斷源只有兩個(gè),當(dāng)需要擴(kuò)展時(shí),可以采用例5-4、例5-5、例5-6的方法進(jìn)行外部中斷源的擴(kuò)展?!纠?-4】利用定時(shí)/計(jì)數(shù)器擴(kuò)展外部中斷。利用定時(shí)/計(jì)數(shù)器擴(kuò)展外部中斷源,是把定時(shí)/計(jì)數(shù)器溢出中斷做成外部中斷,即將定時(shí)/計(jì)數(shù)器設(shè)置為計(jì)數(shù)模式,然后把信號接到計(jì)數(shù)器相應(yīng)的引腳上(T0或T1)。為了使每出現(xiàn)一個(gè)從高到低的脈沖時(shí)都產(chǎn)生一個(gè)中斷,可以把定時(shí)器設(shè)置為自動(dòng)重裝模式,令重裝值為FFH。當(dāng)計(jì)時(shí)器檢測到從高到低的脈沖時(shí),定時(shí)器將溢出,這時(shí)將產(chǎn)生一個(gè)中斷請求。程序代碼如下:

#include<reg51.h>

voidmain(void){ ... TMOD=0x66; //兩個(gè)定時(shí)/計(jì)數(shù)器都設(shè)置成8位模式

TH1=0xff; //設(shè)定重裝值 TH0=0xff; TL0=0xff; TL1=0xff; TCON=0x50; //開始計(jì)數(shù) IE=0x9f; //中斷使能 ...}/******************************************定時(shí)器0中斷服務(wù)程序******************************************/voidtimer0_int(void)interrupt1{ ... } /******************************************定時(shí)器1中斷服務(wù)程序******************************************/voidtimer1_int(void)interrupt3{ while(!TI) {...}}

這種方法還是有一定的限制的。首先,它只能是邊沿觸發(fā),所以當(dāng)需要的是一個(gè)電平觸發(fā)的中斷時(shí),就要在中斷中不斷地對T0或T1進(jìn)行采樣,直到它們變?yōu)楦?。其次,檢測到下降沿和產(chǎn)生終端之間一個(gè)指令周期的延時(shí),這是因?yàn)樵跈z測到下降沿一個(gè)指令周期之后,計(jì)數(shù)器才加1。如果使用的8051單片機(jī)有多個(gè)定時(shí)器,而且有外部引腳,可以用這種方法來擴(kuò)充邊沿觸發(fā)的外部中斷。值得重申的一點(diǎn)是,當(dāng)使用定時(shí)器作為外部中斷時(shí),它以前的功能將不能使用,除非用軟件對它進(jìn)行復(fù)位?!纠?-5】利用外部中斷和查詢相結(jié)合的方法擴(kuò)展外部中斷。

如果系統(tǒng)有多個(gè)外中斷請求源,可以按照它們的輕重緩急進(jìn)行排隊(duì),把其中最高級別的中斷源直接連接到單片機(jī)外中斷0輸入引腳,其余的外部中斷請求可以用利用邏輯器件通過“與”或者“或”的辦法連接到單片機(jī)外中斷1引腳,同時(shí)還連接到輸入/輸出端口(如P0或P1)的若干引腳,用來查詢判斷具體是哪一個(gè)中斷請求源發(fā)生的中斷事件。

如圖5-11所示,利用單片機(jī)擴(kuò)展5個(gè)外部中斷源,中斷的優(yōu)先次序這S0~S4,其中S0接到外部中斷0上,S1~S4通過“與”門接到外部中斷1上;單片機(jī)的P1.4~P1.7接4個(gè)發(fā)光二極管用來作為輸出指示;當(dāng)有S1~S4其中一個(gè)外部中斷發(fā)生時(shí),相應(yīng)的發(fā)光二極管VD1~VD4點(diǎn)亮;當(dāng)S0外部中斷發(fā)生時(shí),4個(gè)發(fā)光二極管全亮。8051S0S1S2S3S4INT0INT1P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7&+5V+5VVD1VD2VD3VD4

圖5-11外部中斷擴(kuò)展電路程序代碼如下:#include<reg51.h>sbitP1_0=P1^0; //定義位變量sbitP1_1=P1^1;...sbitP1_7=P1^7;voidmain(){ P1=0xff; //熄滅LED EA=1; //開總中斷 EX0=1; //開外中斷0 EX1=1; //開外中斷1 IT0=0; //外中斷0脈沖觸發(fā)方式 IT1=0; //外中斷1脈沖觸發(fā)方式 PX0=1; //外中斷0高優(yōu)先級 PX1=0; //外中斷1低優(yōu)先級 for(;;) //延時(shí)等待中斷發(fā)生 {;}}

voidINT0_ISP()interrupt0 //外中斷0服務(wù)函數(shù){ P1=0x0f;

//P1口高4位置0,點(diǎn)亮4個(gè)LED}voidINT1_ISR()interrupt2 //外中斷1服務(wù)函數(shù){ if(P1_0==0){P1=P1&0xef;} //點(diǎn)亮VD1 ... if(P1_3==0){P1=P1&0x7f;} //點(diǎn)亮VD4

}

【例5-6】利用優(yōu)先編碼器擴(kuò)展外部中斷。從例5-5可以看出,利用與門、或門擴(kuò)展外中斷所占端口引腳較多,在實(shí)際應(yīng)用中,還可以采用優(yōu)先級解碼芯片如74LS148,把多個(gè)中斷源信號作為一個(gè)中斷。如圖5-12所示,在有8個(gè)中斷源的情況下,經(jīng)74LS148優(yōu)先譯碼后,只占3個(gè)I/O引腳,即用3根引腳可分辨8個(gè)中斷源,從而節(jié)省了I/O口資源。8051S0RX8+5VD0A0A1A2G74LS148P0.0P0.1P0.2INT0S1S2S3S4S5S6S7D1D2D3D4D5D6D7圖5-12利用優(yōu)先編碼器擴(kuò)展外部中斷的電路

程序代碼如下:#include<reg51.h>unsignedcharstatus; //定義一變量,用來讀取P0口狀態(tài)voidmain(

){ EA=1; //開總中斷 EX0=1; //開外中斷0 PX0=1; //外中斷0高優(yōu)先級 for(;;) //延時(shí)等待中斷發(fā)生 {;}}voidINT0_ISR(

)interrupt0

//外中斷0中斷服務(wù)函數(shù){status=P0&0x07;

//讀取P0口低三位狀態(tài),不同的值

switch(status)//對應(yīng)不同的中斷源 {

case0:

{ … //處理中斷源0 break;

} … case7:

{

… //處理中斷源7

break;

}}}【例5-7】中斷嵌套。

外部中斷/INT1觸發(fā)后,啟動(dòng)計(jì)數(shù)器0。計(jì)數(shù)達(dá)到10次后停止計(jì)數(shù),啟動(dòng)定時(shí)器1。由定時(shí)器1控制定時(shí),由P1.7輸出周期為200ms的方波信號,接收兩次中斷后關(guān)閉方波發(fā)生器,P1.7置低。

程序如下:#include<reg51.h>#defineucharunsignedcharuchardatea,b,c;voidinterrupt0(

)interrupt2using1 //定義外部中斷1{ a++;}voidtimer0(

)interrupt1using2 //定義計(jì)數(shù)器0(T0){ TL0=0xff; b++;}voidtime1(

)interrupt3using3 //定義定時(shí)器1(T1){ TH1=0x06; c--;}sbitP1_7=P1^7;

voidmian(void){ P1_7=1;

//初始化 TCON=0x01;

//外部中斷為低電平觸發(fā)方式 TMOD=0x27;

//啟動(dòng)定時(shí)器1和計(jì)數(shù)器0,工作方式2 IE=0x8b; //開中斷 a=0; do{

}

while(a!=1); //等待外部中斷 P1_7=!P1_7; //取反 TL0=0xff; //初值 TH0=0x06; //初值 b=0; TR0=0; //停止計(jì)數(shù)器0工作 TR1=1; //啟動(dòng)定時(shí)器1

do

{ c=0xc8; do{}

while(c!=0);

//定時(shí)輸出方波 P1_7=!P1_7;

} while(a!=3); //等待兩次外部中斷 TR1=0; //關(guān)定時(shí)器1 P1_7=0; EA=0; //關(guān)總中斷 EX0=0; //禁止外部中斷 }

【例5-8】利用外部中斷實(shí)現(xiàn)發(fā)光二極管的簡單控制。本例將介紹一個(gè)中斷使用的演示程序,通過這個(gè)程序,讀者可以了解到各種中斷的使用方法。

程序如下:#include<reg51.h>sbitled0=P1^0; //定義I/O引腳sbitled1=P1^1;sbitled2=P1^2;sbitled3=P1^3;bitFINT0; //全局變量及位標(biāo)志定義bitFINT1;bitFT0;bitFT1;bitFT2;unsignedcharT0_10ms;unsignedcharT0_50ms;unsignedcharT0_100ms;voidint_0(

); //函數(shù)聲明voidint_1(

);voidtimer_0(

);voidtimer_1(

);voidserial_1(

);voidtimer_2(

);

voidinitial(); //用戶函數(shù)聲明初始化

voidmain(void){ initial(

); while(1) { if(FINT0) //中斷0到,則進(jìn)入循環(huán)體 { FINT0=0; led0=0; //中斷/INT0時(shí)燈點(diǎn)亮

led1=0; led2=0; led3=0; }

if(FINT1) //中斷1到,則進(jìn)入循環(huán)體

{ FINT1=0;

led0=1; //中斷/INT1時(shí)燈熄滅 led1=1;

led2=1; led3=1; }

if(FT0) { FT0=0; if(++T0_10ms>30) {

T0_10ms=0; //未在初始化里設(shè)置定時(shí)器 } } }}

voidinitial(){ EA=1; //CPU所有中斷開 EX0=1; //中斷開

IT0=1; //低電平觸發(fā) EX1=1; //中斷開 IT1=1; //低電平觸發(fā) return;}

voidint_0()interrupt0using0 //中斷/INT0{ FINT0=1; }voidint_1()interrupt2using1 //中斷/INT2{ FINT1=1; }voidtimer_0()interrupt1using2 //定時(shí)器0中斷{ F

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論