小知识:数据在计算机中都是以二进制存储:
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;
}
}