智能家居

 2 E币 
成为会员,免费下载资料
文件大小:22.27 KB 上传者:495005638 时间:2013-08-27 16:28:08 下载量:7
红外遥控器原理 我这里就不多说了,如果需要了解的 请网上寻找相关资料
基于市面上的家电遥控器绝大多数是38khz的载波,所以我们这次也选择只学习和控制38khz的。
学习型的原理:采样学习遥控器波形——存储波形数据——发送相应的波形   
三步骤就完成了自学习红外转发的功能。
当然最好有淘宝网上的那种百来块的逻辑分析仪会让你的工作事半功倍。

1、采样学习遥控器波形
    接收头为了图方便 使用一体化红外接收头 主要是38k载波的  tim2 90us 采样用。
    学习键值:主要实现的原理是基于一般的红外高低电平大概是560US 所以我们用90us去采集,
    我用的最简单的方法,定时去判断io口状态,然后保存起来。
    当然也可以用pwm高低电平的输入捕获,保存每次跳变的时间,我觉得有点麻烦 以前没用过,所以就用个最简单的方法。
    程序如下:
   bTIM2Flag是90us定时器2,每次定时时间到之后 bTIM2Flag = TRUE;

void Receve_Data(u8 * data,u16 len)
  {
    u8 buf=0;
    u16 i,j;
    for(i=0;i         {  
           buf=0;     
           for(j=0;j<8;)
           {                  
              
                  if(bTIM2Flag)
                  {         
                    buf=buf<<1;
                        if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_4)==0)
                        {
                          buf|=1;
                        }
                   j++;
                   bTIM2Flag = FALSE;
                  }

                  data = buf;
           }

     }
  }


2、存储波形数据
   通过上面的工作,每个键的学习你可以得到200~500个数据 ,为什么差别在吗大呢? 原因是这样:电视机遥控器 机顶盒 dvd等这些常用的都是单键值遥控器,比如开机关机是同一个键值。
   但是空调就是不一样了,虽然是按下同一个按键,开机和关机键不一样。 不同的温度,不同的模式,输出的都是不是一样的,也就是说 如果你想学空调的键值,空调的每个状态你都必须要学习。
   当然我觉得没必要空调的学习完所有状态,学习常用的温度常用的模式之间组合就差不多了。

   这时候你需要用另外的定时器tim3做一个38khz的载波,条件成立时候bSendFlag = TRUE 让红外发射控制管脚不停的取反。条件不成立bSendFlag = FALSE,tim3 不控制发射引脚 ,很简单吧。
   然而你应该什么时候 设置bSendFlag 的值呢? 应该是进入发送程序时候,你就判断发送数据里面,判断要发送的每个数据,比如0xff 或者0x3f,你就知道0xff 是8位都是 bSendFlag = TRUE。
   0x3f 你应该知道前后6位时候是bSendFlag = TRUE ,高2位是bSendFlag = FALSE。
   程序如下:
   void Send_Data(u8 * data,u16 len)
  {
    u8 buf;
    u16 i,j;
    for(i=0;i         {      
           buf = data;

           for(j=0;j<8;)
           {
                  if(bTIM2Flag)
                  {
                      if(buf &0x80)
                          {
                           bSendFlag = TRUE;
                          }
                          else
                          {
                           bSendFlag = FALSE;
                          }
                   j++;
                   buf=buf<<1;
                   bTIM2Flag = FALSE;
                  }
           }
     }

           bTIM2Flag = FALSE;
           while(!bTIM2Flag);
           bSendFlag = FALSE;
  }

通过这样就可以完成学习和发送的功能了。 很简单但是比较实用。
[attach]854[/attach]
展开
折叠
662
评论
共 0 个
内容存在敏感词
    易百纳技术社区暂无数据
相关资料
关于作者
易百纳技术社区
495005638
贡献资料 38
易百纳技术社区 我上传的资料
登录查看
我赚取的积分
登录查看
我赚取的收益
登录查看
上传资料 赚取积分兑换E币
易百纳技术社区
删除原因
广告/SPAM
恶意灌水
违规内容
文不对题
重复发帖
置顶时间设置
结束时间
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-资料模块

审核失败

失败原因
备注
易百纳技术社区