STC890S52 T2定时器捕获功能解析红外NEC格式码
遥控器红外码有多种格式,这里讲NEC 格式, 波形如下所示。更多IR 协议可以参考这个网址:http://www.sbprojects.com/knowledge/ir/nec.php
这里可以看到,logic0,1 可以用持续时间的长短来区分。
上面是Spec 定义的波形,实际上经过红外接收头之后,电平是翻转过来的,是这个样子
, 没有信号的时候是高电平。
单片机部分:
51单片机输入捕获只能够识别下降沿,所以这里我们刚好可以将两个下降沿之间的时间记录下来,通过长短来区分出0或者1。
单片机晶振用22.1184,T2定时器加1 的时间大约为0.54us ,T2 是16位定时器,这里采用近似计算,只取RCAP2H的值。
leading pulse : (13500/0.54) >> 8 = 97
logic 0 :(1120/0.54)>> 8 = 8
logic 1 :(2250/0.54)>> 8 = 16
=======================================
抓取出来的数值:
97, 8, 7, 16, 16, 16, 8, 8, 7, 16, 16, 8, 7, 8, 16, 16, 16, 8, 16, 8, 16, 8, 7, 8, 8, 16, 8, 16, 8, 16, 16, 16, 16,
解码为==>
LSB - MSB MSB - LSB
0011 1000-> 0001 1100 -> 0x1C
1100 0111-> 1110 0011 -> 0xE3
1101 0000-> 0000 1011 -> 0x0B
0010 1111-> 1111 0100 -> 0xF4 ==>0xF40B 0xE31C
源码在这里
#include"stc_52.h"
#include"common_def.h"
#include"uart.h"
#defineNUMBIT33
//#defineDEBUG
sbit IrWafChk = P1^0;
bitPulseStart=false;
bitGetOneData = false;
uint8 NumT2Full=0;
uint8 IrWafBuf;
bit RemoteDecodeNEC(uint32 *u4KeyCode)
{
uint8 i;
uint32 u4Val =0;
if(IrWafBuf!=97)
{
return false;
}
for(i=0;i<32;i++)
{
if(IrWafBuf>6 && IrWafBuf<9)
{
}
else if(IrWafBuf>15 && IrWafBuf<17)
{
u4Val |= (uint32)0x01<<i;;
}
else
{
return false;
}
}
*u4KeyCode = u4Val;
return true;
}
void main(void)
{
#ifdef DEBUG
uint8 i;
#endif
uint32 u4IrKey;
Uart_Init();
T2CON |= 0x09;
ET2 = 1;
TL2 = 0;
TH2 = 0;
TR2=1;
EA = 1;
while(1)
{
if(GetOneData)
{
ET2 = 0;//disable T2 int.
#ifdef DEBUG
for(i=0;i<NumT2Full;i++)
{
Uart_SendData_Integer(IrWafBuf);
LOG(0,", ");
}
LOG(0,"\r\n");
#endif
if(RemoteDecodeNEC(&u4IrKey))
{
Uart_SendData_Hex(u4IrKey >> 16);
Uart_SendData_Hex(u4IrKey & 0xFFFF);
LOG(0,"\r\n");
}
GetOneData = false;
NumT2Full = 0;
ET2 = 1; //enable.
}
}
}
void Timer2()interrupt 5
{
if(EXF2)
{
EXF2 = 0; //Clear interrupt bit.
if(!PulseStart)
{
PulseStart = true;
TL2 = 0;
TH2 = 0;
return;
}
IrWafBuf = RCAP2H;
NumT2Full ++;
TL2 = 0;
TH2 = 0;
if(NumT2Full >= NUMBIT)
{
GetOneData = true;
PulseStart = false;
}
}
else if(TF2)
{
TF2 = 0;
if(PulseStart)
{
GetOneData = true;
}
PulseStart = false;
}
} {:victory:}学习 也上一个我以前捣鼓的
//#include<regx52.h>
#define uchar unsigned char
#define uint unsigned int
//#define M110592
#ifdef M110592
#define guide_h 48
#define high_h 8
#define low_h 4
#define mask 0xfc
#else //24M晶振
#define guide_h 105
#define high_h 17
#define low_h 8
#define mask 0xf8
#endif
extern ucharmenu_times;
extern ucharmanul_wait;
extern bit once;
bit guide_flag=0;
uchar dataxxh,decode_num,r_data,irtemp,irram;
uchar data rf_ram;
void decode(void) interrupt 0 // using 0
{
xxh=TH0;
TH0=0;
TR0=1;
IE0=0;
if(guide_flag==0)
{
if((xxh & mask)==(guide_h & mask))//引导码
{
guide_flag=1;
decode_num=0;
r_data=0;
}
}
else
{
decode_num += 1;
if((xxh & mask)==(high_h & mask))
{
r_data >>= 1;
r_data |= 0x80;
}
else if((xxh & mask)==(low_h & mask))
r_data >>= 1;
else
{
decode_num=0;
guide_flag=0;
r_data=0;
TH0=0;
}
if((decode_num % 8 )==0)
{
irtemp=decode_num / 8 - 1;
rf_ram=r_data;
r_data=0;
if(irtemp==3)
{
TR0=0;
TH0=0;
irram=rf_ram;
once=1;
guide_flag=0;
decode_num=0;
}
}
}
}
void timer1(void) interrupt 1
{
TR0=0;
TH0=0;
TL0=0;
IE0=0;
}
void timer(void) interrupt 3
{
// manul_wait += 1;
if(manul_wait==255)
menu_times=255;
} 这一帖太有营养了
我要怎么感谢你呢 xou822 发表于 2013-10-18 09:18 static/image/common/back.gif
这一帖太有营养了
我要怎么感谢你呢
把你的试验快快完工
然后把试验资料发上来
大家分享
就是最好的感谢呀 楼上说得有道理 看了一下那个网站但是介绍页不是很详细楼主可以加个qq聊一下么 xou822 发表于 2013-10-20 23:18 static/image/common/back.gif
看了一下那个网站但是介绍页不是很详细楼主可以加个qq聊一下么
请问是具体哪里不明白呢? 其实可以直接发上来的。QQ1169518754, 白天在公司不能上。 标记学习中
页:
[1]