红外线遥控数据的学习和转发教程.doc

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
红外线遥控数据的学习和转发教程

红外线遥控数据的学习和转发(基于新唐M0单片机实现) 本文只是研发的一点心得,是产品化证明了非常实用的东西,文字组织相对不那么严谨,适合有一定经验的自动控制工程师借鉴。 红外线遥控的基础知识有不太多的阐述,目前为止我所见到的红外线遥控器基本都是基于送脉冲+停止等待的循环,所以学习红外线遥控数据主要是要获取如下参数 送出脉冲的脉冲频率(就是所谓载波) 送出脉冲的宽度 停止等待到下一个送出脉冲的宽度 采样就会有误差,实际测试过程中发现实际红外解码设备其实比较粗糙,即使有点误差也能100%动作执行单元,毕竟我们学习的过程中没有累计误差。 要采样到数据必须有合适的硬件电路,其实最简单的方法就是用一个家电用的接收管来实现,里面有现成的带通滤波器出来就是方波不过载波就没法学习了,因为家电一般都是用一个频率所以也基本可以实现,因为我们设计产品时是定位于万能遥控器,要做好就必须要采集载波,为此采用的是不过硬件带通的办法实现采集的,算法麻烦一点,但是可以实现所有红外信号的复制。 由于采样数据时数据序列是整块发下来的,有的遥控器发出来的数据比较长,所以在单片机选型时要选择内存相对大一点的,想一边接受数据一边往FLASH写是比较困难的,我觉得不太容易实现,现在单片机也不是很贵这个费用还是值得的,否则整个开发过程会很费劲。 实战中我们采用如下的硬件电路: 实现的效果如下 经过大量的验证,学习的方法可以适应所有红外遥控器,目前还没有发现学习后转发出来会有问题的设备。 下面一段代码是主程序中启动红外学习的过程,供参考 U8 learning(MENU_HEAD m_head ,CONTROL_HEAD *ctr_head , U8 Continue ) { U16 x ,y , count ; U8 flag ; CONTROL_HEAD ctr_head_copy ; IFR_IN_POWER = 0 ; OpenInt1() ; flag = TRUE ; touch_flag = TOUCH_RELEASE ; count = 0 ; if( Continue==TRUE ) { MY_PICTURE pic ; ReadGD25Q16B( ctr_head-address , (U8 *)pic , sizeof(MY_PICTURE)) ; //ShowLearning( ctr_head-x , ctr_head-y+pic.y_size+20 , 0 , 0xffff ) ; #ifdef CHINESE ShowString( ctr_head-x , ctr_head-y - 24 ,学习中 , 0 , 0xffff ) ; #else ShowString( ctr_head-x , ctr_head-y - 24 ,leaning , 0 , 0xffff ) ; #endif } // while( touch_flag==TOUCH_PRESS ) ; while( flag ) //flag为按键退出的标志 { //IFR_LEARN_TOO_LONG: TIMER_Reset( TIMER2 ) ; learn_step = 0 ; learn_count = 0 ; memset( (U8 *)learn.InfraredBuf , 0 , MAX_BUF*2 ) ; while(1) //等待中断中获取脉冲数据(等待 MAX_LEARN_IDLE ) { if(learn_step1) { /* if(InfraredBuf[0] 30 ) //起始最小脉冲判断(去毛刺) { learn_step = 0 ; continue ; } */ if( Timer2Count MAX_LEARN_IDLE ) //空闲大于100ms退出等待 break ; } //if( learn_step(MAX_BUF-1)) if( learn_step get_learn_step_length(m_head.attribute ) ) { #ifdef CHINESE MessageBox( 学习数据太长 , 2 ) ; #else MessageBox(learn too long , 2 ) ; #endif break ; } if( learn_step == 0 ) { if( GetTouchxy( x , y , TRUE) )

文档评论(0)

dajuhyy + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档