痞酷網_PIGOO

 找回密碼
 立即註冊
!!! [系統偵測到廣告阻擋軟體] !!!

如果您覺得痞酷網對您有些許幫助,或者您認同痞酷網的理想,

那麼希望您將痞酷網設定為白名單.

並請在上論壇的時候,動動您的手指,用行動支持我們.

謝謝!
查看: 20262|回復: 21

要如何抓取 遙控器紅外線 頻率

  [複製鏈接]
發表於 2012-7-19 16:58:24 | 顯示全部樓層 |閱讀模式
各位大大

      想抓取遙控器 按鈕的頻率 小弟想要用遙控器控制單晶片  但遙控器的頻率 不會抓
以下網站是小弟查到的但從示波器上觀察到的紅外線波形 我看不懂如何看出   04FB

請大大指點  

http://tw.myblog.yahoo.com/black ... ev=1111&next=-1

                                                                                        n_155|
發表於 2012-7-19 17:46:58 | 顯示全部樓層
知道這不完全是你要的東西,我先回覆做個記號
有找到可以用電腦軟體讀遙控器內碼的軟體再貼上來

WinLIRC電腦萬用紅外線遙控器
http://www.mobile01.com/topicdetail.php?f=168&t=124928

WinLIRC 紅外線遙控電腦教學
http://coopermaa2nd.blogspot.tw/2011/04/winlirc.html

這應該才是你想要的
兩個取得遙控器紅外線資料的方法
http://coopermaa2nd.blogspot.tw/2011/03/15.html

WinLIRC : 利用家用遙控器控制電腦
http://gsyan888.blogspot.tw/2010/02/winlirc-1.html

評分

1

查看全部評分

發表於 2012-7-19 18:14:56 | 顯示全部樓層
雄爸爸 發表於 2012-7-19 05:46 PM static/image/common/back.gif
知道這不完全是你要的東西,我先回覆做個記號
有找到可以用電腦軟體讀遙控器內碼的軟體再貼上來

雄爸;
   博學多聞+好分享!!
發表於 2012-7-19 21:36:06 | 顯示全部樓層
遙控器IR的編碼方式有很多種.
該網頁的NEC IR Protocol只是其中一種.
首先你必須瞭解NEC IR Protocol的編碼方式.一般是用脈波寬度的長短來編碼,
以NEC IR Protocol來說一個短LOW加一短HI為0, 一個短LOW加一個長HI為1.
nec_ir.JPG

評分

1

查看全部評分

 樓主| 發表於 2012-7-20 01:11:33 | 顯示全部樓層
感謝各位大大的指點  小弟有進度再嘗傳給各位指點
 樓主| 發表於 2012-7-20 08:57:10 | 顯示全部樓層
本帖最後由 zuoso2006 於 2012-7-20 09:00 AM 編輯

雄爸
          小弟想要用89s51 接收  有範例嗎 ??
小弟在對岸買的學習版  有以下遙控器
但沒有範例  也不知如何下手  n_158|

DSC01994-800.jpg
DSC01995-800.jpg
DSC01993-800.jpg

                   有人可以救一下嗎???
                                  我住台南n_146|





                 
發表於 2012-7-20 11:40:02 | 顯示全部樓層
這個是有趣的題目

俺以前玩過, 不解碼, 直接記錄波形及重放

好處是, 不需要理解不同廠牌的編碼或格式, 編程序就是讀表格資料, IO直接按順序輸出

缺點是, 記憶體消耗多一些, 有些遙控器, 按住同一個鍵不放, 他的編碼會只輸出部份, 引導碼會省略

讀碼的器材, 就是PC和軟件 GOLDWAVE 或是 Audacity, 都免費. 加個 LED 或者 IR LED 接收遙控訊號就可以開始玩樂, 買不到IR LED的話, 買超亮的綠色LED, 全透明包裝的那種比較效率高, 容易接受IR訊號. 不需要示波器

參考看看, 很好玩的

http://blog.yahoo.com/xiao-laba/articles/382585
發表於 2012-7-20 21:54:38 | 顯示全部樓層
本帖最後由 legion 於 2012-7-20 10:15 PM 編輯

