//=========================
//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
沒有留言:
張貼留言