发新帖我要提问
12
返回列表
打印

红外解码,为何总是解码不出?

[复制链接]
楼主: ningling_21
手机看帖
扫描二维码
随时随地手机跟帖
21
shanan| | 2017-5-6 12:15 | 只看该作者 回帖奖励 |倒序浏览
试试我的程序,希望有帮助。

在M8实现的基于输入捕捉单元的IR遥控解码
https://bbs.21ic.com/forum.php?mo ... &fromuid=985938
(出处: 21ic电子技术论坛)

使用特权

评论回复
22
liubeihua| | 2017-5-7 00:02 | 只看该作者
#include <stdio.h>
#include <reg51.h>
#include <intrins.h>

#define uchar unsigned char
#define uint  unsigned int

#define T_100US 100

#define T_REP 11250                        //连发最小值
#define T_REP_ERROR 500                //连发最大值
#define T_ZERO        1125                        //ZERO
#define T_ZERO_ERROR 100                //ZERO偏差
#define T_ONE 2250                        //ONE
#define T_ONE_ERROR 100                        //ONE偏差
#define T_LEADER 13500                        //引导头
#define T_LEADER_ERROR 600                //引导头偏

bit head;                                //接收头标志
bit c_error=0;                                //错误标志
bit finish;                                //完成标志
bit datafg;

uchar c_bits=8;                                //接收记数器
uchar data irdata[4]={0,0,0,0};
uint onecode;
uint zerocode;
uchar irpoint;

void intersvr0(void) interrupt 0 using 1
{        uint temp;       
        temp=TL0+TH0*256;
        TL0=0;
        TH0=0;
        if(datafg==1)
        {        if((temp>(zerocode-T_ZERO_ERROR))&&(temp<(zerocode+T_ZERO_ERROR)))
                        _nop_();
                if((temp>(onecode-T_ONE_ERROR))&&(temp<(onecode+T_ONE_ERROR)))
                        irdata[irpoint]+=0x80;
                c_bits--;
                if(c_bits)
                        irdata[irpoint]=irdata[irpoint]>>1;
                else
                {        irpoint++;
                        c_bits=8;
                        if(irpoint>=4)
                        {        datafg=0;
                                head=0;
                                finish=1;
                        }
                }
        }
        if((head==1)&&(datafg==0))
        {        if((temp>(T_LEADER-T_LEADER_ERROR))&&(temp<(T_LEADER+T_LEADER_ERROR)))
                {        datafg=1;
                        onecode=temp/6;
                        zerocode=temp/12;
                        repeatcode=temp-onecode;
                        irdata[0]=0;
                        irdata[1]=0;
                        irdata[2]=0;
                        irdata[3]=0;
                        c_bits=8;
                        irpoint=0;
                }
        }
        if((head==0)&&(finish==0))
                head=1;
}

void timer1(void)interrupt 3 using 1
{        TH1=-1000/256;                                                                        //1毫秒定时
        TL1=-1000%256;
        if((first_key_delay==1)&&(nonekey==0))
        {        keydlcount++;
                if(keydlcount>=400)
                {        keydlcount=0;
                        repeatdelay=0;
                        keycount=0;
                        first_key_delay=0;
                        key_delay=0;
                        RED=1;
                }
        }
        if((datafg==1)||(repeatflag==1))
        {        uint temp;       
                temp=TL0+TH0*256;
                if(temp>0x0e00)
                {        head=0;
                        repeatflag=0;                        //重复码标志
                        irdata[0]=0;
                        irdata[1]=0;
                        irdata[2]=0;
                        irdata[3]=0;
                        finish=0;
                }
        }
}

void tsetctrl(void)
{        uchar aa;
        if(finish==1)
        {        aa=irdata[2]+irdata[3];
                if(aa!=0xff)
                        c_error=1;
        }
}

void main(void)
{        P1=0x03;
        P3=0x0f;
        TMOD=0x11;                                //定时器1为为16位定时器,定时器0为16位定时器
        TCON=0x51;                                //设置T1、T0控制位,外部中断0下降沿触发
        TH0=0;
        TL0=0;
        TH1=-1000/256;                        //1ms定时
        TL1=-1000%256;
        IE=0x8b;                                //总中断使能,定时器1中断使能,定时器0中断使能,外部中断0使能
        state=0;
        delayX10ms(10);
        BEEP=1;
        GREEN=1;
        RED=0;
        for(;;)
        {
                        if(finish==1)
                        {       
                                        userhigh=irdata[0];
                                        userlow=irdata[1];
                                        tsetctrl();
                        }
        }
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则