51单片机曼彻斯特码译码源程序.docx
- 文档编号:11939384
- 上传时间:2023-06-03
- 格式:DOCX
- 页数:14
- 大小:17.63KB
51单片机曼彻斯特码译码源程序.docx
《51单片机曼彻斯特码译码源程序.docx》由会员分享,可在线阅读,更多相关《51单片机曼彻斯特码译码源程序.docx(14页珍藏版)》请在冰点文库上搜索。
51单片机曼彻斯特码译码源程序
C51Manchester译码源程序C51曼彻斯特码译码源程序
2009-04-3011:
14
/*
manchester编码方式:
0为101为01,如果与其相反则需要做相应的修改。
适用于125KHz非接触式ID卡,EM4100兼容格式ID卡(64bits,Manchester编码)
MCU:
stc12c54xx
crystal:
11.0592M
使用资源:
外部中断0(INT0)+PCA0
*/
#include
#include
#include
#defineChanne256uS_H0x00//模块60mS定时常数高位
#defineChanne256uS_L0xEC//模块60mS定时常数低位
#defineuint8unsignedchar
sbitRFID_DATA=P3^2; //外部中断口接收数据
/*/函数申明*/
voidstart_Read();
voidData_reveice();
voidLmove_bite();
uint8find_head();
uint8Data_L_check();
uint8Data_R_check();
voidget_data();
uint8Data_Sever();
voidGet_EffectData(uint8edata);
voidInit_PCA0();
voidDAT_Change(uint8dat[]);
voidinit_dev(void);
uint8tcount ;//定时中断计数
uint8count ;//接收数据位数计数
uint8t_count ;//获得数据及校验变量。
uint8temp ;//临时变量
uint8temp_buf[16];//128个Machester位55个数据位缓冲区。
uint8effectdata[5];//5个数据缓冲区。
相当于模块串行读的10Bytes数据。
biterror_bit;//数据出错时为0,初始值为1
bitrev_state;//初始值为0;数据正确接收后为1.//当此位变为1时,说明数据接收正确并且正确处理,可以使用此ID数据。
/*********************************************
函数名:
main()
功能:
主函数
参数:
无
*********************************************/
voidmain(void)
{
uint8i;
error_bit=1;
rev_state=0;
init_dev();//初始化各模块
//添加自己的程序
}
}
voidinit_dev(void)
{
CMOD=0x80;//PCA在空闲模式下停止PCA计数器工作
CCON=0x00;//;CF=0,清0PCA计数器溢出中断请求标志位
CCAP0L=Channe256uS_L;//给PCA模块0的CCAP0L置初值
CCAP0H=Channe256uS_H;
CCAPM0=0X49;
SCON=0x50;//串口工作在方式1,允许接收。
TMOD=0x20;//定时器1工作在方式2forgeneratorbaudrate
TH1=0xFD;//11.0592Mbaudrate//串口用于调试方便,波特率9600
TL1=0xFD;
TR1=1;
IT0=1;
EA=1;// 开总中断
TI=1;
}
/*********************************************
函数名:
BCD_Change
功能:
初始化RFID模块
参数:
无
*********************************************/
voidDAT_Change(uint8*dat)
{
uint8i,count,c;
for(count=0;count<5;count++)
{
for(i=0;i<2;i++)
{
if(i==0)
{
c=dat[count]>>4;
c&=0x0f;
if(c>=0&&c<=9)
temp_buf[2*count+1]='0'+c;
else
temp_buf[2*count+1]='A'+c-10;
}
else
{
c=dat[count];
c&=0x0f;
if(c>=0&&c<=9)
temp_buf[2*count]='0'+c;
else
temp_buf[2*count]='A'+c-10;
}
}
}
}
/*********************************************
函数名:
start_Read()
功能:
初始化RFID模块
参数:
无
*********************************************/
voidstart_Read()
{
count=0;
EX0=1;// 开外部中断0
}
/*********************************************
函数名:
Init_PCA0
功能:
设定定时器1定时128us
参数:
无
*********************************************/
voidInit_PCA0()
{
CL=0x76;//清0PCA计数器
CH=0x00;
EPCA_LVD=1;//开PCA中断和LVD(低压检测)中断共享的总中断控制位
CR=1;//启动PCA计数器(CH,CL)计数
}
/*********************************************
函数名:
EX0_Serve
功能:
外部中断0初始化定时器1定时128us
参数:
无
*********************************************/
voidEX0_Serve()interrupt0 //外部中断0
{
//printf("intoEX0_Serve.\n");
Init_Timer1(); //初始化定时器1
tcount=0;
}
/*********************************************
函数名:
PCA0_Serve
功能:
定时器1中断
参数:
无
*********************************************/
voidPCA_Serve()interrupt6//定时0中断
{
Data_reveice();
tcount++;
if(tcount==5)//定时器中断5次,而外部中断没有发生时。
{
error_bit=0;//返回出错状态
//printf("dataerror.\n");
}
CL=0x00;//清0PCA计数器
CH=0x00;
CCF0=0;//清0PCA模块0中断请求标志位
}
voidData_reveice()
{
//P2=0x00;
if(RFID_DATA==1)
{
temp_buf[count/8]=(temp_buf[count/8]|(0x01<<(count%8)));
}
if(RFID_DATA==0)
{
temp_buf[count/8]=(temp_buf[count/8]&(~(0x01<<(count%8))));
}
count++;
if(count==128) //0x80)
{
count=0;
CR=0;
EX0=0;
if(Data_Sever()) //RFID数据处理成功
{
//printf("dataright.\n");
rev_state=1; //禁止RFID接收数据。
}
else //RFID数据处理失败
{
//printf("dataerror1.\n");
error_bit=0;//返回出错状态
}
}
//P2=0xff;
}
/*********************************************
函数名:
Lmove_bite
功能:
128位左移一位。
参数:
无
*********************************************/
voidLmove_bite()
{
uint8tempData0=0;
for(temp=0;temp<0x10;temp++) //循环16次
{
if(temp==0)
{tempData0=((temp_buf[0]&0x01)<<7);}//保存数组0的1位
if(temp==0x0f)
{temp_buf[temp]=((temp_buf[temp]>>1)|tempData0);}
else
{
temp_buf[temp]=((temp_buf[temp]>>1)|((temp_buf[temp+1]&0x01)<<7));
}
}
}
/*******************************************
函数名:
find_head
功能:
循环移位查找128位数据的9个1:
101010101010101010
参数:
无
*********************************************/
uint8find_head()
{
for(count=0;count<128;count++)
{
if((temp_buf[0]==0xAA)&&(temp_buf[1]==0xAA)&&((temp_buf[2]&0x03)==0x02))
{return1;}
else
{Lmove_bite();}
}
return0;
}
/*******************************************
函数名:
get_data
功能:
将128位除9个10的位转化为55位
参数:
无
********************************************/
//此处也与实际相反。
//因为些程序应用在0为101为01的Machester解码中。
颠倒了大小于符号。
voidget_data()
{
for(count=0,t_count=0;count<=126;)//0x6c;)
{
if((temp_buf[((count+18)/8)]&(0x01<<((count+18)%8)))<
(temp_buf[((count+19)/8)]&(0x01<<((count+19)%8)))) ///1
{temp_buf[t_count/8]=(temp_buf[t_count/8]|(0x01<<(t_count%8)));}
if((temp_buf[((count+18)/8)]&(0x01<<((count+18)%8)))>
(temp_buf[((count+19)/8)]&(0x01<<((count+19)%8)))) //0
{temp_buf[t_count/8]=(temp_buf[t_count/8]&(~(0x01<<(t_count%8))));}
t_count++;
count=count+2;
}
}
/*********************************************
函数名:
Data_L_check
功能:
列校验
返回值:
列校验成功返回1 列校验失败返回0
********************************************/
uint8Data_L_check()
{
for(count=0;count<0x04;count++)
{
temp=0;
t_count=count;
for(;t_count<=53;)//0x37;)
{
if((temp_buf[(t_count/8)]&(0x01<<(t_count%8))))//>>(t_count%8))
{
temp++;
}
t_count=t_count+5;
}
if((temp%2)!
=0)
{
return0;//列校验失败
}
}
return1;
}
/*********************************************
函数名:
Data_R_check
功能:
行校验[7]
参数:
行校验成功返回1 行校验失败返回0
********************************************/
uint8Data_R_check()
{
uint8t_buf[5];
count=0;
for(t_count=0;t_count<=45;)//0x32;)
{
t_buf[0]=((temp_buf[(t_count/8)] &(0x01<<(t_count%8)) )>>(t_count%8) );
t_buf[1]=((temp_buf[((t_count+1)/8)]&(0x01<<((t_count+1)%8)))>>((t_count+1)%8));
t_buf[2]=((temp_buf[((t_count+2)/8)]&(0x01<<((t_count+2)%8)))>>((t_count+2)%8));
t_buf[3]=((temp_buf[((t_count+3)/8)]&(0x01<<((t_count+3)%8)))>>((t_count+3)%8));
t_buf[4]=((temp_buf[((t_count+4)/8)]&(0x01<<((t_count+4)%8)))>>((t_count+4)%8));
if(((t_buf[0]+t_buf[1]+t_buf[2]+t_buf[3]+t_buf[4])%2)==0)
{t_count=t_count+5;}
else
{return0;} //行校验失败
for(temp=0;temp<0x04;temp++)
{
Get_EffectData(t_buf[3-temp]);
count++;
}
}
return1;
}
/*********************************************
函数名:
Get_EffectData
功能:
将一位数据依次放入数组effectdata【5】
参数:
edata要放入数组的数据
*********************************************/
voidGet_EffectData(uint8edata)
{
switch(edata)
{
case1:
//被注释的为位数从高到低全部掉换因
//为读出的数据左移8位后才也实际数据相符
//effectdata[count/8]=(effectdata[count/8]|(0x01<<(7-(count%8))));
effectdata[count/8]=(effectdata[count/8]|(0x01<<(count%8)));
break;
case0:
//被注释的为位数从高到低全部掉换因
//为读出的数据左移8位后才也实际数据相符
//effectdata[count/8]=(effectdata[count/8]&(~(0x01<<(7-(count%8)))));
effectdata[count/8]=(effectdata[count/8]&(~(0x01<<(count%8))));
break;
}
}
/*********************************************
函数名:
Data_Sever
功能:
处理RFID数据
返回值:
0处理是失败1处理成功
*********************************************/
uint8Data_Sever()
{
if(find_head()==0) //寻找128位中9个10的曼切斯特码的头
{return0;}
get_data();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 单片机 曼彻斯特 译码 源程序