您的位置 首页 硬件

红外解码原理及程序

//————————————————————————————————–

//———————————————————————————————————————————————-

//红外解码原理根本简介:当发射键按下后,就会发射出33位遥控编码,按下的键不同,发射出的编码不同;
//33位数据中。榜首位是开端码,告知接纳器预备开端接纳。后边的32位时数据,最开端发送出去的是控制码,用于不同遥控器的辨认。同一各遥控器
//一切按键的控制码都相同;发送时,先发低位,再发高位;接下来的数据是控制码的反码,用于验证控制码,相同也是低位在前,高位在后;接下来
//的便是数据了,数据石油8位2进制的数构成,相同低位在前,高位在后。最终的8位数据时前面数据的反码,用于数据的校正;
//在解码时最要害的是怎样辨认发送过来的0和1;遥控编码,是用38kHZ的载波发送的;一般, ”0“用0.56ms的低电平和0.56ms的高电平组合而成,脉冲宽度
//位1.12ms;”1“是用0.56ms的低电平和1.69ms的高电平组合而成,脉冲宽度为2.25ms。这页就位咱们供给了一种办法来辨认0和1,即判别脉冲宽度;这页便是
//本程序所用到的办法;其次,比较要害的是,怎么辨认开端位;一般用9ms的低电平和4.5ms的高电平组合成开端位,因此相同可以用判别脉冲宽度的办法来识
//别开端位;
//————————————————————————————————————————————————

#include//包括头文件;

//——————————————————————–
//从头声明变量标识符;
//——————————————————————–
#defineucharunsignedchar
#defineuintunsignedint
#defineulongunsignedlongint

sbitout=P3^2;//端口界说;

ucharadd=0,_add=0,tdata=0,_tdata=0;//分别为 控制码,控制反码,数据,数据反码;
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;//用于判别接纳数据的位数,判别停止位;
ulongbitdata=0x00000000;//用于寄存接纳到的32位二进制数

bitfinish_flag=0;//完毕标志;
bitstart_flag=0;//开端标志;
bittime=1;//数据与开端标志辨认;
bitdata_start=0;//数据开端标志;

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*/
};

//——————————————————————————————————
//所用到函数的声明;
//——————————————————————————————————
voiddisplay(uchart);
voidinitial();
bitstart_check(uchardata1,uchardata2);
bittrans_to_bit(uchardata1,uchardata2);
voidtrans_bitdata_to_data();
voidtrans_data();
bitdata_check();
voidinterrupt0();
voiddisplay(uchart);

//————————————————————————————————-
//函数称号:delay();
//进口参数:uchar n;
//功用:延时;

//————————————————————————————————-

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

//————————————————————————————————-
//函数称号:initial();
//进口参数:无;
//功用:初始化;

//————————————————————————————————-

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;
}

//————————————————————————————————-
//函数称号:start_check();
//进口参数:uchar data1,uchar data2;
//出口参数类型:bit;
//功用:开端位判别;
//————————————————————————————————-
bitstart_check(uchardata1,uchardata2)
{
uinti;
i=data1*256+data2;
if(i>7500&&i<14500)
return1;
else
return0;
}

//————————————————————————————————-
//函数称号:trans_to_bit();
//进口参数:uchar data1,uchar data2;
//出口参数类型:bit;
//功用:将守时器的值转化位2进制数0和1;

//————————————————————————————————-

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

//————————————————————————————————-
//函数称号:trans_bitdata_to_data();
//进口参数:无;
//出口参数类型:void;
//功用:别离出控制码,控制反码,数据,数据反码;;

//————————————————————————————————-

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

//————————————————————————————————-
//函数称号:trans_data();
//进口参数:无;
//出口参数类型:void;
//功用:别离出控制码,控制反码,数据,数据反码的高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;

}

//————————————————————————————————-
//函数称号:data_check();
//进口参数:无;
//出口参数类型:bit;
//功用:查验所得数据的正确性;
//————————————————————————————————-
bitdata_check()
{
if((add==~_add)&&(tdata==~_tdata))
return1;
else
return0;
}

//————————————————————————————————-
//函数称号:interrupt0();
//进口参数:无;
//出口参数类型:void;
//功用:外部中止0;

//————————————————————————————————-

voidinterrupt0()interrupt0
{
ucharTH0_BUF,TL0_BUF;//守时器数据缓存;
if(!time&&data_start)//判别开端位是否有用,为第2次中止时;
{
TR0=0;//关守时器0;
if(start_check(TH0,TL0))
{start_flag=1;data_start=0;TH0=0x00;TL0=0x00;TR0=1;}//若开端位有用,置位开端标志位start_flag,守时器从头守时;
else//若开端位无效,初始化,等候下个开端位;
initial();
}

else if(!time&&start_flag)//开端位有用,则在第2次中止时接纳数据;
{
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)//接纳完结,完结标志finish_flag置位;
finish_flag=1;
else
num++;
}
elseif(time)//榜首此中止,开守时器;
{
time=!time;
TR0=1;
data_start=1;
}
}

//————————————————————————————————-
//函数称号:display();
//进口参数:uchar t;
//出口参数类型:void;
//功用:显现函数;

//————————————————————————————————-
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);
}
}

//———————————————————————————————-
//主函数进口;
//———————————————————————————————-

main()
{
initial();//初始化;
while(1)
{
display(1);
if(finish_flag)//完结后,进行数据处理;
{
initial();//初始化,预备接纳第2次;
trans_bitdata_to_data();
if(data_check())//判别接纳数据是否正确,假如正确,则显现,不然丢掉;
trans_data();
}
}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/yingjian/266988.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部