




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第5章單片機(jī)的中斷系統(tǒng)51單片機(jī)的中斷系統(tǒng)是8位機(jī)中功能較強(qiáng)的,可以提供5個(gè)中斷源(52系列是6個(gè)),具有兩個(gè)中斷優(yōu)先級(jí),可以實(shí)現(xiàn)兩級(jí)中斷嵌套。5.1中斷的基本知識(shí)
5.1.1中斷源及中斷結(jié)構(gòu)MCS-51單片機(jī)的5個(gè)中斷源分為兩種類(lèi)型:一類(lèi)是外部中斷源,包括
和
;一類(lèi)是內(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.外部中斷
它們的中斷請(qǐng)求信號(hào)有效方式分為電平觸發(fā)和脈沖觸發(fā)兩種。電平方式是低電平有效,脈沖方式為負(fù)跳變觸發(fā)有效。對(duì)于電平方式,只要檢測(cè)到低電平信號(hào)即為有效申請(qǐng)。對(duì)于脈沖方式,則需要比較兩次檢測(cè)到的信號(hào),才能確定中斷請(qǐng)求信號(hào)是否有效。中斷請(qǐng)求信號(hào)高低電平的狀態(tài)都應(yīng)該至少維持一個(gè)機(jī)器周期,以確保電平變化能被單片機(jī)檢測(cè)到。2.內(nèi)部中斷除外部中斷外,內(nèi)部還有TF0、TF1、TI/RI分別為定時(shí)/計(jì)數(shù)器溢出中斷和串行口的發(fā)送/接收中斷的中斷源。5.1.2中斷控制
MCS-51單片機(jī)設(shè)置了4個(gè)專(zhuān)用寄存器用于中斷控制,用戶(hù)通過(guò)設(shè)置其狀態(tài)來(lái)管理中斷系統(tǒng)。1.定時(shí)器控制寄存器(TCON)TCON的格式如圖5-2所示。
IT0IE0IT1IE1TR0TF0TR1TF1D7D6D5D4D3D2D1D0TCON(88H)圖5-2TCON的格式在該寄存器中,TR1、TR0用于定時(shí)/計(jì)數(shù)器的啟動(dòng)控制,其余6位用于中斷控制,其作用如下:1)IT0為外中斷0請(qǐng)求信號(hào)方式控制位。IT0=1為脈沖觸發(fā)方式(負(fù)跳變有效),IT0=0為電平方式(低電平有效)。2)IE0為外部中斷0請(qǐng)求標(biāo)志位。當(dāng)CPU檢測(cè)到(P3.2)端有中斷請(qǐng)求信號(hào)時(shí),由硬件置位,使IE0=1請(qǐng)求中斷,中斷響應(yīng)后轉(zhuǎn)向中斷服務(wù)程序時(shí),由硬件自動(dòng)清零。3)IT1為外部中斷1請(qǐng)求信號(hào)方式控制位,其作用同IT0。4)IE1為外部中斷1請(qǐng)求標(biāo)志位,其作用同IE0。5)TF0(TF1)為定時(shí)/計(jì)數(shù)器溢出標(biāo)志位,此標(biāo)志的作用將在5.3節(jié)說(shuō)明。
2.串行口控制寄存器(SCON)SCON的格式如圖5-3所示。RITIRB8TB8RENSM2SM1SM0D7D6D5D4D3D2D1D0TCON(98H)圖5-3SCON的格式
SCON中的高6位用于串行口控制,低2位(RI、TI)用于中斷控制,其作用如下:1)TI為串行口發(fā)送中斷請(qǐng)求標(biāo)志位,發(fā)送完一幀串行數(shù)據(jù)后,由硬件置1,其清零必須由軟件完成。2)RI為串行口接收中斷請(qǐng)求標(biāo)志位,接收完一幀串行數(shù)據(jù)后,由硬件置1,其清零必須由軟件完成。
在MCS-51單片機(jī)串行口中,以TI和RI的邏輯“或”作為一個(gè)內(nèi)部中斷源,二者之一置位就可以產(chǎn)生串行口中斷請(qǐng)求,然后在中斷服務(wù)程序中測(cè)試這兩個(gè)標(biāo)志位,以決定是發(fā)送中斷還是接收中斷。3.中斷允許控制寄存器(IE)中斷允許控制寄存器的格式如圖5-4所示。EX0ET0EX1ET1ES————EAD7D6D5D4D3D2D1D0IE(A8H)圖5-4中斷允許控制寄存器的格式
寄存器中用于控制中斷的共6位,實(shí)現(xiàn)中斷管理,其作用如下。EA為中斷允許總控制位。EA=1時(shí),CPU開(kāi)放中斷;EA=0時(shí),CPU屏蔽所有中斷請(qǐng)求。
ES、ET1、EX1、ET0、EX0為對(duì)應(yīng)的串行口中斷、定時(shí)/計(jì)數(shù)器1中斷、外部中斷1中斷、定時(shí)器/計(jì)數(shù)器0中斷、外部中斷0中斷的中斷允許位。對(duì)應(yīng)位為1時(shí),允許其中斷,對(duì)應(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)先級(jí)控制寄存器(IP)中斷優(yōu)先級(jí)控制寄存器的格式如圖5-5所示。PX0PT0PX1PT1PS——————D7D6D5D4D3D2D1D0IP(B8H)圖5-5中斷優(yōu)先級(jí)控制寄存器的格式圖5-5中斷優(yōu)先級(jí)控制寄存器的格式MCS-51單片機(jī)規(guī)定了兩個(gè)中斷優(yōu)先級(jí):高級(jí)中斷和低級(jí)中斷。用中斷優(yōu)先級(jí)寄存器(IP)的5位狀態(tài)管理5個(gè)中斷源的優(yōu)先級(jí)別,即PS、PT1、TX1、PT0、PX0分別對(duì)應(yīng)串行口中斷、定時(shí)器/計(jì)數(shù)器1中斷、外部中斷1中斷、定時(shí)器/計(jì)數(shù)器0中斷、外部中斷0中斷。當(dāng)相應(yīng)位為1時(shí),設(shè)置其為高級(jí)中斷;相應(yīng)位為0時(shí),設(shè)置其為低級(jí)中斷。5.1.3中斷優(yōu)先級(jí)結(jié)構(gòu)MCS-51中斷系統(tǒng)具有兩級(jí)優(yōu)先級(jí)(由IP寄存器把各中斷源的優(yōu)先級(jí)分為高優(yōu)先級(jí)和低優(yōu)先級(jí)),它們遵循下列兩條基本原則:1).為了實(shí)現(xiàn)中斷嵌套,高優(yōu)先級(jí)中斷請(qǐng)求可以中斷低優(yōu)先級(jí)的中斷服務(wù),反之,則不允許;2).同等優(yōu)先級(jí)中斷源之間不能中斷對(duì)方的中斷服務(wù)過(guò)程。為了實(shí)現(xiàn)上述兩條原則,中斷系統(tǒng)內(nèi)部包含兩個(gè)不可尋址的優(yōu)先級(jí)狀態(tài)觸發(fā)器。其中一個(gè)用來(lái)指示某個(gè)高優(yōu)先級(jí)的中斷源正在得到服務(wù),并阻止所有其他中斷的響應(yīng);另一個(gè)觸發(fā)器則指出某低優(yōu)先級(jí)的中斷正得到服務(wù),所有同級(jí)的中斷都被阻止,但不阻止高優(yōu)先級(jí)中斷源。當(dāng)同時(shí)收到幾個(gè)同一優(yōu)先能的中斷時(shí),響應(yīng)哪一個(gè)中斷源取決于內(nèi)部查詢(xún)順序。其優(yōu)先級(jí)排列如圖5-6所示。中斷源外部中斷0定時(shí)器/計(jì)數(shù)器0溢出定時(shí)器/計(jì)數(shù)器1溢出串行口外部中斷1同級(jí)內(nèi)中斷優(yōu)先級(jí)別最高最低圖5-6中斷優(yōu)先級(jí)排列5.1.4中斷服務(wù)程序入口地址
MCS-51單片機(jī)5個(gè)中斷源的中斷服務(wù)程序入口地址如表5-1所示。表5-1MCS-51中斷服務(wù)程序入口地址表5.1.5中斷請(qǐng)求的撤除在中斷請(qǐng)求被響應(yīng)前,中斷源發(fā)出的中斷請(qǐng)求由CPU鎖存在特殊功能寄存器TCON和SCON的相應(yīng)中斷標(biāo)志位中。一旦某個(gè)中斷請(qǐng)求得到響應(yīng),CPU必須把它的響應(yīng)標(biāo)志位復(fù)位成0狀態(tài),否則MCS-51就會(huì)因中斷未能得到及時(shí)撤除而重復(fù)響應(yīng)同一中斷請(qǐng)求,這是絕對(duì)不允許的。MCS-51單片機(jī)有5個(gè)中斷源,但實(shí)際上只分屬于3種中斷類(lèi)型。這3種類(lèi)型是:外部中斷、定時(shí)器溢出中斷和串行口中斷。對(duì)于這3種中斷類(lèi)型的中斷請(qǐng)求,其撤除方法是不同的。1.定時(shí)器溢出中斷請(qǐng)求的撤除TF0和TF1是定時(shí)器溢出中斷標(biāo)志位,它們因定時(shí)器溢出中斷請(qǐng)求的輸入而置位,因定時(shí)器溢出中斷得到響應(yīng)而自動(dòng)復(fù)位成0狀態(tài)。因此,定時(shí)器溢出中斷源的中斷請(qǐng)求是自動(dòng)撤除的,用戶(hù)根本不必專(zhuān)門(mén)為它們撤除。
2.串行口中斷請(qǐng)求的撤除TI和RI是串行口中斷的標(biāo)志位,中斷系統(tǒng)不能自動(dòng)將它們撤除,這是因?yàn)镸CS-51進(jìn)入串行口中斷服務(wù)程序后常需要對(duì)它們進(jìn)行檢測(cè),以測(cè)定串行口發(fā)生了接收中斷還是發(fā)送中斷。為了防止CPU再次響應(yīng)這類(lèi)中斷,用戶(hù)應(yīng)在中斷服務(wù)程序的適當(dāng)位置處通過(guò)指令將它們撤除:CLRTI;撤除發(fā)送中斷
CLRRI;撤除接收中斷若采用字節(jié)指令,則也可采用如下指令:ANLSCON,#0FCH;撤除發(fā)送和接收中斷或采用位判斷清除指令:
JBCTI,rel;判斷TI標(biāo)志是否置位,若置位則跳轉(zhuǎn)并撤除發(fā)送中斷
JBCRI,rel;判斷RI標(biāo)志是否置位,若置位則跳轉(zhuǎn)并撤除接收中斷
3.外部中斷的撤除外部中斷請(qǐng)求有兩種觸發(fā)方式:電平觸發(fā)和負(fù)邊沿觸發(fā)。對(duì)于這兩種不同的中斷觸發(fā)方式,MCS-51撤除它們的中斷請(qǐng)求的方法是不相同的。在負(fù)邊沿觸發(fā)方式下,外部中斷標(biāo)志IE0和IE1是依靠CPU兩次檢測(cè)
或
上觸發(fā)電平狀態(tài)而設(shè)置的。因此,芯片設(shè)計(jì)者使CPU在響應(yīng)中斷時(shí)自動(dòng)復(fù)位IE0或IE1,就可撤除
或
上的中斷請(qǐng)求,因?yàn)橥獠恐袛嘣丛谥袛喾?wù)程序時(shí)是不可能再在
或
上產(chǎn)生負(fù)邊沿,而使相應(yīng)的中斷標(biāo)志IE0或IE1置位。
在電平觸發(fā)方式下,外部中斷標(biāo)志IE0和IE1是依靠CUP檢測(cè)或上低電平而置位的。盡管CPU響應(yīng)中斷時(shí)相應(yīng)中斷標(biāo)志IE0或IE1,能自動(dòng)復(fù)位成0狀態(tài),但若外部中斷源不能及時(shí)撤除它在或上的低電平,就會(huì)再次使已經(jīng)變0的中斷IE0或IE1置位,這是絕對(duì)不允許的。因此,電平觸發(fā)型外部中斷請(qǐng)求的撤除必須使或上的低電平隨著其中斷被CPU響應(yīng)而變?yōu)楦唠娖健R环N可供采用的電平型外部中斷的撤除電路如圖5-7所示。INT08051P1.0QDSDCP1外部中斷信號(hào)圖5-7電平型外部中斷的撤除電路由圖可見(jiàn),當(dāng)外部中斷源產(chǎn)生中斷請(qǐng)求時(shí),D觸發(fā)器的復(fù)位成0狀態(tài),Q端的低電平被送到
,該低電平被8051檢測(cè)后就使中斷標(biāo)志IE0置1。8051響應(yīng)
上的中斷請(qǐng)求可使
中斷服務(wù)程序執(zhí)行,故可以在中斷服務(wù)程序開(kāi)頭安排如下程序來(lái)使
上的電平拉高。INSVR:ORLP1,#01H
ANL
P1,#0FEH CLR
IE0
… END8051執(zhí)行上述程序就可使P1.0上產(chǎn)生一個(gè)寬度為兩個(gè)機(jī)器周期的負(fù)脈沖。在該負(fù)脈沖作用下,D觸發(fā)器被置位成1狀態(tài),
上的電平也因此而變高,從而撤除了其上的中斷請(qǐng)求。5.1.6中斷系統(tǒng)的初始化MCS-51中斷系統(tǒng)功能,是可以通過(guò)上述特殊功能寄存器進(jìn)行統(tǒng)一管理的,中斷系統(tǒng)初始化是指對(duì)這些特殊功能的寄存器中各控制位進(jìn)行賦值。中斷系統(tǒng)初始化步驟如下:1).置位相應(yīng)中斷源的中斷允許;2).設(shè)定所有中斷源的中斷優(yōu)先級(jí);
3).若為外部中斷,則應(yīng)規(guī)定低電平還是負(fù)邊沿的中斷觸發(fā)方式。例如,用
為低電平觸發(fā)的中斷系統(tǒng)初始化程序。
1.采用位操作指令
SETBEA; SETBEX0;開(kāi)
中斷
中斷 SETBPX0;令
為
高優(yōu)先級(jí) CLRIT0;
令
為
電平觸發(fā)2.采用字節(jié)操作指令
MOVIE,#81H;開(kāi)
中斷 ORLIP,#01H;令
為高優(yōu)先級(jí)
ORLTCON,#0FEH;令
電平觸發(fā)
顯然,采用位操作指令進(jìn)行中斷系統(tǒng)初始化是比較簡(jiǎn)單的。因?yàn)橛脩?hù)不必記住各控制位在寄存器中的位置,只需按各控制位名稱(chēng)來(lái)設(shè)置,而各控制位名稱(chēng)是比較容易記憶的。5.2中斷的編程及應(yīng)用實(shí)例
C51語(yǔ)言編譯器支持在C語(yǔ)言源程序中直接編寫(xiě)51單片機(jī)的中斷服務(wù)函數(shù)程序,從而減輕了采用匯編語(yǔ)言編寫(xiě)中斷服務(wù)程序的煩瑣程序。為了能在C語(yǔ)言源程序中直接編寫(xiě)中斷服務(wù)函數(shù),C51語(yǔ)言編譯器對(duì)函數(shù)的定義有所擴(kuò)展,增加了一個(gè)擴(kuò)展關(guān)鍵字interrupt。關(guān)鍵字interrupt是函數(shù)定義時(shí)的一個(gè)選項(xiàng),加上這個(gè)選項(xiàng)即可將函數(shù)定義成中斷服務(wù)函數(shù)。
定義中斷服務(wù)函數(shù)的一般形式為:
函數(shù)類(lèi)型函數(shù)名(形式參數(shù)表)interruptn[usingm]interrupt后面的n是中斷號(hào),n的取值范圍為0~31。編譯器從8n+3處產(chǎn)生中斷向量,具體的中斷號(hào)n和中斷向量取決于不同的51系列單片機(jī)芯片。對(duì)于MCS-51單片機(jī)而言,外部中斷0中斷、定時(shí)器/計(jì)數(shù)器0溢出中斷、外部中斷1中斷、定時(shí)器/計(jì)數(shù)器1溢出中斷、串行口發(fā)送/接收中斷對(duì)應(yīng)的中斷號(hào)分別為0、1、2、3、4。using后面的m是選擇哪個(gè)工作寄存器區(qū),分別為0、1、2、3。
【例5-1】外部中斷在本實(shí)例中,首先通過(guò)P1.7口點(diǎn)亮發(fā)光二極管,然后外部輸入一脈沖串,則發(fā)光二極管亮、暗交替。電路如圖5-8所示。+5VP1.7AT89C51圖5-8發(fā)光二極管交替亮、暗
編寫(xiě)程序如下:
#include<reg51.h>sbitP1_7=P1^7;voidinterrupt0(
)interrupt0using0//定義定時(shí)器0{ P1_7=!P1_7;}voidmain(
){ EA=1; //開(kāi)中斷 IT0=1; //外部中斷0脈沖觸發(fā) EX0=1; //外部中斷0 P1_7=0; do
{
} while(1);}
【例5-2】如圖5-9所示,8只LED陰極接至單片機(jī)P0口,兩開(kāi)關(guān)S0、S1分別接至單片機(jī)引腳P3.2和P3.3。
編寫(xiě)程序控制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; //開(kāi)總中斷 EX0=1; //開(kāi)外中斷0 EX1=1; //開(kāi)外中斷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ā)方式,且為滿(mǎn)足功能要求。注意:中斷的優(yōu)先級(jí)別是不同的
【例5-3】利用外中斷控制外設(shè)的數(shù)據(jù)傳送如圖5-10所示,外設(shè)數(shù)據(jù)經(jīng)P1口輸入單片機(jī),每準(zhǔn)備好一個(gè)數(shù)據(jù),發(fā)出選通信號(hào),使觸發(fā)器輸出1再經(jīng)非門(mén)得0至外中斷/INT0,向CPU發(fā)出中斷請(qǐng)求,CPU響應(yīng)這個(gè)中斷請(qǐng)求后,在中斷處理程序中先撤除中斷請(qǐng)求信號(hào),(通過(guò)P3.0=0,使/INT0=1),再由P1口輸入數(shù)據(jù)到單片機(jī)內(nèi)部。P1P3.0INT0——8051選通信號(hào)1QCLRDCLK+5V數(shù)據(jù)
圖5-10利用中斷控制數(shù)傳送程序代碼如下:#include<reg51.h>unsignedchartemp; //定義臨時(shí)變量,來(lái)存取送到P1口的數(shù)據(jù)sbitP3_0=P3^0;
//定義位變量voidmain(
){ P3_0=1; //初始化外中斷0引腳,其為高電平 EA=1; //開(kāi)總中斷 EX0=1; //開(kāi)外中斷0 IT0=1; //外中斷脈沖觸發(fā)方式 for(;;) //延時(shí)等待中斷發(fā)生 {;}}voidINT0_ISR()interrupt0
//外中斷0中斷服務(wù)函數(shù){ P3_0=0; //恢復(fù)外中斷0引腳電平,除中斷請(qǐng)求信號(hào) 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ù)模式,然后把信號(hào)接到計(jì)數(shù)器相應(yīng)的引腳上(T0或T1)。為了使每出現(xiàn)一個(gè)從高到低的脈沖時(shí)都產(chǎn)生一個(gè)中斷,可以把定時(shí)器設(shè)置為自動(dòng)重裝模式,令重裝值為FFH。當(dāng)計(jì)時(shí)器檢測(cè)到從高到低的脈沖時(shí),定時(shí)器將溢出,這時(shí)將產(chǎn)生一個(gè)中斷請(qǐng)求。程序代碼如下:
#include<reg51.h>
voidmain(void){ ... TMOD=0x66; //兩個(gè)定時(shí)/計(jì)數(shù)器都設(shè)置成8位模式
TH1=0xff; //設(shè)定重裝值 TH0=0xff; TL0=0xff; TL1=0xff; TCON=0x50; //開(kāi)始計(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í),就要在中斷中不斷地對(duì)T0或T1進(jìn)行采樣,直到它們變?yōu)楦?。其次,檢測(cè)到下降沿和產(chǎn)生終端之間一個(gè)指令周期的延時(shí),這是因?yàn)樵跈z測(cè)到下降沿一個(gè)指令周期之后,計(jì)數(shù)器才加1。如果使用的8051單片機(jī)有多個(gè)定時(shí)器,而且有外部引腳,可以用這種方法來(lái)擴(kuò)充邊沿觸發(fā)的外部中斷。值得重申的一點(diǎn)是,當(dāng)使用定時(shí)器作為外部中斷時(shí),它以前的功能將不能使用,除非用軟件對(duì)它進(jìn)行復(fù)位?!纠?-5】利用外部中斷和查詢(xún)相結(jié)合的方法擴(kuò)展外部中斷。
如果系統(tǒng)有多個(gè)外中斷請(qǐng)求源,可以按照它們的輕重緩急進(jìn)行排隊(duì),把其中最高級(jí)別的中斷源直接連接到單片機(jī)外中斷0輸入引腳,其余的外部中斷請(qǐng)求可以用利用邏輯器件通過(guò)“與”或者“或”的辦法連接到單片機(jī)外中斷1引腳,同時(shí)還連接到輸入/輸出端口(如P0或P1)的若干引腳,用來(lái)查詢(xún)判斷具體是哪一個(gè)中斷請(qǐng)求源發(fā)生的中斷事件。
如圖5-11所示,利用單片機(jī)擴(kuò)展5個(gè)外部中斷源,中斷的優(yōu)先次序這S0~S4,其中S0接到外部中斷0上,S1~S4通過(guò)“與”門(mén)接到外部中斷1上;單片機(jī)的P1.4~P1.7接4個(gè)發(fā)光二極管用來(lái)作為輸出指示;當(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; //開(kāi)總中斷 EX0=1; //開(kāi)外中斷0 EX1=1; //開(kāi)外中斷1 IT0=0; //外中斷0脈沖觸發(fā)方式 IT1=0; //外中斷1脈沖觸發(fā)方式 PX0=1; //外中斷0高優(yōu)先級(jí) PX1=0; //外中斷1低優(yōu)先級(jí) 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可以看出,利用與門(mén)、或門(mén)擴(kuò)展外中斷所占端口引腳較多,在實(shí)際應(yīng)用中,還可以采用優(yōu)先級(jí)解碼芯片如74LS148,把多個(gè)中斷源信號(hào)作為一個(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; //定義一變量,用來(lái)讀取P0口狀態(tài)voidmain(
){ EA=1; //開(kāi)總中斷 EX0=1; //開(kāi)外中斷0 PX0=1; //外中斷0高優(yōu)先級(jí) for(;;) //延時(shí)等待中斷發(fā)生 {;}}voidINT0_ISR(
)interrupt0
//外中斷0中斷服務(wù)函數(shù){status=P0&0x07;
//讀取P0口低三位狀態(tài),不同的值
switch(status)//對(duì)應(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的方波信號(hào),接收兩次中斷后關(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; //開(kāi)中斷 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ā)光二極管的簡(jiǎn)單控制。本例將介紹一個(gè)中斷使用的演示程序,通過(guò)這個(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(); //用戶(hù)函數(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所有中斷開(kāi) EX0=1; //中斷開(kāi)
IT0=1; //低電平觸發(fā) EX1=1; //中斷開(kāi) IT1=1; //低電平觸發(fā) return;}
voidint_0()interrupt0using0 //中斷/INT0{ FINT0=1; }voidint_1()interrupt2using1 //中斷/INT2{ FINT1=1; }voidtimer_0()interrupt1using2 //定時(shí)器0中斷{ F
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 服裝設(shè)計(jì)中的傳統(tǒng)文化融合與創(chuàng)新考核試卷
- 危險(xiǎn)廢物處理與環(huán)保產(chǎn)業(yè)市場(chǎng)準(zhǔn)入制度考核試卷
- 住宅建筑與社區(qū)居民社區(qū)兒童教育考核試卷
- 勘察項(xiàng)目項(xiàng)目管理海洋工程海洋環(huán)境保護(hù)與勘察考核試卷
- 托兒所服務(wù)的沉浸式教育與虛擬現(xiàn)實(shí)考核試卷
- 托兒所服務(wù)的安全管理與緊急救援考核試卷
- 地質(zhì)勘探設(shè)備在地震勘探中的物聯(lián)網(wǎng)應(yīng)用案例考核試卷
- 微特電機(jī)散熱問(wèn)題解決方案考核試卷
- 鎖匯合同范本
- 外賣(mài)小哥租車(chē)合同范本
- 新材料概論課件ppt 第8章 新能源材料
- 毛概課說(shuō)課課件
- 冷庫(kù)熱氟融霜操作
- 考生個(gè)人簡(jiǎn)歷及自述表
- 風(fēng)電機(jī)組偏航誤差產(chǎn)生機(jī)理及調(diào)整策略研究
- GB/T 18684-2002鋅鉻涂層技術(shù)條件
- 第九講:信息與大數(shù)據(jù)倫理問(wèn)題-工程倫理
- 四年級(jí)美術(shù)素養(yǎng)附答案
- 2021年全國(guó)中學(xué)生天文奧林匹克競(jìng)賽預(yù)賽試題及答案
- 四年級(jí)下冊(cè)音樂(lè)教案-2.2我們美麗的祖國(guó) |接力版
- Quantum軟件培訓(xùn)手冊(cè)
評(píng)論
0/150
提交評(píng)論