| 
 
论坛元老  
 
	积分4524金钱4524 注册时间2018-5-11在线时间947 小时 | 
 
 
 楼主|
发表于 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;
 }
 
 
 
 | 
 |