2011年11月22日 星期二

NEC transmission format IR remote controller decode program

//=========================
//Project:     IR Remote Controller Decode
//Author:      Leo.Tseng
//Date:        2011/11/22
//MCU:         W78E054D
//CRYSTAL:     25Mhz
//Description: Use uart for output, set boudrate=9600,
//             Decode NEC transmission format
//=========================
#include  <reg52.h>
#include  <stdio.h>
// 變數宣告
sbit IR_INT = P3^2;
sbit IR_OUT = P2^0;
unsigned int IR_BUFFER[33]=0;
unsigned int i,j,index=0;
unsigned long ir_data=0;
        
// 副程式宣告
void UART_initinal(int baudrate);
void timer0_RUN(void);

// 主程式開始
void main(void)
{
 UART_initinal(9600);               // 使用UART,baudrate=9600

 IT0 = 1;                             // 設定INT0 (P3.2)為負緣輸入中斷
 EX0 = 1;                             // 致能INT0中斷
 
 TMOD = (TMOD & 0xF0) | 0x01;         // 設定計時器0為模式1
 EA = 1;                              // 總中斷致能啟始
 ET0 = 0;                             // 禁止計時器0產生中斷
 TR0 = 0;                             // 禁止計時器0計數
 
 printf("NEC編碼遙控器解碼程式\n\n");

 //IR_INT=1;
  
 while(1)
  {
   if(index==32)
     {
      TR0=0;                           // 停止計時器0
      ET0=0;                           // 禁止計時器0產生中斷     
      EX0=0;                           // 禁止外部中斷0產生中斷
      EA=0;                            // 禁止所有中斷
      for(i=0;i<4;i++)
         for(j=0;j<4;j++)
            {
             IR_BUFFER[33]=IR_BUFFER[8*i+j];             
             IR_BUFFER[8*i+j]=IR_BUFFER[7+8*i-j];
             IR_BUFFER[7+8*i-j]=IR_BUFFER[33];
            }
      for(i=0;i<32;i++)
         {
          if((IR_BUFFER[i]>=7)&&(IR_BUFFER[i]<=10))
            {
             IR_BUFFER[i]=0;
             ir_data=ir_data<<1;
            }
          else if((IR_BUFFER[i]>=17)&&(IR_BUFFER[i]<=20))
                 {
                  IR_BUFFER[i]=1;
                  ir_data=(ir_data<<1)|0x01;
                 }
          printf("%d",IR_BUFFER[i]);
         }
      printf(" < 二進位碼\n");  
      printf("遙控器16進位全碼:%lX \t",ir_data);
      printf("\n\n");
     
      // 重置所有變數及暫存區及中斷致能
      index=0;
      ir_data=0;
      TH0= 0;                           
      TL0= 0;
      EX0=1; 
     }
   EA=1;
  }
}
// 主程式結束

// UART副程式
void UART_initinal(int baudrate)      
{
 PCON  = 0x00;                          // PCON: if SMOD=1(b7), Baud Rate is Doubled                         
 SCON  = 0x52;                          // SCON: mode 1, 8-bit UART, enable rcvr                   
 TMOD  = (TMOD & 0x0F) | 0x20;            // TMOD: timer 1, mode 2, 8-bit reload          
 //TH1   = 256-(11059200/384/baudrate);   // TH1:  reload value for baud @ 11.0592MHz, TH=0xFD
 TH1   = 256-(25000000/372/baudrate);     // TH1:  reload value for baud @ 25MHz, TH=0xF9   
 TR1   = 1;                               // TR1:  timer 1 run                             
 //TI    = 1;                             // TI:   set TI to send first char of UART   
}
// INT0中斷0
void EXT_INT0(void) interrupt 0
{
 EX0=0;                                   // 外部中斷0禁能
 IR_BUFFER[index]=TH0;                    // 儲存計時器0的計時值
 index++;                                 // 指向下一個暫存區
 if(TH0==109) index=0;                    // 偵測前導碼
 timer0_RUN();                            // 開始計時
}
//Timer0 計時副程式
void timer0_RUN()
{
 TR0=0;                                   // 停止計時器0
 TH0=0;                                   // 重設計時器0
 TL0=0;                                   //
 TR0=1;                                   // 啟動計時器0
 EX0=1;                                   // 外部中斷0重新啟動
}


============= 測試結果 ================

