導航:首頁 > 操作系統 > 單片機c語言中斷怎麼辦

單片機c語言中斷怎麼辦

發布時間:2023-01-08 06:51:17

『壹』 單片機C語言 中斷

我先說說interrupt關鍵字的意思。
interrupt聲明 表示中斷向量中(8*n+3)這里,n就是interrupt參數後的那個數字這里,生成 LJMP XXX 這樣一條指令.
假設你寫的是void spi_server() interrupt 5 using 0
那麼C51會自動在8*5+3這個地方生產LJMP ?C_SPI_SERVER。
當你的單片機響應了SPI中斷,那麼PC會自動跳到8*5+3這個地方,然後就跳到了spi_server()。希望能幫到你。

『貳』 單片機c語言中斷問題

這個簡單,不要用goto語句,程序會跑飛,你可以寫個標志程序如下:

MAIN_Flag;

int main(void)
{
while(1)
{
if( MAIN_Flag == 1)
{
執行相應的程序
}
}
}

void INTO(void)interrupt 0
{
MAIN_Flag = 1; //打開標志
}

也可以寫個進入外部中斷讓單片機內部看門狗復位,程序從頭開始執行

『叄』 單片機中斷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;
}
}
}

『肆』 單片機C語言中斷問題

你有個地方沒弄清楚。單片機執行的是機器碼,機器碼對應的是匯編指令。而C語言表述的句子,會編譯成若干匯編指令。就是說沒有C指令這一說,以51舉例,_nop_()對應匯編的NOP,但是一個簡單的a*b,編譯後可能長度就有好幾百位元組。
每條指令執行的周期不同。有些只要一個周期,有些需要幾個周期。中斷標志出現後,必須把當前執行的匯編指令執行完,才能響應中斷。

你的調用數組,也涉及到數據首地址,偏移量,讀寫數據等操作。這些操作是由好多個指令組合的。在這個過程中,產生中斷,會對數據有不可預知的影響。
如果要避免這個情況,只要調用這個數組前先關中斷。處理完數組後再開中斷就行了。

『伍』 單片機C語言中斷問題

你有個地方沒弄清楚。單片機執行的是機器碼,機器碼對應的是匯編指令。而C語言表述的句子,會編譯成若干匯編指令。就是說沒有C指令這一說,以51舉例,_nop_()對應匯編的NOP,但是一個簡單的a*b,編譯後可能長度就有好幾百位元組。
每條指令執行的周期不同。有些只要一個周期,有些需要幾個周期。中斷標志出現後,必須把當前執行的匯編指令執行完,才能響應中斷。
你的調用數組,也涉及到數據首地址,偏移量,讀寫數據等操作。這些操作是由好多個指令組合的。在這個過程中,產生中斷,會對數據有不可預知的影響。
如果要避免這個情況,只要調用這個數組前先關中斷。處理完數組後再開中斷就行了。

『陸』 c語言怎麼編寫單片機的中斷

給你上個較完整的程序,可以直接在KEIL中運行並觀察輸出
/******************************************************************************
功能:
本程序在12M晶振模式下,通過定時器中斷精確實現數字時鍾計時操作,並在KEIL
中實現輸出。時、分、秒的變化在定時中斷里處理。
說明:
因採用工作方式2,自動裝入初值,所以此程序計時很精確,只是在KEIL中模擬輸
出顯示的變化速度很快,這點可不理會
******************************************************************************/
#include
#include
#define
TEST
//此行用於KEIL輸出顯示,如果不需要顯示可將其刪除
typedef
unsigned
char
uchar;
typedef
unsigned
int
uint;
#define
TH0TL0_INIT
(256-250)
//定時器8位自動裝入模式下寄存器初值,0.25ms中斷一次
char
cHour;
//時
char
cMin;
//分
char
cSec;
//秒
uint
iCount;
//秒計數,計數達到4000時1s,4000*0.25ms
=1000ms
=
1s
bit
bSecChanged;
//秒發生變化標志,每秒送一次輸出顯示,送顯完成後清0,提高主程序效率
//==============================================================================
//T0定時器中斷服務程序,12M晶振下每0.25ms產生中斷,本程序執行一次
//==============================================================================
void
Timer0()
interrupt
1
{
iCount++;
//秒計數值+1
if(iCount==4000)
{//時間計數達到1S
iCount
=
0;
//重新開始下一秒計數
cSec++;
//時鍾:秒+1
bSecChanged
=
1;
//置秒發生變化標志
if(cSec==60)
{//計夠60s
cSec
=
0;
//重新開始下一分計數
cMin++;
//時鍾:分+1
}
if(cMin==60)
{//計夠60分鍾
cMin
=
0;
//重新開始下一小時計數
cHour++;
//時鍾:小時+1
}
if(cHour==24)
{//計夠24小時
cHour
=
0;
//重新開始第二天計數
}
}
}
//==============================================================================
//主程序
//==============================================================================
void
main()
{
uchar
outstr[10];
//輸出字元串,我的編譯器可能有問題,直接輸出有錯
TMOD
=
0X02;//工作方式2,8位自動重裝計時模式
TH0
=
TH0TL0_INIT;
//0.25ms中斷一次
TL0
=
TH0TL0_INIT;
//0.25ms中斷一次
#ifdef
TEST
SCON
=
0x50;
/*
SCON:
mode
1,
8-bit
UART,
enable
rcvr
*/
TMOD
|=
0x20;
/*
TMOD:
timer
1,
mode
2,
8-bit
reload
*/
TH1
=
221;
/*
TH1:
reload
value
for
1200
baud
@
16MHz
*/
TR1
=
1;
/*
TR1:
timer
1
run
*/
TI
=
1;
/*
TI:
set
TI
to
send
first
char
of
UART
*/
#endif
cHour
=
0;
//時
cMin
=
0;
//分
cSec
=
0;
//秒
iCount
=
0;
//秒計數
bSecChanged
=
0;
outstr[2]
=
':';
//時分分隔符
outstr[5]
=
':';
//分秒分隔符
outstr[8]
=
0;
//字元串結束符
EA=1;
//開總中斷
ET0=1;
//允許T0中斷
TR0=1;
//啟動T0
while(1)
{
if(bSecChanged==1)
{//秒發生變化,將時間值轉換為可顯示字元串准備送顯示
bSecChanged
=
0;//清除標志,節省CPU資源
outstr[0]
=
cHour/10
+
0x30;
//將秒轉換為ASCII碼
outstr[1]
=
cHour%10
+
0x30;
outstr[3]
=
cMin/10
+
0x30;
//將分轉換為ASCII碼
outstr[4]
=
cMin%10
+
0x30;
outstr[6]
=
cSec/10
+
0x30;
//將小時轉換為ASCII碼
outstr[7]
=
cSec%10
+
0x30;
#ifdef
TEST
printf("
%s\r",outstr);
//在KEIL中顯示時鍾
#endif
}
}
}

『柒』 誰能用C語言講講單片機中的中斷是怎麼用的

下面是51單片機一個定時器中斷應用程序。

#include<reg52.h>
#include<intrins.h>
unsigned char dat;
void main( void)
{TMOD=0x01;//設置定時器0為工作方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;//開總中斷
ET0=1;//開定時器0中斷
TR0=1;//啟動定時器0
while(1)
{P0=dat; //把dat賦給P0口顯示。
}}

//-----------------------中斷函數中斷號為1---------------
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
dat++;//每發生一次中斷DAT自加1.
}}

『捌』 單片機C語言一個中斷的問題

51單片機,不會在中斷過程中,再響應同等級別的中斷。
只有退出該中斷後,如果剛才的中斷申請標志還存在,才會再次進入中斷程序。

『玖』 c語言怎麼編寫單片機的中斷

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

『拾』 單片機c語言中的中斷問題

1.void(中斷函數返回類型(空型)) Time1 (中斷函數名)(void(參數類型) interrupt 3 (中斷號)
2: 中斷條件發生時執行中斷,比如void Time1(void) interrupt 3 是定時器1定時時間到發生中斷,中斷函數放在那裡無所謂
3:void PxInt0(void) interrupt 0 中斷名為PxInt0的0號中斷
void PxInt1(void) interrupt 2 中斷名為PxInt1的2號中斷
void time0_int(void) interrupt 1 中斷名為time0_int的1號中斷
void time1_int(void) interrupt 3 中斷名為time1_int的3號中斷
4:中斷的代碼是你想中斷執行的工作,中斷的代碼是根據任務,需要你自己寫的

閱讀全文

與單片機c語言中斷怎麼辦相關的資料

熱點內容
連漲啟動源碼 瀏覽:161
小奔運動app網路異常怎麼回事 瀏覽:449
php開啟壓縮 瀏覽:305
伺服器主機如何設置啟動 瀏覽:284
linux配置網路命令 瀏覽:774
一張照片怎麼製作視頻app 瀏覽:908
pythonweb和php 瀏覽:978
電腦伺服器地址ip地址 瀏覽:823
對矩陣壓縮是為了 瀏覽:912
setfacl命令 瀏覽:172
linux子系統中斷 瀏覽:342
linux查看進程ps 瀏覽:224
知識庫系統php 瀏覽:625
小波變換壓縮圖像python 瀏覽:153
阿里巴巴程序員怎麼月入百萬 瀏覽:175
如何使用國外伺服器 瀏覽:188
燃燈者pdf 瀏覽:470
編譯器用數學嗎 瀏覽:9
圖形化apk反編譯工具 瀏覽:48
考勤表加密怎麼辦 瀏覽:739