當前位置:首頁 » 存儲配置 » 51中斷函數怎麼配置

51中斷函數怎麼配置

發布時間: 2022-05-13 18:35:06

A. C51中斷函數在什麼情況下被調用

一、中斷函數的調用
中斷函數是硬體或者操作系統自動調用的,也就是說只要滿足觸發條件,就會自動調用中斷函數(此時主函數是停止的)。當中斷函數執行完畢,又返回主函數繼續執行主函數。然後這樣不斷的循環,反正只要是觸發中斷的條件一滿足。就會自動進入中斷(前提是你的中斷的配置是正確的)
二、中斷函數的定義
1、中斷函數定義的格式為:
函數類型 函數名 interrupt n using n

其中: Interrupt後面的n是中斷號。
關鍵字using後面的n是所選擇的寄存器組,取值范圍是0-3.
定義中斷函數時,using是一個選項,可以省略不用。如果不用則由編譯器選擇一個寄存器組作為絕對寄存器組。
2、8051的中斷過程通過使用interrupt關鍵字和中斷號來實現,中斷號告訴編譯器中斷程序的入口地址。中斷號對應著IE寄存器中的使能位,換句話說,IE寄存器中的0位對應著外部中斷0,相應的外部中斷0的中斷號是0. IE寄存器中的使能位與外部中斷對應關系:
中斷號 中斷源

0 外部中斷0

1 定時器0

2 外部中斷1

3 定時器1中斷
4 串列口中斷

5 定時器2中斷

B. 關於51單片機中斷函數如何加入到主函數裡面

中斷函數不需要加到主函數,主函數打開中斷允許即可
你用的是定時器中斷,你的中斷號寫錯了

void int0(void) interrupt 1 //0是外中斷0,1才是定時器0

C. 51單片機中斷函數問題

首先中斷函數中一般是要杜絕循環的,也不用延時的。
延時通過定時器定時來實現,中斷多次進入就能實現重復多次處理。


設置一個位變數,每次進入後取反,根據它的值來給P2口服不同的值。
啟動前給flag賦值1,n賦值10,然後啟動定時計數器,設置合適的初值,使其定時為500

bitflag;
intn;
voidhi()interrupt2using2
{
if(n-->0)
if(flag)
P2=0xf8;
else
P2=0x07;
flag=~flag;
}

D. c51中斷函數如何定義,在使用時應注意哪些

