C语言:发送编码与解码函数

小知识:数据在计算机中都是以二进制存储:

              1<<i:表示1左移i位;            1>>i:表示1右移i位;

                      i<<1:表示i左移1位;            i>>1:表示i右移1位;


以下编码解码函数可以在单片机上实现:

发送编码函数:

一帧数据:前导码加8位数据码

                  前导码一个码字:高电平250us,低电平250us

                  数据码一个码字:1  高电平80us,低电平40us

                                               0  高电平40us,低电平40us

编码函数:实现一个前导码字和8位数据码字


void sendpulse(unsigned int dat)//
{
     int i;
     int bite=0;
     //发送前导码:1个码字
     TEST_OUT=1;	
     Wait_US(250);
     TEST_OUT=0;
     Wait_US(250);
     
     //发送数据码:8个码字   
    for(i=0;i<8;i++)
    {
       bite=( dat& (1<< i) ) >> i;
       if(bite == 0)
	{
	   TEST_OUT=1;  //0
	   Wait_US(40);
	   TEST_OUT=0;
	   Wait_US(40);		 
	}
	if(bite == 1)
	{
	    TEST_OUT=1; //1
	    Wait_US(80);
	    TEST_OUT=0;
	    Wait_US(40);
	}
      }
		
    Wait_US(500000);
}


解码函数:

查询法解码函数:
思路:1.利用单片机的IO口判断电平

           2.首先判断前导码,检测高电平,定时器清0,开启定时器计数

           3.判断数据码,检测高电平,定时器清0,开启定时器计数,计数值存数组,循环8次

void Demod_Recv(void)
{
 	unsigned int i;
    unsigned char bite ;
	while(1)
	{
        //前导码
		while(PB1==1&&flag==0)
		{
		  TR2=1;
		  TMR2 =(int)T2_RELOAD_CLOCKS;

		  while(PB1==1);
		  TR2=0;
		  count=TMR2H*256+TMR2L;


		  if(count>6125)//250us 对应的定时器2计数个数 
		  {
		   flag =1;//身份识别码解码标志位判断
		   i= 0;
		   Decode_ID=0x00;
		  }
		}
        //身份识别码
		while(PB1==1&&flag==1)
		{
		  TR2=1;
		  TMR2 = (int)T2_RELOAD_CLOCKS;
		  while(PB1==1);
		  TR2=0;
                  ID[i]=(TMR2H*256+TMR2L)>1400?1:0;     //高电平对应的计数个数,直接进行解码转换
		  bite =  ID[i] == 1? 1:0;  //实现进制转换:16进制
		  Decode_ID |= (bite<<i)  ; //实现进制转换:16进制
		  i++;
                  if(i==8)
		  {
		     flag=0;
		  }
			
		}
	 if(i==8) break;
	}
}


  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值