曼彻斯特解码原则+125K EM4100系列RFID卡解码源程序分析Word下载.docx

上传人:b****6 文档编号:19573060 上传时间:2023-01-07 格式:DOCX 页数:25 大小:72.94KB
下载 相关 举报
曼彻斯特解码原则+125K EM4100系列RFID卡解码源程序分析Word下载.docx_第1页
第1页 / 共25页
曼彻斯特解码原则+125K EM4100系列RFID卡解码源程序分析Word下载.docx_第2页
第2页 / 共25页
曼彻斯特解码原则+125K EM4100系列RFID卡解码源程序分析Word下载.docx_第3页
第3页 / 共25页
曼彻斯特解码原则+125K EM4100系列RFID卡解码源程序分析Word下载.docx_第4页
第4页 / 共25页
曼彻斯特解码原则+125K EM4100系列RFID卡解码源程序分析Word下载.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

曼彻斯特解码原则+125K EM4100系列RFID卡解码源程序分析Word下载.docx

《曼彻斯特解码原则+125K EM4100系列RFID卡解码源程序分析Word下载.docx》由会员分享,可在线阅读,更多相关《曼彻斯特解码原则+125K EM4100系列RFID卡解码源程序分析Word下载.docx(25页珍藏版)》请在冰豆网上搜索。

曼彻斯特解码原则+125K EM4100系列RFID卡解码源程序分析Word下载.docx

位中间电平从低到高跳变表示"

2、在一些《计算机网络》书籍中:

位中间电平从高到低跳变表示"

在清华大学出版的《计算机通信与网络教程》《计算机网络(第4版)》也是这么说的,就以此为标准,我们就叫这为标准曼彻斯编码。

至于第一种,我们在这里就叫它曼彻斯特编码。

但是要记住,在不同的情况下懂得变通哦,否则会被老师扣分数的哦。

这两者恰好相反,千万别弄混淆了。

现在我们要讲的就是差分曼彻斯特编码:

在信号位开始时不改变信号极性,表示辑"

在信号位开始时改变信号极性,表示逻辑"

【注意】:

如果在最初信号的时候,即第一个信号时:

如果中间位电平从低到高,则表示0;

如果中间位电平从高到低,则表示1;

后面的(从第二个开始)就看每个信号位开始时有没有跳变来决定:

下面我们来举个例子,来比较标准曼彻斯特编码、曼彻斯特编码、差分曼彻斯特编码:

 

EM4100系列用的是:

曼彻斯特编码!

125K;

EM4100系列RFID卡解码源程序分析

1.

我们知道了曼彻斯特编码原则,那么反过来的过程就是解码了。

2.传统只读射频卡读卡器的设计一般采用U2270B或EM4095读写基站芯片加MCU模式,其成本高、功耗大。

本文介绍一种采用一片74HC4060+LM258/358加少量普通元件构成的读卡器电路和处理的程序设计方案,电路简单、功耗小、成本低。

74HC4060+LM258/358电路为市面上已非常成熟RFID-125KHZ-I卡且广泛采用的低功耗、低成本方案。

该方案在门禁、保安、考勤、展览会、公园、旅店、餐厅等公共场所的门票、优惠卡以及生产过程、邮政包裹、航空铁路运输、产品包装、交通等部门的物流、电子标签、防伪标志、一次性票证等众多领域上占据半壁江山。

3.推挽式放大电路输出後接LC串联谐振电路,当回路固有谐振频率与输入讯号频率相等时,电路发生串联谐振。

本文只要求对125kHz频率的讯号放大,所以根据串联谐振公式

计算电路中元件参数,可得L=737uH,C=2200pF。

4.包络检波电路

感应线圈产生谐振电压约有20V,所以载波讯号的电压也约为20V。

对输入电压高於500mV检波,称为「大讯号检波」,利用二极体单向导电特性及检波负载RC充放电过程实现。

RC参数的确定需要满足两个条件:

1.不产生隋性失真,一般工程上按

计算,f为载波频率。

2.不产生负峰切割失真,即

,m为调幅系数,R1是交流阻值,R0是直流阻值。

联立上述两个条件,确定检波电路中R12、C36分别为470kΩ、4700pF。

5.波形整形电路

在单晶片处理之前,整形电路将检波後的讯号变成单片机可以识别的高低电平。

LM358(LM258)内部整合两个运放,经过两次整形後可以得到很好的方波讯号。

电路中R16、R17、R18、R19起到分压作用,确定输出翻转门限为2.5V;

R15、R21将同向输入的电压叠加在反向输入端;

C54、C55为耦合电容,能够隔离直流分量,传递交流讯号。

