一种简便的ID卡曼彻斯特解码方法
曼彻斯特编码
曼彻斯特编码两种编码方法,即曼彻斯特(Manchester)编码和差分曼彻斯特编码。
未经编码的二进制基带数字信号就是高电平和低电平不断交替的信号。
至于用低电平代表1或0都是可以的。
使用这种最简单的基带信号的最大问题就是当出现一长串的连1或0时,在接收端无法收到的比特流中提取位同步信号。
曼彻斯特编码则可以解决这一问题。
它的编码方法是将每一个码元再分成两个相等的间隔。
码元1是在前一个间隔为高电平而后一个间隔为低电平。
码元0则正好相反,从低电平变到高电平。
这种编码的好处就是可以保证在每一个码元的正中间时间可以出现一次电平的转换,这对接收端的提取位同步信号是非常有利的。
但是从曼彻斯特编码的波形图不难看出其缺点,这就是它所占的频带宽度比原始的基带信号增加了一倍。
曼彻斯特编码的变种叫做差分曼彻斯特编码,它的编码规则是:若码元为1,则其前半个码元的电平与上一个码元的后半个码元的电平一样,但若码元为0,则其前半个码元的电平与上一个码元的后半个码元相反。
不论码元是0或1,在每个码元的正中间的时刻,一定要有一次电平的转换。
差分曼彻斯特编码需要较复杂的技术,但可以获得较好的抗干扰性能。
看右图:每两条虚线间表示一个代码,电压从高到低代表0,从低到高代表1 而差分曼彻斯特编码,为1时则与前一个编码方向相反,为0时则相同曼彻斯特编码是采用双相位技术来实现的,通常用于局部网络传输,在曼彻斯特编码中,每位数据位的中心都有一个跳变,既作为时钟信号,又作为数据信号,可以起到位同步信号的作用。
曼彻斯特编码中以该跳变的方向来判断这位数据是1还是0,其编码规则是:每个比特的中间有跳变;二进制0表示从低电平到高电平的跳变;二进制1表示从高电平到低电平的跳变曼彻斯特:(高-低:1;低-高:0);差分曼彻斯特:(有变化是"1";没变化是“0”)练习:。
一种RFID的曼彻斯特解码技术
射 频 识 别 ( do F e u n y I e t iain R D)应 Ra i rq e c d ni ct , FI f o 用 是 目前 发 展 最 为 迅 速 、 力 最 大 的新 兴 技 术 之 一 , 利 潜 其
M a c e t rCod c dig Te h ol g orRFI n h se e De o n c n o y f D
Ka g W e g a g,W a i i g n nun ng Hu y n ( h h iUnt e o r Te h oo y Co Z u a i h P we c n l g .,Lt .,Z u a 1 0 0, i a e d h h i 9 7 Ch n ) 5
编码 机 制 , 出射 频 芯 片输 出 6 得 4位 曼彻 斯特 码 的特 点 , 给 出 了软件 实 现 算 法 。利 用 中断 捕 获 脉 宽 的 方 法进 行 解 码 , 并 不
但 硬 件 接 口 简单 , 而且 解码 速 度 快 , 确 率 高 , 准 同时 也 为 曼彻 斯 特 解 码 算 法提 供 了一种 新 的 思路 。 关 键 词 :RF D; I 曼彻 斯 特 码 ; 解码 中 图分 类 号 :T 3 l P 1 文 献 标 识 码 :A
际 应 用 中不 需 要 进 入 休 眠状 态 时 , 以把 EM4 9 可 0 5芯 片 的
下 拉 到低 电平 , 而 节省 微 控 制器 的一 个 io引脚 。 从 /
1 R I 卡 系统 的构成 FD读
曼彻斯特解码原则+KEM系列RFID卡解码源程序分析
曼彻斯特解码原则+K-EM系列RFID卡解码源程序分析————————————————————————————————作者:————————————————————————————————日期:曼彻斯特解码原则+125K EM4100系列RFID卡解码源程序分析曼彻斯特解码原则1.曼彻斯特编码曼彻斯特编码(Manchester Encoding),也叫做相位编码(PE),是一个同步时钟编码技术,被物理层使用来编码一个同步位流的时钟和数据。
曼彻斯特编码被用在以太网媒介系统中。
曼彻斯特编码提供一个简单的方式给编码简单的二进制序列而没有长的周期没有转换级别,因而防止时钟同步的丢失,或来自低频率位移在贫乏补偿的模拟链接位错误。
在这个技术下,实际上的二进制数据被传输通过这个电缆,不是作为一个序列的逻辑1或0来发送的(技术上叫做反向不归零制(NRZ))。
相反地,这些位被转换为一个稍微不同的格式,它通过使用直接的二进制编码有很多的优点。
曼彻斯特编码,常用于局域网传输。
在曼彻斯特编码中,每一位的中间有一跳变,位中间的跳变既作时钟信号,又作数据信号;从高到低跳变表示"1",从低到高跳变表示" 0"。
还有一种是差分曼彻斯特编码,每位中间的跳变仅提供时钟定时,而用每位开始时有无跳变表示"0"或"1",有跳变为"0",无跳变为"1"。
对于以上电平跳变观点有歧义:关于曼彻斯特编码电平跳变,在雷振甲编写的<<网络工程师教程>>中对曼彻斯特编码的解释为:从低电平到高电平的转换表示1,从高电平到低电平的转换表示0,模拟卷中的答案也是如此,张友生写的考点分析中也是这样讲的,而《计算机网络(第4版)》中(P232页)则解释为高电平到低电平的转换为1,低电平到高电平的转换为0。
清华大学的《计算机通信与网络教程》《计算机网络(第4版)》采用如下方式:曼彻斯特编码从高到低的跳变是0从低到高的跳变是1。
曼彻斯特解码方法
曼彻斯特解码方法曼彻斯特解码方法是一种用于将二进制数据转换为可读文本的方法,它起源于1950年代的曼彻斯特大学。
这种解码方法被广泛应用于计算机科学和通信领域,特别是在网络通信中。
曼彻斯特解码方法的基本原理是将每个二进制位转换为一个时间间隔,通过这种方式来表示数据。
具体而言,如果一个二进制位为0,则对应的时间间隔为高电平持续一段时间,而如果一个二进制位为1,则对应的时间间隔为低电平持续一段时间。
通过解码这些时间间隔,我们可以恢复出原始的二进制数据。
曼彻斯特解码方法的优点之一是它具有很好的抗干扰性能。
由于每个二进制位都被表示为一个时间间隔,即使在信号传输过程中产生了一些噪声,我们仍然可以通过判断时间间隔的长短来正确解码数据。
这在无线通信和有线通信中都非常有用,因为信号的传输过程中常常会受到各种干扰。
另一个优点是曼彻斯特解码方法可以很容易地实现同步。
由于每个二进制位都被表示为一个时间间隔,接收方可以通过检测时间间隔的变化来确定数据的起始点,并与发送方进行同步。
这对于数据的正确接收非常重要,尤其是在高速数据传输中。
曼彻斯特解码方法虽然具有很多优点,但也存在一些限制。
首先,由于每个二进制位都需要表示为一个时间间隔,这导致了数据传输速率的下降。
相比于其他编码方法,曼彻斯特解码方法的传输速率较低。
其次,由于每个二进制位都需要表示为一个时间间隔,这意味着数据的传输距离受到限制。
在远距离传输中,由于信号衰减和传输延迟等问题,曼彻斯特解码方法可能会导致数据错误。
尽管存在一些限制,曼彻斯特解码方法仍然被广泛应用于许多领域。
在计算机网络中,以太网中的物理层就使用了曼彻斯特解码方法。
在无线通信中,蓝牙和红外线通信等也采用了曼彻斯特解码方法。
此外,在一些特殊的应用中,如音频和视频传输,曼彻斯特解码方法也得到了广泛应用。
曼彻斯特解码方法是一种将二进制数据转换为可读文本的方法,它具有抗干扰性能强、易于实现同步等优点。
尽管存在一些限制,但曼彻斯特解码方法仍然是计算机科学和通信领域中重要的编码方法之一。
曼砌斯特解码
/**********************************************曼彻斯特编码调制的非接触ID卡通用读卡程序编制ID卡每位的脉宽为512us,每半位的脉宽256usCPU为Atmel公司的A T89S52芯片,晶振11.0592MHz读卡采用边沿检测方式,只要跳变边沿脉宽在要求的脉宽范围内就是合法脉宽每位脉宽要求490us-530us,半位要求为230us-280us,可根据调试更改定时器时间2010年3月11日东北大学通信与智能控制工作室/******************头文件********************/#include <REG52.h>#include <absacc.h>#include <intrins.h>/******************宏定义*********************/#define uchar unsigned char#define uint unsigned int#define ulint unsigned long int//#define SYSCLK 11059200 //使用外部晶振11.0592MHz//#define BAUD_RATE 2400 //这里没有采用//#define TCLK SYSCLK/12 ////#define TIME_COUNT (-(TCLK/BAUD_RA TE)) //+0x20 ////#define T1_1B_H TIME_COUNT >> 8 ////#define T1_1B_L TIME_COUNTsbit RF_DATA_IN =P3^2; //读卡卡号输入端,这里为外部0终端,最好改为普通的I/O sbit RF_LED_ON =P1^4; //原理机电平提取端,这里接在了原理机74HC14的第二次取反后sbit RUN_LED =P2^4; //测试用sbit RUN_LED1 =P2^3; //测试用sbit RUN_LED2 =P2^5; //测试用sbit RUN_LED3 =P2^6; //测试灿?sbit DIDA =P2^2; //蜂鸣器接口,高电平时蜂鸣,低电平时停止蜂鸣/****************全局变量**********************/uchar Read_RF_Data[11]; //从卡号输入端读取的暂存数据uchar Card_ID[10]; //卡号暂存数组uchar data ID_Data[6]; //暂存经效验后的正确数据uint data TIMER_1=0; //判断定时时用uchar RX0_DAT=0; //硬件串口接收到的字节数据uchar SUART0_RXD[10]; //硬件串口接收ID号数组uchar SUART0_NUM=0; //硬件串口计数变量bit Check_Data_bit; //效验请求标志位bit Check_Data_Ok =0; //校验正确标志位/****************函数列表***********************/void Recive_RF_Data(void);void Check_Data(void);void watchdog_init(void);void Clern_Number(void);void dogFeed(void);void delay0_2ms(uint count);void UART_TXD(uchar Data[],uchar Num); //这里两个发送函数是一样的,由于出现了语法错误,这里定义为了两个void UART0_TXD(uchar Data[],uchar Num);/**********************************************初始化程序**********************************************/void Data_start(void){TMOD=0x21; //T0方式1,T1工作于方式2TH1=0x00; //初始化T1计时器TL1=0x00;TR1=0;SCON=0x50; //串行口初始化// PCON=0x80; //SMOD位设置TH0=0x00; //初始化T0计时器TL0=0x04; //这里从0x0004开始,参考程序中是这个数值,改为从其他数开始也可以TR0=0;ES=1; //开放串行口中断EA=1; //开放总中断}/**********************************************I/O初始化程序,这里根据需要可修改**********************************************/void PORT_Init (void){P0=0xFF; //P1=0xFF; //P2=0xF0; // 蜂鸣器引脚采用的是P2.2,电路图中是P2.3,P2.2为高时蜂鸣器蜂鸣,为低时停止蜂鸣,这点注意初始化时要为0P3=0xCF; //}/**********************************************初始化程序,和data_start有点重复**********************************************/void UART0_Init (void){ES = 0; //禁止串口0中断SCON = 0x50; //串口工作方式1:8位(先低位)数据和//一位停止位,可变波特率.REN=1允许接收//清发送和接收中断标志RI、TIES = 1; //开UART0中断PCON = 0x00; //1/32PS = 1; //UART0中断优先级为高ES = 1; //串行中断允许}/****************************************************************************** *delay:延时子程序*延时时间待测******************************************************************************* /void delay(void){int t;for(t=0;t<200;t++);dogFeed(); //喂狗}/****************************************************************************** *delay_1s :延时子程序******************************************************************************* /void delay_long(int time){int t;for(t=0;t<time;t++){delay();dogFeed(); //喂狗}}/****************************************************************************** Timer2_Init:T2定时器初始化设置T2CON中的TCLK或RCLK选择定时器T2工作为波特率发生器方式,T2为串口UART0的波特率发生器:2400波特率, 该方式下T2计时脉冲为晶振频率的1/2(而不是1/12)晶振频率波特率=---------------- 2400BPD: FF 7032x[65536-(RCAP2H, RCAP2L)] 9600BPD: FF DC这里波特率改为了9600;******************************************************************************* /void Timer2_Init(void){TR2=0; //停T2定时器T2CON &= ~0x02; //T2为定时方式T2CON |= 0x30; //RX和TX都使用T2时钟RCAP2H = 0xFF; //9600波特率对应16位自动重加载寄存器赋值0xFFDCRCAP2L = 0xDC; //TH2 = RCAP2H; //TL2 = RCAP2L; //TR2 = 1; //启动T2}/****************************************************************************** **********看门狗初始化初始化时需要在reg52.h文件中声明看门狗寄存器地址语法为:sfr WDTRST = 0xA6;******************************************************************************* **********/void watchdog_init(void){WDTRST=0x1E;WDTRST=0xE1;}/***********************************看门狗子程序*****************************************功能:8ms不喂狗复位AT89S52内置看门过为13位定时器,最大计数8191个机器周期最大计时为8191*(12/11059200)=8.8878ms8ms不喂狗单片机复位******************************************************************************* **********/void dogfeed(void){WDTRST=0x1E;WDTRST=0xE1;//喂狗指令}/*********************************************//*接收RF数据*//*********************************************/void Recive_RF_Data(void){/////////////////////定义局部变量uchar header,pc;uchar temp;uchar temp1 =0x00;uint temp2;uchar ByteCounter; //字节计数器uchar *PData;uchar BitCounter; //位计数器////////////////////初始化变量值header=0;pc=4;PData=Read_RF_Data;temp=0;temp1=0;ByteCounter=0;BitCounter=5;/////////////////////检测一个稳定的低电平str://WATCHDOG=~WA TCHDOG;dogFeed();if(RF_DATA_IN==0)if(RF_DATA_IN==0)if(RF_DATA_IN==0)if(RF_DATA_IN==0)if(RF_DATA_IN==0){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();////////////////////检测一个起始位电平while(RF_DA TA_IN==0) dogFeed(); //当电平由低向高跳变时启动计时器TR0=1; //此处喂狗挺关键的,当无卡时为低电平,无卡时在此等待不能喂狗_nop_(); //_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();// dogFeed();////////////////////检测9个"header"while(RF_DA TA_IN==1); //检测字头第一个高点平,为1时计时,这里的字头为末尾和开始的组合TR0=0;TF0=0;TIMER_1=TH0;TIMER_1=(TIMER_1<<8)+TL0;TH0=0x00;TL0=0x04;//temp2=0x01EC; //这里改为530us,计算方法为(0x01EC-0x0004)*12/11059200=0x01E8*12/11059200=488*1.0850694=530ustemp2=0x01FC; //这里改为547us,可根据调试调整参数if(TIMER_1>temp2){goto str;} //这里只要第一个字头在490us-547us之间就行//temp2=0xf9;temp2=0x01C7; //这里对应的时间为490usif(TIMER_1<temp2) // <490us{goto str;}RUN_LED3 =!RUN_LED3; //检测到第一个字头LED闪烁一次do //接下来检测8位其余字头1{TIMER_1=0;//WATCHDOG=~WA TCHDOG;dogFeed();while(RF_DA TA_IN==0) dogFeed(); //为低电平时等待,为高电平时跳出,计时开始TR0=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();while(RF_DA TA_IN==1); //为1时计时开始// RUN_LED2 =!RUN_LED2;TR0=0;TF0=0;TIMER_1=TH0;TIMER_1=(TIMER_1<<8)+TL0;TH0=0x00;TL0=0x04;temp2=0x00FE; // 对应的时间为271us//temp2=0x012B; // >320usif(TIMER_1>temp2) //这里为曼码,半位时间为256us{ //这里只要检测半位脉宽在220us-271us之间就行,可根据调试调整计时参数header=0;goto str;}temp2=0x00CF;if(TIMER_1<temp2) // <220us{header=0;goto str;}header++;// RUN_LED2 =!RUN_LED2;}while(header<8); //8位高电平字头检测完毕退出RUN_LED2 =!RUN_LED2; //相应指示灯闪烁一次TR0=0;TF0=0;///////////////////如果9个"header"都对,开始接收卡内数据//TH0=0xff; //time:300us//TL0=0x6a;TH0=0xFE; //time:320us 这里采用计数溢出计时的TL0=0xD8; //计数方法为:(0xFFFF-0xFED8)*12/11059200=320us,采样到中间位置TR0=1;if(header==8){do{do{while(TF0==0); //等待320us,进入数据位的前半位TF0=0;if(RF_DATA_IN==1) temp=1;else temp=0;RUN_LED1 =!RUN_LED1;while(RF_DA TA_IN==temp) //检测电平是否跳变{ //等待跳变,当跳出跳变时又从新开始计时,计时大小为300usif(TF0==1) //如果300us计时到还未跳变,视为非法电平!!!{TR0=0;TF0=0;goto str;}}TH0=0xFE; //time:300us,从新赋值,开始计时TL0=0xEB;// TL0=0xD8; //time:320us// temp=~RF_DATA_IN;temp1=(temp1<<1)|temp; //采用循环的方式赋给临时变量BitCounter--;dogFeed();}while(BitCounter>0); //一个字节完否*(PData+ByteCounter)=temp1; //将一字节数据存入缓存数组temp1=0;BitCounter=5;ByteCounter++;//WATCHDOG=~WA TCHDOG;dogFeed();}while(ByteCounter<10);do{//WATCHDOG=~WA TCHDOG;dogFeed();while(TF0==0); //等待一个位周期TF0=0;if(RF_DATA_IN==1) temp=1;else temp=0;// RUN_LED1 =!RUN_LED1;while(RF_DA TA_IN==temp) //检测电平跳变否?{if(TF0==1) //如果300us计时到还未跳变,视为非法电平!!!{TR0=0;TF0=0;goto str;}}//TH0=0xff; //time:300us//TL0=0x6a;TH0=0xFE; //time:300usTL0=0xEB;//1TL0=0xD8; //time:320ustemp=~RF_DATA_IN;temp1=(temp1<<1)|temp;pc--;}while(pc); //一个字节完否Read_RF_Data[10]=temp1; //将一字节数据存入缓存数组///////////////////检测最后一个停止位while(TF0==0);TR0=0;TF0=0;if(RF_DATA_IN==1) temp=1;else temp=0;while(RF_DA TA_IN==temp) //检测电平跳变否?{if(TF0==1) //如果300us计时到还未跳变,视为非法电平!!!{TR0=0;TF0=0;goto str;}}temp=~RF_DATA_IN;dogFeed();if(temp==0) //如果停止位正确{Check_Data_bit=1; //置效验请求标志//RUN_LED2 =!RUN_LED2;}else //如果停止位不正确{Clern_Number(); //清除}}}}/*********************************************效验数据**这里只进行了行校验,没有进行列校验*参考的部分程序也只进行了行校验*********************************************/void Check_Data(void){/////////////////////定义局部变量uchar temp;uchar temp1;uchar ByteCounter; //数组计数器uchar ByteCounter1;uchar *PData;uchar *PData1;////////////////////初如化变量值PData=Read_RF_Data;PData1=ID_Data; //ID_Data暂存经效验后的正确数据temp=0;temp1=0;ByteCounter=0;ByteCounter1=0;Check_Data_Ok =0;/////////////////////循环效验//WATCHDOG=~WA TCHDOG;dogFeed();/////////////////////行校验for(ByteCounter1=0;ByteCounter1<5;ByteCounter1++)//有5个字节数据{temp=(((*(PData+ByteCounter))&0x10)>>4)+(((*(PData+ByteCounter))&0x08)>>3)+(((*(PData+ByteCounter))&0x04)>>2)+(((*(PData+ByteCounter))&0x02)>>1);if((temp&0x01)==((*(PData+ByteCounter))&0x01))//效验低4位{temp1=(*(PData+ByteCounter)&0xfe)<<3;ByteCounter++;temp=(((*(PData+ByteCounter))&0x10)>>4)+(((*(PData+ByteCounter))&0x08)>>3)+(((*(P Data+ByteCounter))&0x04)>>2)+(((*(PData+ByteCounter))&0x02)>>1);if((temp&0x01)==((*(PData+ByteCounter))&0x01))//效验高4位{*(PData1+ByteCounter1)=temp1|((*(PData+ByteCounter)&0xfe)>>1);//高低位生成一个字节存入数组ByteCounter++;}else{ByteCounter1=5;//只要有一组不对则退出效验Clern_Number();//并清所有数据}}else{ByteCounter1=5;//只要有一组不对则退出效验Clern_Number();//并清所有数据}// WATCHDOG=~W ATCHDOG;dogFeed();}/////////////////////列校验//......因没有必要所以先省略此处.........///////////////////////生成校验和,并发送出去if(ByteCounter==10){Check_Data_Ok =1;delay0_2ms(1000);}}//************************************************************/*清暂存器*///************************************************************void Clern_Number(void){uchar i;// WATCHDOG=~W ATCHDOG;dogFeed();for(i=0;i<10;i++){Read_RF_Data[i] =0;Card_ID[i] =0;SUART0_RXD[i] =0;}for(i=0;i<5;i++)ID_Data[i]=0; //卡号数据也进行清除}/****************************************************************************** *UART_TXD:向PC发送卡号数据这里定义了两个,和下面的一样,更改语法数据后可合为一个******************************************************************************** /void UART_TXD(uchar Data[],uchar Num){uchar i=0;uchar *PData;PData=Data;EX0=0;ES=0;for(i=0;i<Num;i++)//有Num组号码要发送{SBUF=*(PData+i);// SBUF =addr;while(TI==0);TI=0;//等待数据发送出去delay();//等待后再发dogFeed();}}/****************************************************************************** *UART0_TXD: 向PC发送卡号数据,这里为PC向读卡器发过命令后的向PC发送可以和上面的进行合并******************************************************************************* /void UART0_TXD(uchar Data[],uchar Num){uchar i=0;uchar *PData;PData=Data;EX0=0;ES=0;for(i=0;i<Num;i++)//有Num组号码要发送{SBUF=*(PData+i);// SBUF =addr;while(TI==0);TI=0;//等待数据发送出去delay();//等待后再发送dogFeed();}}/***************************************************** 延时时间还有待测量*****************************************************/ void delay0_2ms(uint count){uint k;while(count--!=0){for(k=0;k<50;k++){//WATCHDOG=~W ATCHDOG;dogFeed();}}}/***************************************************** 蜂鸣器蜂鸣函数可以单独写成子程序,这里没有运用*****************************************************/ /*void dida(uchar j){uchar i;for(i=0;i<j;i++){DD=0;delay_long(20);delay1ms(30);DD=~DD;delay1ms(30);}}*///*****************************************************/*将ID_Data中的5字节数据转换成Card_ID中的10字节数据*///*****************************************************void trans(void){Card_ID[0] = (ID_Data[0] >> 4) & 0x0F;Card_ID[1] = ID_Data[0] & 0x0F;Card_ID[2] = (ID_Data[1] >> 4) & 0x0F;Card_ID[3] = ID_Data[1] & 0x0F;Card_ID[4] = (ID_Data[2] >> 4) & 0x0F;Card_ID[5] = ID_Data[2] & 0x0F;Card_ID[6] = (ID_Data[3] >> 4) & 0x0F;Card_ID[7] = ID_Data[3] & 0x0F;Card_ID[8] = (ID_Data[4] >> 4) & 0x0F;Card_ID[9] = ID_Data[4] & 0x0F;dogFeed();}//*****************************************************/*码型转换方法1*///*****************************************************void hex_to_assic_1(void){ulint Card_Num;uchar i;trans();dogFeed();Card_Num = (ulint)(Card_ID[9]) + (ulint)(16)*(ulint)(Card_ID[8]) + (ulint)(256)*(ulint)(Card_ID[7]) + (ulint)(4096)*(ulint)(Card_ID[6]) + (ulint)(65536)*(ulint)(Card_ID[5]) + (ulint)(1048576)*(ulint)(Card_ID[4]);for(i = 9;i > 1;i--){Card_ID[i] =(Card_Num%10)+48; //48为ASCII码的值,0为48,1为49,依次类推。
曼彻斯特码
曼彻斯特码Manchester code (又称裂相码、双向码),一种用电平跳变来表示1或0的编码,其变化规则很简单,即每个码元均用两个不同相位的电平信号表示,也就是一个周期的方波,但0码和1码的相位正好相反。
其对应关系为:0--》011--》10信码0 1 0 0 1 0 1 1 0双向码01 10 01 01 10 01 10 10 01曼彻斯特编码是一种自同步的编码方式,即时钟同步信号就隐藏在数据波形中。
在曼彻斯特编码中,每一位的中间有一跳变,位中间的跳变既作时钟信号,又作数据信号;从高到低跳变表示"1",从低到高跳变表示"0"。
还有一种是差分曼彻斯特编码,每位中间的跳变仅提供时钟定时,而用每位开始时有无跳变表示"0"或"1",有跳变为" 0",无跳变为"1"。
两种曼彻斯特编码是将时钟和数据包含在数据流中,在传输代码信息的同时,也将时钟同步信号一起传输到对方,每位编码中有一跳变,不存在直流分量,因此具有自同步能力和良好的抗干扰性能。
但每一个码元都被调成两个电平,所以数据传输速率只有调制速率的1/2。
曼彻斯特编码曼彻斯特编码(Manchester Encoding),也叫做相位编码(PE),是一个同步时钟编码技术,被物理层使用来编码一个同步位流的时钟和数据。
曼彻斯特编码被用在以太网媒介系统中。
曼彻斯特编码提供一个简单的方式给编码简单的二进制序列而没有长的周期没有转换级别,因而防止时钟同步的丢失,或来自低频率位移在贫乏补偿的模拟链接位错误。
在这个技术下,实际上的二进制数据被传输通过这个电缆,不是作为一个序列的逻辑1或0来发送的(技术上叫做反向不归零制(NRZ))。
相反地,这些位被转换为一个稍微不同的格式,它通过使用直接的二进制编码有很多的优点。
曼彻斯特编码,常用于局域网传输。
曼彻斯特解码原则 125K EM4100系列RFID卡解码源程序分析资料
曼彻斯特解码原则+125K EM4100系列RFID卡解码源程序分析曼彻斯特解码原则1.曼彻斯特编码曼彻斯特编码(Manchester Encoding),也叫做相位编码(PE),是一个同步时钟编码技术,被物理层使用来编码一个同步位流的时钟和数据。
曼彻斯特编码被用在以太网媒介系统中。
曼彻斯特编码提供一个简单的方式给编码简单的二进制序列而没有长的周期没有转换级别,因而防止时钟同步的丢失,或来自低频率位移在贫乏补偿的模拟链接位错误。
在这个技术下,实际上的二进制数据被传输通过这个电缆,不是作为一个序列的逻辑1或0来发送的(技术上叫做反向不归零制(NRZ))。
相反地,这些位被转换为一个稍微不同的格式,它通过使用直接的二进制编码有很多的优点。
曼彻斯特编码,常用于局域网传输。
在曼彻斯特编码中,每一位的中间有一跳变,位中间的跳变既作时钟信号,又作数据信号;从高到低跳变表示"1",从低到高跳变表示"0"。
还有一种是差分曼彻斯特编码,每位中间的跳变仅提供时钟定时,而用每位开始时有无跳变表示"0"或"1",有跳变为"0",无跳变为"1"。
对于以上电平跳变观点有歧义:关于曼彻斯特编码电平跳变,在雷振甲编写的<<网络工程师教程>>中对曼彻斯特编码的解释为:从低电平到高电平的转换表示1,从高电平到低电平的转换表示0,模拟卷中的答案也是如此,张友生写的考点分析中也是这样讲的,而《计算机网络(第4版)》中(P232页)则解释为高电平到低电平的转换为1,低电平到高电平的转换为0。
清华大学的《计算机通信与网络教程》《计算机网络(第4版)》采用如下方式:曼彻斯特编码从高到低的跳变是0 从低到高的跳变是1。
两种曼彻斯特编码是将时钟和数据包含在数据流中,在传输代码信息的同时,也将时钟同步信号一起传输到对方,每位编码中有一跳变,不存在直流分量,因此具有自同步能力和良好的抗干扰性能。
通信原理实验15 曼彻斯特码编解码实验
实验十五曼彻斯特码编解码实验实验内容1. 熟悉曼彻斯特码编码实验2.熟悉曼彻斯特码译码实验一、实验目的1.掌握曼彻斯特码的编解码规则的过程2.掌握曼彻斯特码的编解码原理3. 学习通过CPLD编程实现曼彻斯特码编译码实验二、实验电路工作原理在实际的基带传输系统中,并不是所有码字都能在信道中传输。
例如,含有直流和低频成分的基带信号就不适宜在信道中传输,因为它有可能造成信号严重畸变。
同时,一般基带传输系统都从接收到的基带信号流中提取收定时信号,而收定时信号却又依赖于传输的码型,如果码型出现长时间的连“0”或连“1”符号,则基带信号可能会长时间的出现0电位。
从而使收定时恢复系统难以保证收定时信号的准确性。
实际的基带传输系统还可能提出其它要求,因而对基带信号也存在各种可能的要求。
归纳起来,对传输用的基带信号的主要要求有两点:①对各种代码的要求,期望将原始信息的符号编制成适合于传输用的码型,②对所传码型的电波波形要求,期望电波波形适宜于在信道中传输。
前一问题称为传输码型选择,后一问题称为基带脉冲的选择。
这是两个既有独立性又有联系的问题,也是基带传输原理中十分重要的两个问题。
传输码(又称线路码)的结构将取决于实际信道特性和系统工作的条件。
在较为复杂的基带传输系统中,传输码的结构应具有下列主要特性:①能从其相应的基带信号中获取定时信息;②相应的基带信号无直流成分和只有很小的低频成分;③不受信息源统计特性的影响,即能适应于信息源的变化;④尽可能地提高传输码型的传输效率;⑤具有内在的检错能力,等等。
曼彻斯特码(Manchester code)又称裂相码、双向码,是一种用电平跳变来表示1或0的编码,它是计算机网络中常用的两种编码方法(曼彻斯特编码和差分曼彻斯特编码)。
未经编码的二进制基带数字信号就是高电平和低电平不断交替的信号。
至于用低电平代表1或0都是可以的。
使用这种最简单的基带信号的最大问题就是当出现一长串的连1或0时,在接收端无法收到的比特流中提取位同步信号。
射频卡应用中的曼彻斯特码解码技术
66 万凹 方凹数凹据ci。s棚a口④④圆④圃
通信技术
Communl catl on S;善j瀑鞋eI.1nol091 es
根据以上的分析,解码过程如下: 首先,搜索含9个“l”的同步头。由图5可知,同步头 之前是上一帧数据的停止位,加上随后出现的9个1,就会形 成连续8个宽度为T的下降沿间隔,这时,我们可以认为已 经搜到同步头中的8个l,而第9个“l”只出现了一个“H” 电平,要等待与后续电平结合。
可咀椅删到连续8个亩度为T的下降沿间隔
由于信号发送
方EM4100与接收
方EM4095采用耦
合方式传输信息,
所以,实际在天线
上的调制信号如图3
所示,这样,在
图3发送方和接收方的幅度调制信号
EM4100的载波上用
高电流代表逻辑0,而在EM4095载波上用低电流代表逻辑0。
2 曼彻斯特码解码
根据曼彻斯特码(以下简称M码)的特点:在每一个数据 位的“中间”发生由低到高的跳变代表“l”、发生由高到低 的跳变代表“O”。又由图3可知,由于信号耦合的原因,实 际上由EM4095芯片送给单片机的64位M码的数据是反过 来的,即:用数据位中间发生高到低的跳变代表“1”、发生 由低到高的跳变代表“0”。另外,在本系统中,64位数据中 的每一位在天线上的持续时间,即位宽时间是载波周期的64 倍,当载波频率为125KHz时,每一位的持续时间是(1/125K)
பைடு நூலகம்
器…。大多数射频卡将卡内的身份辨识号码(ID号码)编码为曼 彻斯特码,然后由单片机进行解码。
曼彻斯特编码与解码实验
计算机通信网实验一 曼彻斯特编码与解码实验一、实验目的1.掌握曼彻斯特编解码原理;2.了解如何利用曼彻斯特的时钟特征实现收/发时钟同步及其实现方法。
二、预习要求1.复习曼彻斯特编解码原理; 2.复习软件Maxpluss Ⅱ的使用方法。
三、实验原理1.编码原理在曼彻斯特编码方式中,每一位的中间有一个跳变,位中间的跳变为时钟,也作为数据。
从高电平到低电平的跳变表示数据“1”(称为“1”跳变)。
从低电平到高电平的跳变表示数据“0”(称为“0”跳变)。
因此发送时钟必须在发送数据位的中间进行采样,即发送时钟TxC 的频率应为数据TxD 频率的两倍。
2.解码原理解码可通过解码器来实现,解码器从曼彻斯特码中分离出接收数据RxD 与接收时钟RxC 。
具体方法是:解码器从曼码中分别提出“1”跳变和“0”跳变信号,但需区分位中跳变与位间跳变,前者是表示数据的跳变,后者是当数据中有连续“1”信号或连续“0”信号时产生的不反应数据特征的无效跳变。
解码器提取位中跳变后,可将其转换为二进制1212(1)D触发器在编码中的作用。
(2)D触发器的时钟信号为何用2TxC?2.解码电路(1)图中如何提取Mc中的“1”跳变和“0”跳变信号的,试解释4个非门和YH1的作用。
(2)八位移位寄存器的作用是取得延迟信号,用于封住YF门以便除去无效的位间跳Q)的输出,是否可选择用其它输出?为变。
延迟时间应如何选取?为何选用第七位(7什么?(3)移位寄存器的时钟为什么要用8TxC(TxC的8倍频信号),如选用16TxC或4TxC 将会如何?八、实验报告要求1.绘制编解码电路图(给定或自行设计均可);2.描绘8TxC、TxC、Mc、A、B、B’、C、D、Q G1、Q G2、RxD、RxC各点信号波形图;3.回答思考题。
射频卡应用中的曼彻斯特码解码技术
器…。大多数射频卡将卡内的身份辨识号码(ID号码)编码为曼 彻斯特码,然后由单片机进行解码。
然而,目前的很多单片机解码程序采用定时查询或考察 信号的边沿状态的方式解码,这些解码方法对天线上的载波 频率要求比较高,对定时的准确度要求也比较高,当载波稍 微偏离规定的范围内时将不能正确读卡。本文介绍了一种新 的解码技术,载波频率的偏移对解码没有任何影响,而且不 用检测信号的边沿状态,从而更加可靠、快速地读卡。
调制到此载波信号上面,通过信号的耦合,EM4095的天线
上也产生带有64位ID号码的调制信号,然后通过EM4095
的解调系统,滤除载波卜”,将64位数据传送给单片机,由
单片机再解码出其中的ID号码。
射频卡内的EM4100芯片内部有预先存储的不可改写的
64位数据,当其通过天线向外输出时,格式如图2所示f2J。
5结语
经过实际的应用,采用这种解码方法可以在读曼彻斯特 码的同时进行同步解码,速度比较快,而且由于对载波频率 的变化不敏感,故读卡成功率非常高。
曼码
上一帻
图5 曼彻斯特码解码分析图 在同步头形成的连续8个T间隔之后,随后的下降沿间 隔可能是T、1.5T或2T。当这个间隔为T时,电平为“LH”, 其中“L”电平要与同步头中第9个l的“H”电平结合,解 出第9个1,同时余下另一个“H”电平等待与后续电平结合; 同理,如果宽为1.5T时,只能解为“LLH”,这样也可以找 到同步头的第9个l,同时可以解出随后的第一位数据“0”。 当间隔为2T时,电平为“LLHH”,除第一个“L”与前面剩 余的“H”结合外,还可以解出一位数据“0”,同时,余下 一个“H”电平等待与后续电平结合。 依照这样的规则,继续对检测到的每一个下降沿间隔进 行解码。在解码过程中,当遇到T时,上次解码必然剩余一
曼彻斯特解码原则+125K EM4100系列RFID卡解码源程序分析
曼彻斯特解码原则+125K EM4100系列RFID卡解码源程序分析曼彻斯特解码原则1.曼彻斯特编码曼彻斯特编码(Manchester Encoding),也叫做相位编码(PE),是一个同步时钟编码技术,被物理层使用来编码一个同步位流的时钟和数据。
曼彻斯特编码被用在以太网媒介系统中。
曼彻斯特编码提供一个简单的方式给编码简单的二进制序列而没有长的周期没有转换级别,因而防止时钟同步的丢失,或来自低频率位移在贫乏补偿的模拟链接位错误。
在这个技术下,实际上的二进制数据被传输通过这个电缆,不是作为一个序列的逻辑1或0来发送的(技术上叫做反向不归零制(NRZ))。
相反地,这些位被转换为一个稍微不同的格式,它通过使用直接的二进制编码有很多的优点。
曼彻斯特编码,常用于局域网传输。
在曼彻斯特编码中,每一位的中间有一跳变,位中间的跳变既作时钟信号,又作数据信号;从高到低跳变表示"1",从低到高跳变表示"0"。
还有一种是差分曼彻斯特编码,每位中间的跳变仅提供时钟定时,而用每位开始时有无跳变表示"0"或"1",有跳变为"0",无跳变为"1"。
对于以上电平跳变观点有歧义:关于曼彻斯特编码电平跳变,在雷振甲编写的<<网络工程师教程>>中对曼彻斯特编码的解释为:从低电平到高电平的转换表示1,从高电平到低电平的转换表示0,模拟卷中的答案也是如此,张友生写的考点分析中也是这样讲的,而《计算机网络(第4版)》中(P232页)则解释为高电平到低电平的转换为1,低电平到高电平的转换为0。
清华大学的《计算机通信与网络教程》《计算机网络(第4版)》采用如下方式:曼彻斯特编码从高到低的跳变是0 从低到高的跳变是1。
两种曼彻斯特编码是将时钟和数据包含在数据流中,在传输代码信息的同时,也将时钟同步信号一起传输到对方,每位编码中有一跳变,不存在直流分量,因此具有自同步能力和良好的抗干扰性能。
曼彻斯特解码程序
曼彻斯特解码1、变量定义 (2)2、Manchest初始化 (2)3、Manchest解码信号翻转 (3)4、过滤错误的卡号 (4)5、获取正确的卡号 (5)6、Manchest获取卡号数据 (6)7、通过中断采样获取刷卡数据 (9)1、变量定义#define TH1_370US_H 0XFE //晶振11.0592MHZ,12T模式#define TL1_370US_L 0XAB#define SIGNAL_FLIP_TIME 10 //每隔100ms翻转一次读卡信号#define REPEAT_TIME 5 //500ms后重复读卡#define CLEAR_CARD_TIME 20 //2S后清除卡号数据#define MANCHEST_TIME 5sbit PULSE = P3^2;sbit RFEN = P3^5; //曼彻斯特解码脉冲信号sbit MANCHEST0= P3^2; //wiegand0sbit MANCHEST1= P3^3; //wiegand1uchar code CheckingTab[32]={ //接收到10组卡号的偶校验0X00,0X01,0X01,0X00,0X01,0X00,0X00,0X01, //这里数值是低五位的偶校验值0X01,0X00,0X00,0X01,0X00,0X01,0X01,0X00,0X01,0X00,0X00,0X01,0X00,0X01,0X01,0X00,0X00,0X01,0X01,0X00,0X01,0X00,0X00,0X01};uchar WGCardBuf[5]; //卡号uchar CopyCardBuf[5]; //备份卡号uchar ManchestBuf[11]; //暂存接收到的11组数据uchar idata g_ucManchestTime = MANCHEST_TIME; //uchar idata g_ucDWithCardTime= 0; //隔500ms处理该卡号uchar idata g_ucPreambleFlag = 0;uchar idata g_ucERAgainTimer = 0; //每隔100ms翻转一次RFENuchar idata g_ucStoreGroupCnt= 0; //接收到几组数据,这里为11组才可能正确uchar idata g_ucEGroupBitCnt = 0; //每组数据有5个为,5=4位卡号+1位偶校验uchar idata g_ucPreambleCount= 0; //9位为1的引导码uchar idata g_ucRemvoeCardTime=0; //隔多久清除以前的卡号数据,这里为3s2、Manchest初始化/******************************************************************** 函数原型:ManchestInit功能:曼彻斯特解码变量初始化输入:无输出:无说明:无*-------------------------------------------------------------------- *修改时间| 修改者| 备注*-------------------------------------------------------------------- *2012-02-14 Oscar First********************************************************************/ void ManchestInit(void) //初始化读卡参数{RFEN = 1;g_ucPreambleFlag = 0;g_ucStoreGroupCnt = 0;g_ucEGroupBitCnt = 5;g_ucPreambleCount = 9;g_ucERAgainTimer = SIGNAL_FLIP_TIME;}3、Manchest解码信号翻转/******************************************************************** 函数原型:ProcessManchestSignal功能:manchest解码的翻转信号输入:无输出:无说明:无*-------------------------------------------------------------------- *修改时间| 修改者| 备注*-------------------------------------------------------------------- *2012-02-14 Oscar First********************************************************************/ void ProcessManchestSignal(void){if((g_ucDWithCardTime!=0)&&(--g_ucDWithCardTime==0)){}if((g_ucRemvoeCardTime!=0)&&(--g_ucRemvoeCardTime==0)){CopyCardBuf[0] = 0; //清除卡号缓冲区CopyCardBuf[1] = 0;CopyCardBuf[2] = 0;CopyCardBuf[3] = 0;CopyCardBuf[4] = 0;}RFEN = ~RFEN;g_ucPreambleFlag = 0;g_ucPreambleCount= 9;if(RFEN){EX0 = 1;EX1 = 1;}else{EX0 = 0;EX1 = 0;}}4、过滤错误的卡号/******************************************************************** 函数原型:CalibrationCardData功能:一张卡号,如果出现全部相同的数字或者该卡号只有两种数据,则认为是错误的卡号。
一种简便的ID卡曼彻斯特解码方法
一种简便的ID卡曼彻斯特解码方法我这里介绍的是常用的125KHz的ID卡。
ID卡内固化了64位数据,由5个区组成:9个引导位、10个行偶校验位“PO~P9′’、4个列偶校验位“PC0~PC3”、40个数据位“D00~D93”和1个停止位S0。
9个引导位是出厂时就已掩膜在芯片内的,其值为“111111111”,当它输出数据时,首先输出9个引导位,然后是10组由4个数据位和1个行偶校验位组成的数据串,其次是4个列偶校验位,最后是停止位“0”。
“D00~D13”是一个8位的晶体版本号或ID识别码。
“D20~D93”是8组32位的芯片信息,即卡号。
注意校验位都是偶校验,网上有些资料写的是奇校验,很明显是错的,如果是奇校验的话,在一个字节是FF 的情况下,很容易就出现9个1,这样引导位就不是唯一的了,也就无法判断64位数据的起始位了。
数据结构如下图:我读的一个ID卡数据是111111111 10001 00101 00000 00011 00000 01010 00000 11011 00110 01100 01100,对应的ID卡号是01050d36。
ID卡数据采用曼彻斯特编码,1对应着电平下跳,0对应着电平上跳。
每一位数据的时间宽度都是一样的(1T)。
由于电路参数的差别,时间宽度要实际测量。
解码芯片采用U2270B,单片机采用89S52。
U2270B的输出脚把解码得到的曼彻斯特码输出到89S52的INT脚。
在89S52的外部中断程序中完成解码。
在没有ID卡在读卡器射频范围内时,U2270B的输出脚会有杂波输出,ID卡进入读卡器射频范围内后,会循环发送64位数据,直到ID卡离开读卡器的有效工作区域。
根据ID卡的数据结构,64位数据的最后一位停止位是0。
最开始的9位引导位是1,可以把0111111111做为引导码。
也就是说在ID卡进入读卡器工作范围后,丢掉ID卡发送的第一个64位码,检测最后1位0,然后检测ID卡发送的第2个64位码的9个引导码111111111,引导码检测成功后,解码剩余的55位码。
曼彻斯特编码算法
曼彻斯特编码算法详解一、引言曼彻斯特编码是一种被广泛使用的,针对模拟信号的编码方式。
它是由英国科学家弗雷德里克·威廉·汤姆林森(Frederick William Tomlinson)在1880年代后期发明的。
由于其简单性、鲁棒性和兼容性,曼彻斯特编码在许多应用中都得到了广泛的使用,包括以太网和许多类型的数据通信系统。
二、工作原理曼彻斯特编码的原理是将每一个比特的周期划分为两个相等的时间段。
每个时间段又被进一步划分为两个相等的子时间段。
然后根据比特的值,在这个时间段内,信号会有一个跳变或者没有跳变。
如果比特是1,那么在下一个时间段内,信号会有一个跳变;如果比特是0,那么在下一个时间段内,信号不会有一个跳变。
这种跳变既包含了比特的信息,也作为同步的信号使用。
三、编码规则以下是曼彻斯特编码的基本规则:将每个比特拆分成两个时间间隔,第一个时间间隔代表该比特的值(1或0),第二个时间间隔代表该比特值的相反值。
1. 比特1:信号在一个时间段内保持稳定,然后在下一个时间段内跳变。
2. 比特0:信号在一个时间段内保持稳定,然后在下一个时间段内保持与前一个时间段相同的状态(即不跳变)。
四、优点和应用曼彻斯特编码有以下优点:1. 自同步:由于每个比特的开始都有跳变,所以接收器可以通过检测这个跳变来实现位同步。
2. 错误检测:由于每个比特都被编码为两个不同的电平,所以可以很容易地实现错误检测。
如果接收到的比特与发送的比特不同,那么可以立即发现错误。
3. 简单:曼彻斯特编码的实现非常简单,只需要一个电压比较器和一个触发器就可以实现。
曼彻斯特编码广泛应用于以太网、令牌环等网络技术中。
此外,它还被用于数字音频和视频传输、硬盘驱动器、射频识别(RFID)等领域。
五、缺点尽管曼彻斯特编码有许多优点,但它也有一些缺点:1. 效率低:由于每个比特都被编码为两个电平,所以曼彻斯特编码的效率比其它一些编码方式(如二进制或不归零制)低。
曼彻斯特编码解码方法[发明专利]
(19)中华人民共和国国家知识产权局(12)发明专利申请(10)申请公布号 (43)申请公布日 (21)申请号 201811245840.9(22)申请日 2018.10.24(71)申请人 江苏沁恒股份有限公司地址 210012 江苏省南京市雨花台区宁双路18号(72)发明人 任正 (74)专利代理机构 北京品源专利代理有限公司11332代理人 孟金喆(51)Int.Cl.H03M 5/12(2006.01)G06K 17/00(2006.01)(54)发明名称曼彻斯特编码解码方法(57)摘要本发明公开了一种曼彻斯特编码解码方法,S1、起始帧读取,起始帧为连续N个1,因为停止位为0,紧随其后的起始帧必然为1,起始帧的第一个比特位必然为1个跳变,即在N个T0周期里,每隔1/2*T0必有跳变,有2*N -1个跳变边沿,在N*T0时间内检测是否有2*N -1个跳变,如果有则说明起始帧判定正确,此时读取数据并记录;S2、数据帧读取,起始帧读取结束后立即进入数据帧读取阶段,延时大于1/2*T0小于T0,等待跳变边沿,跳变后的电平数据即为当前数据帧比特位数据;S3、校验数据读取是否正确。
本发明仅需要1个定时器即可,只需要记录跳变时间,可以大大降低软件开销,节省RAM与ROM。
权利要求书1页 说明书7页 附图3页CN 109217875 A 2019.01.15C N 109217875A1.一种曼彻斯特编码解码方法,其特征在于,包括以下步骤:S1、起始帧读取,起始帧为连续N个1,因为停止位为0,紧随其后的起始帧必然为1,起始帧的第一个比特位必然为1个跳变,即在N个T0周期里,每隔1/2*T0必有跳变,有2*N -1个跳变边沿,在N*T0时间内检测是否有2*N -1个跳变,如果有则说明起始帧判定正确,此时读取数据并记录;S2、数据帧读取,起始帧读取结束后立即进入数据帧读取阶段,延时大于1/2*T0小于T0,等待跳变边沿,跳变后的电平数据即为当前数据帧比特位数据;S3、校验数据读取是否正确。
曼切斯特解码原理
曼切斯特解码原理曼切斯特解码原理(Manchester decoding principle)是一种用于数字信号的解码方法,常用于网络通信和数据存储等领域。
该原理的核心思想是通过对信号的电平变化进行解码,将数字信号转化为相应的数据。
1. 背景介绍在数字通信中,信息的传输需要通过电信号进行。
常用的数字信号编码方式有曼切斯特编码、差分曼切斯特编码等。
而曼切斯特解码原理则是对曼切斯特编码后的信号进行解码,还原为原始的数字数据。
2. 原理解析曼切斯特编码将每个比特位的信号分为两个时间段,通过电平的变化来表示0和1。
具体而言,如果一个比特位的信号为1,则信号在该时间段内进行一次电平变化;如果信号为0,则信号在该时间段内保持不变。
而曼切斯特解码原理则是通过检测信号的电平变化来识别1和0。
3. 解码过程曼切斯特解码原理的解码过程相对简单。
当信号电平发生变化时,即为一个比特位的开始或结束。
根据信号电平的变化情况,可以判断出该比特位是0还是1。
具体步骤如下:步骤一:初始化。
将初始状态设为0,表示当前比特位的信号为0。
步骤二:检测电平变化。
通过检测信号电平的变化来确定比特位的开始或结束。
步骤三:电平变化判断。
当信号电平发生变化时,根据电平的变化情况来判断该比特位是0还是1。
步骤四:数据还原。
将解码得到的比特位拼接起来,得到原始的数字数据。
4. 优点与应用曼切斯特解码原理具有以下优点:(1)同步性强。
由于信号电平变化频繁,解码过程中的时钟同步问题较为简单。
(2)抗干扰性好。
电平变化频繁,使得信号波形较为复杂,能够有效抵抗干扰。
曼切斯特解码原理广泛应用于网络通信和数据存储等领域:(1)以太网通信。
在以太网通信中,曼切斯特编码和解码原理被用于将数字数据转化为电信号,实现数据的传输。
(2)磁盘存储。
在磁盘存储中,曼切斯特解码原理被用于将存储介质上的磁信号转化为数字数据,实现数据的读取。
5. 总结曼切斯特解码原理是一种常用的数字信号解码方法,通过检测信号电平的变化来识别数字数据。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一种简便的ID卡曼彻斯特解码方法
我这里介绍的是常用的125KHz的ID卡。
ID卡内固化了64位数据,由5个区组成:9个引导位、10个行偶校验位“PO~P9′’、4个列偶校验位“PC0~PC3”、40个数据位“D00~D93”和1个停止位S0。
9个引导位是出厂时就已掩膜在芯片内的,其值为“111111111”,当它输出数据时,首先输出9个引导位,然后是10组由4个数据位和1个行偶校验位组成的数据串,其次是4个列偶校验位,最后是停止位“0”。
“D00~D13”是一个8位的晶体版本号或ID识别码。
“D20~D93”是8组32位的芯片信息,即卡号。
注意校验位都是偶校验,网上有些资料写的是奇校验,很明显是错的,如果是奇校验的话,在一个字节是FF 的情况下,很容易就出现9个1,这样引导位就不是唯一的了,也就无法判断64位数据的起始位了。
数据结构如下图:
我读的一个ID卡数据是111111111 10001 00101 00000 00011 00000 01010 00000 11011 00110 01100 01100,对应的ID卡号是01050d36。
ID卡数据采用曼彻斯特编码,1对应着电平下跳,0对应着电平上跳。
每一位数据的时间宽度都是一样的(1T)。
由于电路参数的差别,时间宽度要实际测量。
解码芯片采用U2270B,单片机采用89S52。
U2270B的输出脚把解码得到的曼彻斯特码输出到89S52的INT脚。
在89S52的外部中断程序中完成解码。
在没有ID卡在读卡器射频范围内时,U2270B的输出脚会有杂波输出,ID卡进入读卡器射频范围内后,会循环发送64位数据,直到ID卡离开读卡器的有效工作区域。
根据ID卡的数据结构,64位数据的最后一位停止位是0。
最开始的9位引导位是1,可以把0111111111做为引导码。
也就是说在ID卡进入读卡器工作范围后,丢掉ID卡发送的第一个64位码,检测最后1位0,然后检测ID卡发送的第2个64位码的9个引导码111111111,引导码检测成功后,解码剩余的55位码。
得到ID卡的数据。
然后丢掉ID卡发送的第3个64位码,检测第3个64位码的最后1位0,再检测ID卡发送的第4个64位码。
这样连续3次检测到同一个码,就认为解码到了正确的ID卡号。
之所以要丢掉ID卡发送的第一个64位数据,是因为U2270B在没有ID卡刷卡时,也会输出波形到89S52的INT脚,这样将无法判断ID卡数据的头码。
从第2个码开始解码能确保检测的头码正确。
丢掉第3个码的原因是在检测第2个码时,最后一位停止位也被解码,那么就不能采用 0111111111来检测第3个码了,只能检测第3个码的最后1位0,再解码第4个码。
下面详细介绍解码原理,程序中要用到的变量定义如下:
Bit_over:为0,表示1位数据处理完,为1,表示当前处于数据位的跳变处。
Head_start:检测到头码0时,把head_start置1,然后连续检测到8次下降沿时间间隔大于0.75T,小于1.25T,并且 head_start为1,置位头码标志head_flag。
Head_start的作用就是保证是连续检测到0111111111。
Head_flag:头码标志,检测到0111111111后置1。
Prev_bit:保存当前数据位的值,下一位数据的值要根据当前位的值来判断。
Pulse_width:16 位数据,保存INT脚两次下降沿之间的时间间隔。
Bit_cnt:检测完头码后,每次检测5位数据,也就是一行。
Row:行数,不包括头码,总共11行,用来判断64位数据是否接收完。
Buff[11]:缓冲区,用来保存接收的11行数据。
每个数据只有低5位有效。
Id_data[11]:保存缓冲区的11个数据,进行校验,得到ID卡号。
头码检测
外部中断设置成下降沿中断,在外部中断函数中,用T1来计算两次下降沿的时间间隔。
从上图可以看到,64位为0,1位为1,64到1两次下降沿之间的间隔大于0.75T,小于1.25T,认为检测到数据0-1的变化。
这时置标志位head_start 为1,然后连续检测到8次下降沿间隔时间大于 0.75T,小于1.25T,且
head_start为1,认为检测到了0111111111,这时置头码标志head_flag,因为这时下降沿在数据 1的电平跳变处,数据1还没接收完,把bit_over置1,prev_bit置1。
数据位检测
分析曼彻斯特码,有以下5种情况,其它情况下是错误码。
Bit_over = 1时,也就是进入下降沿中断时,上一位的数据没处理完
1、
(两次下降沿时间间隔1T)
Bit_over=1时,x=1T,bit_cnt+1,当前位为1,bit_over仍为1。
2、
(两次下降沿时间间隔1.5T)
Bit_over=1时,x=1.5T,bit_cnt+1,当前位为0,bit_over变为0。
3、
(两次下降沿时间间隔2T)
Bit_over =1时,x=2T,bit_cnt+2,一次接收2位数据,第1位数据与上一位值相反,第2位数据与上一位值相同,bit_over仍为1。
Bit_over=0时,有2种情况
4、
(两次下降沿时间间隔1T)
Bit_over = 0时,x = 1T,bit_cnt+1,当前位与上一位值相同,bit_over仍为0。
5、
(两次下降沿时间间隔1.5T)
Bit_over=0时,x=1.5T,bit_cnt+2,一次接收2位数据,第1位值与上一位值相同,第2位值与上一位值相反,bit_over变为1。
解ID卡码我想了好几天,也和网上的解码方法对比了下,觉得采用这种解码方法程序量很少,也不会占用很多硬件资源,是一种很简便的方法。
如果大家有更好的方法,可以一起讨论。