C51的中斷函數的格式為:
void FuncIr(void) interrupt x [using y]
以下是夢游的一些分析:
一、中斷函數是一個特殊的函數,沒有參數,也沒有返回值;但是程序中允不允許使用return呢?答案是允許的,不過
只能用"return;",不能用"return(z);";用在一些需要快速返回的地方,對應的匯編會有多個ret語句,相對效率會高一
些。
二、using的用法,using可以修飾任何函數,不過個人建議只用來修飾中斷函數;簡單的說,「using」會指定工作寄存
器組,由於中斷函數一般都是比較緊急的事情,有時一條語句都會斤斤計較,所以使用using切換寄存器組可以省去一些壓棧
的動作,由於51隻有兩級中斷,同級中斷不能被打斷,因此,我們可以同級中斷設成同樣的寄存器組,從某種意義上來說,
有一組寄存器是多餘的。同時個人建議中斷函數應該使用using這個關鍵字。
三、中斷中調用函數,首先要討論中斷函數中調用函數的必要性,前天在論壇上我和別人爭論過這個問題,現在我還是
這個觀點:有些情況中斷中調用函數還是必要的,這個時候是不是該調用函數,其實和普通函數差不多,首先是這個函數如
果調用多次,或者要帶一些參數什麼的就更加必要的;前天有人跟我叫勁,說假如只調用一次且無參數無返回的函數要直接
寫,因為如果用函數,至少會增加CALL和RET兩條語句,我不敢苟同,我是實際調試發現的,當你程序比較復雜時,你將那部
分單獨拉出來做成函數,可能代碼和時間都會更好
四、中斷中調用的函數最好不要被中斷外的其它函數調用,因為會出現「重復調用」的警告,有時這種調用是很致命
的,有人說這個函數可以用reentrant來修飾,是的,的確可以這樣解決,不過個人不建議這么做,也許這樣會跟你減少很多
堆棧空間,並且整個程序的優化要差很多,個人建議出現這種情況就把這個函數寫兩遍,分成兩個函數分別調用。
五,中斷調用了函數,會出現一些莫名其妙的問題,一些數據不對。其實一般是因為匯編中使用了絕對寄存器引起的,有人說中斷函數使用那個寄存器組,被中斷調用的
函數就使用哪個寄存器組,我認為這樣不好:
這樣會增加額外的消耗,使用using會增加一下語句:
PUSH PSW
MOV PSW, #XX
....
POP PSW
更重要的是,使用using的函數不能有返回值,這是致命傷
個人推薦的方法有兩種:
1、使用「#pragma NOAREGS」禁止使用絕對寄存器
2、使用「#pragme RB(x)」來指定本文件的工作寄存器組
六、一般說來,要求中斷函數盡可能的短,但也有特殊情況,有些前/後台的系統中,就會把很多相對重要的事情放到定
時中斷(這個定時中斷類似實時操作系統中的時鍾節拍)去做,而且程序很長。我單獨提出來這點是想告訴大家,中斷函數
也是一個函數而已,只要系統有必要,可以做一些看似不合理的事情,該出手時就出手,就像goto語句一樣。

E. c51單片機如何使用中斷

將按鍵接到P3.2(INT0)或P3.3(INT1)

main(){
EA=1;//EA總中斷控制,EA=0關,EA=1開
EX0=1;//INT0中斷控制。0關1開,按鍵接P3.2用這個
EX1=1;//INT1中斷控制。0關1開,按鍵接P3.3用這個
//默認情況下,直接使EX0=1或EX1=1來打開中斷,INT0、INT1中斷是電平觸發的
while(1){
//主程序寫這里
}
}

/**外部中斷0服務程序,按下接P3.2的開關k=0下面程序被執行**/
int0()interrupt0
{
//程序代碼寫這裡面
}

/**外部中斷1服務程序,按下接P3.3的開關k=0下面程序被執行**/
int1()interrupt2
{
//程序代碼寫這裡面
}

注意,上面的中斷程序,如果執行完後,按鍵k還沒有放開,則中斷程序會再次被執行。為了防止這種情況發生,有以下幾種處理辦法以:

(1)可以在中斷程序中進行判斷,只有放開了按鈕k=1了中斷函數才返回。

(2)可以在進入中斷後關閉中斷,讓EX0或EX1=0。然後在主程序中,需要的時候再開起。

F. 51單片機定時器中斷函數,定時器,還有while()這三個之間是怎麼跳轉,工作流程是什麼呢

①TR0=1;//啟動定時器0 這就是 定時器開始 工作了。

②程序配置了 定時器的 中斷時間為 50ms(12MHz晶振),也就是每隔 50ms 就進入一次中斷函數。進入中斷後,程序又重新給定時器 定時 50ms,同時 對 中斷次數 進行 記錄(tt++)。主程序只要查詢 記錄值(tt),就能知道 定時器 中斷了多少次了。
③主函數的 while(1)表示 系統是個 循環系統,一直在 循環,不結束。當 定時器 產生中斷時,就會 暫停 主函數,這就稱為 中斷。等 中斷執行結束後,又 會的 主函數 被打斷的 地方,繼續執行主函數的 內容。

G. 51單片機中斷函數怎麼寫

51單片機的中斷函數格式:


void jump_low() interrupt 2
{
P1 = ~P1; //位反轉
}

interrupt函數格式:

void +函數名()+interrupt +數字0~4

0 表示外部中斷0

1 表示定時器/計數器(T0)

2外部中斷1

3:定時器/計數器(T1)

4:串列口

H. 關於51單片機的外部中斷使用方法

使用方法:
單片機的P2.5,P2.6,P2.7口分別接三位動態數碼管的位選端,P0口接動態數碼管的段選端。然後,P1.0口接一個電阻串聯一個LED燈然後接地,電阻取200~470歐之間就行,是一個限流電阻。
中斷用的是外部中斷0,要觸發中斷的時候,就用一根杜邦線一端接地,一端接到單片機的P3.2口就行,這樣,就滿足了你的要求了。
外部中斷的觸發方式有低電平觸發和下降沿觸發。到底是那種觸發方式,要設置中斷允許寄存器中IT0的值,如果IT0=0,像我寫的程序,就是低電平觸發,如果為1,就是下降沿觸發。
燈不是一定要接到P3.2口上的。中斷要執行的任務是在中斷函數中寫代碼控制的,就像我寫的代碼中,你只需要控制LED燈接的那個IO口就行了。
代碼如下:
#include
#define
uchar
unsigned
char
sbit
led=P1^0;
uchar
code
an[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar
code
wei[3]={0x06,0x05,0x03};
void
delay(uchar
c);
void
ini_()

//初始化函數,設置中斷觸發方式,開中斷
{

EA=1;

IT0=0;

EX0=1;
}
void
main()
{
uchar
i;

ini_();
led=0;

//由於單片機上電之後,所有的IO口默認是高電平,而要求是開始不亮,所以要將P1.0口開始設置為低電平。

while(1)

{
for(i=0;i<3;i++)

動態數碼管閃爍
{
P2=wei[i];
P0=an[i];
delay(35);
}
}
}
void
led_()
interrupt
0

//外部中斷0函數,中斷函數不需要申明
{
uchar
i;
led=1;

//在中斷中讓燈亮起來
while(1)
{
for(i=0;i<3;i++)
{
P2=wei[i];
P0=an[i];
delay(1);
}
}
}
void
delay(uchar
c)
{
uchar
a,b;
for(c;c>0;c--)
for(a=38;a>0;a--)
for(b=80;b>0;b--);
}

I. 在 C51 語言程序中,對於 51 系列單片機的 5 個中斷源,中斷函數定義格式中如何

例如定時器0中斷:
void timer0_sev (void) interrupt 1
timer0_sev是中斷程序名稱,可自己定
interrupt 1指的是中斷號,不能隨意寫
0 1 2 3 4 分別是外部中斷0 定時器0 外部中斷1 定時器1 串口中斷。
有的還在中斷序號後面寫 using 0 using 1等,指的是用哪一個寄存器組,防止內存沖突,應該沒什麼用途
編程寫兩個中斷程序,專門註明 using 1 using 2 用不同的分組
可查反匯編代碼,根本沒有修改PSW寄存器的語句
兩個中斷都是 PUSH ACC PUSH PSW
中斷結束前 POP ACC POP PSW

熱點內容
java工程師面試問題 發布:2024-11-16 09:28:36 瀏覽:233
用什麼引擎導出的安卓安裝包不大 發布:2024-11-16 09:09:06 瀏覽:474
安卓手機如何設置轉接 發布:2024-11-16 09:08:55 瀏覽:423
sql行業 發布:2024-11-16 09:04:07 瀏覽:295
如何查看電腦硬碟的介面速率緩存 發布:2024-11-16 08:59:42 瀏覽:221
c語言局部變數與全局變數 發布:2024-11-16 08:37:38 瀏覽:489
安卓蘋果是什麼意思啊 發布:2024-11-16 08:36:03 瀏覽:872
泛型方法編譯 發布:2024-11-16 08:36:01 瀏覽:875
造夢西遊記的密碼和用戶名是什麼 發布:2024-11-16 08:30:22 瀏覽:339
cmake編譯zlib出錯 發布:2024-11-16 08:26:32 瀏覽:442