找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3135|回复: 4
收起左侧

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

[复制链接]
ID:57585 发表于 2015-6-1 20:35 | 显示全部楼层 |阅读模式
仿做了这个万年历,遥控一直不能用,有那位大侠指教下看改动那里,才能配上这个遥控

#ifndef  _IR_H_
#define  _IR_H_

unsigned char keya,keyb,keyc,keyd,keye,keyf,keyg,keyh,keyi,keyj;
unsigned char key_add,key_minus,key_set,key_ok,key_up,
                          key_down,key_alarm,key_voioff,key_voion,key_light;

//bit  ala_flag=0;  //闹钟使能标志位
//bit  back_light_flag=0;//背光使能
sbit IRIN = P3^5; //红外接收器数据线

unsigned char IRCOM[]={0x00,0x00,0x00,0x00,0x10,0x10};
/***************************************************************
            外部中断0响应函数,完成对红外遥控的解码
-------------------------协议--------------------------   
----开始拉低9ms,接着是一个4.5ms的高脉冲,通知器件开始传送数据了
----接着是26位前导脉冲,用于识别该型号的摇控。                                 
----然后是发送8位数据的原码,接着又发送8位数据的反码.
----最后是一个长脉冲,和开始位一样,拉低9ms和一个4.5ms脉冲表示结束。
----每个按键不同这处只在于那8位数据的原码和反码,因些只须要识别
----8位原码就可以识别按键了
****************************************************************/
void delayA(unsigned char x)    //x*0.14MS
{
  unsigned char i;
  while(x--)
{
  for (i = 0; i<13; i++) {}
}
}
//=====================================================
void IR_IN() interrupt 0 //using 0
{
  unsigned char 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=1;
      return;
    }
/*================红外编码处理====================*/  
     switch(IRCOM[2])
            {
                case 0x00: keya=1;                  break;   //1
                case 0x01: keyb=1;                  break;   //2
                case 0x02: keyc=1;                  break;   //3
                case 0x03: keyd=1;                  break;   //4
                case 0x04: keye=1;                  break;   //5
                case 0x05: keyf=1;                  break;   //6
                case 0x06: keyg=1;                  break;   //7
//                case 0x07: keyh=1;                  break;   //8
                case 0x08: keyi=1;                         break;   //9
//                case 0x09: keyj=1;                  break;   //0
//遥控器1(电视遥控器)
/*
                case 0x13: key_minish=1;          break;   //-
                case 0x12: key_add=1;                  break;   //+
                case 0x18: key_manue=1;          break;   //菜单
                case 0x19: key_ok=1;                  break;   //OK
                case 0x15: key_alarm=1;     break;   //关闹钟的开与关
*/
//遥控器2(ALETNK遥控器)
                case 0x15: key_add=1;                 break;   //+
                case 0x07: key_minus=1;         break;   //-  
                case 0x44: key_set=1;                 break;   //菜单       
                case 0x40: key_ok=1;                  break;   //OK       
                case 0x47: key_alarm=1;     break;   //关闹钟的开与关
                case 0x45: key_light=1;        break; //背光控制

                case 0x10: key_up=1;        break;   //上
                case 0x11: key_down=1;      break;   //下
                case 0x14: key_voioff=1;    break;   //静音
                case 0x17: key_voion=1;     break;   //声音
                default:                                           break;   //别的键按下
        }
/*   if(key_alarm==1)//闹钟的开与关的设置标志位
           {
                key_beep();
                key_alarm=0;
                ala_flag=~ala_flag;
                key_alarm=0;
           }
    if(key_light==1)
          {
           key_beep();
           key_light=0;
       back_light_flag=~back_light_flag;
           key_light=0;
           }
*/          
     EX0 = 1; //开中断
}
/**************************
  ALIENTEK遥控器键码值
        45H | 46H | 47H       
        ---------------
        44H | 40H | 43H
        ---------------
        07H | 15H | 09H
        ---------------
        16H | 19H | 0DH
        ---------------
        0CH | 18H | 5EH
        ---------------
        08H | 1CH | 5AH
        ---------------
        42H | 52H | 4AH
***************************/
#endif

这是遥控编码

这是遥控编码

这个是现在的遥控

这个是现在的遥控
PIC_20150601_202624_EE6.jpg

回复

使用道具 举报

ID:1 发表于 2015-6-1 22:50 | 显示全部楼层
遥控不能用。应该是编码格式或者是按键编码值的问题。建议楼主,多用几个遥控器测试一下。
回复

使用道具 举报

ID:44267 发表于 2015-9-5 14:20 | 显示全部楼层
太强了,太强了,太强了,太强了,
回复

使用道具 举报

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
你把编码数据改一下看行不行!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

Powered by 单片机教程网

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