當前位置:首頁 » 編程軟體 » xc編譯器的中斷怎麼寫

xc編譯器的中斷怎麼寫

發布時間: 2023-06-08 10:45:34

1. 請教單片機高人:怎麼用C編寫中斷,匯編中可以有ORG 000BH來確定是T0中斷,那C怎麼辦還有現場保護怎辦

C51中斷函數格式
Keil C51編譯器中斷函數語法定義如下:
(c語言不用處理現場保護了) interrupt n <----這個是重點
void 函數名() interrupt n
{

}
//定時器T0中斷
void 函數名() interrupt 1
{

}

C51編譯器允許0~31個中斷,下列中斷及其相關地址為8051控制器所提供的中斷:
0:EXTERNAL 0 地址:0003H
1:TIMER/COUNTER 0 地址:000BH
2:EXTERNAL 1 地址:0013H
3:TIMER/COUNTER 1 地址:001BH
4:SERIAL PORT 地址:0023H
編寫中斷函數時應遵循下列規則:
·不能進行參數傳遞。如果中斷過程包括任何參數聲明,則編譯器將產生一個錯誤信息。
·無返回值。如果想定義一個返回值將產生錯誤,但是,如果返回整型值,編譯器將不產生
錯誤信息,因為整型值是默認值,編譯器不能清楚識別。
·在任何情況下,不能直接調用中斷函數,否則編譯器會產生錯誤。由於退出中斷過程是由
指令RETI完成的,該指令影響MCS-51單片機的硬體中斷系統,直接調用中斷函數時,硬體
上沒有中斷請求存在,因而這個指令的結果是不定的,並且通常是致命的。
·編譯器從絕對地址8n+3處產生一個中斷向量,其中n為中斷號,該向量包括一個中斷過
程的跳轉,向量的產生可由編譯器控制指令NOINTVECTOR壓縮,因而程序員可以從獨立的匯
編模塊中提供中斷向量。
·可以在中斷函數定義中使用using指定當前使用的寄存器組。格式如下:
void 函數名([形式參數])interrupt n [using m]
MCS-51單片機有四組寄存器R0~R7,程序具體使用哪一組寄存器由程序狀態字PSW中
的兩位RS1和RS0來確定。在中斷函數定義時,可以用using指定該函數具體使用哪一組寄
存器,m在0,1,2,3這4個數中取值,對應四組寄存器組。例如:
void delay() interrupt 3 using 2
·在中斷函數中調用的函數所使用的寄存器組必須與中斷函數相同。當沒有使用using指令
時,編譯器會選擇一個寄存器組作為絕對寄存器訪問。程序員必須保證按要求使用相應寄存
器組,C編譯器不會對此檢查。
·如果在中斷函數中執行浮點運算,必須保存浮點寄存器狀態,當沒有其他程序執行浮點運
算時,可以不保存。

2. 怎樣寫中斷服務程序

方法1. 用關鍵詞interrupt和中斷矢量編號定義中斷函數
這種方式最簡單也最直觀。缺點是程序的可移植性稍差。範例如下:
void interrupt 17 sci1_Recv_ISR(void){
.......}關鍵詞interrupt告訴編譯器此函數為中斷服務函數,數字17告訴連接器該中斷矢量的偏移位置(以復位矢量偏移為0計)。某一個中斷響應對應的矢量入口編號可以在該晶元的DataSheet中查到。
方法2. 用關鍵詞interrupt定義中斷函數,中斷矢量入口由prm文件指定,仍以上面的中斷服務函行仿數為例,這時函數的定義方式為
void interrupt sci1_Recv_ISR(void){
........}然脊帶升後在項目對應的prm文件中添加一行矢量位置定義:
VECTOR 17 sci1_Recv_ISR //指定的中斷服務矢量入口
方法3. 用#pragma TRAP_PROC定義中斷函數,中斷矢量入口由prm文件指定。此類型的函數編譯器在將C代碼編譯成匯編指令櫻老時會在代碼前後增加必要的現場保護和恢復匯編代碼,同時函數的最後返回用匯編指令RTI而不是針對普通函數的RTS。例如

3. 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
}
}
}

4. 關於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:中斷的代碼是你想中斷執行的工作,中斷的代碼是根據任務,需要你自己寫的

熱點內容
現在玩游戲的電腦需要什麼配置 發布:2024-04-20 17:09:57 瀏覽:194
游樂園的密碼一般為多少 發布:2024-04-20 17:09:51 瀏覽:40
興元安卓機怎麼進系統 發布:2024-04-20 17:07:16 瀏覽:805
我的世界伺服器如何放村民 發布:2024-04-20 17:05:35 瀏覽:358
手機反編譯dex 發布:2024-04-20 17:01:01 瀏覽:703
安卓怎麼設置微信拍一拍 發布:2024-04-20 16:44:48 瀏覽:568
三星3熱點密碼怎麼設置 發布:2024-04-20 16:30:52 瀏覽:578
用keil編譯顯示警告warn 發布:2024-04-20 16:27:09 瀏覽:893
訪問在哪兒 發布:2024-04-20 16:20:42 瀏覽:200
安卓手機有什麼可以把聲音改成電音的軟體 發布:2024-04-20 16:19:40 瀏覽:563