此方法适用于发射机功能简单到发射是唯一的大任务的工程项目,其他有一些诸如按键检测、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 //汇编中的变量将前面+"_"
}
}
我要赚赏金
