中斷嵌套。附件里包含源代碼,proteus工程文件。 使用一個外部中斷和定時器中斷,通過P1口連接的八個發光二極管來顯示中斷的作用。外部中斷未發生時,即引腳INT0的按鍵開關沒有按下時,系統通過定時器定時中斷的方法,使LED呈流水燈顯示,當INT0腳的按鍵開光按下,即產生外部中斷,外部中斷INT0打斷定時器的定時中斷,從而控制8個LED閃爍顯示。當按鍵開關松開,繼續呈流水燈顯示。本實驗中外部中斷0設置為高優先級中斷,定時器中斷設置為低優先級中斷。 電路原理圖:
圖片1.png (56.99 KB, 下載次數: 58)
下載附件
2021-12-28 20:43 上傳
電路工作原理的重點說明:發光二極管為共陽極連接,當對應P1口輸出0時,發光二極管發光。K1按鍵沒按下時,INT0=1,當K1按鍵按下時,INT0=0。 源代碼
圖片2.png (224.96 KB, 下載次數: 74)
下載附件
2021-12-28 20:46 上傳
控制程序的重點說明:PX0=1外部中斷為高優先級,PT0=0定時器中斷為低優先級,IT0=0將外部中斷0設置為電平觸發中斷方式,當按鍵K1按下時,為低電平觸發中斷,當按鍵松開時為高電平,外中斷0的中斷服務函數執行完后,中斷結束,回到定時器T0的中斷服務函數。
單片機源程序如下: - #include <reg51.h>
- #include<intrins.h>
- #define uint unsigned int
- #define uchar unsigned char//延時函數Delay( ),i為形式參數,不能賦初值
- void delay(uint i) {
- uchar j;
- for(;i>0;i--)
- for(j=0;j<125;j++)
- {;} //空函數
- }
- void main( )
- { //主函數
-
- TMOD=0x01; //定時器t0為方式1
- TH0=0xee; //設置定時器初值
- TL0=0x00;
- EA=1; //總中斷允許
- ET0=1;//允許定時器t0中斷
- TR0=1;//啟動定時器t0
- EX0=1; //允許外部中斷0中斷
- IT0=0; //選擇外部中斷0為電平觸發中斷方式
- PX0=1;//外部中斷為高優先級
- PT0=0;//定時器中斷為低優先級
- P1=0xff;
- while(1);
- {;} //循環等待
- }
- void timer0() interrupt 1 //T0中斷程序
- {
- uchar i;
- uchar display[9]= {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //流水燈顯示數據組
- TH0=0xee;
- TL0=0x00;
- while(1)
- {
- P1=0xff;
- for(i=0;i<9;i++)
- {
- delay(500);
- P1=display[i];
- }
- }
- }
- void int0_isr(void) interrupt 0 //外中斷0的中斷服務函數
- {
- P1=0;
- delay(700);
- P1=0xff;
- delay(700);
- }
復制代碼
Keil代碼與Proteus仿真下載:
中斷嵌套.zip
(34.25 KB, 下載次數: 18)
2021-12-28 20:48 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
中斷嵌套.zip
(11.62 KB, 下載次數: 14)
2021-12-28 20:48 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|