當前位置:首頁 » 編程語言 » c語言單片機中斷程序設計
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言單片機中斷程序設計

發布時間: 2023-01-11 12:55:59

1. 幾種單片機c語言的中斷程序寫法

關於c的中斷使用一般是,定義函數的時候在後面加上interrupt
n
其中
n
對應中斷源的編號,其值從
0
開始,以
80c51
單片機為例,編號從
0~4,分別對應外中斷
0.
定時器0
中斷.外部中斷
1
.定時器1
中斷.和串列口中斷
.
void
xxxx(void)interrupt
n//中斷服務函數
{
要寫的中斷服務程序.
}

2. 單片機用C語言編寫中斷的範例

#include
sbit
csb_sat=
p1^0;
//定義超聲波發生腳
void
delay(void)
//延時25微秒,12t晶元用12m誤差
0us
{
unsigned
char
a;
for(a=11;a>0;a--);
}
void
csb_fs(int
dat)
{while(dat--){csb_sat=1;delay();csb_sat=0;delay();}}
//發射
void
main()
{
ea=1;
while(1)
{
csb_fs(10);
delay();delay();delay();delay();delay();delay();delay();delay();delay();
ie=0x83;
//int0允許中斷
while(ie);
p1_1=1;delay();p1_1=0;delay();p1_1=1;delay();p1_1=0;delay();p1_1=1;delay();p1_1=0;delay();
}
}
void
int0_chuankou(void)
interrupt
0
using
1
//外部int0中斷子程序
{
ie=0;//禁止int0中斷
}

3. 單片機用C語言編寫中斷的範例,順便簡述電路

#include <reg52.h> //包括一個52標准內核的頭文件
sbit P10 = P1^0;
void main(void)// 主程序
{
IT0=1; //外中斷跳變產生中斷
EX0=1;
EA=1; //打開總中斷
while(1) //主程序循環
{
;
}
}
//interrupt 0 代表0號中斷,也就是外部中斷0
int0() interrupt 0
{
P10=~P10; //在中斷里取反P1.0,翻轉LED燈狀態
}
電路很簡單,一LED加限流電阻,正極+5V,負極連P1.0。再用一按鈕,一端接地,另一端接P3.2。

4. 51單片機簡單中斷C語言程序

首先你這問題不難,現在回答你這問題的難點在於你妹給出電路圖。
在此給出你程序的大體思路,

1、寫兩個子函數,一個是實現8個LED順序點亮的函數1,俗稱的流水燈,另一個是數碼管顯示「sos」的函數2
2、在主程序中去調用函數1,完了跟著檢測按鍵是否按下,檢測到按鍵後,調用函數1,完了多循環幾次函數2的調用來實現你的「顯示一段時間後返回LED順序點亮」
注意:按鍵檢測需要考慮去抖動的問題,寫的高大上一點,可以加入定時器,實現你的點亮一段時間。
望採納,有問題在追加,還不會寫可以發電路圖出來再說

5. 單片機定時器中斷程序,C語言程序設計

#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
uchar keyval;
uchar led1=0xfe,led2=0x55,led3=0x0f;
sbit key=P1^0;
void t0isr() interrupt 1
{
TH0=(65536-60000)/256;
TL0=(65536-60000)%256;
switch(keyval)
{
case 1:
P0=led1;
led1=_crol_(led1,1)
break;
case 2:
P0=led2;
led2=~led2;
break;
case 3:
P0=led3;
led3=~led3;
break;
default:break;
}
}
main()
{
TMOD=0x01;
TH0=(65536-60000)/256;
TL0=(65536-60000)%256;
TR0=1;
ET0=1;
EA=1;
while(1)
{
if(key==0)
{
while(key==0);
keyval++;
keyval%=4;
}
}
}

6. 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;
//低八位裝入初值}

7. c語言怎麼編寫單片機的中斷

