新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 利用AVR的輸入捕捉進(jìn)行紅外解碼

利用AVR的輸入捕捉進(jìn)行紅外解碼

作者: 時(shí)間:2016-12-03 來源:網(wǎng)絡(luò) 收藏
使用AVR輸入捕捉可以對組碼進(jìn)行有效地區(qū)分,這里是對紅外接收頭接收到遙控器的碼型進(jìn)行解碼,也可以擴(kuò)展到其他的應(yīng)用領(lǐng)域。

關(guān)于紅外的基本知識參看下面的參考文章。需要說明的是紅外的數(shù)據(jù)端口電源最好加10uf濾波電容,然后數(shù)據(jù)引腳加上1K限流電阻。

本文引用地址:http://m.butianyuan.cn/article/201612/325120.htm

硬件平臺:ATMega16-16PU 紅外接收頭4338 康佳遙控器

編譯器: IAR For AVR

代碼:

/*================START==================*/

#include
#include
#include

/**********************************************************
變量聲明
**********************************************************/

unsigned int Receive_NewData = 0;
unsigned int Receive_OldData = 0;
unsigned int Calc_num = 0;
unsigned int Temp;
unsigned char Num;
unsigned char buffer[5]={0};

/**********************************************************
定時(shí)器1 捕獲定時(shí)器初始化
**********************************************************/
void Timer1_Init(void)
{
TCCR1A = 0x00;
// Input Capture on Falling Edge
TCCR1B = (1< // Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK = (1<}
/**********************************************************
開始捕獲
**********************************************************/
void main(void)
{
Timer1_Init();
_SEI();// Global enable interrupts
while(1){;}
}
/**********************************************************
定時(shí)器1 捕獲中斷 中斷服務(wù)程序
**********************************************************/
#pragma vector=TIMER1_CAPT_vect//定時(shí)器1 輸入捕獲中斷
__interrupt void OldTimer1_capt_isr(void)
// Timer 1 input capture interrupt service routine
{
unsigned char i,j;
Receive_NewData = ICR1; //得到新的數(shù)據(jù)
Temp = Receive_NewData - Receive_OldData ;//用這一次的數(shù)據(jù)減去上一次的數(shù)據(jù),得到本次捕捉時(shí)間
Receive_OldData = Receive_NewData ;//更新數(shù)據(jù)到 Receive_OldData

if(Temp>100 && Temp<150)// ‘0 ’ 信號
{
Num = 0;
}
else if(Temp>230 && Temp<280)// ‘1 ’ 信號
{
Num = 1;
}
else if(Temp>1300 && Temp<1800)// ‘ hearder ’信號
{
Calc_num = 0;
Num = 2;
}
else//干擾信號
{
return ;
}

//將二進(jìn)制碼轉(zhuǎn)換成十六進(jìn)制

//按下的按鍵鍵值碼型應(yīng)為 1001 1000 1000 0011 0011 1011 (1110 1100 0001 0011 )11
for(i=0;i<5;i++)
{
if((Calc_num>8*i) && (Calc_num<(8*i+8)))
{
buffer[i]=buffer[i] | Num;
buffer[i]<<=1;
}
else if(Calc_num==(8*i+8))
{
buffer[i]=buffer[i] | Num;
}
}


Calc_num++; //計(jì)數(shù)變量


if(Calc_num>41)
{
Calc_num=0;
for(j=0;j<5;j++)
{
buffer[j]=0;
}
}

}

/*================END==================*/

粗體部分是下面代碼總結(jié)的:

/*
if((Calc_num>0) && (Calc_num<8))
{
buffer[0]=buffer[0] | Num;
buffer[0]<<=1;
}
else if(Calc_num==8)
{
buffer[0]=buffer[0] | Num;
}
//-------------

if((Calc_num>8) && (Calc_num<16))
{
buffer[1]=buffer[1] | Num;
buffer[1]<<=1;
}
else if(Calc_num==16)
{
buffer[1]=buffer[1] | Num;
}
//-------------
if((Calc_num>16) && (Calc_num<24))
{
buffer[2]=buffer[2] | Num;
buffer[2]<<=1;
}
else if(Calc_num==24)
{
buffer[2]=buffer[2] | Num;
}
//-------------
if((Calc_num>24) && (Calc_num<32))
{
buffer[3]=buffer[3] | Num;
buffer[3]<<=1;
}
else if(Calc_num==32)
{
buffer[3]=buffer[3] | Num;
}
//-------------
if((Calc_num>32) && (Calc_num<40))
{
buffer[4]=buffer[4] | Num;
buffer[4]<<=1;
}
else if(Calc_num==40)
{
buffer[4]=buffer[4] | Num;
}

*/
//-------------



關(guān)鍵詞: AVR輸入捕捉紅外解

評論


技術(shù)專區(qū)

關(guān)閉