红外遥控器解码

/*-----------------------------------------------
  名称: 键遥控器红外解码数码管显示
  日期:2013.4
  姓名:李斌 
  内容:按配套遥控器上按键会在数码管上对应显示
------------------------------------------------*/
#include<reg52.h>    //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<stdio.h>
#include<intrins.h>
unsigned int j;

#define TURE 1
#define FALSE 0

sbit IR=P3^2;  //红外接口标志

unsigned char code dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x01,0x08,0x30,0x06,0x77,0x7c,0x39,0x5e,0x79,0x71};
 unsigned char code  seg[]={0,1,2,3,4,5,6,7};   
/******************************************************************/
/*                    变量声明                                    */
/******************************************************************/

unsigned char  irtime;//红外用全局变量

bit irpro_ok,irok;
unsigned char IRcord[4];
unsigned char   irdata[33];

/******************************************************************/
/*                    函数声明                                    */
/******************************************************************/

void Delay(unsigned char mS);
void Ir_work(void);
void Ircordpro(void);
void delay(unsigned int i)  //延时函数
{
while(i--);
}

/******************************************************************/
/*                    定时器0中断服务函数                         */
/******************************************************************/

void tim0_isr (void) interrupt 1 using 1//定时器0中断服务函数
{
  irtime++;                             //用于计数2个下降沿之间的时间
}

/******************************************************************/
/*                    外部中断0函数                               */
/******************************************************************/
void ex0_isr (void) interrupt 0 using 0//外部中断0服务函数
{
  static unsigned char  i;             //接收红外信号处理
  static bit startflag;                //是否开始处理标志位

 if(startflag)                         
 {
   
    if(irtime<63&&irtime>=33)//引导码 TC9012的头码,9ms+4.5ms
            i=0;
     
    irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1
    irtime=0;
    i++;
    if(i==33)
      {
  irok=1;
i=0;
  }
          }
 
  else
{irtime=0;startflag=1;}

}

/******************************************************************/
/*                   定时器0初始化                                */
/******************************************************************/
void TIM0init(void)//定时器0初始化
{

  TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
  TH0=0x00; //重载值
  TL0=0x00; //初始化值
  ET0=1;    //开中断
  TR0=1;    
}
/******************************************************************/
/*                   外部中断初始化                               */
/******************************************************************/
void EX0init(void)
{
 IT0 = 1;   //指定外部中断0下降沿触发,INT0 (P3.2)
 EX0 = 1;   //使能外部中断
 EA = 1;    //开总中断
}
/******************************************************************/
/*                    红外键值处理                                */
/******************************************************************/

  void Ir_work(void)//红外键值散转程序
  {
    
  while(1)
  {
       switch(IRcord[2])//判断第三个数码值
        {
case 0x16:P0=dofly[0];P1=0x00;break;//0  显示相应的按键值
case 0x0c:P0=dofly[1];P1=0x00;break;//1 
case 0x18:P0=dofly[2];P1=0x00;break;//2
case 0x5e:P0=dofly[3];P1=0x00;break;//3
case 0x08:P0=dofly[4];P1=0x00;break;//4
case 0x1c:P0=dofly[5];P1=0x00;break;//5
case 0x5a:P0=dofly[6];P1=0x00;break;//6
case 0x42:P0=dofly[7];P1=0x00;break;//7
case 0x52:P0=dofly[8];P1=0x00;break;//8
case 0x4a:P0=dofly[9];P1=0x00;break;//9
case 0x45:P0=dofly[10];P1=0x00;break;//关(中橫)
case 0x46:P0=dofly[11];P1=0x00;break;//上横
case 0x47:P0=dofly[12];P1=0x00;break;//下横 
case 0x44:P0=dofly[13];P1=0x00;break;//左竖
case 0x07:P0=dofly[14];P1=0x00;break;//右竖
case 0x40:P0=dofly[15];P1=0x00;break;
case 0x43:P0=dofly[16];P1=0x00;break;
case 0x15:P0=dofly[17];P1=0x00;break;
case 0x09:P0=dofly[18];P1=0x00;break;
case 0x19:P0=dofly[19];P1=0x00;break;
case 0x0d:P0=dofly[20];P1=0x00;break; 

P2=seg[j++]; 
                {
        if(j==8) 
           j=0;
 }
      delay(260);

 irpro_ok=0;//处理完成标志

  }
  }
/******************************************************************/
/*                    红外解码函数处理                            */
/******************************************************************/
void Ircordpro(void)//红外码值处理函数

  unsigned char i, j, k;
  unsigned char cord,value;

  k=1;
  for(i=0;i<4;i++)      //处理4个字节
     {
      for(j=1;j<=8;j++) //处理1个字节8位
         {
          cord=irdata[k];
          if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差
   {
             value=value|0x80;
}
          else 
   {
             value=value;
}
          if(j<8)
   {
value=value>>1;
}
           k++;
         }
     IRcord[i]=value;
     value=0;     
     } 
irpro_ok=1;//处理完毕标志位置1
    
}

/////////////////////////////////////////////////////////////////

void main(void)
{
 EX0init(); //初始化外部中断
 TIM0init();//初始化定时器
  P0=0x00;
  P2=0x00;//1位数码管全部显示

 while(1)//主循环
   {
    if(irok)                        //如果接收好了进行红外处理
 {   
  Ircordpro();
    irok=0;
 }

    if(irpro_ok)                   //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等
 { P1=0xff;
        delay(260);
  Ir_work();
   }
   }
}
  
  

时间: 2024-11-03 17:32:41

红外遥控器解码的相关文章

【STM32 .Net MF开发板学习-14】红外遥控器编码识别