標准c語言沒有中斷調用機制,但是不同編譯器都有相應的中斷處理方式,可以使用戶實現中斷功能。
解決方案:
1、採取輪詢的方式解決,就是每10毫秒檢查一下是否有鍵盤請求,總的來說,這樣基本上可以解決問題,而且簡單易行,但每10毫秒都要檢查,系統消耗太大。
2、採取中斷的方式:
(1)用高級語言調用中斷來處理問題。中斷是cpu響應一個中斷外圍設備8259A的一個過程,當鍵盤敲擊,cpu保存斷點暫停執行並且跳到相應的中斷處理程序繼續執行,結束後根據斷點再跳回來。通過這種方式可以輕松+愉快地解決這個問題。但是需要用到高級語言調用匯編,根據編譯器的不同而有所差別。
(2)自己模擬中斷。可以另外建立一個線程專門響應鍵盤的敲擊,如果有敲擊則打斷主線程。這樣做實現起來很復雜,而且涉及到不少復雜的關鍵技術,比如信號量之類的東西。
3、強大的vc
vc採取了消息映射的機制來處理外部設備的請求,比如時鍾中斷、鍵盤中斷等等。通過此可以灰常灰常容易的處理外部中斷。

8. c語言怎麼編寫單片機的中斷

外部中斷(INT0):
I0(void)
interrupt
0//interrupt
0用於外部中斷INT0
{//中斷執行的內容}
定時器/計數器中斷(T0):
T0(void)
interrupt
1//interrupt
1用於定時器/計數器T0
{//中斷執行的內容}
外部中斷(INT1):
I1(void)
interrupt
2//interrupt
2用於外部中斷INT1
{//中斷執行的內容}
定時器/計數器中斷(T1):
T1(void)
interrupt
3//interrupt
3用於定時器/計數器T1
{//中斷執行的內容}

9. 單片機中斷c語言編程

單片機上電後,引腳默認是高點平!所以你在引腳初始化時就要把 fmq清零
在主函數開始執行 fmq = 0;再做就不會自動響了

10. 單片機中斷C語言

#include<reg51.h>

#defineucharunsignedchar
ucharcodeledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//0-9
ucharscanled;
ucharflag=0;
uchardisdat[6];
voiddelay(unsignedintx)
{
unsignedinti,j;
for(i=0;i<x;i++)
for(j=0;j<120;j++);
}
voiddischg()
{
uchari;
for(i=0;i<6;i++)
disdat[i]=10;
}
voidext0()interrupt0
{
flag=1;
}
voidext1()interrupt2
{
flag=2;
}
voidt1isr()interrupt3 //顯示
{
TH1=0xec;
TL1=0x78;
switch(scanled)
{
case0:
P2=0x01;
P0=~ledtab[disdat[5]];
break;
case1:
P2=0x02;
P0=~ledtab[disdat[4]];
break;
case2:
P2=0x04;
P0=~ledtab[disdat[3]];
break;
case3:
P2=0x08;
P0=~ledtab[disdat[2]];
break;
case4:
P2=0x10;
P0=~ledtab[disdat[1]];
break;
case5:
P2=0x20;
P0=~ledtab[disdat[0]];
break;
default:break;
}
scanled++;
scanled%=6;
}
main()
{
uchari,j;
TMOD=0x10;
TH1=0xec;
TL1=0x78;
TR1=1;
ET1=1;
IT0=1;
IT1=1;
EX0=1;
EX1=1;
EA=1;
scanled=0;
dischg();
while(1)
{
i=0;
switch(flag)
{
case1:
for(j=0;j<3;j++)
for(i=0;i<10;i++)
{
disdat[5]=disdat[4];
disdat[4]=disdat[3];
disdat[3]=disdat[2];
disdat[2]=disdat[1];
disdat[1]=disdat[0];
disdat[0]=i;
delay(200);
}
dischg();
flag=0;
break;
case2:
for(j=0;j<3;j++)
for(i=0;i<10;i++)
{
disdat[0]=disdat[1];
disdat[1]=disdat[2];
disdat[2]=disdat[3];
disdat[3]=disdat[4];
disdat[4]=disdat[5];
disdat[5]=i;
delay(200);
}
dischg();
flag=0;
break;
default:break;
}
}
}