① c語言怎麼編寫單片機的中斷
標准c語言沒有中斷調用機制,但是不同編譯器都有相應的中斷處理方式,可以使用戶實現中斷功能。
解決方案:
1、採取輪詢的方式解決,就是每10毫秒檢查一下是否有鍵盤請求,總的來說,這樣基本上可以解決問題,而且簡單易行,但每10毫秒都要檢查,系統消耗太大。
2、採取中斷的方式:
(1)用高級語言調用中斷來處理問題。中斷是cpu響應一個中斷外圍設備8259A的一個過程,當鍵盤敲擊,cpu保存斷點暫停執行並且跳到相應的中斷處理程序繼續執行,結束後根據斷點再跳回來。通過這種方式可以輕松+愉快地解決這個問題。但是需要用到高級語言調用匯編,根據編譯器的不同而有所差別。
(2)自己模擬中斷。可以另外建立一個線程專門響應鍵盤的敲擊,如果有敲擊則打斷主線程。這樣做實現起來很復雜,而且涉及到不少復雜的關鍵技術,比如信號量之類的東西。
3、強大的vc
vc採取了消息映射的機制來處理外部設備的請求,比如時鍾中斷、鍵盤中斷等等。通過此可以灰常灰常容易的處理外部中斷。
② 51單片機中斷函數怎麼寫
51單片機的中斷函數格式:
例
void jump_low() interrupt 2
{
P1 = ~P1; //位反轉
}
interrupt函數格式:
void +函數名()+interrupt +數字0~4
0 表示外部中斷0
1 表示定時器/計數器(T0)
2外部中斷1
3:定時器/計數器(T1)
4:串列口
③ 單片機中的中斷函數是不是只能寫在主函數裡面
中斷函數必須獨立,不能寫到主函數裡面。主函數可以初始化。
④ 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
}
}
}
⑤ 單片機C51的中斷程序應該怎麼寫
主函數,對介面輸出前,應該先把數據寫入一個全局變數,如段臘頃 aa = 0x??。
然後再握陸輸出:P0 = aa;。
在中斷函局橘數結束前,也執行:P0 = aa;,即可顯示出來中斷前的燈光。
⑥ 51單片機中斷程序怎麼寫
//unsigned char a;
void main(void)//主函數{TCON=0x01;EX0=1; //外部中斷允許
EA=1;//開總中斷while(1){//其他程序}}
void int0(void) interrupt 0 //外部中斷行搭0 中斷子程序{//這裡面可以寫中斷子程序/*a++;if(a==2) a=0;while(!zd)if(a) TR0=1; //開關計時器
else TR0=0;*/}
由於檔數拿對你的要求「按下INTO接的按鍵,使單片機執行間隔四燈輪流閃爍的中斷子程序」不夠理解,只能給你這樣一個程序框架了
進入中斷要執行中斷子畢檔程序,不同的中斷源要進入不同的中斷子程序。對於51的C編程,可以用中斷標號,如『interrupt 0』來使中斷進入不同的中斷。
中斷標號與它們的中斷優先順序一致,即
⑦ 單片機中斷程序
結構很規矩,這個程序。
首先單片機上電復位,運行死循環前面的程序(,你這里就是init_timer(); // 應該叫初始化定時器,才合適,讓定時器按照你需要的定時長度工作,或叫產生中斷 )
接下來單片機主程序就是一直在死循環了。我們的主要任務一般在這里處理。
中斷,就是在處理一些特殊任務,比如按鍵,或定時處理的程序,或外部一個不知道什麼時間發生的任務,或通信任務等等。你在主循環的時候,無論在什麼時候,中斷請求來了(可以理解為需要處理比較緊急任務,優先處理的任務),就會暫停主循環,進入對應中斷服務程序。運行完,在回主循環的暫停地方,繼續執行死循環的任務。
定時器中斷,就是每過一定時間,運行一下中斷服務程序。常用來計時和產生脈沖信號。
初始化定時器,就是給定時器的寄存器,設置工作模式,時鍾源,溢出的計數值。設置好了,定時器就能根據每個時鍾源的頻率,進行計數,直至溢出,然後產生一個中斷請求。如果不餓能自動載入計數初值的定時器,在中斷處理函數(服務函數)必須手動載入初值。
⑧ 如何知道單片機C語言中斷入口函數關鍵字的標准寫法
單片機C語言中斷入口函數標准寫法如下:
外部滑豎中斷0:void ext0() interrupt 0
定時器0: void time0() interrupt 1
外部中斷1:void ext1() interrupt 2
定時器1:void timer1() interrupt 3
串口: void uart() interrupt 4
如果要用其他工作態散寄存信閉大器組,後面可以加:using n(n=0,1,2,3)
⑨ 單片機c語言寫兩個中斷,兩個中斷怎麼寫
//任務6 顯示按鍵按下的次數(中斷方式)
//任務6 顯示按鍵按下的次數(中斷方式)
#include <reg51.h> //1 包含特殊功能寄存器定義頭文件reg51.h
#define ledport P2 //2 宏定義:ledport代表P2(發光二極體接P2口)
#define uchar unsigned char //3 宏定義:uchar代表unsigned char
#define ulong unsigned int //3 宏定義:ulong代表unsigned long
#define unsigned int j;
uchar m=0xef; //5 定雀和義變數m:m用來保存顯示控制數據,初值為0xfe
ulong i;
sfr p1=0x90;
sbit led1=P1^0; //led引腳定義
sbit led2=P1^1;
sbit led3=P1^2;
sbit led4=P1^3;
void fun1_int() interrupt 0 using 1//5 定義中斷服務函數:中斷號為0,用第1組寄存器組
{
while(1) //while循環(永遠為真,死循環)
{ //循環睜凳體開始
led1=~led1; //發光二級管的顯示狀態取反
led2=~led2;
led3=~led3;
led4=~led4;
for(j=0;j<12500;j++); //for循環,循環體為空,耗時 //延時500ms
}
} //循環體結束
void fun2_int() interrupt 1 using 2//5 定義中斷服務函數:中斷號為0,用第1組寄存器組
{
while(1) //7 while循環,條件表達式為1,永遠為真,死循環
{ //8 while循環體開始
P1=m; //9 P1口輸出當前顯示控制數據
m=(m<<1)|(m>>7); //10 顯示數據m向左循環移1位,為下次顯示輸出作準備
for(i=0;i<60000;i++); //11 for循環實現1s延時,循環體為空語句
} //12 while循環體結束
}
//8 中斷服務函數結束
void main(void) //9 main函數
{
EA=1;
EX0=0; //12 開外部中斷0
EX1=0;
IT1=1;
IT0=1; //11 設置外部中斷0的觸發方式:下降沿觸發。見代碼說明
while(1)
; //14 死循環,循環體為空頃早盯語句
} //15 main函數結束
//任務1 控制1隻發光二極體閃爍顯示上面的注釋可以省略不看,
這個需要設置不同的寄存器,注意依稀俺這里就可以了的,然後查一下數據手冊。