51微控制器的中斷巢狀怎麼實現呢?

2022-08-31 17:33:16 字數 1802 閱讀 1542

今天在練習51微控制器的巢狀中斷時,發現了乙個奇怪的點,就是中斷服務函式在執行的時候,無論優先順序的高低,都不能被打斷。嗯,就是外部中斷

0和外部中斷

1都不能打斷定時器

0的中斷服務函式。(優先順序:外部中斷

0>

定時器0>

外部中斷1)

.我本來想開啟定時器0,外部中斷

0和外部中斷

1,實現中斷巢狀

.比如外部中斷0到達時,執行中斷服務函式

int0

,因為它的優先順序高,所以當外部中斷

1和定時器

0到達時,不會打斷外部中斷

0的中斷服務函式。而當定時器

0中斷時,外部中斷

0到達可以打斷其執行,外部中斷

1到達不可打斷。

但是很難實現,因為開啟三個中斷後,每個中斷的服務函式執行函式超級短,當出現現象的時候(我設定了led燈狀態翻轉表示中斷到達),即小燈亮起或熄滅中斷函式就已經執行完了,很難控制讓中斷同時到達。。。

所以我這樣寫了**測試:

interrupt.c

#include#include

//外部中斷0初始化

void

int0_init()

//外部中斷1初始化

void

int1_init()

//定時器0初始化,模式1,16位計數模式,1ms

void

timer0_init()

//中斷服務函式

void int0() interrupt 0

}void int1() interrupt 2

}void timer0() interrupt 1

}//延時函式,為了消抖

void

delay(u16 j)

interrupt.h

#includetypedef unsigned 

char

u8;typedef unsigned

intu16;

//初始化函式

void

int0_init();

void

int1_init();

void

timer0_init();

void

timer1_init();

//中斷服務函式

void

int0();

void

int1();

void

timer0();

void

timer1();

void

delay(u16 j);

static u16 i=0

;sbit key1=p3^2

;sbit key2=p3^3

;sbit led1=p0^0;

main.c

#include#include

intmain()

嗯,這樣寫完後,我以為能實現我想要的結果,但是現象 是這樣的:

我在定時器0的中斷服務函式中加入的while(1)迴圈,timer0函式就不會退出。但是實驗結果是timer0不能被打斷,即當定時器0的中斷未到達時,外部中斷0和外部在中斷1都能控制led1的亮滅,當定時器1中斷達到時,在中斷服務函式timer0執行時 ,外部中斷0和外部中斷1的到達不能中斷定時器0的服務函式。

那麼問題來了,51微控制器怎能實現中斷巢狀呢?或者說是怎樣控制外部中斷和定時器中斷的同時到達以便確認中斷的優先順序排序?困擾的很啊。。。

微控制器 中斷巢狀

要求 使用乙個外部中斷和定時器中斷,p1口連線的8個發光二極體 系統通過定時器中斷的方式使得led呈流水燈顯示,外部中斷打斷定時器中斷,控制8個流水燈閃爍顯示。如下 include include define uchar unsigned char define uint unsigned int...

51微控制器 中斷

一 中斷的概念 cpu在處理某一事件a時,發生了另一事件b請求cpu迅速去處理 中斷發生 cpu暫時中斷當前的工作,轉去處理事件b 中斷響應和中斷服務 待cpu將事件b處理完畢後,再回到原來事件a被中斷的地方繼續處理事件a 中斷返回 這一過程稱為中斷 二 中斷源 在51微控制器中有5個中斷源 中斷號...

51微控制器 中斷

中斷,是微控制器的一種執行機制。標準的51微控制器有兩個控制中斷的暫存器。乙個是中斷使能暫存器,另乙個是中斷優先順序暫存器。ie 中斷使能暫存器的位分配 位址0xa8,可位定址 位7 6543 210符號 ea et2es et1ex1 et0ex0 復位值000 0000 0ie 中斷使能暫存器的...