NEC編碼遙控器解碼程式
00001000111001100100011110111000 < 二進位碼
遙控器16進位全碼:8E647B8
00001000111001100100001110111100 < 二進位碼
遙控器16進位全碼:8E643BC
00001000111001100100001010111101 < 二進位碼
遙控器16進位全碼:8E642BD
00001000111001100100000110111110 < 二進位碼
遙控器16進位全碼:8E641BE
00001000111001100100000010111111 < 二進位碼
遙控器16進位全碼:8E640BF
00001000111001100100011010111001 < 二進位碼
遙控器16進位全碼:8E646B9
00001000111001100100010110111010 < 二進位碼
遙控器16進位全碼:8E645BA
00001000111001100100010010111011 < 二進位碼
遙控器16進位全碼:8E644BB
00001000111001100100101010110101 < 二進位碼
遙控器16進位全碼:8E64AB5
00001000111001100100100110110110 < 二進位碼
遙控器16進位全碼:8E649B6
00001000111001100100100010110111 < 二進位碼
遙控器16進位全碼:8E648B7
00001000111001100100111010110001 < 二進位碼
遙控器16進位全碼:8E64EB1
00001000111001100100110110110010 < 二進位碼
遙控器16進位全碼:8E64DB2
00001000111001100100110010110011 < 二進位碼
遙控器16進位全碼:8E64CB3
00001000111001100100101110110100 < 二進位碼
遙控器16進位全碼:8E64BB4
00001000111001100001110011100011 < 二進位碼
遙控器16進位全碼:8E61CE3
00001000111001100001101011100101 < 二進位碼
遙控器16進位全碼:8E61AE5
00001000111001100001100111100110 < 二進位碼
遙控器16進位全碼:8E619E6
00001000111001100001100011100111 < 二進位碼
遙控器16進位全碼:8E618E7
00001000111001100001000011101111 < 二進位碼
遙控器16進位全碼:8E610EF
00001000111001100001010011101011 < 二進位碼
遙控器16進位全碼:8E614EB
00001000111001100001110111100010 < 二進位碼
遙控器16進位全碼:8E61DE2
00001000111001100001010111101010 < 二進位碼
遙控器16進位全碼:8E615EA
00001000111001100001000111101110 < 二進位碼
遙控器16進位全碼:8E611EE
00001000111001100001011011101001 < 二進位碼
遙控器16進位全碼:8E616E9
00001000111001100001111011100001 < 二進位碼
遙控器16進位全碼:8E61EE1
00001000111001100001001011101101 < 二進位碼
遙控器16進位全碼:8E612ED
00001000111001100001111111100000 < 二進位碼
遙控器16進位全碼:8E61FE0
00001000111001100001101111100100 < 二進位碼
遙控器16進位全碼:8E61BE4
00001000111001100001011111101000 < 二進位碼
遙控器16進位全碼:8E617E8
00001000111001100001001111101100 < 二進位碼
遙控器16進位全碼:8E613EC
00001000111001100101110010100011 < 二進位碼
遙控器16進位全碼:8E65CA3
00001000111001100101100010100111 < 二進位碼
遙控器16進位全碼:8E658A7
00001000111001100101010010101011 < 二進位碼
遙控器16進位全碼:8E654AB
00001000111001100101000010101111 < 二進位碼
遙控器16進位全碼:8E650AF
00001000111001100101110110100010 < 二進位碼
遙控器16進位全碼:8E65DA2
00001000111001100101100110100110 < 二進位碼
遙控器16進位全碼:8E659A6
00001000111001100101010110101010 < 二進位碼
遙控器16進位全碼:8E655AA
00001000111001100101000110101110 < 二進位碼
遙控器16進位全碼:8E651AE
00001000111001100101111010100001 < 二進位碼
遙控器16進位全碼:8E65EA1
00001000111001100101101010100101 < 二進位碼
遙控器16進位全碼:8E65AA5
00001000111001100101011010101001 < 二進位碼
遙控器16進位全碼:8E656A9
00001000111001100101001010101101 < 二進位碼
遙控器16進位全碼:8E652AD
00001000111001100101111110100000 < 二進位碼
遙控器16進位全碼:8E65FA0
00001000111001100101101110100100 < 二進位碼
遙控器16進位全碼:8E65BA4
00001000111001100101011110101000 < 二進位碼
遙控器16進位全碼:8E657A8
00001000111001100101001110101100 < 二進位碼
遙控器16進位全碼:8E653AC

沒有留言:

張貼留言