記得以前有玩過,而且大約90%以上的搖控器都能使用
扣除掉最前端的識別碼,其實搖控器的按鍵碼碼值有兩組8bit值應都能取得
不過現在是一目十行過目即忘,忘了以前是怎麼作的
下面檔案內含兩個程式都和這類有關,這是轉自大陸那邊的實驗版用的測試程式
IR相關程式.rar (4.46 KB, 下載次數: 172)
不過看了一下都是組合語言的,希望你能使用
用c的話,應該可以將雄爸有列出的網站Arduino模式下,作些修改應該也能用
c是有相當大共通性的,工具在人的使用,參考看看,
 樓主| 發表於 2012-7-21 00:39:16 | 顯示全部樓層
感謝各位大大 照顧 小弟研究中  謝謝:sam09
發表於 2012-7-21 01:20:36 | 顯示全部樓層
zuoso2006 發表於 2012-7-20 08:57 AM static/image/common/back.gif
雄爸
          小弟想要用89s51 接收  有範例嗎 ??
小弟在對岸買的學習版  有以下遙控器

/*-----------------------------------------------
  名称:遥控器红外解码数液晶显示
  论坛:www.doflye.net
  编写:shifang
  日期:2009.5
  修改:无
  内容:按配套遥控器按键,液晶显示4组码值,分别是用户码 用户码 数据码 数据反码
        显示如下:
                 www.doflye.net
                 Code:1E-1E-00-FF
------------------------------------------------*/
#include<reg52.h>    //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include"1602.h"
#include"delay.h"

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

char code Tab[16]="0123456789ABCDEF";
/*------------------------------------------------
                全局变量声明
------------------------------------------------*/

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

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

unsigned char TempData[16];
/*------------------------------------------------
                  函数声明
------------------------------------------------*/
void Ir_work(void);
void Ircordpro(void);

/*------------------------------------------------
                  定时器0中断处理
------------------------------------------------*/

void tim0_isr (void) interrupt 1 using 1
{
  irtime++;  //用于计数2个下降沿之间的时间
}

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

if(startflag)                        
   {
    if(irtime<63&&irtime>=33)//引导码 TC9012的头码,9ms+4.5ms
                        i=0;
                    irdata=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;   
}
/*------------------------------------------------
                  外部中断0初始化
------------------------------------------------*/
void EX0init(void)
{
IT0 = 1;   //指定外部中断0下降沿触发,INT0 (P3.2)
EX0 = 1;   //使能外部中断
EA = 1;    //开总中断
}
/*------------------------------------------------
                  键值处理
------------------------------------------------*/

void Ir_work(void)
{
       TempData[0] = Tab[IRcord[0]/16];   //处理客户码
           TempData[1] = Tab[IRcord[0]%16];
       TempData[2] = '-';
           TempData[3] = Tab[IRcord[1]/16];   //处理客户码
           TempData[4] = Tab[IRcord[1]%16];
           TempData[5] = '-';
           TempData[6] = Tab[IRcord[2]/16];   //处理数据码
           TempData[7] = Tab[IRcord[2]%16];
           TempData[8] = '-';
           TempData[9] = Tab[IRcord[3]/16];   //处理数据反码
           TempData[10] = Tab[IRcord[3]%16];

       LCD_Write_String(5,1,TempData);

           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|=0x80;
          if(j<8)
                    {
                         value>>=1;
                        }
           k++;
         }
     IRcord=value;
     value=0;     
     }
         irpro_ok=1;//处理完毕标志位置1
}

/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main(void)
{
EX0init();            //初始化外部中断
TIM0init();           //初始化定时器

LCD_Init();           //初始化液晶
DelayMs(20);          //延时有助于稳定
LCD_Clear();          //清屏

LCD_Write_String(0,0,"www.doflye.net");
LCD_Write_String(0,1,"Code:");

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

    if(irpro_ok)                   //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等
          {
           Ir_work();
            }
   }
}
  
  
發表於 2012-7-21 01:22:31 | 顯示全部樓層
/*-----------------------------------------------
  名称:遥控器红外解码数码管显示
  论坛:www.doflye.net
  编写:shifang
  日期:2009.5
  修改:无
  内容:按配套遥控器上1-9会在数码管上对应显示
------------------------------------------------*/
#include<reg52.h>    //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

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

#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
sbit LATCH1=P2^2;//定义锁存使能端口 段锁存
sbit LATCH2=P2^3;//                 位锁存
/*------------------------------------------------
                全局变量声明
------------------------------------------------*/

unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
unsigned char  irtime;//红外用全局变量

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

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

void Ir_work(void);
void Ircordpro(void);

