单片机实现红外接收解码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
value=0;
}
irprosok=1; //红外数据提取完毕
}
//显示,要将接收到的码拆开8位显示
void irwork(void)//将接收到的码拆开显示
{
disp[0]=ircode[0]/16; //按16进制显示
disp[1]=ircode[0]%16;
disp[2]=ircode[1]/16;
4.3
判断所收到的用户码是否正确、键码及键码反码是否正确,如果都正确则认为此次收码为正确收码,否则丢弃。
收码完后,还会有结束脉冲波形,如果用户一直按住某个键不放,遥控器会一直发送连续按键脉冲波形,如果多次收到连续按键,可以认为再次收到键码,这个可以根据实际需要定。
5.
#include <reg51.h>
键值为1字节;
键值反码为1字节,键值反码为键值取反值。
先判断所收到用户码是否正确,如果不正确则丢弃此次所收键码,如果正确则利用键值反码取反与键值比较,判断收码是否正确,如果不正确则丢弃所收键码。
如下图所示:
从上图可以看出其用户码为:0b00100000-0b11111110,由于其低位在前,故转换后得到用户码为:0b00000100-0b01111111,即0x04,0x7F;
disp[3]=ircode[1]%16;
disp[4]=ircode[2]/16; //按16进制显示
disp[5]=ircode[2]%16;
disp[6]=ircode[3]/16;
disp[7]=ircode[3]%16;
}
void display(void)//送到数码管显示
{
LS138C=0;LS138B=0;LS138A=0; P0=table[disp[0]]; delay(10);//第一个数码管显示1
红外遥控器作为设备的输入控制具有操作简便、价格便宜等诸多好处。您可以根据您公司产品需要和遥控器提供商协商定制遥控器,包括遥控器键盘布局、每个按键的键码等。
遥控器键盘上每个按键的键码是一个小于256的一个数值,按键后通过遥控器红外管产生脉冲发送出去,红外接收器接收到脉冲后,对脉冲流进行分析,提取键码值,并按照键码值实现其遥控目的。
{
irwork();
irprosok=0;
}
display();
}
}
void exter0() interrupt 0
{
if(irnum>50)//收到引导码,14.5ms
{
startflag=1;
bitnum=0;
}
if(startflag)
{
irdata[bitnum]=irnum; //将接收到的数据放入irdata
LS138C=1;LS138B=0;LS138A=0; P0=table[disp[4]]; delay(10);
LS138C=1;LS138B=0;LS138A=1; P0=table[disp[5]]; delay(10);
LS138C=1;LS138B=1;LS138A=0; P0=table[disp[6]]; delay(10);
LS138C=1;LS138B=1;LS138A=1; P0=table[disp[7]]; delay(10);
}
void main()
{
init();
while(1)
{
if(irreceok) //若接收到数据
{
irpros();//解码
irreceok=0;
}
if(irprosok) //数据解码完毕,拆开显示
IE0=1;//外部中断0允许
EX0=1;//开中断
//定时计数器0中断
TMOD=0x02; //工作方式1,16位
TH0=0x00;//定时0.256ms
TL0=0x00;
ET0=1; //开中断
EA=1;
TR0=1; //定时计数器启动中断
}
void irpros(void) //解码
{
uchar i,j,k;
2.
红外遥控信号接收:
红外接收电路可以使用集成接收器,接收器包括红外接收管及信号处理IC,接收器对外只有三个引脚,一个接电源的Vcc脚、一个接地的GND脚、一个脉冲信号输出脚,当然脉冲信号输出脚直接接单片机的某个可以使用的IO脚就可以了。
3.脉冲波形分析:
每次按键,红外接收器这边会收到一串脉冲宽度不等的脉冲波形流,其脉冲流由35个脉冲波形构成:
sbit LS138C=P2^4; //138译码器的C端由P2.4口控制
void delay(uint i)//定时1ms
{
uchar j;
for(i;i>0;i--)
for(j=110;j>0;j--) ;
}
void init()//初始化T0, exter 0
{
IT0=1; //外部中断,下降沿触发
bit "1"脉宽为:14(1.4ms) <脉冲宽度< 19(1.9ms)
在收到一串脉冲流后,就要对其进行分析,先要检测第一个脉冲波形是不是前导码,如果不是,则继续检测前导码,如果是则检测如下32个脉冲波形:
用户码1为1字节,由8个脉冲波形组成(其中一个脉冲波形表示字节中1 bit);
用户码2为1字节;
irnum=0;
bitnum++;
if(bitnum==33)
{
irreceok=1;//接收到一帧数据
startflag=0;
}
}
}
void timer0() interrupt 1
{
irnum++;//定时时间irnum*0.256ms
}
uchar code weitable[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar irnum; //定时器0定时时间计数
uchar bitnum; //存放接收到的位数
uchar startflag; //开始标志
uchar irdata[33];
4.2
首先当然是检测前导码,单片机红外接收管脚在初始化时已经设置为高阻输入状态(即高电平状态),当有红外输入时,状态变为低电平状态,一旦检测到有低电平过来,则开始准备检测前导码。得到每个脉冲波形序号,并根据定时器统计出每个脉冲波形在高电平状态维持的时间,通过其时间值检测第一个脉冲是否是前导码,如果不是则重新检测前导码,如果是前导码则分析其后每个脉冲波形是bit“0”,还是bit“1”,并按顺序每八个波形为一个字节方式保存到用户码1字节变量、用户码2字节变量、键码字节变量、键码反码字节变量,直到收满32个bits。
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39, 0x5e, 0x79, 0x71};
其键码及键码反码为:0b00010010-0b11101101,同样也是低位在前,转换后得到键码及键码反码为:0b01001000-0b10110111,即0x48,0xB7。
4.实现:Fra Baidu bibliotek
4.1
初始化时当然要先初始化单片机红外接收管脚为高阻输入状态,其次要初始化定时器,因为检测分析脉冲波形时需要用到定时器,根据上面对脉冲流波形分析可以知道最窄的脉宽为bit“0”,为0.3ms左右,所以定时器最好定时为每0.1ms中断一次比较好,但是定时器的值怎么设置呢,这样根据单片机的振荡器决定。
单片机实现红外接收解码
摘要:接收到红外遥控器的脉冲波形,并通过解析其波形得到红外遥控器的相应解码,实习对相应设备的控制。本文详细接受红外遥控技术原理并如何通过C51单片机实现红外遥控。
关键字:单片机,红外遥控,解码
1.
遥控器相信大家不会陌生,日常生活中会使用到各种各样的遥控器,比如电视机、DVD机、空调、机顶盒甚至音响、热水器等都用到遥控器,其实红外技术已经走进与人们的生活并且与人们的生活息息相关了。
前导码:第1个脉冲波形
用户码1:第2到第9个脉冲波形
用户码2:第10到第17个脉冲波形
键码:第18到第25个脉冲波形
键码反码:第26到第33个脉冲波形
连续按键脉冲:第34和第35个脉冲为结束脉冲(也即连续按键脉冲),在每次按键结束后会有两个结束脉冲,如果一直按键不放的话,会一直发送连续按键脉冲,并可以认为在收到10个连续按键脉冲后是下一个按键。
LS138C=0;LS138B=0;LS138A=1; P0=table[disp[1]]; delay(10);//第一个数码管显示2
LS138C=0;LS138B=1;LS138A=0; P0=table[disp[2]]; delay(10);
LS138C=0;LS138B=1;LS138A=1; P0=table[disp[3]]; delay(10);
uchar value;
k=1;
for(j=0;j<4;j++)
{
for(i=0;i<8;i++)
{
value=value>>1;
if(irdata[k]>6) //接收的数据为0或1,0为1.125ms<5,1为2.25约8~9,曲中间
value=value|0x80;
k++;
}
ircode[j]=value;//编码值给ircode,
uchar irreceok=0; //判断是否接收到一帧数据,33位
uchar ircode[4]; //存放4个码值
uchar irprosok;
uchar disp[8];
sbit LS138A=P2^2; //138译码器的A端由P2.2口控制
sbit LS138B=P2^3; //138译码器的B端由P2.3口控制
注意:不同的遥控器产生的用户码值可能不一样,笔者碰到两种不同的用户码:0x00,0xFF及0x04,0x7F。
脉冲流中有四种不同的脉冲波形宽度:
其中前导码脉宽为:40(4ms) <脉冲宽度< 50(5ms)
连续按键脉宽为:21(2.1ms) <脉冲宽度< 25(2.5ms)
bit "0"脉宽为:3(0.3ms) <脉冲宽度< 7(0.7ms)
相关文档
最新文档