課程名稱 | 單片機原理及應用 | 實驗課時 | 2 |
實驗項目 | 中斷系統實驗 | 實驗時間 | |
指導老師 | 胡國華 | 實驗成績 | |
實驗目的(本次上機實驗所涉及并要求掌握的知識點) | 了解中斷處理系統的工作原理,熟悉中斷處理特別是外部中斷處理的過程,掌握中斷處理子程序的書寫格式和使用方法。 | ||
實驗環境 | Protues仿真軟件 KellC51 集成開發環境 微機1臺 | ||
實驗內容 | 一、通過兩個實驗介紹有關中斷應用程序的編寫。 1. 單一外中斷的應用 例題:在單片機P1口上接有8只LED。在外部中斷0輸入引腳(P3.2)接一只按鈕開關K1。 要求將外部中斷0設置為電平觸發。程序啟動時,P1口上的8只LED全亮。每按一次按鈕開關K1,使引腳接地,產生一個低電平觸發的外中斷請求,在中斷服務程序中,讓低4位的LED與高4位的LED交替閃爍5次。然后從中斷返回,控制8只LED再次全亮。 利用中斷控制8只LED交替閃爍1次的電路如下所示 file:///C:/Users/zyt/AppData/Local/Temp/msohtmlclip1/01/clip_image002.png 參考程序如下: #include <reg51.h> #define uchar unsigned char void Delay(unsigned int i) //延時函數Delay( ),i形式參數,不能賦初值 { unsigned int j; for(;i > 0;i--) for(j=0;j<333;j++) //晶振為12MHz,j選擇與晶振頻率有關 {;} //空函數 } void main( ) //主函數 { EA=1; //總中斷允許 EX0=1; //允許外部中斷0中斷 IT0=1; //選擇外部中斷0為跳沿觸發方式 while(1) //循環 { P1=0;} // P1口的8只LED全亮 } void int0( ) interrupt 0 using 0 //外中斷0的中斷服務函數 { uchar m; 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中斷 } 本例程包含兩部分,一部分是主程序段,完成中斷系統初始化,并把8個LED全部點亮。另一部分是中斷函數部分,控制4個LED交替閃爍1次,然后從中斷返回。 2、兩個外中斷的應用 當需要多個中斷源時,只需增加相應的中斷服務函數即可。 例題:在單片機P1口上接有8只LED。在外部中斷0輸入引腳(P3.2)接有一只按鈕開關K1。在外部中斷1輸入引腳(P3.3)接有一只按鈕開關K2。要求K1和K2都未按下時,P1口的8只LED呈流水燈顯示,僅K1(P3.2)按下再松開時,上下各4只LED交替閃爍10次,然后再回到流水燈顯示。如果按下再松開K2(P3.3)時,P1口的8只LED全部閃爍10次,然后再回到流水燈顯示。設置兩個外中斷的優先級相同。 電路圖如下: file:///C:/Users/zyt/AppData/Local/Temp/msohtmlclip1/01/clip_image004.png 參考程序如下: #include <reg51.h> #define uchar unsigned char void Delay(unsigned int i)//延時函數Delay( ),i為形式參數,不能 // 賦初值 { uchar j; for(;i>0;i--) for(j=0;j<125;j++) {;} //空函數 } void main( ) //主函數 { uchar display[9]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf, 0x7f};//流水燈顯示數據數組 unsigned int a; for(;;) { EA=1; //總中斷允許 EX0=1; //允許外部中斷0中斷 EX1=1; //允許外部中斷1中斷 IT0=1; //選擇外部中斷0為跳沿觸發方式 IT1=1; //選擇外部中斷1為跳沿觸發方式 IP=0; //兩個外部中斷均為低優先級 for(a=0;a<9;a++) { Delay(500); //延時 P1=display[a]; //將已經定義的流水燈顯示數據送到P1口 } } } void int0_isr(void) interrupt 0 using 1//外中斷0的中斷服務函數 { uchar n; for(n=0;n<10;n++) //高、低4位顯示10次 { P1=0x0f; //低4位LED滅,高4位LED亮 Delay(500); //延時 P1=0xf0; //高4位LED滅,低4位LED亮 Delay(500); //延時 } } void int1_isr (void) interrupt 2 using 2//外中斷1中斷服務函數 { uchar m; for(m=0;m<10;m++) //閃爍顯示10次 { P1=0xff; //全滅 Delay(500); //延時 P1=0; //全亮 Delay(500); //延時 } } | ||
總結(對上機實驗結果進行分析,上機心得體會及改進意見 | 此次實驗中,我了解了中斷處理系統的工作原理,為了熟悉中斷處理系統,我做了兩個實驗,一個為單-外中斷,另一個為兩外中斷。掌握了中斷處理子程序的書寫格式和使用方法。雖然在實驗過程中遇到了很多難題,但借助了網絡進行查詢,也加上同學的幫助,完成的還比較順利。 |
moky 發表于 2019-7-4 15:41
你這個怎么觸發中斷呢?我沒看懂啊
歡迎光臨 (http://www.zg4o1577.cn/bbs/) | Powered by Discuz! X3.1 |