⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rf_manchester.c

📁 单片机曼彻斯特解码程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -