① 51單片機中斷 C語言請教!
格式是:函數類型 函數名(形式參數表) [interrupt n][using n]
interrupt是中斷函數類型關鍵字,其後面的n是中斷號,范圍是0-31
51單片機內可以在片內RAM中使用4個不同的工作寄存器組,每個寄存器組中包含8個工作寄存器(R0-R7)。而using就是用來選擇不同的工作寄存器組的,其後面的n是一個0-3的正整數,分別選中4個不同的工作寄存器組。using是一個選項,如果不用則由編譯器自動選擇一個寄存器組作為絕對寄存器組訪問。
注意:關鍵字using和interrupt的後面都不允許跟帶運算符的表達式,只能是一個在一定范圍內的常數!
這個我就不太清楚了,可能是為了擴展使用,一般51單片機的介面多
② c語言編寫51單片機中斷程序,執行過程是怎樣的
中斷是為了使時間更精確。使用中斷一般要先設置使用哪個定時/計數器的模式幾,之後再設置定時器的使能為,再打開總中斷使能位,啟動定時器。外部中斷比定時器的優先順序高,如果有更重要的事等著去處理則交給外部中斷,當檢測到有外部中斷時,會去執行外部中斷服務,執行完後回到之前未執行的地方接著繼續執行;串口用到定時器,因為在串口的模式1和模式3中需要用定時器的溢出率來設置波特率。我說得不怎麼詳細,這個幾句話說不清。這個你可以先把概念搞懂,之後用列子去理解概念會比較好,不懂的就多問問。
這是我在網上看到的一點資料
③ 求一個51單片機簡單的中斷C語言程序
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit beep=P3^5;
uchar i;
uchar code table1[]={
0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f,};
uchar code table[]= {
0x02 , 0x9F, 0x25, 0x0D , 0x99 ,
0x49 , 0x40, 0x1F, 0x00, 0x08,
0x10, 0xC0, 0x62, 0x84, 0X60, 0x70
} ;
uchar num;
uint m;
void delay(uint z);
void main()
{
EA=1;
EX0=1;
IT0=1;
EX1=1;
IT1=1;
while(1)
{
// EA=1;
// EX0=1;
// IT0=1;
// EX1=1;
// IT1=1;
for(num=0;num<8;num++)
{
delay(50) ;
P2=0X00;
P0=table1[num];
}
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void enter0()interrupt 0 //第一個中斷無源蜂鳴器響,無源蜂鳴器響要給響,需要不停給高低電平。
{
while(1)
{ P0=0X11;
for(i=100;i>0;i--)
beep=~beep;
}
}
void enter1()interrupt 2 第二個中斷是數碼管從0到F閃爍。
{
while(1)
{
for(i=0;i<17;i++)
{
P2=0XFF;
P0=table[i] ;
delay(200) ;
}
}
}
注釋: P0是控制LED, P2控制數碼管。
④ 51單片機定時中斷C語言的寫法步驟,可追加分數
程序說明:51單片機定時器0工作於方式一,定時50ms中斷一次
晶振為12M
#include
void
main
{
TOMD
=
0X01;
//配置定時器0工作於方式一
TH1
=
(65536-50000)/256;
//高八位裝入初值
TL1
=
(65536-50000)%256;
//低八位裝入初值
ET0
=
1;
//開定時器0中斷
EA
=
1;
//開總中斷
TR0
=
1;
//啟動定時器0
while(1)
{
;
}
}
void
Timer0_int()
interrupt
1
{
//重新裝初值
TH1
=
(65536-50000)/256;
//高八位裝入初值
TL1
=
(65536-50000)%256;
//低八位裝入初值
}
/***************************************************************************************************************/
上面是比較好理解的。如果實在要求簡潔的話,看下面的,跟上面功能一樣
#include
void
main
{
TOMD
=
0X01;
//配置定時器0工作於方式一
TH1
=
0x3c;
//高八位裝入初值
TL1
=
0xb0;
//低八位裝入初值
IE
=
0x82;//開總中斷並開定時器0中斷
TR0
=
1;
//啟動定時器0
while(1)
{
;
}
}
void
Timer0_int()
interrupt
1
{
//重新裝初值
TH1
=
0x3c;
//高八位裝入初值
TL1
=
0xb0;
//低八位裝入初值}
⑤ 51單片機c語言中斷函數不能進行參數傳遞,是什麼意思,誰能解釋一下
是指中斷處理函數不能有輸入參數也不能有函數返回。因為中斷都是些硬體自動調用,沒有程序去給他傳遞參數,也沒有硬體去接收參數。
不過x86計算機的軟中斷可以有參數傳遞,不過他是用寄存器傳遞的。
⑥ 51單片機c語言編程中產生中斷的條件是什麼
三個:
1.總中斷使能位EA=1
2.相應中斷使能 (ET0、EX0……) 打開
3.中斷源:外部中斷引腳的電平觸發、定時器溢出……
oid PxInt0(void) interrupt 0 //定義外部中斷0
void PxInt1(void) interrupt 2 //定義外部中斷1
void time0_int(void) interrupt 1 //定義定時器0
void time1_int(void) interrupt 3 //定義定時器1
這里為什麼是 0 1 2 3的順序呢~?其實是單片機內部默認的,順序依次是:
0 外部中斷0
1 定時/計數器0
2 外部中斷1
3 定時/計數器1
4 串列口中斷
這個是沒有什麼理由的,記住就行,以後要定義一個中斷的時候,定義的是哪一個,就在後面加上它的序號就行了,比如void PxInt0(void) interrupt 0 表示外部中斷0,就在後面加上interrupt 0.
逐詞解釋的話。。。如:void PxInt0(void) interrupt 0
void的意思是沒有返回值,Pxint0(void)是你定義的函數名,interrupt表示你定義的是中斷函數,0表示你定義的是外部中斷0
後面的依此類推。
另外,中斷函數不需要在main函數前聲明,當單片機檢測到中斷所需的信號時,它會自動立即停止正在進行的工作進入中斷函數。
⑦ 51單片機(c語言)中斷嵌套的困惑
「只要堆棧空間足夠,中斷嵌套的層數一般沒有限制」。
這話應該是對的。
雖然只有兩級優先順序。但是,同一優先順序的不同中斷的優先性不同。
具體的是:外部中斷0、T0、外部中斷1、T1、串列中斷。五級依次遞減。
(在同一優先順序)如果正在執行T1中斷,這時來了個T0中斷,那麼可以被打斷,執行T0中斷服務程序時又來個外部中斷0,也能被打斷。這不是有三級了嗎?
依次類推,應該最多5層吧!不過很少用到那麼多。
⑧ 單片機 C語言 中斷
主程序和中斷沒關系的,主程序是個死循環,一直執行。中斷是打斷主程序進入中斷子程序,中斷完成後繼續執行主程序。中斷標志要在進入中斷後清除,如果不清除,下次不會再觸發。主程序繼續執行無影響。
TR0是啟動定時器,啟動以後不要再改寫就好每到定時時間進入中斷。進入中斷後要清除中斷使能標志,不是叫你關閉定時器。這兩種不是一個概念。定時器控制寄存器裡面有一個中斷標志A,為1的時候代表進入中斷,進入中斷後A要清零,之後才會繼續查看A是否再次為1,為1即進中斷,在中斷寫零,如此循環進行。
關閉或者重新開啟TR0,標志A都是硬體自動重新裝載(初始化)0,以使中斷執行。所以也能達到效果,但是每次執行都重新設置定時器會比較耗費資源,其實只需要清零標志位就ok了。
⑨ 51單片機 C語言 如何實現中斷調用
#include<stc.h>
sbit
d1=P2^0;
sbit
p1=P2^1;
void
main()
{
方式一;
}
void
main()
{
EA=1;
EX0=1;
IT0=1;
方式二;
}
void
main()
{
EA=1;
EX1=1;
IT0=1;
方式三;
}
void
zd0()
interrupt
0
{
d1=0;
}
void
zd1()
interrupt
1
{
p1=0;
}
用的是外部中斷0和1,程序很簡單,注釋就不寫了。如果有錯誤的話,還請指正。
⑩ 51單片機簡單中斷C語言程序
首先你這問題不難,現在回答你這問題的難點在於你妹給出電路圖。
在此給出你程序的大體思路,
1、寫兩個子函數,一個是實現8個LED順序點亮的函數1,俗稱的流水燈,另一個是數碼管顯示「sos」的函數2
2、在主程序中去調用函數1,完了跟著檢測按鍵是否按下,檢測到按鍵後,調用函數1,完了多循環幾次函數2的調用來實現你的「顯示一段時間後返回LED順序點亮」
注意:按鍵檢測需要考慮去抖動的問題,寫的高大上一點,可以加入定時器,實現你的點亮一段時間。
望採納,有問題在追加,還不會寫可以發電路圖出來再說