📄 rf_manchester.c
字号:
#include <REGX51.H>
#include <intrins.h>
//#include <REGX51.H>
#define uchar unsigned char
#define uint unsigned int
#define IRout P2_1
#define MaxAllLevel 600 //周期最大值650uS
#define MaxHalfLevel 300 //半周期最大值350uS
#define MinAllLevel 400 //周期最小值450uS
#define MinHalfLevel 100 //半周期最小值200uS
#define Start_Check 0x01 //数据头已经检测到,开始接受剩余数据
#define Start_Find 0x02 //正在检测数据头
#define mcsHead 0x03
#define mcsHeadNull 0x04
#define mcsHighTimer 0x05
#define mcsLowTimer 0x06
uchar code Adj[16]={0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0};
/*
uchar code uData[]={0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
*/
uint High_Timer,Low_Timer;
uchar temp1,temp2;
//uchar bdata mcsbuf=0;
uchar bdata buffer=0;
sbit IRbitPri=buffer^0;
sbit IRbitNext=buffer^1;
uchar i=0;
uchar OS_Status;
uchar RecvBuf[7]; //接收数据缓冲
typedef struct{
uchar Head; //数据检测头(一个周期的高电平)
uchar Pro; //前一次读取的电平长度
}Mchste_MSG;
Mchste_MSG mcsbuf;
typedef struct{ //接收数据头标志判别(9个1)
uchar intHigh; //+接收数据个数(1 or 0)
uchar intLow;
}DataHead_MSG;
DataHead_MSG DataHeadbuf;
uchar bdata pBuf; //接收数据后组合缓冲(将8位数组合成字节数据)
sbit pBuf0=pBuf^0;
sbit pBuf1=pBuf^1;
sbit pBuf2=pBuf^2;
sbit pBuf3=pBuf^3;
sbit pBuf4=pBuf^4;
sbit pBuf5=pBuf^5;
sbit pBuf6=pBuf^6;
sbit pBuf7=pBuf^7;
void InitReg(void);
uchar Calibration(void);
void Send_Data(uchar SDData);
uchar Manchster(uchar index);
void Push_Data(uchar PDData);
uchar Calibration(void);
void HeadFindHandle(uchar HFHData);
void DataRecvHandle(uchar DRHData);
void InitReg(void)
{
SCON = 0x40;
TMOD = 0x21;
TH1 = 0xFD;
TL1 = 0xFD;
PCON = 0x00; //9600bps
TR1 = 1;
TR0 = 0;
TH0 = 0x00;
TL0 = 0x00;
IRout = 1;
ET0 = 1;
ES = 1;
OS_Status=Start_Find;
mcsbuf.Head=mcsHeadNull;
DataHeadbuf.intHigh=0;
DataHeadbuf.intLow=0;
// AUXR = 0x00;
}
/*--------------------------------------------------------------------------------
函数:
功能:
引用值:
返回值:
--------------------------------------------------------------------------------*/
void FeedDog(void)
{
_nop_();
_nop_();
// WDTRST = 0x1E;
_nop_();
_nop_();
// WDTRST = 0xE1;
}
/*--------------------------------------------------------------------------------
函数:
功能:
引用值:
返回值:
--------------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------------
函数:
功能:
引用值:
返回值:
--------------------------------------------------------------------------------*/
void T0_service(void) interrupt 1
{
/*
IRbit = IRout;
i++;
if(i==8)
{
TI=0;
SBUF=buffer;
i=0;
}
buffer=buffer<<1;
*/
}
void Send_Data(uchar SDData)
{
SBUF=SDData;
while(TI==0);
TI=0;
}
/*--------------------------------------------------------------------------------
函数: Manchster(uchar index)
功能: Manchster数据处理
引用值:index: mcsLowTimer:低电平数据处理;mcsHighTimer:高电平数据处理
返回值:0:数据0;1:数据1;2:数据还未分析完毕,需下次才能判断;3:错误
--------------------------------------------------------------------------------*/
uchar Manchster(uchar index)
{
if(index==mcsLowTimer) //处理Low_Timer
{
if((Low_Timer>MinAllLevel)&&(Low_Timer<MaxAllLevel))
{
if(mcsbuf.Head==mcsHead)
{
if((mcsbuf.Pro==0x21) || (mcsbuf.Pro==0x11))
{
mcsbuf.Pro=0x20; //0x20:2个0;0x10:1个0
return(0);
}
else
{
mcsbuf.Head=mcsHeadNull;
return(3); //在没有确定起始检测位时所有数据不予理会
}
}
else
{
mcsbuf.Head=mcsHeadNull;
return(3); //在没有确定起始检测位时所有数据不予理会
}
}
else if((Low_Timer>MinHalfLevel)&&(Low_Timer<MaxHalfLevel))
{
if(mcsbuf.Head==mcsHead)
{
if(mcsbuf.Pro!=0xff) //只要前一位数据没有处理完,则结合本次数据进行处理并返回同时置数据处理完毕标志
{
mcsbuf.Pro=0xff;
return(0);
}
else
{
mcsbuf.Pro=0x10;
return(2); //如果前一位数据已经处理完毕,则从新开始纪录数据便于下次处理
}
}
else
{
mcsbuf.Head=mcsHeadNull;
return(3); //在没有确定起始检测位时所有数据不予理会
}
}
else if((Low_Timer<MinHalfLevel)||(Low_Timer>MaxAllLevel))
{
mcsbuf.Head=mcsHeadNull;
return(3); //在没有确定起始检测位时所有数据不予理会
}
}
else if(index==mcsHighTimer) //处理High_Timer
{
if((High_Timer>MinAllLevel)&&(High_Timer<MaxAllLevel))
{
if(mcsbuf.Head==mcsHeadNull)
{
mcsbuf.Head=mcsHead; //确定数据检测起始位置
mcsbuf.Pro=0x21; //0x21:2个1;0x11:1个1
}
else
{
if((mcsbuf.Pro==0x20) || (mcsbuf.Pro==0x10))
{
mcsbuf.Pro=0x21; //0x21:2个1;0x11:1个1
return(1);
}
else
{
mcsbuf.Head=mcsHeadNull;
return(3); //在没有确定起始检测位时所有数据不予理会
}
}
}
else if((High_Timer>MinHalfLevel)&&(High_Timer<MaxHalfLevel))
{
if(mcsbuf.Head==mcsHead)
{
if(mcsbuf.Pro!=0xff) //只要前一位数据没有处理完,则结合本次数据进行处理并返回同时置数据处理完毕标志
{
mcsbuf.Pro=0xff;
return(1);
}
else
{
mcsbuf.Pro=0x11;
return(2); //如果前一位数据已经处理完毕,则从新开始纪录数据便于下次处理
}
}
else
{
mcsbuf.Head=mcsHeadNull;
return(3); //在没有确定起始检测位时所有数据不予理会
}
}
else if((High_Timer<MinHalfLevel)||(High_Timer>MaxAllLevel))
{
mcsbuf.Head=mcsHeadNull;
return(3); //在没有确定起始检测位时所有数据不予理会
}
}
}
/*--------------------------------------------------------------------------------
函数: Push_Data(uchar PDData)
功能: 检测的数据保存
引用值:uchar PDData:1 or 0
返回值:无
--------------------------------------------------------------------------------*/
void Push_Data(uchar PDData)
{
i=DataHeadbuf.intHigh+DataHeadbuf.intLow;
if(i<=55)
{
i=(i-1)%8;
if(PDData==0x01)
{
switch(i)
{
case 0:pBuf0=1; break;
case 1:pBuf1=1; break;
case 2:pBuf2=1; break;
case 3:pBuf3=1; break;
case 4:pBuf4=1; break;
case 5:pBuf5=1; break;
case 6:pBuf6=1; break;
case 7:pBuf7=1; break;
}
}
else if(PDData==0x00)
{
switch(i)
{
case 0:pBuf0=0; break;
case 1:pBuf1=0; break;
case 2:pBuf2=0; break;
case 3:pBuf3=0; break;
case 4:pBuf4=0; break;
case 5:pBuf5=0; break;
case 6:pBuf6=0; break;
case 7:pBuf7=0; break;
}
}
i=DataHeadbuf.intHigh+DataHeadbuf.intLow-1;
i=i/8;
RecvBuf[i]=pBuf;
}
i=DataHeadbuf.intHigh+DataHeadbuf.intLow;
if(i==55) //数据读取完毕,发送
{
for(i=0;i<7;i++)
{
Send_Data(RecvBuf[i]);
}
i=Calibration();
if(i)
for(i=0;i<7;i++)
{
Send_Data(RecvBuf[i]);
RecvBuf[i]=0x55;
}
i=P2;
P2=~i;
OS_Status=Start_Find; //发送完毕,置位从新检测
DataHeadbuf.intHigh=0;
DataHeadbuf.intLow=0;
mcsbuf.Head=mcsHeadNull;
}
}
/*--------------------------------------------------------------------------------
函数:
功能:
引用值:
返回值:
--------------------------------------------------------------------------------*/
uchar Calibration(void)
{
temp1=RecvBuf[0] & 0x1F;
temp2=(temp1 & 0x10)>>4;
temp1=temp1& 0x0F;
if(temp2!=Adj[temp1])
return(0); //校验失败1
RecvBuf[0]=(RecvBuf[0] & 0xF0) | temp1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -