㈠ 單片機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隻發光二極體閃爍顯示上面的注釋可以省略不看,
這個需要設置不同的寄存器,注意依稀俺這里就可以了的,然後查一下數據手冊。
㈡ 單片機中斷初始化程序 編程
void INT_init()//初始化
{
IT0 = 0;//外部中斷0低電平觸發
IT1 = 1;//外部中斷1低電平觸發
PX0 = 1;//外部中斷0分配高優先順序
PX1=0;
IE = 0x85;//使能全局中斷,外部中斷0,外部中斷1
}
void EX_INT0() interrupt 0//外部中斷0
{
//添加自己的功能代碼
IE0=0;//清零中斷標志位
}
void EX_INT1() interrupt 2//外部中斷1
{
//添加自己的功能代碼
IE1=0;
}
㈢ 單片機中斷程序
結構很規矩,這個程序。
首先單片機上電復位,運行死循環前面的程序(,你這里就是init_timer(); // 應該叫初始化定時器,才合適,讓定時器按照你需要的定時長度工作,或叫產生中斷 )
接下來單片機主程序就是一直在死循環了。我們的主要任務一般在這里處理。
中斷,就是在處理一些特殊任務,比如按鍵,或定時處理的程序,或外部一個不知道什麼時間發生的任務,或通信任務等等。你在主循環的時候,無論在什麼時候,中斷請求來了(可以理解為需要處理比較緊急任務,優先處理的任務),就會暫停主循環,進入對應中斷服務程序。運行完,在回主循環的暫停地方,繼續執行死循環的任務。
定時器中斷,就是每過一定時間,運行一下中斷服務程序。常用來計時和產生脈沖信號。
初始化定時器,就是給定時器的寄存器,設置工作模式,時鍾源,溢出的計數值。設置好了,定時器就能根據每個時鍾源的頻率,進行計數,直至溢出,然後產生一個中斷請求。如果不餓能自動載入計數初值的定時器,在中斷處理函數(服務函數)必須手動載入初值。
㈣ 單片機中斷代碼
void init0(void)interrupt 0 using 1 //init0方式1,採用中斷方式
{
EA=0; // 關掉總中斷,防止外部中斷再來
TH0=0xff;
TL0=0x14; // 給定時器賦值,以便計數
int_times++; // int_times自增
if(head_ok==0) // 檢測同步頭
{
if(tmr_times>0x31&tmr_times<0x37) // 如果頭的時間在這個范圍內,那麼就標志頭檢測到了
{
head_ok=1; // 檢測到頭了
int_times=0; // 清零定時器
tmr_times=0;
lanth=0; // 清零lanth
}
else
{
wrong(); // 超出0X31 - 0X37則表示檢測的頭不對
}
}
else // 如果之前已經檢測到頭了,那麼就檢測數據位
{
one_zero(); // 調用這個函數不知道要幹啥
code_data=code_data>>1; // 檢測到的數據位組合起來,原來的數據往低位移動
if(lanth==1)
{
code_data|=0x80;
}
else
{
code_data&=0x7f;
}
tmr_times=0;
lanth=0;
if(int_times==8) //如果數值為8,則接收到的是地址碼
{
address=code_data;
}
else if(int_times==16) // 地址反碼
{
if(code_data+address!=0xff) wrong(); // 判斷是否是地址反碼
}
else if(int_times==24)
{
code_data1=code_data;
}
else if(int_times==32)
{
int_times=0;
head_ok=0;
if(code_data1==~code_data)
{
flagf=1;
shuju=code_data1;
beep=0;
}
else
{
flagf=0;
}
}
}
EA=1;
}
樓上說的是,要放在具體程序中才知道,貌似紅外或者無線數據解碼,不過解碼方式比較笨重,呵呵