这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 红外线发射方法之二

共2条 1/1 1 跳转至

红外线发射方法之二

助工
2014-11-21 16:53:43     打赏
上面所说的那个方法需要延时等待,在发射过程中CPU不能执行其他的功能,严重降低了CPU的效率。如果工程中还牵涉到LCD(不管是点阵的还是TN的)驱动程序、PWM控制、复合按键(长击,双击灯)、接口扩展等,后果就会很严重。

   A、把发射函数置于中断外,这样做可以减少中断函数的负担,可以去执行更多其他的功能,但是发射编码的时间需要做进一步调整(需要考虑主循环的时间误差)。不过我们可以在接受端适当的把范围放宽。

extern void SendRF(void);
extern uchar FSendWork0;
sbit        FSend38K        = FSendWork0:7;
sbit        FIrEnb                = FSendWork0:6;
sbit         FSyncEnd        = FSendWork0:5;
sbit         FDataOK                = FSendWork0:4;
sbit        FIRCntEnb        = FSendWork0:3;
sbit        FSyncOk                = FSendWork0:2;
sbit        FCycleOver        = FSendWork0:1;

uchar FSendWork0;
uchar SdBitCnt=0;
uchar RDataSend;   //        准备发射的数据

//==================================================
//函数名称:void SendData(uchar Data,uchar temp0)
//函数功能:数据信号发射  位格式:38K/低电平
//                      数据0        300us/300us
//                      数据1        300us/600us
//==================================================
void SendData(uchar Data,uchar temp0)
{        
        if(FDataOK) return;
        if(!FSend38K)
        {        
                IRTimeCnt0=23U;                //38K  23
                FIrEnb=1;
                FCycleOver=1;
                FSend38K=1;        
        }
        else 
        {
                if((Data<<temp0)&0x80)
                        { IRTimeCnt0=34U;}        //参数需要调准                
                else  IRTimeCnt0=17U;        //低电平发射,参数需要调准
                FIrEnb=0;
                FCycleOver=1;
                FSend38K=0;                //低电平发射
                SdBitCnt++;
                if(SdBitCnt>=9)                //发射位数
                {
                        SdBitCnt=0;
                        FDataOK=1;
                }
        }        
}

//==================================================
//函数名称:void SendSync(void)
//函数功能:同步头发射  1200/300us   38K/低电平
//==================================================
void SendSync(void)
{
        if(!FSend38K)                //为0时,发射38K
        {
                IRTimeCnt0=91U;                //23
                FSend38K=1;
                FIrEnb=1;
                FCycleOver=1;
        }        
        else
        {
                IRTimeCnt0=15U;                //6
                FIrEnb=0;
                FCycleOver=1;
                FSend38K=0;
                FSyncOk=1;                //同步头完成
        }                        
}

//==================================================
//函数名称:void SendSyscEnd(void)
//输入参数:无
//输出参数:无
//函数功能:同步尾  300us/13=23
//==================================================
void SendSyscEnd(void)
{
        IRTimeCnt0=23U;                //6
        FIrEnb=1;
        FSyncEnd=1;        
        FCycleOver=1;        
}

//==================================================
//函数名称:void SendRF(void)
//输入参数:无
//输出参数:无
//函数功能:信号发射
//只发射了8位有效数据,如果想发送更多的位,只需要加
//相应的寄存器和标志位即可。
//==================================================
void SendRF(void)
{        
        if(!FGunFire)  return;//为1时发射子弹信号
        if(!FSendGunIR)        {        
                FSendGunIR=1; FTC0ENB=1;        
                FIRCntEnb=1;
            }                        
        if(!FCycleOver) 
        {                                        
                if(FSyncOk)
                {
                 SendData(RDataSend,SdBitCnt); 
                        if(FDataOK)
                        {
                                SendSyscEnd();        
                                if(FSyncEnd)
                                {
                                FTC0ENB=0;                        
                                FIrEnb=0;        
FIRCntEnb=0;
                                FSyncOk=0;        
FSyncEnd=0;
                                FDataOK=0;        
FSendGunIR=0;
                                FGunFire=0;        
Rfout=0;
                                }
                        }        
                }
            else
            SendSync();        
        }
}

//==================================================
//函数名称:ISR(void)
//输入参数:无
//输出参数:无
//函数功能:中断服务        
//==================================================
__interrupt  ISR(void)
{
        FTC0IRQ=0;
        if(FIrEnb) 
        Rfout=~Rfout;        //13us中断
        IRTimeCnt0++; 
}

 


院士
2014-11-21 23:16:54     打赏
2楼

好古老的程序啊~~

这样的程序鲁棒性有多高啊~~


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]