当U+大於U-+2.5V时,输出高电平;

当U+小於U-+2.5V时,输出低电平。

6.读卡程序是根据EM4100、EM4001系列射频卡的特点量身定做的一段程序,射频卡以曼彻斯特编码,传输一个资料的时间t=64/125kHz=512μs。

实际使用中,一般传输时间为,230μs<

0.5t<

280μs。

280μs<

定时器取样时间<

512μs。

所以本文中取样波形时,定时器时间设定为400μs,保证为取样留有足够的时间。

原程序分析:

1.定时器时间设定为400μs

#defineTH0_H0xfe//定时器0取样定时值设定为400us

#defineTL0_L0x8f//8f

2.定时器0中断优先级最高:

PT0=1;

3.//曼彻斯特码同步头检测,9个1采用逐个前移检测法

//逐个前移检测法,即每检测到一个数据,如果是"

并向数据库写入1,

//如果是"

就放弃当前检测的数据,并向当前数据流方向移动一位,

//这样一来,就保证了不管数据流是在何种状态下,都能正确无误地抓取9个1,

//同步头9个1的提取成功,曼彻斯特码译码器即和当前的数据流保持了同步,

//并把余下的55位数据全部译完。

4.ucharREM_Buffer[14];

//曼彻斯特码解码后得到最终数据的缓存0~13

/*曼彻斯特码解码后的数据放在REM_Buffer[0~13];

REM_Buffer[0]=0xff数据格式:

11111111同步头,8个1

REM_Buffer[1]=0x8x数据格式:

1xxxxxxx同步头,1个1,x表示无意义

REM_Buffer[2]=数据格式:

D00D01D02D03P0xxx八个版本位或厂商信息的前四位,x表示无意义;

P0为行效验位

REM_Buffer[3]=数据格式:

D10D11D12D13P1xxx八个版本位或厂商信息的后四位,x表示无意义;

P1为行效验位

REM_Buffer[4]=数据格式:

D20D21D22D23P2xxx三十二个数据,x表示无意义;

P2为行效验位

REM_Buffer[5]=数据格式:

D30D31D32D33P3xxx三十二个数据,x表示无意义;

P3为行效验位

REM_Buffer[6]=数据格式:

D40D41D42D43P4xxx三十二个数据,x表示无意义;

P4为行效验位

REM_Buffer[7]=数据格式:

D50D51D52D53P5xxx三十二个数据,x表示无意义;

P5为行效验位

REM_Buffer[8]=数据格式:

D60D61D62D63P6xxx三十二个数据,x表示无意义;

P6为行效验位

REM_Buffer[9]=数据格式:

D70D71D72D73P7xxx三十二个数据,x表示无意义;

P7为行效验位

REM_Buffer[10]=数据格式:

D80D81D82D83P8xxx三十二个数据,x表示无意义;

P8为行效验位

REM_Buffer[11]=数据格式:

D90D91D92D93P9xxx三十二个数据,x表示无意义;

P9为行效验位

REM_Buffer[12]=数据格式:

PC0PC1PC2PC30xxx四个列效验位,x表示无意义;

0为停止位

原程序:

//2008.10.15

//125K;

EM4100系列RFID卡解码

//#include<

reg52.h>

//使用AT89S51/52等系列单片机头文件

#include<

STC12C5410AD.h>

//stc系列单片机专用头文件

intrins.h>

#defineuintunsignedint//定义

#defineucharunsignedchar//定义

#defineulongunsignedlong//定义

sbitREM=P2^1;

//曼彻斯特编码输入端

sbitCLK=P3^3;

//产生125KHZ时钟信号端

sbitLED=P2^5;

//红灯

sbitSPP=P1^0;

//喇叭

bitREM_BIT;

//曼彻斯特码高、低边沿跳变标志位,

bitEfficacy_BIT;

//待效验标志位,

bitP_PC_BIT;

//行,列效验标志位

bitYES_NO_BIT;

//效验正确,或效验错误标志位,

//YES_NO_BIT=1表示效验正确;

//YES_NO_BIT=0表示效验错误。

//350~420us

//375~450us

ucharU_D_Buffer[5];

//User_Data//用户数据缓存,

ulonglong_D;

//方法1,卡号在long_D中,不足10位,则在高位前面加0

ucharchar_D;

//方法2,前两位卡号在char_D中,

uintint_D;

//方法2,卡号后4位卡号在int_D中,

ucharvolue;

//volue为曼彻斯特码译码时的临时运算缓存

ucharREM_Buffer[14];

*/

ucharcodeDispTab[]={'

0'

'

1'

2'

3'

4'

5'

6'

7'

8'

9'

A'

B'

C'

D'

E'

F'

};

ucharcodeData[]={"

Data:

"

//数据

ucharcodeUserData[]={"

UserData:

//用户数据

ucharcodeCard_1[]={"

Methods1DecimalCardNumber:

//方法1:

掐头留尾法提取10位十进制卡号:

ucharcodeCard_2[]={"

Methods2DecimalCardNumber:

////方法2:

前两位+后4位的微根格式,段间以小数点或豆号隔开

ucharcodeDispTab_2[]={'

'

H'

voidinit()//

{

TMOD=0x21;

TH1=0xfd;

//11.0592MHz波特率:

9600

TL1=0xfd;

PCON&

=0x80;

SCON=0x40;

//AUXR=0x40;

//波特率倍增//11.0592MHz115200

TH0=0x00;

//

TL0=0x00;

EA=1;

ET0=1;

TR0=0;

TR1=1;

ES=0;

REN=1;

PT0=1;

//PT0H=1;

//定时器0中断优先级最高:

第三

//PT0H是stc单片机特有的寄存器

REM=1;

CLK=1;

SPP=1;

LED=1;

REM_BIT=1;

}

voiddelay1(uintz)//delay(10);

10次为1ms

{ucharx;

for(;

z>

0;

z--)

{

for(x=0;

x<

160;

x++)

}

/*

voiddelay()//

_nop_();

voidTime_interrupt(void)interrupt1//定时器0中断

//关闭定时器0,为曼彻斯特码提取数据定时器

voidRS232_in(void)interrupt4//串口中断

EA=0;

if(RI==1)//接收

RI=0;

//SBUF_RI_Buffer[0]=SBUF;

//RS2323接收缓冲区

//////////////////

else//if(TI==1)//发送

TI=0;

voidRS232()//通信转输数据,发给PC

uchari;

ulongmm;

//ES=0;

if((REM_Buffer[0]==0xff)&

&

(REM_Buffer[1]==0x80))//同步头9个1的判断,同步头正确,进入数据发送,否则退出

for(i=0;

i<

6;

i++)

SBUF=Data[i];

//"

while(TI==0);

13;

{

SBUF=DispTab[(REM_Buffer[i]/16)];

//SBUF=REM_Buffer[i];

//给PC发送REM_Buffer[0~13]个数据

//TI=1,表示数据发送完毕,

//TI清零,并把余下的数据继续发送,直到13个数据全部发送完。

SBUF=DispTab[(REM_Buffer[i]%16)];

SBUF=DispTab_2[1];

//'

SBUF=DispTab_2[0];

94;

//U_D_Buffer[5];

11;

SBUF=UserData[i];

5;

SBUF=DispTab[(U_D_Buffer[i]/16)];

SBUF=DispTab[(U_D_Buffer[i]%16)];

120;

31;

SBUF=Card_1[i];

//10位十进制卡号Card_1

SBUF=DispTab[long_D/1000000000];

//10

mm=long_D%1000000000;

SBUF=DispTab[mm/100000000];

//9

mm=long_D%100000000;

SBUF=DispTab[mm/10000000];

//8

mm=long_D%10000000;

SBUF=DispTab[mm/1000000];

//7

mm=long_D%1000000;

SBUF=DispTab[mm/100000];

//6

mm=mm%100000;

SBUF=DispTab[mm/10000];

//5

mm=long_D%10000;

SBUF=DispTab[mm/1000];

//4

mm=long_D%1000;

SBUF=DispTab[mm/100];

//3

mm=long_D%100;

SBUF=DispTab[mm/10];

//2

SBUF=DispTab[mm%10];

//1

//////////////////////////////////Card_2

106;

SBUF=Card_2[i];

SBUF=DispTab[char_D/100];

char_D=char_D%100;

SBUF=DispTab[char_D/10];

SBUF=DispTab[char_D%10];

SBUF=DispTab_2[2];

//////////////////////

SBUF=DispTab[int_D/10000];

int_D=int_D%10000;

SBUF=DispTab[int_D/1000];

int_D=int_D%1000;

SBUF=DispTab[int_D/100];

int_D=int_D%100;

SBUF=DispTab[int_D/10];

SBUF=DispTab[int_D%10];

109;

//}

voidREM_init()//射频接口初始化

CLK=0;

//为74HC4060提供+5V电源,74HC4060得电后输出125KHZ信号

voidREM_Processing()//曼彻斯特码数据提取

uchari,ii;

loop:

volue=0;

9;

i++)//曼彻斯特码同步头检测,9个1采用逐个前移检测法

while(REM==1)

if(TR0==0)

gotoloop;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 幼儿教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1