一年前我写过一篇博文<自制电脑红外遥控接收器(PC软解码)>,文中介绍借助几个简单的器件通过PC串口,来获取红外遥控器的按键信息.现在我们已经学会了如何用PWM技术驱动智能小车(参见<用PWM驱动智能小车>),正好缺少一个遥控机制,所以本篇文章先介绍一下,.NET Micro Framework开发板如何获取红外遥控信息,下一篇文章将介绍用遥控器驱动智能小车相关实现细节. 这次我们红外接收的硬件电路更为简单,仅需红外接收头.两个电阻,一个电容即可,其原理图如下: 我所选取的具体器件

智能家居-空调红外遥控器编码是如何学习的

问题描述 空调红外遥控器编码是如何学习的 请问大神 空调红外编码真的是各家各异吗? 那么市面上的智能遥控器诸如broadlink是怎么实现学习的?(这里不谈一般的牛屎芯片) 难道真是一个个记录放入EEPROM中?那样采样频率和位数也太多了,我看broadlink构造很简单啊.难道有专门采集识别红外的芯片?这不可能吧,红外种类不算少,变种也很多.总之我现在凌乱了,求大神解惑指点 解决方案 这个比较全 红外遥控编解码相关资料http://dl.21ic.com/download/-9-8m-zip-

【STM32 .Net MF开发板学习-15】红外遥控智能小车

我前段时间写了<用PWM驱动智能小车>和<红外遥控器编码识别>两篇博文,分别介绍了如何用PWM驱动直流电机及红外遥控器编码识别,这一次我们把二者结合起来,用红外遥控器遥控智能小车. 在<红外遥控器编码识别>中,我们用面包板搭建简单的电路,来验证红外接收信号,但是放在小车上是不行的,相关器件我们需要进行焊接,最终完成图如下. 开发板学习-15]红外遥控智能小车-">我们把智能小车和红外板拼装在一起,最终完成图如下:

禁用某台Mac接收红外线遥控器信号

  如果你有多台Mac或者多个带遥控器功能的苹果设备,比如Universal Dock.Apple TV,一个遥控器就控制多个是一件很不爽的事情... 要禁止Mac接收任何红外遥控器的信号,只需要进入"系统偏好设置"--"安全性与隐私"--"通用",钩上"停用遥控红外接收机"即可

DIY物联网应用 4-遥控器控制风扇

有请本章的主角们:玩具小风扇.红外接收器和一个红外遥控器(空调.电视遥控都行).本章我们的目标是实现用遥控器控制风扇. 红外协议 我们知道,人的眼睛能看到的可见光按波长从长到短排列,依次为红.橙.黄.绿.青.蓝.紫.其中红光的波长范围为0.62-0.76μm:紫光的波长范围为0.38-0.46μm,比紫光波长还短的光叫紫外线,比红光波长还长的光叫红外线,红外是一种人的眼眼看不到的光线,利用红外波来传递信息,传递的规则就成为红外协议.红外线的波长较短,对障碍物的衍射能力差,所以更适合应用在需要短距

小米王兴超:为什么蓝牙遥控器难做?

    雷锋网(公众号:雷锋网)按:本文作者为王兴超,他供职于小米,是电视音响团队的软件负责人. 小米电视2发布会上,雷总宣布了小米电视2配件蓝牙遥控器,遥控距离更远,无需对准电视操作更方便,遥控器找不着了用户触摸电视下巴就可以听到遥控器发出"嘀嘀"声音.自此,全球首款跨平台解决方案蓝牙遥控器面世! 上市半年多来,蓝牙遥控器给用户带来方便同时,也让米粉吐槽很多.大家知道小米是没有KPI的,员工工作成绩的好坏,很大程度上与米粉的满意度息息相关.研发的小伙伴很多时候是追着米粉报的bug跑,

深入解析Java中的编码转换以及编码和解码操作_java

一.Java编码转换过程 我们总是用一个java类文件和用户进行最直接的交互(输入.输出),这些交互内容包含的文字可能会包含中文.无论这些java类是与数据库交互,还是与前端页面交互,他们的生命周期总是这样的:  (1).程序员在操作系统上通过编辑器编写程序代码并且以.java的格式保存操作系统中,这些文件我们称之为源文件.  (2).通过JDK中的javac.exe编译这些源文件形成.class类.  (3).直接运行这些类或者部署在WEB容器中运行,得到输出结果.  这些过程是从宏观上面来观

天猫魔盒M17和小米盒子3C哪个比较好?

  天猫魔盒M17和小米盒子3C哪个比较好?          提到电视盒子的选择,大家都会拿小米盒子和天猫魔盒进行比较,本月内小米盒子和天猫魔盒分别都发布了自己的新品盒子,那么,天猫魔盒M17和小米盒子3C买哪个好?那本文将对比天猫魔盒M17和小米盒子3C,让大家有个更直观的体验. 性能参数对比评测:天猫魔盒M17和小米盒子3C哪个配置好? 电视盒子性能影响着视频播放的流畅程度.本地解码的能力等等,也就是使用时的整体感受如何.先来看看一组对比表格,接下来主要讲讲配置上的差异的地方. 天猫魔盒M

激光视真系统在应急指挥中心的应用

针对不同行业所需要的不同场景的视频会商需求,迪威视讯激光视真系统可根据不同的会议室布局设计相应的定制化部署方式,实现一站式交付,让用户畅享更加智慧的沉浸式视频沟通体验. 一.省委应急办专网亟需升级 根据省委要求,为落实<省委办公厅2015年工作要点>中提出"加强对各地各单位值班工作的督促检查,推动值班专网覆盖到县"的具体任务,将值班工作专网纳入省委应急指挥服务平台,打造成为省委应急指挥服务平台涉密传输的主渠道,拟对省委值班工作专网进行升级改造. 图1 激光视真系统投影效果显