新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 紅外解碼原理及程序

紅外解碼原理及程序

作者: 時間:2016-11-18 來源:網(wǎng)絡(luò) 收藏
//----------------------------------------------------------------------------------------------------------------------------------------------

//紅外解碼原理基本簡介:當(dāng)發(fā)射鍵按下后,就會發(fā)射出33位遙控編碼,按下的鍵不同,發(fā)射出的編碼不同;
//33位數(shù)據(jù)中。第一位是起始碼,告訴接收器準(zhǔn)備開始接收。后面的32位時數(shù)據(jù),最開始發(fā)送出去的是操控碼,用于不同遙控器的識別。同一各遙控器
//所有按鍵的操控碼都相同;發(fā)送時,先發(fā)低位,再發(fā)高位;接下來的數(shù)據(jù)是操控碼的反碼,用于驗證操控碼,同樣也是低位在前,高位在后;接下來
//的就是數(shù)據(jù)了,數(shù)據(jù)石油8位2進(jìn)制的數(shù)構(gòu)成,同樣低位在前,高位在后。最后的8位數(shù)據(jù)時前面數(shù)據(jù)的反碼,用于數(shù)據(jù)的校對;
//在解碼時最關(guān)鍵的是怎樣識別發(fā)送過來的0和1;遙控編碼,是用38kHZ的載波發(fā)送的;通常, ”0“用0.56ms的低電平和0.56ms的高電平組合而成,脈沖寬度
//位1.12ms;”1“是用0.56ms的低電平和1.69ms的高電平組合而成,脈沖寬度為2.25ms。這頁就位我們提供了一種方法來識別0和1,即判別脈沖寬度;這頁就是
//本程序所用到的方法;其次,比較關(guān)鍵的是,如何識別起始位;通常用9ms的低電平和4.5ms的高電平組合成起始位,因而同樣可以用判別脈沖寬度的方法來識
//別起始位;
//------------------------------------------------------------------------------------------------------------------------------------------------

本文引用地址:http://butianyuan.cn/article/201611/315931.htm



#include//包含頭文件;

//--------------------------------------------------------------------
//重新聲明變量標(biāo)識符;
//--------------------------------------------------------------------
#defineucharunsignedchar
#defineuintunsignedint
#defineulongunsignedlongint

sbitout=P3^2;//端口定義;


ucharadd=0,_add=0,tdata=0,_tdata=0;//分別為 操控碼,操控反碼,數(shù)據(jù),數(shù)據(jù)反碼;
ucharadd_up=0,add_down=0,_add_up=0,_add_down=0,tdata_up=0,tdata_down=0,_tdata_up=0,_tdata_down=0;//up代表高4位,down代表低4位;
ucharnum=0;//用于判斷接收數(shù)據(jù)的位數(shù),判斷終止位;
ulongbitdata=0x00000000;//用于存放接收到的32位二進(jìn)制數(shù);

bitfinish_flag=0;//結(jié)束標(biāo)志;
bitstart_flag=0;//開始標(biāo)志;
bittime=1;//數(shù)據(jù)與開始標(biāo)志識別;
bitdata_start=0;//數(shù)據(jù)開始標(biāo)志;

ucharcodetable[]={
0x28,/*0*/
0x7E,/*1*/
0xA2,/*2*/
0x62,/*3*/
0x74,/*4*/
0x61,/*5*/
0x21,/*6*/
0x7A,/*7*/
0x20,/*8*/
0x60,/*9*/
0x30,/*A*/
0x25,/*b*/
0xA9,/*C*/
0x26,/*d*/
0xA1,/*E*/
0xB1 /*F*/
};

//------------------------------------------------------------------------------------------------------
//所用到函數(shù)的聲明;
//------------------------------------------------------------------------------------------------------
voiddisplay(uchart);
voidinitial();
bitstart_check(uchardata1,uchardata2);
bittrans_to_bit(uchardata1,uchardata2);
voidtrans_bitdata_to_data();
voidtrans_data();
bitdata_check();
voidinterrupt0();
voiddisplay(uchart);

//-------------------------------------------------------------------------------------------------
//函數(shù)名稱:delay();
//入口參數(shù):uchar n;
//功能:延時;

//-------------------------------------------------------------------------------------------------


voiddelay(ucharn)
{
while(n--);
}

//-------------------------------------------------------------------------------------------------
//函數(shù)名稱:initial();
//入口參數(shù):無;
//功能:初始化;

//-------------------------------------------------------------------------------------------------

voidinitial()
{
EA=1;//開總中斷;
EX0=1;//開外部中斷0;
IT0=1;//外部0中斷方式位下降沿中斷;
TMOD=0x01;//定時器0,工作方式1;
TH0=0x00;//置初值;
TL0=0x00;
time=1;
num=0;
data_start=0;
start_flag=0;
finish_flag=0;
}

//-------------------------------------------------------------------------------------------------
//函數(shù)名稱:start_check();
//入口參數(shù):uchar data1,uchar data2;
//出口參數(shù)類型:bit;
//功能:開始位判斷;
//-------------------------------------------------------------------------------------------------
bitstart_check(uchardata1,uchardata2)
{
uinti;
i=data1*256+data2;
if(i>7500&&i<14500)
return1;
else
return0;
}


