此方法适用于发射机功能简单到发射是唯一的大任务的工程项目,其他有一些诸如按键检测、RC充放电、AD检测、LED指示等功能都不会受什么影响。
#define uchar unsigned char #define uint unsigned long //sonix的C编译器中的long型是16位 #define SD_LONG 24u //必须为偶数,单位BIT的长度:24-->24*13us=312us uchar SendDataH; uchar SendDataM; uchar SendDataL; uchar SendDataA; extern uchar Dat_IrCont0; extern bit FIrEnb; //IR发送允许38k //***************************************// //函数名称:void SendSync(void) //输入参数:无 //输出参数:无 //函数功能:发射同步头 //**************************************// void SendSync(void) { FIrEnb=1; //允许翻转 Dat_IrCont0=0; while(Dat_IrCont0<SD_LONG); Io_SendIR=0; FIrEnb=0; Dat_IrCont0=0; while(Dat_IrCont0<5*SD_LONG); } //***************************************// //函数名称:void SendEnd(void) //输入参数:无 //函数功能:发射同步尾 //**************************************// void SendEnd(void) { FIrEnb=1; //允许翻转 Dat_IrCont0=0; while(Dat_IrCont0<SD_LONG); Io_SendIR=0; } //***************************************// //函数名称:void Send_Byte(uchar data0,uchar bl) //输入参数:data0,b1 //输出参数:无 //函数功能:发射b1位数据 //**************************************// void Send_Byte(uchar data0,uchar bl) { uchar i; sbit blow=data0:7; for(i=0;i<bl;i++) { FIrEnb=1; Dat_IrCont0=0; while(Dat_IrCont0<SD_LONG); Io_SendIR=0; FIrEnb=0; Dat_IrCont0=0; if(blow) while(Dat_IrCont0<2*SD_LONG); else while(Dat_IrCont0<SD_LONG); data0<<=1; } } //****************************************// //函数名称:void SendIR(void) //函数功能:红外线发射一帧数据 //***************************************// extern void SendIR(void) { if(!FCharge) { FTC0ENB=1; //打开38k定时器 SendSync(); Send_Byte(SendDataH,8); Send_Byte(SendDataM,8); Send_Byte(SendDataL,8); Send_Byte(SendDataA,8); //校验和 SendEnd(); FTC0ENB=0; //关闭38K中断,因为太快了只在发射的时候打开 } else FTC0ENB=0; } //***************************************// //函数名称:__interrupt ISR(void) //函数功能:中断函数,C编译器不够完美,所以嵌入汇编 //**************************************// __interrupt ISR(void) { __asm { PUSH B0BCLR FTC0IRQ //13us中断,用于红外线发生器 MOV A,#10h //对位取反 BTS0 _FIrEnb XOR P5,A //发射口为P54 INCMS _Dat_IrCont0 //汇编中的变量将前面+"_" } }