/*------------------------------------------------
                  定时器0中断处理
------------------------------------------------*/

void tim0_isr (void) interrupt 1 using 1
{
  irtime++;  //用于计数2个下降沿之间的时间
}

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

if(startflag)                        
   {
    if(irtime<63&&irtime>=33)//引导码 TC9012的头码,9ms+4.5ms
                        i=0;
                    irdata=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;   
}
/*------------------------------------------------
                  外部中断0初始化
------------------------------------------------*/
void EX0init(void)
{
IT0 = 1;   //指定外部中断0下降沿触发,INT0 (P3.2)
EX0 = 1;   //使能外部中断
EA = 1;    //开总中断
}
/*------------------------------------------------
                  键值处理
------------------------------------------------*/

void Ir_work(void)//红外键值散转程序
{
       switch(IRcord[2])//判断第三个数码值
                 {
                         case 0x0cataPort=dofly_DuanMa[1];break;//1 显示相应的按键值
                         case 0x18ataPort=dofly_DuanMa[2];break;//2
                         case 0x5eataPort=dofly_DuanMa[3];break;//3
                         case 0x08:DataPort=dofly_DuanMa[4];break;//4
                         case 0x1c:DataPort=dofly_DuanMa[5];break;//5
                         case 0x5a:DataPort=dofly_DuanMa[6];break;//6
                         case 0x42:DataPort=dofly_DuanMa[7];break;//7
                         case 0x52:DataPort=dofly_DuanMa[8];break;//8
                         case 0x4a:DataPort=dofly_DuanMa[9];break;//9
             default:break;
                         }

                  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|=0x80;
          if(j<8)
                    {
                         value>>=1;
                        }
           k++;
         }
     IRcord=value;
     value=0;     
     }
         irpro_ok=1;//处理完毕标志位置1
}

/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main(void)
{
EX0init(); //初始化外部中断
TIM0init();//初始化定时器

  DataPort=0xfe; //取位码 第一位数码管选通,即二进制1111 1110
  LATCH2=1;      //位锁存
  LATCH2=0;

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

    if(irpro_ok)                   //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等
          {
           Ir_work();
            }
   }
}
  
  
 樓主| 發表於 2012-7-21 18:45:35 | 顯示全部樓層
本帖最後由 zuoso2006 於 2012-7-21 06:51 PM 編輯

大大 小弟有用示波器量測了  附上圖片  但如何看 編碼阿???

    感謝 legion大大提供程式  在裡面IR-1602LC與小弟的遙控器有一顆符合  

   目前40H可以接收到了一顆鍵了 小弟有改 10H 20H 30H 都槓龜 :sam09

    MOV  A,22H
          CJNE  A,#40H,LOOP2    ;K17鍵按下
      CLR   RELAY           ;繼電器吸合




用以下電路連接
新增Microsoft Visio 繪圖.jpg

這是量到的波形
DSC01999-800.jpg


DSC02001-800.jpg




發表於 2012-7-21 21:32:57 | 顯示全部樓層
本帖最後由 legion 於 2012-7-21 09:47 PM 編輯

這個應該不是這樣作的吧
如果是想知道按鍵值的話,應該先將按鍵值作輸出顯示而己
取得的數值放在記憶體的位置應為22h
實際上應是把程式修改成每按一次便接收顯示一次,這才知道收到什麼碼
而不是用碰運氣的方式,因為40h只是一個特定鍵,
換成是我不考慮去查實際碼的話,應該會以40h為中心上下作位移測試
35h,36h....40h,41h...45h或許中獎率還高一點
而且一般也不用太複雜的電路,如果是一般的紅外線接收器
大概只要這樣就能使用,參考看看
紅外線接收電路.jpg
發表於 2012-7-22 12:26:51 | 顯示全部樓層
zuoso2006 發表於 2012-7-21 06:45 PM static/image/common/back.gif
大大 小弟有用示波器量測了  附上圖片  但如何看 編碼阿???

    感謝 legion大大提供程式  在裡面IR-1602L ...

用示波器直接看 38/40khz 紅外線訊號會連 38/40khz 載波與訊息一起觀測到,
一般 38/40 載波不是我們感興趣的部份,
所以直接用紅外線遙控接收模組過濾掉載波直接取的訊息比較方便,
而訊息就落在音頻範圍內 < 5khz,
要用什麼工具的選擇就多了.
 樓主| 發表於 2012-7-22 12:44:38 | 顯示全部樓層
