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++; }