找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

GPS+12864+18B20+IR+Key万年历,遥控求助

查看数: 3803 | 评论数: 4 | 收藏 1
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2015-6-1 20:35

正文摘要:

仿做了这个万年历,遥控一直不能用,有那位大侠指教下看改动那里,才能配上这个遥控 #ifndef  _IR_H_ #define  _IR_H_ unsigned char keya,keyb,keyc,keyd,keye,keyf,keyg,keyh,keyi,keyj; ...

回复

ID:18867 发表于 2015-9-15 12:56
#ifndef  _HW_H_
#define  _HW_H_
/**********************************************************
设置
**********************************************************/
uchar IRCOM[]={0x00,0x00,0x00,0x00,0x10,0x10};
/***************************************************************
            外部中断0响应函数,完成对红外遥控的解码
-------------------------协议--------------------------   
----开始拉低9ms,接着是一个4.5ms的高脉冲,通知器件开始传送数据了
----接着是26位前导脉冲,用于识别该型号的摇控。                                 
----然后是发送8位数据的原码,接着又发送8位数据的反码.
----最后是一个长脉冲,和开始位一样,拉低9ms和一个4.5ms脉冲表示结束。
----每个按键不同这处只在于那8位数据的原码和反码,因些只须要识别
----8位原码就可以识别按键了
****************************************************************/
void delayA(uchar x)    //x*0.14MS
{
  uchar i;
  while(x--)
{
  for (i = 0; i<13; i++) {}
}
}



void IR_IN() interrupt 0 using 0
{
  uchar j,k,N=0;
     EX0 = 0;   
         delayA(15);
         if (IRIN==1)
     { EX0 =1;
           return;
          }
                           //确认IR信号出现
  while (!IRIN)            //等IR变为高电平,跳过9ms的前导低电平信号。
{delayA(1);}

for (j=0;j<4;j++)         //收集四组数据
     {
      for (k=0;k<8;k++)        //每组数据有8位
                  {
                           while (IRIN)            //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
                     {delayA(1);}//
                    while (!IRIN)          //等 IR 变为高电平
                           {delayA(1);}  //
                     while (IRIN)           //计算IR高电平时长
                      {
                      delayA(1);
                      N++;           
                      if (N>=30)
                                 { EX0=1;
                                 return;}                  //0.14ms计数过长自动离开。
                      }                        //高电平计数完毕               
              IRCOM[j]=IRCOM[j] >> 1;                  //数据最高位补“0”
              if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}  //数据最高位补“1”
              N=0;
             }//end for k
    }//end for j
   
    if (IRCOM[2]!=~IRCOM[3])   //接收时间是否正确
    {
      EX0=0;
      return;
    }
/*================红外编码处理====================*/  
     switch(IRCOM[2])
            {
                case 0x0C: key_0=1;                  break;   //1
                case 0x18: key_1=1;                  break;   //2
                case 0x5E: key_2=1;                  break;   //3
                case 0x08: key_3=1;                  break;   //4
                case 0x1C: key_4=1;                  break;   //5
                case 0x5A: key_5=1;                  break;   //6
                case 0x42: key_6=1;                  break;   //7
                case 0x52: key_7=1;                  break;   //8
                case 0x4A: key_8=1;                 break;   //9
                case 0x16: key_9=1;                  break;   //0
                case 0x40: key_minish=1;          break;   //音量-
                case 0x43: key_add=1;                  break;   //音量+
                case 0x46: key_manue=1;          break;   //播放
                case 0x45: key_ok=1;                  break;   //OFF
                case 0x15: key_up=1;        break;   //上
                case 0x09: key_down=1;      break;   //下
                case 0x19: key_alarm=1;     break;   //RPT
                case 0x47: key_voioff=1;    break;   //静音
                case 0x0D: key_voion=1;     break;   //U/SD                default:    break;   //别的键按下
        }
   

     EX0 = 1; //开中断
}

#endif
你把编码数据改一下看行不行!
ID:18867 发表于 2015-9-15 12:56
#ifndef  _HW_H_
#define  _HW_H_
/**********************************************************
设置
**********************************************************/
uchar IRCOM[]={0x00,0x00,0x00,0x00,0x10,0x10};
/***************************************************************
            外部中断0响应函数,完成对红外遥控的解码
-------------------------协议--------------------------   
----开始拉低9ms,接着是一个4.5ms的高脉冲,通知器件开始传送数据了
----接着是26位前导脉冲,用于识别该型号的摇控。                                 
----然后是发送8位数据的原码,接着又发送8位数据的反码.
----最后是一个长脉冲,和开始位一样,拉低9ms和一个4.5ms脉冲表示结束。
----每个按键不同这处只在于那8位数据的原码和反码,因些只须要识别
----8位原码就可以识别按键了
****************************************************************/
void delayA(uchar x)    //x*0.14MS
{
  uchar i;
  while(x--)
{
  for (i = 0; i<13; i++) {}
}
}



void IR_IN() interrupt 0 using 0
{
  uchar j,k,N=0;
     EX0 = 0;   
         delayA(15);
         if (IRIN==1)
     { EX0 =1;
           return;
          }
                           //确认IR信号出现
  while (!IRIN)            //等IR变为高电平,跳过9ms的前导低电平信号。
{delayA(1);}

for (j=0;j<4;j++)         //收集四组数据
     {
      for (k=0;k<8;k++)        //每组数据有8位
                  {
                           while (IRIN)            //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
                     {delayA(1);}//
                    while (!IRIN)          //等 IR 变为高电平
                           {delayA(1);}  //
                     while (IRIN)           //计算IR高电平时长
                      {
                      delayA(1);
                      N++;           
                      if (N>=30)
                                 { EX0=1;
                                 return;}                  //0.14ms计数过长自动离开。
                      }                        //高电平计数完毕               
              IRCOM[j]=IRCOM[j] >> 1;                  //数据最高位补“0”
              if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}  //数据最高位补“1”
              N=0;
             }//end for k
    }//end for j
   
    if (IRCOM[2]!=~IRCOM[3])   //接收时间是否正确
    {
      EX0=0;
      return;
    }
/*================红外编码处理====================*/  
     switch(IRCOM[2])
            {
                case 0x0C: key_0=1;                  break;   //1
                case 0x18: key_1=1;                  break;   //2
                case 0x5E: key_2=1;                  break;   //3
                case 0x08: key_3=1;                  break;   //4
                case 0x1C: key_4=1;                  break;   //5
                case 0x5A: key_5=1;                  break;   //6
                case 0x42: key_6=1;                  break;   //7
                case 0x52: key_7=1;                  break;   //8
                case 0x4A: key_8=1;                 break;   //9
                case 0x16: key_9=1;                  break;   //0
                case 0x40: key_minish=1;          break;   //音量-
                case 0x43: key_add=1;                  break;   //音量+
                case 0x46: key_manue=1;          break;   //播放
                case 0x45: key_ok=1;                  break;   //OFF
                case 0x15: key_up=1;        break;   //上
                case 0x09: key_down=1;      break;   //下
                case 0x19: key_alarm=1;     break;   //RPT
                case 0x47: key_voioff=1;    break;   //静音
                case 0x0D: key_voion=1;     break;   //U/SD                default:    break;   //别的键按下
        }
   

     EX0 = 1; //开中断
}

#endif
你把编码数据改一下看行不行!
ID:44267 发表于 2015-9-5 14:20
太强了,太强了,太强了,太强了,
ID:1 发表于 2015-6-1 22:50
遥控不能用。应该是编码格式或者是按键编码值的问题。建议楼主,多用几个遥控器测试一下。

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表