论坛元老
- 积分
- 4416
- 金钱
- 4416
- 注册时间
- 2018-5-11
- 在线时间
- 922 小时
|
楼主 |
发表于 2018-7-1 18:00:38
|
显示全部楼层
本帖最后由 warship 于 2018-7-1 18:04 编辑
至于发射部分,也很容易,
可以用定时器,为了方便实现和理解,
我把直接使用延时实现的代码贴在下面:
void Send_IRByteSft(unsigned char x_irdata)
{
unsigned char i; //循环移位计数
unsigned char irdata; //数据寄存
unsigned int endcount; //计数结束(即完成延时)
irdata = x_irdata;
for(i=0;i<8;i++)
{
//先发送0.56ms的高电平(即编码中0.56ms的低电平)
SendLogicONE; //发送高电平0.56ms
delay_us(565);
SendLogicZERO;
//先发高位,有协议是先发低位,请与接收解码程序配合
if(irdata&0x80) //判断最高位是0还是1(0则延时(1.125ms-0.56ms=0.565ms);1则延时(2.25ms-0.56ms=1.685ms))
{
endcount = 1685; //1.685ms
}
else endcount = 565; //0.565ms
delay_us(endcount);
irdata = irdata << 1;
}
}
//发送一帧用户数据
/*******************************************************************
采用软件延时方式发送一帧用户数据
*******************************************************************/
void Transmit_IRdataSft(unsigned char p_irdata)
{
unsigned char IrAddr=IR_ADDR; //(地址ID码)
//发送9ms的引导码(高电平)
SendLogicONE;
delay_ms(9);
//发送4.5ms的引导码的结束码(低电平)
SendLogicZERO;
delay_ms(4);
delay_us(500);
Send_IRByteSft(IrAddr); //发送地址码
Send_IRByteSft(~IrAddr); //发送地址码的反码
Send_IRByteSft(p_irdata); //发送8位数据码
Send_IRByteSft(~p_irdata); //发送8位数据反码
// Send_IRByteSft(0x66); //结束码(可用于进一步的辨别)
//最后发送0.56ms的高电平
SendLogicONE;
delay_us(565);
SendLogicZERO;
}
|
|