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

共1条 1/1 1 跳转至

红外线发射方法之一

助工
2014-11-21 16:34:27     打赏
先说一个最笨的方法:就地延时等待发射。

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

 


共1条 1/1 1 跳转至

回复

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