實(shí)驗(yàn)二:外部中斷實(shí)驗(yàn) 一、實(shí)驗(yàn)?zāi)康?/font> 1.掌握外部中斷技術(shù)的基本使用方法; 2.掌握中斷處理程序的編寫方法; 3、進(jìn)一步掌握Keil和Proteus軟件的用法。 二、實(shí)驗(yàn)說明 1.外部中斷的初始化設(shè)置共有三項(xiàng)內(nèi)容:中斷總允許即EA=1,外部中斷允許即EXi=1(i=0或1),中斷方式設(shè)置。中斷方式設(shè)置一般有兩種方式:電平方式和脈沖方式,本實(shí)驗(yàn)選用后者,其前一次為高電平后一次為低電平時(shí)為有效中斷請(qǐng)求。因此高電平狀態(tài)和低電平狀態(tài)至少維持一個(gè)周期,中斷請(qǐng)求信號(hào)由引腳INT0(P3.2)和INT1(P3.3)引入,本實(shí)驗(yàn)由INT0(P3.2)引入。 2.中斷服務(wù)的關(guān)鍵: A.保護(hù)進(jìn)入中斷時(shí)的狀態(tài)。 堆棧有保護(hù)斷點(diǎn)和保護(hù)現(xiàn)場(chǎng)的功能使用PUSH指令,在轉(zhuǎn)中斷服務(wù)程序之前把單片機(jī)中有關(guān)寄存單元的內(nèi)容保護(hù)起來。 B.必須在中斷服務(wù)程序中設(shè)定是否允許中斷重入,即設(shè)置EX0位。 C.用POP指令恢復(fù)中斷時(shí)的現(xiàn)場(chǎng)。 3.中斷控制原理: 中斷控制是提供給用戶使用的中斷控制手段。實(shí)際上就是控制一些寄存器,51系列用于此目的的控制寄存器有四個(gè):TCON 、IE 、SCON 及IP。 4.中斷響應(yīng)的過程: 首先中斷采樣然后中斷查詢最后中斷響應(yīng)。采樣是中斷處理的第一步,對(duì)于本實(shí)驗(yàn)的脈沖方式的中斷請(qǐng)求,若在兩個(gè)相鄰周期采樣先高電平后低電平則中斷請(qǐng)求有效,IE0或IE1置“1”;否則繼續(xù)為“0”。所謂查詢就是由CPU測(cè)試TCON和SCON中各標(biāo)志位的狀態(tài)以確定有沒有中斷請(qǐng)求發(fā)生以及是那一個(gè)中斷請(qǐng)求。中斷響應(yīng)就是對(duì)中斷請(qǐng)求的接受,是在中斷查詢之后進(jìn)行的,當(dāng)查詢到有效的中斷請(qǐng)求后就響應(yīng)一次中斷。 INT0端接單次脈沖發(fā)生器。P1口接LED的并行口JD3,以查看LED在每次中斷時(shí)的移位過程。 三、實(shí)驗(yàn)內(nèi)容及步驟 1、用Keil軟件編輯中斷控制應(yīng)用程序,采用P3.2接入開關(guān)K0,P3.3接入開關(guān)K1引入外部中斷0和1,外部中斷0服務(wù)程序點(diǎn)亮8支LED,外部中斷1服務(wù)程序?qū)崿F(xiàn)P1口驅(qū)動(dòng)流水燈,0.5s變換一次。 2、用proteus軟件繪制實(shí)驗(yàn)所需硬件電路,并進(jìn)行仿真運(yùn)行。 3、用試驗(yàn)箱載入程序并運(yùn)行程序: 用P1口做輸出口,接八位邏輯電平顯示,P3.2,P3.3接開關(guān)輸入外部中斷信號(hào),中斷程序功能使發(fā)光二極管循環(huán)點(diǎn)亮。 (1)最小系統(tǒng)中插上80C51核心板,用扁平數(shù)據(jù)線連接MCU的P1口與八位邏輯電平顯示模塊JD3。 (2)用串行數(shù)據(jù)通信線連接計(jì)算機(jī)與實(shí)驗(yàn)箱的RS232串口,將實(shí)驗(yàn)箱RS232串口的端子RXD和TXD插到實(shí)驗(yàn)芯片模塊的P3.0和P3.1插孔中,建立PC機(jī)與實(shí)驗(yàn)箱單片機(jī)芯片的串行通信聯(lián)系。 (3)打開電腦桌面上的Keil uVision4仿真軟件,建立實(shí)驗(yàn)的項(xiàng)目文件夾和項(xiàng)目文件,在項(xiàng)目文件的源文件界面上輸入實(shí)驗(yàn)源程序,并對(duì)源程序進(jìn)行編譯,直到編譯無誤,并連接生成hex目標(biāo)文件。 (4)打開電腦桌面上的STC燒錄軟件,下載并裝載目標(biāo)程序到實(shí)驗(yàn)單片機(jī)芯片,然后上電全速運(yùn)行程序,觀察程序運(yùn)行的結(jié)果:程序功能使發(fā)光二極管循環(huán)點(diǎn)亮的流水燈的效果。 四、源程序 實(shí)驗(yàn)程序一: #include<reg51.h> void delay(unsigned int d) //定義延時(shí)子函數(shù) { while(--d>0); } void main() { P1=0xff; //熄滅LED EA=1; EX0=1; EX1=1; IT0=1; IT1=1; for(;;) {;} } void INT0_ISR() interrupt 0 //外中斷0服務(wù)函數(shù) { P1=0x00; PX0=0; PX1=1; } void INT1_ISR() interrupt 2 //外中斷1服務(wù)函數(shù) { while(1) { delay(15000); P1=0xfe; delay(15000); P1=0xfd; delay(15000); P1=0xfb; delay(15000); P1=0xf7; delay(15000); P1=0xef; delay(15000); P1=0xdf; delay(15000); P1=0xbf; delay(15000); P1=0x7f; PX0=1; PX1=0; } }
這個(gè)程序錯(cuò)在哪里?
|