[DemoCode下载] 红外遥控器单片机编码程序加详解

[复制链接]
1995|11
 楼主| 小猫爱吃鱼 发表于 2015-8-16 20:54 | 显示全部楼层 |阅读模式
  1. void IR_IN() interrupt 0 using 0   //采用12MHz晶振
  2. {
  3.   unsigned char j,k,N=0;
  4.      EX0 = 0;   //初始化,关闭外中断
  5.   delay(15);
  6.   if (IRIN==1) //没有脉冲到来高电平
  7.      { EX0 =1;   //默认状态下开中断,寻找9ms引导脉冲
  8.     return;
  9.    }
  10.                            //确认IR信号出现
  11.   while (!IRIN)            //等IR变为高电平,跳过9ms的前导低电平信号。
  12.     {delay(1);}      //单片机接收电平与遥控器电平完全相反,delay(1)延时0.14ms

  13. for (j=0;j<4;j++)         //收集四组数据
  14. {
  15.   for (k=0;k<8;k++)        //每组数据有8位
  16.   {
  17.    while (IRIN)            //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
  18.      {delay(1);}
  19.     while (!IRIN)          //等 IR 变为高电平(0.56ms)
  20.      {delay(1);}
  21.      while (IRIN)           //计算IR高电平时长
  22.       {
  23.     delay(1);
  24.     N++;         
  25.     if (N>=14)    //大于1.685ms高电平长度,为了保证可靠性N=14
  26.   { EX0=1;    //(2.25/0.14=16,1.685/0.14=12,0.565/0.14=4)
  27.   return;}                  //0.14ms计数过长自动离开,重新判断。
  28.       }                        //高电平计数完毕               
  29.      IRCOM[j]=IRCOM[j] >> 1;                  //数据最高位补“0”
  30.      if (N>=6) {IRCOM[j] = IRCOM[j] | 0x80;}  //大于0.565ms高电平长度,N=6,7,8(1.685/2)都行,判断为“1”,数据最高位补“1”
  31.      N=0;
  32.   }//end for k
  33. }//end for j
  34.   
  35.    if (IRCOM[2]!=~IRCOM[3])     数据码与数据反码相反,继续执行,否则,数据出错。返回,重新判断。
  36.    { EX0=1;
  37.      return; }

  38.    IRCOM[5]=IRCOM[2] & 0x0F;     //取键码的低四位
  39.    IRCOM[6]=IRCOM[2] >> 4;       //右移4次,高四位变为低四位

  40.    if(IRCOM[5]>9)
  41.     { IRCOM[5]=IRCOM[5]+0x37;}    //转换成相应的ASCII码,送1602显示。
  42.    else
  43.    IRCOM[5]=IRCOM[5]+0x30;

  44.    if(IRCOM[6]>9)
  45.     { IRCOM[6]=IRCOM[6]+0x37;}
  46.    else
  47.    IRCOM[6]=IRCOM[6]+0x30;

  48.      lcd_pos(0x4b);            
  49.      lcd_wdat(IRCOM[6]);        //第一位数显示
  50.      lcd_pos(0x4c);              
  51.      lcd_wdat(IRCOM[5]);        //第二位数显示

  52.      beep();
  53.      EX0 = 1;      //开中断,继续判断
  54. }


相关帖子

598330983 发表于 2015-8-16 21:09 | 显示全部楼层
楼主应该给个文字说明啊,只看代码我哪儿懂啊。
734774645 发表于 2015-8-16 22:14 | 显示全部楼层
其实复杂的不是程序,而是协议,楼主不说明协议和方法,是很坑的。
玛尼玛尼哄 发表于 2015-8-16 22:21 | 显示全部楼层
不知道是不是所有的协议通用啊,这个能通用所有的吗
天灵灵地灵灵 发表于 2015-8-16 22:30 | 显示全部楼层
IRCOM[5]=IRCOM[2] & 0x0F;     //取键码的低四位
   IRCOM[6]=IRCOM[2] >> 4;       //右移4次,高四位变为低四位
这两句是干神马用。到底是高位还是低位。
仙女山 发表于 2015-8-17 15:53 | 显示全部楼层
先给个程序的说明和硬件电路对照图,就好理解了
643757107 发表于 2015-8-20 16:47 | 显示全部楼层
楼主应该给个文字说明啊
yiyigirl2014 发表于 2015-8-20 16:58 | 显示全部楼层
  if(IRCOM[5]>9)
    { IRCOM[5]=IRCOM[5]+0x37;}    //转换成相应的ASCII码,送1602显示。
这如何理解。
benny169 发表于 2015-8-30 22:35 | 显示全部楼层
HT的红外读码程序。
lovecat2015 发表于 2015-9-3 22:15 | 显示全部楼层
红外遥控器单片机编码程序加详解,如果有硬件电路图就好了
598330983 发表于 2015-9-28 15:50 来自手机 | 显示全部楼层
主要是时序问题
wahahaheihei 发表于 2015-9-28 22:16 来自手机 | 显示全部楼层
红外就和单总线通信方式很像
您需要登录后才可以回帖 登录 | 注册

本版积分规则

33

主题

294

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部