首 页文档资料下载资料维修视频包年699元
请登录  |  免费注册
当前位置:精通维修下载 > 文档资料 > 家电技术 > 维修教程知识 > 电子制作
用增强型51实验板实现红外线遥控
来源:本站整理  作者:佚名  2010-10-15 09:00:41



   3.接收头及解码

    一体化红外线接收头是一种集红外线接收和放大于一体,不需要任何外接元件,就能完成从红外线接收到输出与TTL 电平信号兼容的所有工作,而体积较小,很多家电中都采用此类红外接收头,它适合于各种红外线遥控和红外线数据传输,如图1左下角所示为增强型51实验板上的一体化红外线接收头。

  下面我们就来一起看一下增强型51实验板是如何来解uPD6121红外线编码及如何使用红外线来进行各式各样的控制。

  学习了红外发射原理后,可以想到解码的关键是如何识别“0 ”和“1”,从位的定义我们可以发现“O”、“1”均以O.56ms的低电平开始,不同的是高电平的宽度不同,“0”为O.56ms,“1”为1.68ms,所以必须根据高电平的宽度区别“0”和“1”。如果从O.56ms低电平过后,开始延时,0.56ms以后,若读到的电平为低,说明该位为“O”,反之则为“1”,为了可靠起见,延时必须比O.56ms长些,但又不能超过1.12ms,否则如果该位为“O”,读到的已是下一位的高电平,因此取(1.12ms+0.56ms)/2=0.84ms最为可靠,一般取0.84ms左右均可。同时,我们还应注意的是,根据码的格式,应该等待9ms的起始码和4.5ms的结果码完成后才能读码。

  学习板上的一体化红外接收头一共有3个脚,分别是“地”、“电源”、“数据”,其“数据”脚与51单片机的“INTO”脚,整个过程可以分成两步,第一步是读取并判断引导码是否正确,如果不是则直接返回并初始化检测参数;第二步是连续4次,按照每次8bit读取4个字节的后续数据,其中,检测过程里对“O”和“1”的判断必须是在开启计时之后,以减少因为程序执行而导致的测量时间长度上误差。

  解码过程关键是使用单片机的定时器,我们可以用引导码的下降沿来触发单片机的定时器开始计时处理,这样就可以获得电平的时间长度了,一般的遥控器编码在长按按键的时候,会连续发数据,可能是同样的数据,也有可能是个特定的所谓的重复帧,但大致上15ms之内没有信号收到就表示当前的数据帧已经接收完毕。

   

     解码部分程序代码如下:
   unsigned char uPD6121_read_code_8(void){unsigned char temp=0;unsigned char i;for(i=0;<8;i++){temp=temp》1:
  while(ir_receive==0);//等待高电平测试结束TR1=0;//高电平测试结束,停止计时high_level_time=TH1*256+TL1;//保存高电平的数据TH1=0;TL1=0;TR1=1;//启动对低电平的测试while(ir_receive==1){if(TH 1>0x4e)  {decode_error=1;return 0;}  //超时出错,返回}
  TR1=0;  //低电平测试结束Iow_level_time=TH1*256+TL1;//保存低电平的数据TH1=O;TL1=O;TR1=1;//如果电平长度不在合理的范围内,则认为出错if((high_level_time<400)II(high_level_time>700)II(Iow_level_time<400)II(Iow_level—time>1900)){decode_error=1;return O;}
  if    ((Iow_level_time>400)&&(Iow_level_time<700))temp=temp&0x7f;if    ((Iow_level_time>1400)&&(Iow_level_time<1900))temp=temp1ox80;} return temp;}  nsigned char uPD6121_decode(void)//解码出错返回1,对则返回OTR1=1://开始测量引导码(或重复码)的高电平宽度while(ir_receive==0);//等待电平变高,不需要超时监测TR1=0;//高电平(对发射电路而言)测试结束high_level_time=TH1*256+TL1://保存高电平的数据//————————————————————TH1=O;TL1=O;TR1=1;//启动对低电平的测试while(ir_receive==1)//在对高电平进行查询时,计超时。大于20ms出错{if(TH1>0x4e)return 1://测试超时后直接初始化相关变量,开始下次测试}
  TR1=0://低电平(对发射电路而言)测试结束Iow_level_time=TH1*256+TL1:
  //保存低电平的数据TH1=0;TL1=0;TR1=1;//为增加计时的准确性,数据的处理都是在计时过程里//判断引导码(或重复码)是否正确,如果不正确,则设置出错标志位,并退出中断程序if((high_level_time<8500)II(high_level_time>9500)II(Iow_level_time<1000)II(Iow_level_time>5000)){return 1://因是引导码出错,所以直接初始化后重新开始测试}
  //——————————————————//对是引导码还是重复码进行判断。如果是重复码,就跳过后面数据的读取if((Iow_level—time>1000)&&(Iow_level_time<3500))repeat_code_detected=1:
  if((Iow_level_time>4000)&&(Iow_level_time<5000))Ioad_code_detected=1;if(repeat_code_detected==1)return1;//直接结束,temp1=uPD6121_read_code_8();//读后面的系统、按健等数据,temp2=uPD6121_read_code_8();teMP3=uPD6121_read_code_8();temp4=uPD6121_read_code_8();TR1=0:
  if(decode_error==1)return 1://无论是哪部分解码出错,都是重新开始if  ((temp1!=Ntemp2)II  (temp3 !
  =~temp4)){return 1;}
  sys_code=temp1:
  key_code=temp3;data_available=1;return 0:
    如图5所示,是我们完成红外线实验所必需的设备,准备好硬件设备后,我们将红外线解码控制程序通过A51编程器烧入AT89S51单片机芯片,然后将芯片插到增强型51实验板上通电运行即可。

  图6为增强型51实验板做红外解码电路,从而进行数码管显示的实验电路板。

  最后,要提醒大家一下,在做红外实验需要注意的是:不同的红外线遥控器编码方式可能不同,你可能会发现有很多红外线遥控器的外表几乎都一样。

  但对于同一电器设备却有些能用,有些不能用,这就是因为遥控器内部使用了不同的编码芯片的原因,或许你会想到用家中的电视机或空调的遥控器来完成红外线解码的实验,但你必须得事先知道该遥控器的红外线编码芯片是什么类型的,否则就比较麻烦了,而现在众多红外线遥控器厂商为了保护自己的知识产权已将编码芯片打磨,这对我们DIY爱好者来说就不太有利了。图5中的红外线遥控器为uPD6121红外编码芯片。

上一页  [1] [2] 

关键词:

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分)
Copyright © 2007-2017 down.gzweix.Com. All Rights Reserved .
页面执行时间:55,117.19000 毫秒