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++;
}
我要赚赏金
