本帖最后由 老鱼探戈 于 2011-4-21 17:17 编辑
如果你还不太了解红外线,请谷歌一下。
如果你还不太了解红外线的使用,请看下文。
一、先说一个最笨的方法:就地延时等待发射。
此方法适用于发射机功能简单到发射是唯一的大任务的工程项目,其他有一些诸如按键检测、RC充放电、AD检测、LED指示等功能都不会受什么影响。
参考程序1:
//*****************************************************//
//所用母体:SN8P2501B
//ICE版本号:SN8 C Studio_100702(564.158)
//初始编辑:老鱼探戈
//最后修改:2011-4-20
//*****************************************************//
#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 //汇编中的变量将前面+"_"
}
}
有些台系的IC是内置38K或57K发射的,例如佑华、一般的语音IC都有,还有sonix的26系列也有。所以只需配置相应的寄存器即可实现发射功能。 |