流浪的小白 发表于 2013-10-17 22:27:11

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




流浪的小白 发表于 2013-10-17 22:29:12

源码在这里
#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;
        }
}

jetli 发表于 2013-10-17 23:07:57

{:victory:}学习

younge 发表于 2013-10-18 00:31:21

也上一个我以前捣鼓的

//#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:36

这一帖太有营养了

我要怎么感谢你呢

lxa0 发表于 2013-10-19 00:45:36

xou822 发表于 2013-10-18 09:18 static/image/common/back.gif
这一帖太有营养了

我要怎么感谢你呢

把你的试验快快完工
然后把试验资料发上来
大家分享
就是最好的感谢呀

流浪的小白 发表于 2013-10-20 19:25:24

楼上说得有道理

xou822 发表于 2013-10-20 23:18:51

看了一下那个网站但是介绍页不是很详细楼主可以加个qq聊一下么

流浪的小白 发表于 2013-10-21 20:53:42

xou822 发表于 2013-10-20 23:18 static/image/common/back.gif
看了一下那个网站但是介绍页不是很详细楼主可以加个qq聊一下么

请问是具体哪里不明白呢? 其实可以直接发上来的。QQ1169518754, 白天在公司不能上。

xiaojun2019 发表于 2013-10-22 12:29:46

标记学习中
页: [1]
查看完整版本: STC890S52 T2定时器捕获功能解析红外NEC格式码