1、曼彻斯特解码原则+125K EM4100 系列RFID 卡解码源程序分析曼彻斯特解码原则1. 曼彻斯特编码曼 彻 斯 特 编 码 ( Manchester Encoding) , 也 叫 做 相 位 编 码 (PE), 是 一 个 同 步 时钟 编 码 技 术 , 被 物 理 层 使 用 来 编 码 一 个 同 步 位 流 的 时 钟 和 数 据 。 曼 彻 斯 特 编 码 被 用 在 以太 网 媒 介 系 统 中 。 曼 彻 斯 特 编 码 提 供 一 个 简 单 的 方 式 给 编 码 简 单 的 二 进 制 序 列 而 没 有 长的 周 期 没 有 转 换 级 别 , 因 而 防 止 时
2、 钟 同 步 的 丢 失 , 或 来 自 低 频 率 位 移 在 贫 乏 补 偿 的 模 拟链 接 位 错 误 。 在 这 个 技 术 下 , 实 际 上 的 二 进 制 数 据 被 传 输 通 过 这 个 电 缆 , 不 是 作 为 一 个序 列 的 逻 辑 1 或 0 来 发 送 的 ( 技 术 上 叫 做 反 向 不 归 零 制 (NRZ)) 。 相 反 地 , 这 些 位 被转 换 为 一 个 稍 微 不 同 的 格 式 , 它 通 过 使 用 直 接 的 二 进 制 编 码 有 很 多 的 优 点 。曼 彻 斯 特 编 码 , 常 用 于 局 域 网 传 输 。 在 曼 彻 斯 特
3、编 码 中 , 每 一 位 的 中 间 有 一 跳 变 ,位 中 间 的 跳 变 既 作 时 钟 信 号 , 又 作 数 据 信 号 ; 从 高 到 低 跳 变 表 示 “1“, 从 低 到 高 跳 变表 示 “0“。 还 有 一 种 是 差 分 曼 彻 斯 特 编 码 , 每 位 中 间 的 跳 变 仅 提 供 时 钟 定 时 , 而 用 每位 开 始 时 有 无 跳 变 表 示 “0“或 “1“, 有 跳 变 为 “0“, 无 跳 变 为 “1“。 对 于 以 上 电 平 跳 变 观 点 有 歧 义 : 关 于 曼 彻 斯 特 编 码 电 平 跳 变 , 在 雷 振 甲 编 写 的 网 络
4、 工 程 师 教 程 中 对 曼 彻 斯 特 编 码 的 解 释 为 : 从 低 电 平 到 高 电 平 的 转 换 表 示 1, 从 高 电 平 到 低 电 平 的 转 换 表 示 0, 模 拟 卷 中 的 答 案 也 是 如 此 , 张 友 生 写 的 考 点 分 析中 也 是 这 样 讲 的 , 而 计 算 机 网 络 ( 第 4 版 ) 中 ( P232 页 ) 则 解 释 为 高 电 平 到 低电 平 的 转 换 为 1, 低 电 平 到 高 电 平 的 转 换 为 0。 清 华 大 学 的 计 算 机 通 信 与 网 络 教 程 计 算 机 网 络 ( 第 4 版 ) 采 用 如
5、下 方 式 : 曼 彻 斯 特 编 码 从 高 到 低 的 跳 变 是 0 从低 到 高 的 跳 变 是 1 。两 种 曼 彻 斯 特 编 码 是 将 时 钟 和 数 据 包 含 在 数 据 流 中 , 在 传 输 代 码 信 息 的 同 时 , 也 将时 钟 同 步 信 号 一 起 传 输 到 对 方 , 每 位 编 码 中 有 一 跳 变 , 不 存 在 直 流 分 量 , 因 此 具 有 自 同步 能 力 和 良 好 的 抗 干 扰 性 能 。 但 每 一 个 码 元 都 被 调 成 两 个 电 平 , 所 以 数 据 传 输 速 率 只 有调 制 速 率 的 1/2。 就 是 说 主
6、要 用 在 数 据 同 步 传 输 的 一 种 编 码 方 式 。【 在 曼 彻 斯 特 编 码 中 , 用 电 压 跳 变 的 相 位 不 同 来 区 分 1 和 0, 即 用 正 的 电 压 跳 变表 示 0, 用 负 的 电 压 跳 变 表 示 1。 因 此 , 这 种 编 码 也 称 为 相 应 编 码 。 由 于 跳 变 都 发 生在 每 一 个 码 元 的 中 间 , 接 收 端 可 以 方 便 地 利 用 它 作 为 位 同 步 时 钟 , 因 此 , 这 种 编 码 也称 为 自 同 步 编 码 。 】2. 曼彻斯特编码(Manchester Encoding),也叫做相位编码
7、(PE);常用于局域网传输。在曼彻斯特编码中,每一位的中间有一跳变,位中间的跳变既作时钟信号,又作数据信号。但在不同的书籍中,曼彻斯特编码中,电平跳动表示的值不同,这里产生很多歧义:1、在网络工程师考试以及与其相关的资料中:位中间电平从高到低跳变表示“0“;位中间电平从低到高跳变表示“1“。2、在一些计算机网络书籍中:位中间 电平从高到低跳变表示“1“;位中间电平从低到高跳变表示“0“。在清华大学出版的计算机通信与网络教程计算机网络(第 4 版)也是这么说的,就以此为标准,我们就叫这为标准曼彻斯编码。至于第一种,我们在这里就叫它曼彻斯特编码。 但是要记住,在不同的情况下懂得变通哦,否则会被老师
8、扣分数的哦 。这两者恰好相反,千万别弄混淆了。现在我们要讲的 就是差分曼彻斯特编码:在信号位开始时不改变信号极性,表示辑“1“ 在信号位开始时改变信号极性,表示逻辑“0“ ;【注意】:如果在最初信号的时候,即第一个信号时:如果中间位电平从低到高,则表示 0;如果中间位电平从高到低,则表示 1;后面的(从第二个开始)就看每个信号位开始时有没有跳变来决定:下面我们来举个例子,来比较标准曼彻斯特编码、曼彻斯特编码、差分曼彻斯特编码:EM4100 系列用的是:曼彻斯特编码!125K;EM4100 系列 RFID 卡解码源程序分析1.我们知道了曼彻斯特编码原则,那么反过来的过程就是解码了。EM4100
9、系列用的是:曼彻斯特编码!2. 传统只读射频卡读卡器的设计一般采用 U2270B 或 EM4095 读写基站芯片加 MCU 模式,其成本高、功耗大。本文介绍一种采用一片 74HC4060+LM258/358 加少量普通元件构成的读卡器电路和处理的程序设计方案,电路简单、功耗小、成本低。 74HC4060+LM258/358 电路为市面上已非常成熟 RFID-125KHZ-I 卡且广泛采用的低功耗、低成本方案。该方案在门禁、保安、考勤、展览会、公园、旅店、餐厅等公共场所的门票、优惠卡以及生产过程、邮政包裹、航空铁路运输、产品包装、交通等部门的物流、电子标签、防伪标 志、一次性票证等众多领域上占据
10、半壁江山。3. 推挽式放大电路输出後接 LC 串联谐振电路,当回路固有谐振频率与输入讯号频率相等时,电路发生串联谐振。本文只要求对125kHz 频率的讯号放大,所以根据串联谐振公式 计算电路中元件参数,可得 L=737uH,C=2200pF。4. 包络检波电路感应线圈产生谐振电压约有 20V,所以载波讯号的电压也约为 20V。对输入电压高於 500mV 检波,称为大讯号检波 ,利用二极体单向导电特性及检波负载 RC 充放电过程实现。RC 参数的确定需要满足两个条件:1.不产生隋性失真,一般工程上按计算,f 为载波频率。2.不产生负峰切割失真,即 ,m 为调幅系数,R1 是交流阻值,R0 是直流
11、阻值。联立上述两个条件,确定检波电路中 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 系列
12、射频卡的特点量身定做的一段程序,射频卡以曼彻斯特编码,传输一个资料的时间t=64/125kHz=512s。实际使用中,一般传输时间为,230s/使用 AT89S51/52 等系列单片机头文件#include /stc 系列单片机专用头文件#include #define uint unsigned int/定义 #define uchar unsigned char/定义 #define ulong unsigned long/定义 sbit REM=P21;/ 曼彻斯特编码输入端sbit CLK=P33;/产生 125KHZ 时钟信号端sbit LED=P25;/ 红灯sbit SPP=P1
13、0;/ 喇叭bit REM_BIT;/ 曼彻斯特码高、低边沿跳变标志位,bit Efficacy_BIT; /待效验标志位,bit P_PC_BIT; /行,列效验标志位bit YES_NO_BIT; /效验正确,或效验错误标志位,/YES_NO_BIT=1 表示效验正确;/YES_NO_BIT=0 表示效验错误。#defineTH0_H 0xfe/ 定时器 0 取样定时值设定为 400us#defineTL0_L 0x8f/8f/350420us/375450usuchar U_D_Buffer5;/User_Data/用户数据缓存,ulong long_D;/方法 1,卡号在 long_D
14、 中,不足 10 位,则在高位前面加 0uchar char_D;/方法 2,前两位卡号在 char_D 中,uint int_D;/方法 2,卡号后 4 位卡号在 int_D 中,uchar volue;/volue 为曼彻斯特码译码时的临时运算缓存uchar REM_Buffer14;/曼彻斯特码解码后得到最终数据的缓存 013/*曼彻斯特码解码后的数据放在 REM_Buffer013;REM_Buffer0=0xff 数据格式:1111 1111 同步头,8 个 1REM_Buffer1=0x8x 数据格式:1xxx xxxx 同步头,1 个 1,x 表示无意义REM_Buffer2=
15、数据格式:D00D01D02D03 P0xxx 八个版本位或厂商信息的前四位,x 表示无意义;P0 为行效验位REM_Buffer3= 数据格式:D10D11D12D13 P1xxx 八个版本位或厂商信息的后四位,x 表示无意义;P1 为行效验位REM_Buffer4= 数据格式:D20D21D22D23 P2xxx 三十二个数据,x 表示无意义;P2 为行效验位REM_Buffer5= 数据格式:D30D31D32D33 P3xxx 三十二个数据,x 表示无意义;P3 为行效验位REM_Buffer6= 数据格式:D40D41D42D43 P4xxx 三十二个数据,x 表示无意义;P4 为行
16、效验位REM_Buffer7= 数据格式:D50D51D52D53 P5xxx 三十二个数据,x 表示无意义;P5 为行效验位REM_Buffer8= 数据格式:D60D61D62D63 P6xxx 三十二个数据,x 表示无意义;P6 为行效验位REM_Buffer9= 数据格式:D70D71D72D73 P7xxx 三十二个数据,x 表示无意义;P7 为行效验位REM_Buffer10= 数据格式:D80D81D82D83 P8xxx 三十二个数据,x 表示无意义;P8 为行效验位REM_Buffer11= 数据格式:D90D91D92D93 P9xxx 三十二个数据,x 表示无意义;P9
17、为行效验位REM_Buffer12= 数据格式:PC0PC1PC2PC3 0xxx 四个列效验位,x 表示无意义;0 为停止位*/uchar code DispTab=0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F;uchar code Data=“Data: “;/数据uchar code UserData=“User Data: “;/用户数据uchar code Card_1=“Methods 1 Decimal Card Number: “;/方法 1:掐头留尾法提取 10 位十进制卡号:uchar code Card_2=“Methods 2 Decimal Card
18、 Number: “;/方法2:前两位后 4 位的微根格式,段间以小数点或豆号隔开uchar code DispTab_2= ,H,;void init()/TMOD=0x21;TH1=0xfd;/11.0592MHz 波特率: 9600TL1=0xfd;PCONSCON=0x40;/AUXR=0x40;/波特率倍增 /11.0592MHz 115200TH0=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=
19、1;LED=1;REM_BIT=1;void delay1(uint z)/ delay(10); 10 次为 1ms uchar x;for(;z0;z-)for(x=0;x160;x+)/*void delay()/ _nop_();_nop_();_nop_();*/void Time_interrupt(void) interrupt 1 /定时器 0 中断TR0=0; /关闭定时器 0,为曼彻斯特码提取数据定时器void RS232_in(void) interrupt 4/串口中断EA=0;if(RI=1)/接收RI=0;/SBUF_RI_Buffer0=SBUF;/RS2323
20、接收缓冲区/else /if(TI=1)/发送TI=0;EA=1;void RS232()/通信转输数据,发给 PCuchar i;ulong mm;/ES=0;if(REM_Buffer0=0xff)i6;i+)SBUF=Datai;/“ “while(TI=0);TI=0;for(i=0;i13;i+)SBUF=DispTab(REM_Bufferi/16);/SBUF=REM_Bufferi;/给 PC 发送 REM_Buffer013个数据while(TI=0);/TI=1,表示数据发送完毕,TI=0;/TI 清零,并把余下的数据继续发送,直到 13 个数据全部发送完。SBUF=Dis
21、pTab(REM_Bufferi%16);while(TI=0);TI=0;SBUF=DispTab_21;/Hwhile(TI=0);TI=0;SBUF=DispTab_20;/ while(TI=0);TI=0;for(i=0;i94;i+)SBUF=DispTab_20;/“ “while(TI=0);TI=0;/U_D_Buffer5;/User_Data/用户数据缓存,for(i=0;i11;i+)SBUF=UserDatai;/“ “while(TI=0);TI=0;for(i=0;i5;i+)SBUF=DispTab(U_D_Bufferi/16);while(TI=0);TI=
22、0;SBUF=DispTab(U_D_Bufferi%16);while(TI=0);TI=0;SBUF=DispTab_21;/Hwhile(TI=0);TI=0;SBUF=DispTab_20;/ while(TI=0);TI=0;for(i=0;i120;i+)SBUF=DispTab_20;/“ “while(TI=0);TI=0;for(i=0;i31;i+)SBUF=Card_1i;/“ “while(TI=0);TI=0;/10 位十进制卡号 Card_1SBUF=DispTablong_D/1000000000;/10while(TI=0);TI=0;mm=long_D%100
23、0000000;SBUF=DispTabmm/100000000;/9while(TI=0);TI=0;mm=long_D%100000000;SBUF=DispTabmm/10000000;/8while(TI=0);TI=0;mm=long_D%10000000;SBUF=DispTabmm/1000000;/7while(TI=0);TI=0;mm=long_D%1000000;SBUF=DispTabmm/100000;/6while(TI=0);TI=0;mm=mm%100000;SBUF=DispTabmm/10000;/5while(TI=0);TI=0;mm=long_D%10
24、000;SBUF=DispTabmm/1000;/4while(TI=0);TI=0;mm=long_D%1000;SBUF=DispTabmm/100;/3while(TI=0);TI=0;mm=long_D%100;SBUF=DispTabmm/10;/2while(TI=0);TI=0;SBUF=DispTabmm%10;/1while(TI=0);TI=0;/Card_2for(i=0;i106;i+)SBUF=DispTab_20;/“ “while(TI=0);TI=0;for(i=0;i31;i+)SBUF=Card_2i;/“ “while(TI=0);TI=0;SBUF=Di
25、spTabchar_D/100;/while(TI=0);TI=0;char_D=char_D%100;SBUF=DispTabchar_D/10;/while(TI=0);TI=0;SBUF=DispTabchar_D%10;/while(TI=0);TI=0;SBUF=DispTab_22;/while(TI=0);TI=0;SBUF=DispTabint_D/10000;/while(TI=0);TI=0;int_D=int_D%10000;SBUF=DispTabint_D/1000;/while(TI=0);TI=0;int_D=int_D%1000;SBUF=DispTabint_
26、D/100;/while(TI=0);TI=0;int_D=int_D%100;SBUF=DispTabint_D/10;/while(TI=0);TI=0;SBUF=DispTabint_D%10;/while(TI=0);TI=0;for(i=0;i109;i+)SBUF=DispTab_20;/“ “while(TI=0);TI=0;/ES=0;void REM_init()/射频接口初始化CLK=0;/为 74HC4060 提供+5V 电源,74HC4060 得电后输出125KHZ 信号void REM_Processing()/曼彻斯特码数据提取uchar i,ii;loop:TR0
27、=0;volue=0;for(i=0;i9;i+)/曼彻斯特码同步头检测,9 个 1 采用逐个前移检测法/逐个前移检测法,即每检测到一个数据 ,如果是“1“, 并向数据库写入 1,/如果是“0“,就放弃当前检测的数据,并向当前数据流方向移动一位 ,/这样一来,就保证了不管数据流是在何种状态下,都能正确无误地抓取 9 个 1,/同步头 9 个 1 的提取成功 ,曼彻斯特码译码器即和当前的数据流保持了同步,/并把余下的 55 位数据全部译完。while(REM=1)if(TR0=0)goto loop;/break;TR0=0;TH0=TH0_H;/开启 400us 定时器,TL0=TL0_L;T
28、R0=1;while(TR0=1);TH0=TH0_H;/开启 400us 定时器,同步头逐个前移检测TL0=TL0_L;TR0=1;if(REM=0)goto loop;if(i8)volue=1;volue|=0x01;if(i=7)REM_Buffer0=volue;REM_Buffer1=0x80;TR0=0;REM_BIT=0;volue=0x00;TH0=TH0_H;/400usTL0=TL0_L; /下降TR0=1;for(i=2;i13;i+)/曼彻斯特码解码for(ii=0;ii5;ii+)/曼彻斯特码解码while(TR0=1);if(REM=1)if(REM_BIT=0)
29、while(REM=1);/曼彻斯特码跳变为高电平_nop_();_nop_();_nop_();_nop_();/抗抖动while(REM=1);/_nop_();_nop_();_nop_();_nop_();/抗抖动while(REM=1);/volue=1;/用左移指令把 “1“移入 voluevolue|=0x08;/跳变的瞬间提取数据,TH0=TH0_H;/开启 400us 定时器,为下次提取数据提供参考TL0=TL0_L;TR0=1;REM_BIT=0;/曼彻斯特码标志位置 “0“else /if(REM_BIT=1)while(REM=1);/曼彻斯特码跳变为高电平_nop_(
30、);_nop_();_nop_();_nop_();/抗抖动while(REM=1);_nop_();_nop_();_nop_();_nop_();/抗抖动while(REM=1);volue=1;/用左移指令把 “1“移入 voluevolue|=0x08;/跳变的瞬间提取数据,TH0=TH0_H;/开启 400us 定时器,为下次提取数据提供参考TL0=TL0_L;TR0=1;REM_BIT=0;/曼彻斯特码标志位置 “0“else /if(REM=0)if(REM_BIT=0)while(REM=0);/曼彻斯特码跳变为下降沿_nop_();_nop_();_nop_();_nop_(
31、);/抗抖动while(REM=0);_nop_();_nop_();_nop_();_nop_();/抗抖动while(REM=0);volue=1;/用左移指令把 “0“移入 volueTH0=TH0_H;/开启 400us 定时器,为下次提取数据提供参考TL0=TL0_L;TR0=1;REM_BIT=1;/曼彻斯特码标志位置 “1“else /if(REM_BIT=1)while(REM=0);/曼彻斯特码跳变为下降沿_nop_();_nop_();_nop_();_nop_();/抗抖动while(REM=0);_nop_();_nop_();_nop_();_nop_();/抗抖动w
32、hile(REM=0);volue=1;/用左移指令把 “0“移入 volueTH0=TH0_H;/开启 400us 定时器,为下次提取数据提供参考TL0=TL0_L;TR0=1;REM_BIT=1;/曼彻斯特码标志位置 “1“REM_Bufferi=volue;volue=0x00;void Efficacy()/数据效验uchar i,ii,cache,cache_1,counter;/counter=0;for(i=2;i12;i+)/行效验counter=0;cache=REM_Bufferi;cache_1=REM_Bufferi;for(ii=0;ii4;ii+)cacheif(cache=0x80)counter+;