單片機原理:7-6-補-6-中斷系統(tǒng)_第1頁
單片機原理:7-6-補-6-中斷系統(tǒng)_第2頁
單片機原理:7-6-補-6-中斷系統(tǒng)_第3頁
單片機原理:7-6-補-6-中斷系統(tǒng)_第4頁
單片機原理:7-6-補-6-中斷系統(tǒng)_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第6章AT89S51單片機的中斷系統(tǒng)

1

1.TCON寄存器為定時器/計數(shù)器的控制寄存器,字節(jié)地址為88H,可位尋址。既包括定時器/計數(shù)器T0、T1溢出中斷請求標(biāo)志位TF0和TF1,也包括兩個外部中斷請求的標(biāo)志位IE1與IE0,還包括兩個外部中斷請求源的中斷觸發(fā)方式選擇位。TCON格式見圖6-3。

圖6-3特殊功能寄存器TCON的格式2.SCON寄存器串行口控制寄存器,字節(jié)地址為98H,可位尋址。SCON的低二位鎖存串口的發(fā)送中斷和接收中斷的中斷請求標(biāo)志TI和RI,格式見圖6-4。

圖6-4SCON中的中斷請求標(biāo)志位6.3.1中斷允許寄存器IE

各中斷源開放或屏蔽,是由片內(nèi)中斷允許寄存器IE控制。IE字節(jié)地址為A8H,可進行位尋址,格式見圖6-5。圖6-5中斷允許寄存器IE的格式6.3.2中斷優(yōu)先級寄存器IP

中斷請求源有兩個中斷優(yōu)先級,每一個中斷請求源可由軟件設(shè)置為高優(yōu)先級中斷或低優(yōu)先級中斷,也可實現(xiàn)兩級中斷嵌套。

圖6-7IP寄存器的格式6.8中斷函數(shù)為直接使用C51編寫中斷服務(wù)程序,C51中定義了中斷函數(shù)。這在第3章中已簡要介紹。由于C51編譯器在編譯時對聲明為中斷服務(wù)程序的函數(shù)自動添加相應(yīng)現(xiàn)場保護、阻斷其他中斷、返回時自動恢復(fù)現(xiàn)場等處理的程序段,因而在編寫中斷函數(shù)時可不必考慮這些問題,減小編寫中斷服務(wù)程序煩瑣程度。中斷服務(wù)函數(shù)的一般形式為:

函數(shù)類型函數(shù)名(形式參數(shù)表)interruptnusingn

關(guān)鍵字interrupt后面的n是中斷號,對于8051單片機,n的取值為0~4,編譯器從8×n+3處產(chǎn)生中斷向量。AT89S51中斷源對應(yīng)的中斷號和中斷向量見表6-3。AT89S51內(nèi)部RAM中可使用4個工作寄存器區(qū),每個工作寄存器區(qū)包含8個工作寄存器(R0~R7)。關(guān)鍵字using后面的n用來選擇4個工作寄存器區(qū)。using是一選項,如不選,中斷函數(shù)中的所有工作寄存器內(nèi)容將被保存到堆棧中。

關(guān)鍵字using對函數(shù)目標(biāo)代碼的影響如下:

在中斷函數(shù)的入口處將當(dāng)前工作寄存器區(qū)內(nèi)容保護到堆棧中,函數(shù)返回前將被保護的寄存器區(qū)內(nèi)容從堆棧中恢復(fù)。使用using在函數(shù)中確定一個工作寄存器區(qū)須十分小心,要保證任何工作寄存器區(qū)的切換都只在指定的控制區(qū)域中發(fā)生,否則將產(chǎn)生不正確的函數(shù)結(jié)果。

例如,外中斷1()中斷服務(wù)函數(shù)如下:voidint1()interrupt2using0//中斷號n=2,選擇0區(qū)工作寄存器區(qū)中斷調(diào)用與標(biāo)準(zhǔn)C的函數(shù)調(diào)用是不一樣的,當(dāng)中斷事件發(fā)生后,對應(yīng)的中斷函數(shù)被自動調(diào)用,即沒有參數(shù),也沒有返回值,會帶來如下影響。