//-------------------------------------------------------------------------------------------------
//函數(shù)名稱:trans_to_bit();
//入口參數(shù):uchar data1,uchar data2;
//出口參數(shù)類型:bit;
//功能:將定時器的值轉(zhuǎn)化位2進(jìn)制數(shù)0和1;

//-------------------------------------------------------------------------------------------------

bittrans_to_bit(uchardata1,uchardata2)
{
uint i;
i=data1*256+data2;
if(i>1200&&i<2300)
return1;
else
return0;
}

//-------------------------------------------------------------------------------------------------
//函數(shù)名稱:trans_bitdata_to_data();
//入口參數(shù):無;
//出口參數(shù)類型:void;
//功能:分離出操控碼,操控反碼,數(shù)據(jù),數(shù)據(jù)反碼;;

//-------------------------------------------------------------------------------------------------

voidtrans_bitdata_to_data()
{
add=(uchar)(bitdata&0x000000ff);
_add=(uchar)((bitdata&0x0000ff00)>>8);
tdata=(uchar)((bitdata&0x00ff0000)>>16);
_tdata=(uchar)((bitdata&0xff000000)>>24);
}


//-------------------------------------------------------------------------------------------------
//函數(shù)名稱:trans_data();
//入口參數(shù):無;
//出口參數(shù)類型:void;
//功能:分離出操控碼,操控反碼,數(shù)據(jù),數(shù)據(jù)反碼的高4位和低4位;
//-------------------------------------------------------------------------------------------------
voidtrans_data()
{
add_up=(add&0xf0)/16;
add_down=add&0x0f;
_add_up=(_add&0xf0)/16;
_add_down=_add&0x0f;
tdata_up=(tdata&0xf0)/16;
tdata_down=tdata&0x0f;
_tdata_up=(_tdata&0xf0)/16;
_tdata_down=_tdata&0x0f;

}

//-------------------------------------------------------------------------------------------------
//函數(shù)名稱:data_check();
//入口參數(shù):無;
//出口參數(shù)類型:bit;
//功能:檢驗所得數(shù)據(jù)的正確性;
//-------------------------------------------------------------------------------------------------
bitdata_check()
{
if((add==~_add)&&(tdata==~_tdata))
return1;
else
return0;
}

//-------------------------------------------------------------------------------------------------
//函數(shù)名稱:interrupt0();
//入口參數(shù):無;
//出口參數(shù)類型:void;
//功能:外部中斷0;

//-------------------------------------------------------------------------------------------------

voidinterrupt0()interrupt0
{
ucharTH0_BUF,TL0_BUF;//定時器數(shù)據(jù)緩存;
if(!time&&data_start)//判斷起始位是否有效,為第二次中斷時;
{
TR0=0;//關(guān)定時器0;
if(start_check(TH0,TL0))
{start_flag=1;data_start=0;TH0=0x00;TL0=0x00;TR0=1;}//若起始位有效,置位開始標(biāo)志位start_flag,定時器重新定時;
else//若起始位無效,初始化,等待下個起始位;
initial();
}

else if(!time&&start_flag)//起始位有效,則在第二次中斷時接收數(shù)據(jù);
{
TR0=0;
TH0_BUF=TH0;
TL0_BUF=TL0;
TH0=0x00;
TL0=0x00;
TR0=1;
bitdata=bitdata>>1;//先移位,后賦值;
if(trans_to_bit(TH0_BUF,TL0_BUF))
bitdata=bitdata|0x80000000;
else
;
if(num>=31)//接收完成,完成標(biāo)志finish_flag置位;
finish_flag=1;
else
num++;
}
elseif(time)//第一此中斷,開定時器;
{
time=!time;
TR0=1;
data_start=1;
}
}


//-------------------------------------------------------------------------------------------------
//函數(shù)名稱:display();
//入口參數(shù):uchar t;
//出口參數(shù)類型:void;
//功能:顯示函數(shù);

//-------------------------------------------------------------------------------------------------
voiddisplay(uchart)
{
while(t--)
{
P0=0x00;
P2=0xfe;
P0=table[add_up];
delay(10);
P0=0x00;
P2=0xfd;
P0=table[add_down];
delay(10);
P0=0x00;
P2=0xfb;
P0=table[_add_up];
delay(10);
P0=0x00;
P2=0xf7;
P0=table[_add_down];
delay(10);
P0=0x00;
P2=0xef;
P0=table[tdata_up];
delay(10);
P0=0x00;
P2=0xdf;
P0=table[tdata_down];
delay(10);
P0=0x00;
P2=0xbf;
P0=table[_tdata_up];
delay(10);
P0=0x00;
P2=0x7f;
P0=table[_tdata_down];
delay(10);
}
}


//----------------------------------------------------------------------------------------------
//主函數(shù)入口;
//----------------------------------------------------------------------------------------------

main()
{
initial();//初始化;
while(1)
{
display(1);
if(finish_flag)//完成后,進(jìn)行數(shù)據(jù)處理;
{
initial();//初始化,準(zhǔn)備接收第二次;
trans_bitdata_to_data();
if(data_check())//判斷接收數(shù)據(jù)是否正確,如果正確,則顯示,否則丟棄;
trans_data();
}
}
}



關(guān)鍵詞: 紅外解碼原理及程

評論


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

關(guān)閉