本帖最後由 zuoso2006 於 2012-7-22 11:14 PM 編輯

感恩 站上大大的照顧
    小弟正在努力中學習 目前遇到 週期計算的問題 可以幫小弟解釋一下
並計算下列程式 是花多少 週期阿????:sam27


DEL:
              MOV  R5,#1          ;  T1       1週期               
DEL0:     MOV  R6,#2          ;  T2       1週期
DEL1:     MOV  R7,#        32       ;  T3       1週期
DEL2:     DJNZ  R7,DEL2     ; T4        2週期
              DJNZ  R6,DEL1    ;   T5       2週期
              DJNZ  R5,DEL0    ;   T6       2週期
             RET                       ;   T7      2週期


  T1+(T2+(T3+(T4x32)+T5)x2+(T6x1)+T7

   1 +(1+(1+(2X32)+2)x2+(2x1)+2  =  140


==========================================
如果上面是對的 那小弟可以寫成以下這樣嗎??
但寫成以下這樣卻不跑了 是週期算錯了嗎


EL:
              MOV  R5,#135                ;  T1       1週期               
DEL00:   DJNZ  R5,DEL00                   ;  T2       2週期
           RET  
===========================================
發表於 2012-7-22 20:59:46 | 顯示全部樓層
其實用keil c本身在作模擬時就能在下面看到所有的動作週期和時間值
而且都是8051的mcu本身還有分12t和1t的種類,
同一個延遲參數都會有不同的時間差
看了一下那個程式,本身程式就有註明是R5*0.14ms
先確認你用的是那種mcu,是1t還是12t的,然後140個週期是0.14ms時
那麼xtal本身應該是12mhz的,這幾個小細節注意一下
剩下的用keil c在模擬時,下面就會告訴你的
DEL00:       R5,DEL00                   ;  T2       2週期
這個應該是連compiler都過不去的
DEL00:       djnz R5,DEL00                   ;  T2       2週期
 樓主| 發表於 2012-7-22 22:49:57 | 顯示全部樓層
本帖最後由 zuoso2006 於 2012-7-22 11:38 PM 編輯

EL:
              MOV  R5,#135                ;  T1       1週期               
DEL00:   DJNZ  R5,DEL00                   ;  T2       2週期
           RET  

喔 以上 真的有錯ㄋ  感謝糾正  



但第一條計算有錯嗎???  公式是怎樣算阿 ???  

小弟 目前用12hz 沒錯  所以是 週期乘上1us  是這樣嗎??


要如何去判斷這訊號 是不是 38hz  >''<  

有點暈了ㄋ   
發表於 2012-7-23 00:41:43 | 顯示全部樓層
如果只是想要140t的話應該改成這樣
EL:
           MOV  R5,#68               ;  T1       1週期               
DEL00:  DJNZ  R5,DEL00            ;  T2       2週期
           NOP                           ;  T3       1週期
           RET                           ;  T4       2週期

t1=1    t2=2*68=136  
T1+T2+T3+T4=1+136+1+2=140 這才對吧
週期的部份請詳閱一般入門的書籍,上面都會有清楚的詳列
用組合語言是不用像c要外部中斷負緣觸發模式來作輸入
但如果本身對組合語言不熟的話,有時用c會來的更容易一些
像上面antlu大己列出c的模式,也是可以參考的

 樓主| 發表於 2012-8-3 00:12:53 | 顯示全部樓層
本帖最後由 zuoso2006 於 2012-8-3 12:17 AM 編輯


感謝各位大大指導 好像會一點了
    已可以控制 單晶片了  但c語 還沒看懂 >''<
這是小弟這幾天看出來的成果筆記 就在這程式
                      給各位大大指點一下

小弟在單晶片收到狀態與遙控器發射出來的狀態看了好久喔才懂相反的道理

8051紅外線.jpg

發表於 2012-8-15 12:49:05 | 顯示全部樓層
根據clk的h L 去決定data's H L
 樓主| 發表於 2012-8-29 00:00:05 | 顯示全部樓層
對的  感謝回復


發表於 2012-8-29 01:32:04 | 顯示全部樓層
很值得深入研究的技術
~:)
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

關閉

站長小叮嚀上一條 /1 下一條

禁閉室|手機版|連繫我們|痞酷網電子技術論壇

GMT+8, 2024-11-23 12:15 PM , Processed in 0.350319 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.