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

📄 rf_manchester.c

📁 51单片机读EM卡的程序,EM卡输出是曼彻斯特吗有.很好用的.
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <52.H>
#include <intrins.h>

//#include <REGX51.H>
#define uchar unsigned char
#define uint  unsigned int
sbit 	IRout= P4^0;
bit 	IRbit;
sbit 	EMCLK=P4^1;
sbit 	EMSHD=P4^2;
sbit 	EMMOD=P3^5;
sbit 	BEEP=P1^5; //蜂鸣器
#define	MaxAllLevel 1200//600					//周期最大值650uS
#define	MaxHalfLevel 600//300				//半周期最大值350uS
#define	MinAllLevel 800//400					//周期最小值450uS
#define	MinHalfLevel 200/100				//半周期最小值200uS

#define Start_Check 0x01  				//数据头已经检测到,开始接受剩余数据
#define Start_Find 0x02					//正在检测数据头
#define mcsHead	0x03
#define mcsHeadNull	0x04
#define mcsHighTimer 0x05
#define mcsLowTimer 0x06
#define  WDT 63

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);
void HeadFindHandle(uchar HFHData);
void DataRecvHandle(uchar DRHData);
/*--------------------------------------------------------------------------------
函数:   void InitReg(void)
功能:   初始化MCU
引用值: 无
返回值: 无
--------------------------------------------------------------------------------*/
void InitReg(void)
{
	SCON	=	0x50;//
	TMOD	=	0x21;//T1为常数自动装载8位定时计数器,T0为16位定时计数器
	TH1		=	0xF5;//T1初值,波特率4800
	TL1		=	0xF5;
	PCON	=	0x80;    //SMOD=1波特率加倍成9600bps
	TR1		=	1;//启动T1计数
	TR0		=	0;//停止T0计数	      
	TH0		=	0x00;//T0初值,
	TL0		=	0x00;
	IRout	= 	1;
	ET0		=	1;//T0中断允许
	ES		=	1;//串口开中断
	OS_Status=Start_Find;
	mcsbuf.Head=mcsHeadNull;// mcsHeadNull	0x04
	DataHeadbuf.intHigh=0;
	DataHeadbuf.intLow=0;
	EMSHD=0;
	
//	AUXR = 0x00;
}
//////////串口初始化函数,T0初始化////
/*void init()
{
	TMOD=0x20;			//定时器T1工作方式2
	TL1=0XF5;			//初值
	TH1=0XF5;
	TR1=1;				//启动T1,开始计时
	PCON=0X80;			//SMOD=0,波特率不加倍
	SCON=0X50;			//工作方式1,10位UART, 波特率9600KBPS,允许接收
	EA=1;
	ES=1;
}*/
void init()
{
	SCON	=	0x50;//
	TMOD	=	0x21;//0x21;//T1为常数自动装载8位定时计数器,T0为16位定时计数器
	TH1		=	0xFd;//T1初值,波特率9600
	TL1		=	0xFd;
	PCON	=	0x00;    //SMOD=1波特率加倍成9600bps
	TR1		=	1;//启动T1计数
	TR0		=	0;//停止T0计数	      
	TH0		=	0x00;//T0初值,
	TL0		=	0x00;
	IRout	= 	1;
	ET0		=	1;//T0中断允许
	ES		=	1;//串口开中断
	OS_Status=Start_Find;//0x02, 正在检测数据头
	mcsbuf.Head=mcsHeadNull;// mcsHeadNull	0x04
	DataHeadbuf.intHigh=0;
	DataHeadbuf.intLow=0;
	EMSHD=0;

}

/*--------------------------------------------------------------------------------
函数:
功能:
引用值:
返回值:
--------------------------------------------------------------------------------*/
/*void T0_service(void) interrupt 1   //T0中断服务  
{

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     mcsLowTimer=6
	{
		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;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -