📄 rf_manchester.c
字号:
#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 + -