(1)編譯器會為中斷函數(shù)自動生成中斷向量。(2)退出中斷函數(shù)時,所有保存在堆棧中的工作寄存器及特殊功能寄存器被恢復(fù)。(3)在必要時特殊功能寄存器Acc、B、DPH、DPL以及PSW的內(nèi)容被保存到堆棧中。編寫中斷程序,應(yīng)遵循以下規(guī)則:(1)中斷函數(shù)沒有返回值,如果定義一個返回值,將會得到不正確結(jié)果。建議將中斷函數(shù)定義為void類型,明確說明無返回值。(2)中斷函數(shù)不能進行參數(shù)傳遞,如果中斷函數(shù)中包含任何參數(shù)聲明都將導(dǎo)致編譯出錯。(3)任何情況下都不能直接調(diào)用中斷函數(shù),否則會產(chǎn)生編譯錯誤。因為中斷函數(shù)的返回是由匯編語言指令RETI完成的。RETI指令會影響AT89S51硬件中斷系統(tǒng)內(nèi)的不可尋址的中斷優(yōu)先級寄存器的狀態(tài)。如沒有實際中斷請求情況下,直接調(diào)用中斷函數(shù),也就不會執(zhí)行RETI指令,其操作結(jié)果有可能產(chǎn)生一個致命錯誤。(4)如在中斷函數(shù)中再調(diào)用其他函數(shù),則被調(diào)用的函數(shù)所用的寄存器區(qū)必須與中斷函數(shù)使用的寄存器區(qū)不同。6.9中斷系統(tǒng)應(yīng)用舉例本節(jié)通過幾個例程介紹有關(guān)中斷應(yīng)用程序的編寫。6.9.1

單一外中斷的應(yīng)用

【例6-1】在單片機P1口上接有8只LED。在外部中斷0輸入引腳(P3.2)接一只按鈕開關(guān)K1。要求將外部中斷0設(shè)置為電平觸發(fā)。程序啟動時,P1口上的8只LED全亮。每按一次按鈕開關(guān)K1,使引腳接地,產(chǎn)生一個低電平觸發(fā)的外中斷請求,在中斷服務(wù)程序中,讓低4位的LED與高4位的LED交替閃爍5次。然后從中斷返回,控制8只LED再次全亮。原理電路及仿真結(jié)果見圖6-9。作業(yè)3:exp3_學(xué)號->keil->用C實現(xiàn)用INT1外部中斷下降沿觸發(fā),單片機P1口上接有8只LED,在中斷服務(wù)程序中,讓奇偶位的LED交替閃爍20次。然后從中斷返回,控制8只LED全滅。

圖6-9利用中斷控制8只LED交替閃爍1次的電路參考程序如下:..\..\范例\exp7-6_補_6_中斷系統(tǒng)\exp7_6_INT0

#include<reg51.h>#defineucharunsignedchar

voidDelay(unsignedinti) //延時函數(shù)Delay(),i形式參數(shù),不能賦初值{ unsignedintj; for(;i>0;i--) for(j=0;j<333;j++)//晶振為12MHz,j選擇與晶振頻率有關(guān) {;} //空函數(shù)}voidmain() //主函數(shù){ EA=1; //總中斷允許 EX0=1; //允許外部中斷0中斷 IT0=1; //選擇外部中斷0為跳沿觸發(fā)方式 while(1) //循環(huán)

{P1=0;} //P1口的8只LED全亮}

voidint0()interrupt0using0 //外中斷0的中斷服務(wù)函數(shù){ ucharm; EX0=0; //禁止外部中斷0中斷 for(m=0;m<5;m++) //交替閃爍5次 { P1=0x0f; //低4位LED滅,高4位LED亮

Delay(400); //延時 P1=0xf0; //高4位LED滅,低4位LED亮 Delay(400); //延時 EX0=1; //中斷返回前,打開外部中斷0中斷}本例程包含兩部分,一部分是主程序段,完成中斷系統(tǒng)初始化,并把8個LED全部點亮。另一部分是中斷函數(shù)部分,控制4個LED交替閃爍1次,然后從中斷返回。6.9.2兩個外中斷的應(yīng)用當(dāng)需要多個中斷源時,只需增加相應(yīng)的中斷服務(wù)函數(shù)即可。例6-2是處理兩個外中斷請求的例子。【例6-2】如圖6-10所示,在單片機P1口上接有8只LED。在外部中斷0輸入引腳(P3.2)接有一只按鈕開關(guān)K1。在外部中斷1輸入引腳(P3.3)接有一只按鈕開關(guān)K2。要求K1和K2都未按下時,P1口的8只LED呈流水燈顯示,僅K1(P3.2)按下再松開時,上下各4只LED交替閃爍10次,然后再回到流水燈顯示。如果按下再松開K2(P3.3)時,P1口的8只LED全部閃爍10次,然后再回到流水燈顯示。設(shè)置兩個外中斷的優(yōu)先級相同。

圖6-10兩個外中斷控制8只LED顯示的電路參考程序如下:#include<reg51.h>#defineucharunsignedchar

voidDelay(unsignedinti) //延時函數(shù)Delay(),i為形式參 //數(shù),不能賦初值{ ucharj; for(;i>0;i--) for(j=0;j<125;j++) {;} //空函數(shù)}voidmain() //主函數(shù){uchardisplay[9]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //流水燈顯示數(shù)據(jù)數(shù)組

unsignedinta;for(;;){EA=1; //總中斷允許EX0=1; //允許外部中斷0中斷EX1=1; //允許外部中斷1中斷IT0=1; //選擇外部中斷0為跳沿觸發(fā)方式IT1=1; //選擇外部中斷1為跳沿觸發(fā)方式

IP=0; //兩個外部中斷均為低優(yōu)先級 for(a=0;a<9;a++) { Delay(500); //延時 P1=display[a]; //將已經(jīng)定義的流水燈顯示數(shù)據(jù)送到P1口 } }}

voidint0_isr(void)interrupt0using1//外中斷0的中斷服務(wù)函數(shù){ ucharn; for(n=0;n<10;n++) //高、低4位顯示10次 { P1=0x0f; //低4位LED滅,高4位LED亮 Delay(500); //延時 P1=0xf0; //高4位LED滅,低4位LED亮 Delay(500); //延時 }}

voidint1_isr(void)interrupt2using2//外中斷1中斷服務(wù)函數(shù){ ucharm; for(m=0;m<10;m++) //閃爍顯示10次 { P1=0xff; //全滅 Delay(500); //延時 P1=0; //全亮 Delay(500); //延時 }}6.9.3中斷嵌套的應(yīng)用中斷嵌套只發(fā)生正執(zhí)行一個低優(yōu)先級中斷,此時又有一高優(yōu)先級中斷產(chǎn)生,就會去執(zhí)行高優(yōu)先級中斷服務(wù)程序。高優(yōu)先級中斷服務(wù)程序完成后,再繼續(xù)執(zhí)行低優(yōu)先級中斷程序。

【例6-3】電路見圖6-10,設(shè)計一中斷嵌套程序:要求K1和K2都未按下時,P1口8只LED呈流水燈顯示,當(dāng)按一下K1時,產(chǎn)生一個低優(yōu)先級外中斷0請求(跳沿觸發(fā)),進入外中斷0中斷服務(wù)程序,上下4只LED交替閃爍。此時按一下K2時,產(chǎn)生一個高優(yōu)先級的外中斷1請求(跳沿觸發(fā)),進入外中斷1中斷服務(wù)程序,使8只LED全部閃爍。當(dāng)顯示5次后,再從外中斷1返回繼續(xù)執(zhí)行外中斷0中斷服務(wù)程序,即P1口控制8只LED,上、下4只LED交替閃爍。設(shè)置外中斷0為低優(yōu)先級,外中斷1為高優(yōu)先級。參考程序如下:(演示運行略)#include<reg51.h>#defineucharunsignedcharvoidDelay(unsignedinti) //延時函數(shù)Delay(){ unsignedintj;for(;i>0;i--) for(j=0;j<125;j++) {;} //空函數(shù)}voidmain() //主函數(shù){ uchardisplay[9]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

//流水燈顯示數(shù)據(jù)組 uchara;for(;;) { EA=1; //總中斷允許 EX0=1; //允許外部中斷0中斷 EX1=1; //允許外部中斷1中斷 IT0=1; //選擇外部中斷0為跳沿觸發(fā)方式 IT1=1; //選擇外部中斷1為跳沿觸發(fā)方式 PX0=0; //外部中斷0為低優(yōu)先級 PX1=1; //外部中斷1為高優(yōu)先級for(a=0;a<9;a++) { Delay(500); //延時P1=display[a]; //流水燈顯示數(shù)據(jù)送到P1口驅(qū)動LED顯示}

}}voidint0_isr(void)interrupt0using0//外中斷0中斷函數(shù){ for(;;){ P1=0x0f; //低4位LED滅,高4位LED亮 Delay(400); //延時 P1=0xf0; //高4位LED滅,低4位LED亮 Delay(400); //延時}

溫馨提示

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

評論

0/150

提交評論