博客参考:https://blog.csdn.net/Stack_/article/details/116952678
发送数据时序
相比ID卡,解码思路差不多,但这个时序是要简单一些的,特点是有起始头码,数据一共3个字节(24位),发码间隔时间150ms,没有校验码
解码思路:
1.设置外部中断边沿触发
2.设置定时器计数,进入外部中断后关闭定时器计数,然后读取定时器计数值TH0和TL0的值,再开启定时器计数,根据定时器计数值判断4T,T,2T的值的范围
3.设置头码检验,也就是定时器计数值在4T范围内
4.设置数据检验,并且记录这一次的值。由于头码是一段低电平,那么标记头码低电平状态,头码之后的第一次是上升沿中断,并且读取到定时器计数值是T范围的值,记录这一次的状态,不记录这一次的数据。下一次下降沿中断再次读取到定时器计数值是T范围的值,那么记录下这次读取到的值为0,并且记录为低电平状态
5.如果上一次为低电平状态,并且在下降沿读到2T,那么说明数据跳变为1了,记录为高电平状态,如果在上升沿读到T,说明数据还是0,记录为低电平状态;如果上一次为高电平状态,并且在下降沿读到T,说明数据是1,记录为高电平状态,如果上升沿读到2T,那么数据是0,记录为低电平状态。
//外部中断0处理函数
{
static U8 XDATA dataenflag=0;
static U8 XDATA LastState=0;
static U16 XDATA WaveNow=0;
static U8 XDATA DataStateFlag=0;
static U8 XDATA RfState=0;
static U8 XDATA Invcnt=0;
U8 XDATA i=0;
T0En(OFF);
// 判断上升沿还是下降沿
Invcnt = R_FLAG & 0x07;
if(Invcnt & 0x04)
{
DataStateFlag=DATA_STATE_H;//上升沿
}
else
{
DataStateFlag=DATA_STATE_L;//下降沿
}
WaveNow=0;
WaveNow=((U16)TH0)&0x00ff;
WaveNow=(WaveNow<<8)&0xff00;
WaveNow+=(((U16)TL0)&0x00ff);
TH0=TL0=0;
T0En(ON);
/*接收足够的数据判断T,2T,4T的值的范围*/
#if 0
g_u8Tesetbuf[g_u8Tesetcnt]=WaveNow;
if(++g_u8Tesetcnt>=59)
{
g_u8Teseflag=1;
}
else
{
T0En(ON);
}
#endif
#if 1
switch(RfState)
{
case 0: //找头
if(DataStateFlag==DATA_STATE_H)
{
if((WaveNow>RF_STAR_MIX)&&(WaveNow<RF_STAR_MAX))
{
RfState=1;
g_u8Tesetcnt=0;
Invcnt=0;
LastState=DATA_TYPE_L;
}
}
break;
#if 1
case 1:
//g_u8Teseflag=1;
if(LastState==DATA_TYPE_L)
{
if(DataStateFlag==DATA_STATE_L)
{
if((WaveNow>RF_DATA_B_MIX)&&(WaveNow<RF_DATA_B_MAX))
{
g_u8Tesetbuf[g_u8Tesetcnt]=0x01;
dataenflag=1;
LastState=DATA_TYPE_H;
}
//else if((WaveNow<RF_DATA_A_MIX)||(WaveNow>RF_DATA_B_MAX))
else if(WaveNow>RF_DATA_B_MAX)
{
dataenflag=2; // 异常值
}
else{dataenflag=0;}
}
else if(DataStateFlag==DATA_STATE_H)
{
//if((WaveNow>RF_DATA_A_MIX)&&(WaveNow<RF_DATA_A_MAX))
if((WaveNow<RF_DATA_A_MAX))
{
g_u8Tesetbuf[g_u8Tesetcnt]=0x00;
dataenflag=1;
LastState=DATA_TYPE_L;
}
else if((WaveNow>RF_DATA_B_MAX))
{
dataenflag=2; // 异常值
}
else{dataenflag=0;}
}
}
else if(LastState==DATA_TYPE_H)
{
if(DataStateFlag==DATA_STATE_L)
{
//if((WaveNow>RF_DATA_A_MIX)&&(WaveNow<RF_DATA_A_MAX))
if((WaveNow<RF_DATA_A_MAX))
{
g_u8Tesetbuf[g_u8Tesetcnt]=0x01;
dataenflag=1;
LastState=DATA_TYPE_H;
}
else if((WaveNow>RF_DATA_B_MAX))
{
dataenflag=2; // 异常值
}
else{dataenflag=0;}
}
else if(DataStateFlag==DATA_STATE_H)
{
if((WaveNow>RF_DATA_B_MIX)&&(WaveNow<RF_DATA_B_MAX))
{
g_u8Tesetbuf[g_u8Tesetcnt]=0x00;
dataenflag=1;
LastState=DATA_TYPE_L;
}
else if((WaveNow>RF_DATA_B_MAX))
{
dataenflag=2; // 异常值
}
else{dataenflag=0;}
}
}
/**/
if(dataenflag==1)
{
dataenflag=0;
if(g_u8Tesetcnt<23)
{
g_u8Tesetcnt++;
}
else
{
for(i=0;i<24;i++)
{
g_u8Tesetbuf2[i]=g_u8Tesetbuf[i];
}
g_u8Teseflag=1;
RfState=0;
}
}
else if(dataenflag==2)
{
g_u8DATAflag=WaveNow;//看看出错情况
RfState=0;
g_u8Tesetcnt=0;
}
break;
#endif
default:break;
}
#endif
IE0 = 0; // 清除中断标志
}