找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3752|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

GPS+12864+18B20+IR+Key萬年歷,遙控求助

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:57585 發(fā)表于 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;  //鬧鐘使能標(biāo)志位
//bit  back_light_flag=0;//背光使能
sbit IRIN = P3^5; //紅外接收器數(shù)據(jù)線

unsigned char IRCOM[]={0x00,0x00,0x00,0x00,0x10,0x10};
/***************************************************************
            外部中斷0響應(yīng)函數(shù),完成對紅外遙控的解碼
-------------------------協(xié)議--------------------------   
----開始拉低9ms,接著是一個4.5ms的高脈沖,通知器件開始傳送數(shù)據(jù)了
----接著是26位前導(dǎo)脈沖,用于識別該型號的搖控。                                 
----然后是發(fā)送8位數(shù)據(jù)的原碼,接著又發(fā)送8位數(shù)據(jù)的反碼.
----最后是一個長脈沖,和開始位一樣,拉低9ms和一個4.5ms脈沖表示結(jié)束。
----每個按鍵不同這處只在于那8位數(shù)據(jù)的原碼和反碼,因些只須要識別
----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;
          }
                           //確認(rèn)IR信號出現(xiàn)
  while (!IRIN)            //等IR變?yōu)楦唠娖,跳過9ms的前導(dǎo)低電平信號。
{delayA(1);}

for (j=0;j<4;j++)         //收集四組數(shù)據(jù)
     {
      for (k=0;k<8;k++)        //每組數(shù)據(jù)有8位
                  {
                           while (IRIN)            //等 IR 變?yōu)榈碗娖,跳過4.5ms的前導(dǎo)高電平信號。
                     {delayA(1);}//
                    while (!IRIN)          //等 IR 變?yōu)楦唠娖?br />                            {delayA(1);}  //
                     while (IRIN)           //計算IR高電平時長
                      {
                      delayA(1);
                      N++;           
                      if (N>=30)
                                 { EX0=1;
                                 return;}                  //0.14ms計數(shù)過長自動離開。
                      }                        //高電平計數(shù)完畢               
              IRCOM[j]=IRCOM[j] >> 1;                  //數(shù)據(jù)最高位補(bǔ)“0”
              if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}  //數(shù)據(jù)最高位補(bǔ)“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;   //關(guān)鬧鐘的開與關(guān)
*/
//遙控器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;   //關(guān)鬧鐘的開與關(guān)
                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)//鬧鐘的開與關(guān)的設(shè)置標(biāo)志位
           {
                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


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:1 發(fā)表于 2015-6-1 22:50 | 只看該作者
遙控不能用。應(yīng)該是編碼格式或者是按鍵編碼值的問題。建議樓主,多用幾個遙控器測試一下。
回復(fù)

使用道具 舉報

板凳
ID:44267 發(fā)表于 2015-9-5 14:20 | 只看該作者
太強(qiáng)了,太強(qiáng)了,太強(qiáng)了,太強(qiáng)了,
回復(fù)

使用道具 舉報

地板
ID:18867 發(fā)表于 2015-9-15 12:56 | 只看該作者
#ifndef  _HW_H_
#define  _HW_H_
/**********************************************************
設(shè)置
**********************************************************/
uchar IRCOM[]={0x00,0x00,0x00,0x00,0x10,0x10};
/***************************************************************
            外部中斷0響應(yīng)函數(shù),完成對紅外遙控的解碼
-------------------------協(xié)議--------------------------   
----開始拉低9ms,接著是一個4.5ms的高脈沖,通知器件開始傳送數(shù)據(jù)了
----接著是26位前導(dǎo)脈沖,用于識別該型號的搖控。                                 
----然后是發(fā)送8位數(shù)據(jù)的原碼,接著又發(fā)送8位數(shù)據(jù)的反碼.
----最后是一個長脈沖,和開始位一樣,拉低9ms和一個4.5ms脈沖表示結(jié)束。
----每個按鍵不同這處只在于那8位數(shù)據(jù)的原碼和反碼,因些只須要識別
----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;
          }
                           //確認(rèn)IR信號出現(xiàn)
  while (!IRIN)            //等IR變?yōu)楦唠娖,跳過9ms的前導(dǎo)低電平信號。
{delayA(1);}

for (j=0;j<4;j++)         //收集四組數(shù)據(jù)
     {
      for (k=0;k<8;k++)        //每組數(shù)據(jù)有8位
                  {
                           while (IRIN)            //等 IR 變?yōu)榈碗娖,跳過4.5ms的前導(dǎo)高電平信號。
                     {delayA(1);}//
                    while (!IRIN)          //等 IR 變?yōu)楦唠娖?br />                            {delayA(1);}  //
                     while (IRIN)           //計算IR高電平時長
                      {
                      delayA(1);
                      N++;           
                      if (N>=30)
                                 { EX0=1;
                                 return;}                  //0.14ms計數(shù)過長自動離開。
                      }                        //高電平計數(shù)完畢               
              IRCOM[j]=IRCOM[j] >> 1;                  //數(shù)據(jù)最高位補(bǔ)“0”
              if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}  //數(shù)據(jù)最高位補(bǔ)“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
你把編碼數(shù)據(jù)改一下看行不行!
回復(fù)

使用道具 舉報

5#
ID:18867 發(fā)表于 2015-9-15 12:56 | 只看該作者
#ifndef  _HW_H_
#define  _HW_H_
/**********************************************************
設(shè)置
**********************************************************/
uchar IRCOM[]={0x00,0x00,0x00,0x00,0x10,0x10};
/***************************************************************
            外部中斷0響應(yīng)函數(shù),完成對紅外遙控的解碼
-------------------------協(xié)議--------------------------   
----開始拉低9ms,接著是一個4.5ms的高脈沖,通知器件開始傳送數(shù)據(jù)了
----接著是26位前導(dǎo)脈沖,用于識別該型號的搖控。                                 
----然后是發(fā)送8位數(shù)據(jù)的原碼,接著又發(fā)送8位數(shù)據(jù)的反碼.
----最后是一個長脈沖,和開始位一樣,拉低9ms和一個4.5ms脈沖表示結(jié)束。
----每個按鍵不同這處只在于那8位數(shù)據(jù)的原碼和反碼,因些只須要識別
----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;
          }
                           //確認(rèn)IR信號出現(xiàn)
  while (!IRIN)            //等IR變?yōu)楦唠娖,跳過9ms的前導(dǎo)低電平信號。
{delayA(1);}

for (j=0;j<4;j++)         //收集四組數(shù)據(jù)
     {
      for (k=0;k<8;k++)        //每組數(shù)據(jù)有8位
                  {
                           while (IRIN)            //等 IR 變?yōu)榈碗娖,跳過4.5ms的前導(dǎo)高電平信號。
                     {delayA(1);}//
                    while (!IRIN)          //等 IR 變?yōu)楦唠娖?br />                            {delayA(1);}  //
                     while (IRIN)           //計算IR高電平時長
                      {
                      delayA(1);
                      N++;           
                      if (N>=30)
                                 { EX0=1;
                                 return;}                  //0.14ms計數(shù)過長自動離開。
                      }                        //高電平計數(shù)完畢               
              IRCOM[j]=IRCOM[j] >> 1;                  //數(shù)據(jù)最高位補(bǔ)“0”
              if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}  //數(shù)據(jù)最高位補(bǔ)“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
你把編碼數(shù)據(jù)改一下看行不行!
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表