红外接收

//-----------------------------------------------
//------------------红外收码---------------------
//-----------------------------------------------
#define        io_ir    P2_6

unsigned char xdata _ucIrCnt;//时间计数            
unsigned char xdata _ucIrCount;//接收码计数
unsigned char xdata _ucUserCode;//接收到的遥控码
unsigned char xdata _ucIrCode[4];//遥控码处理

flag    _ucIrRecFlag;
#define    _bitIrRise        _ucIrRecFlag._bit.b0//边沿标志
#define    _bitIrFirstLow    _ucIrRecFlag._bit.b1//第一个下降沿
#define    _bitIrGuide        _ucIrRecFlag._bit.b2//引导码

/**************************************************
*函数名称:_IR_PROC()
*函数功能:红外接收
*入口参数:void
*出口参数:void
**************************************************/
void _IR_PROC()                                            //200us中断调用,注意各个码时间控制
{
    _ucIrCnt++;
    if(_ucIrCnt==0)
    {
        _bitIrFirstLow=0;                                //第一个下降沿清零
    }    
    if(io_ir)
    {
        _bitIrRise=1;                                    //置高电平标志
    }
    else if(_bitIrRise)
    {
        _bitIrRise=0;
        if(!_bitIrFirstLow)                                //判断是否第一个下降沿
        {
            _bitIrFirstLow=1;                            //是,则不处理,等待下一个下降沿
            _ucIrCnt=0;
        }
        else if(_ucIrCnt>62&&_ucIrCnt<80)                //判断是否引导码的长度
        {
            _ucIrCnt=0;
            _ucIrCount=0;
            _bitIrGuide=1;                    
        }    
        else if(_ucIrCnt>50&&_ucIrCnt<63)                //判断是否重复码长度,如果不需要重复码,请把这段程序屏蔽
        {
            _ucIrCnt=0;
            _bitIrFirstLow=0;
            _ucUserCode=_ucIrCode[2];                    //是,则直接相应遥控功能
        }    
        else if(_ucIrCnt<20)                            //判断是否属于普通码的长度
        {
            if(_bitIrGuide)                                //是否已经接受到引导码
            {            
                _ucIrCode[0]<<=1;
                if(_ucIrCode[1]&0X80)_ucIrCode[0]|=0X01;
                else _ucIrCode[0]&=0XFE;
                _ucIrCode[1]<<=1;
                if(_ucIrCode[2]&0X80)_ucIrCode[1]|=0X01;
                else _ucIrCode[1]&=0XFE;
                _ucIrCode[2]<<=1;
                if(_ucIrCode[3]&0X80)_ucIrCode[2]|=0X01;
                else _ucIrCode[2]&=0XFE;
                _ucIrCode[3]<<=1;    
                
                        
                if(_ucIrCnt>7)_ucIrCode[3]|=0X01;
                else _ucIrCode[3]&=0XFE;
                _ucIrCnt=0;
                _ucIrCount++;
                if(_ucIrCount>=32)                        //是否接受到32位码
                {
                    _ucIrCount=0;
                    _bitIrFirstLow=0;
                    if(_ucIrCode[0]==~_ucIrCode[1]&&_ucIrCode[2]==~_ucIrCode[3])//是否符合遥控码格式
                    {
                        _ucUserCode=_ucIrCode[2];    
                        _bitIrGuide=0;
                    }    
                }    
            }        
        }                                
    }                    
}

你可能感兴趣的:(红外接收)