曼彻斯特解码原则+KEM系列RFID卡解码源程序分析
- 格式:doc
- 大小:294.00 KB
- 文档页数:40
曼彻斯特编码/差分曼彻斯特编码
曼彻斯特编码的编码规则是:
在信号位中电平从低到高跳变表示0;
在信号位中电平从高到低跳变表示1;
差分曼彻斯特编码的编码规则是:
在信号位开始时不改变信号极性,表示逻辑"1";
在信号位开始时改变信号极性,表示逻辑"0";
不论码元是1或者0,在每个码元正中间的时刻,一定有一次电平转换。
曼切斯特和差分曼切斯特编码是原理基本相同的两种编码,后者是前者的改进。
他们的特征是在传输的每一位信息中都带有位同步时钟,因此一次传输可以允许有很长的数据位。
曼切斯特编码的每个比特位在时钟周期内只占一半,当传输“1”时,在时钟周期的前一半为高电平,后一半为低电平;而传输“0”时正相反。
这样,每个时钟周期内必有一次跳变,这种跳变就是位同步信号。
差分曼切斯特编码是曼切斯特编码的改进。
它在每个时钟位的中间都有一次跳变,传输的是“1”还是“0”,是在每个时钟位的开始有无跳变来区分的。
差分曼切斯特编码比曼切斯特编码的变化要少,因此更适合与传输高速的信息,被广泛用于宽带高速网中。
然而,由于每个时钟位都必须有一次变化,所以这两种编码的效率仅可达到50%左右。
曼彻斯特编码和奈氏准则一、曼彻斯特编码曼彻斯特编码是一种双相线码,主要用于数字信号的传输。
在曼彻斯特编码中,每一位数据都由两个不同极性的电压表示。
在每一位的中心点,信号的电平都会发生跳变,使得接收端可以准确地判断信号的相位。
这种编码方式具有自同步的特性,能够自动确定数据位的起始和结束位置。
曼彻斯特编码的优点在于它具有较好的抗干扰能力,能够有效地抵抗数据传输过程中的噪声和干扰。
此外,由于每一位数据都包含一个电压跳变,因此接收端可以准确地检测到数据信号的相位,保证了数据传输的可靠性和稳定性。
然而,曼彻斯特编码也存在一些缺点。
由于每一位数据都需要一个电压跳变,因此它需要较高的发送功率和带宽。
此外,由于曼彻斯特编码中含有较多的过渡频率成分,因此它可能会对通信系统造成较大的干扰。
二、奈氏准则奈氏准则是由德国物理学家海因里希·鲁特·奈奎斯特提出的,是通信系统中的基本理论之一。
奈氏准则指出,在一个理想的无噪声通信系统中,为了准确地传输信号而不发生失真,信号的带宽必须小于或等于信道带宽的一半。
换句话说,如果信道带宽为B,则信号的带宽不能超过B/2。
奈氏准则的原理是基于信息量的统计性质。
在一个信道中,信息量与信号的频谱密度有关,而频谱密度又与信号的带宽有关。
因此,如果信号的带宽超过了信道带宽的一半,那么信道将无法容纳更多的信息量,从而导致信号失真。
奈氏准则对于通信系统的设计和优化具有重要的指导意义。
在实际应用中,我们需要根据奈氏准则来确定信号的带宽和采样频率等参数,以保证信号传输的质量和稳定性。
三、曼彻斯特编码和奈氏准则的结合应用在数字通信系统中,曼彻斯特编码和奈氏准则常常被结合起来使用。
曼彻斯特编码提供了可靠的数据传输和自同步机制,而奈氏准则则为系统设计提供了理论依据。
首先,根据奈氏准则,我们需要确定一个合适的信道带宽。
然后,根据这个带宽和数据传输速率,我们可以选择适合的曼彻斯特编码方案。
例如,如果信道带宽较窄,我们可以选择位周期较长的曼彻斯特编码,以减少信号的带宽占用。
/**********************************************曼彻斯特编码调制的非接触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 decoding principle)是一种用于数字信号的解码方法,常用于网络通信和数据存储等领域。
该原理的核心思想是通过对信号的电平变化进行解码,将数字信号转化为相应的数据。
1. 背景介绍在数字通信中,信息的传输需要通过电信号进行。
常用的数字信号编码方式有曼切斯特编码、差分曼切斯特编码等。
而曼切斯特解码原理则是对曼切斯特编码后的信号进行解码,还原为原始的数字数据。
2. 原理解析曼切斯特编码将每个比特位的信号分为两个时间段,通过电平的变化来表示0和1。
具体而言,如果一个比特位的信号为1,则信号在该时间段内进行一次电平变化;如果信号为0,则信号在该时间段内保持不变。
而曼切斯特解码原理则是通过检测信号的电平变化来识别1和0。
3. 解码过程曼切斯特解码原理的解码过程相对简单。
当信号电平发生变化时,即为一个比特位的开始或结束。
根据信号电平的变化情况,可以判断出该比特位是0还是1。
具体步骤如下:步骤一:初始化。
将初始状态设为0,表示当前比特位的信号为0。
步骤二:检测电平变化。
通过检测信号电平的变化来确定比特位的开始或结束。
步骤三:电平变化判断。
当信号电平发生变化时,根据电平的变化情况来判断该比特位是0还是1。
步骤四:数据还原。
将解码得到的比特位拼接起来,得到原始的数字数据。
4. 优点与应用曼切斯特解码原理具有以下优点:(1)同步性强。
由于信号电平变化频繁,解码过程中的时钟同步问题较为简单。
(2)抗干扰性好。
电平变化频繁,使得信号波形较为复杂,能够有效抵抗干扰。
曼切斯特解码原理广泛应用于网络通信和数据存储等领域:(1)以太网通信。
在以太网通信中,曼切斯特编码和解码原理被用于将数字数据转化为电信号,实现数据的传输。
(2)磁盘存储。
在磁盘存储中,曼切斯特解码原理被用于将存储介质上的磁信号转化为数字数据,实现数据的读取。
5. 总结曼切斯特解码原理是一种常用的数字信号解码方法,通过检测信号电平的变化来识别数字数据。
曼彻斯特解码原则+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。
两种曼彻斯特编码是将时钟和数据包含在数据流中,在传输代码信息的同时,也将时钟同步信号一起传输到对方,每位编码中有一跳变,不存在直流分量,因此具有自同步能力和良好的抗干扰性能。
一种RFID的曼彻斯特解码技术
康文广;王辉映
【期刊名称】《单片机与嵌入式系统应用》
【年(卷),期】2010(000)012
【摘要】对射频芯片输出的数据进行解码是射频卡应用系统中的关键问题.通过分析EM4095的工作原理和EM4100的编码机制,得出射频芯片输出64位曼彻斯特码的特点,并给出了软件实现算法.利用中断捕获脉宽的方法进行解码,不但硬件接口简单,而且解码速度快,准确率高,同时也为曼彻斯特解码算法提供了一种新的思路.【总页数】3页(P20-22)
【作者】康文广;王辉映
【作者单位】珠海优特电力科技股份有限公司,珠海,519070;珠海优特电力科技股份有限公司,珠海,519070
【正文语种】中文
【中图分类】TP311
【相关文献】
1.一种基于CPLD的曼彻斯特编解码器设计 [J], 杜敏社;赵文波;黄德东
2.一种基于同相正交环的数字曼彻斯特解码方法 [J], 王岳松;孔韬
3.一种基于反相对称调制的曼彻斯特码解码系统 [J], 萧宝瑾;程江亮
4.一种基于 DDFS 技术的曼彻斯特码时钟提取及解码电路 [J], 钱莹晶;张仁民
5.一种基于时钟提取的曼彻斯特编解码设计 [J], 宋一丁; 王振华; 田巧红; 马志敏
因版权原因,仅展示原文概要,查看原文内容请购买。
曼彻斯特编码曼彻斯特编码编辑词条曼彻斯特编码(Manchester Encoding),也叫做相位编码(PE),是一个同步时钟编码技术,被物理层使用来编码一个同步位流的时钟和数据。
曼彻斯特编码被用在以太网媒介系统中。
曼彻斯特编码提供一个简单的方式给编码简单的二进制序列而没有长的周期没有转换级别,因而防止时钟同步的丢失,或来自低频率位移在贫乏补偿的模拟链接位错误。
在这个技术下,实际上的二进制数据被传输通过这个电缆,不是作为一个序列的逻辑1或0来发送的。
相反地,这些位被转换为一个稍微不同的格式,它通过使用直接的二进制编码有很多的优点。
目录简介编码规则关于数据表示的约定展开编辑本段简介曼彻斯特编码(Manchester Encoding),也叫做相位编码(PE),是一个同步时钟编码技术,被物理层使用来编码一个同步位流的时钟和数据。
曼彻斯特编码被用在以太网媒介系统中。
曼彻斯特编码提供一个简单的方式给编码简单的二进制序列而没有长的周期没有转换级别,因而防止时钟同步的丢失,或来自低频率位移在贫乏补偿的模拟链接位错误。
曼彻斯特编码,常用于局域网传输。
曼彻斯特编码将时钟和数据包含在数据流中,在传输代码信息的同时,也将时钟同步信号一起传输到对方,每位编码中有一跳变,不存在直流分量,因此具有自同步能力和良好的抗干扰性能。
但每一个码元都被调成两个电平,所以数据传输速率只有调制速率的1/2。
就是说主要用在数据同步传输的一种编码方式。
【在曼彻斯特编码中,用电压跳变的相位不同来区分1和0,即用正的电压跳变表示1,用负的电压跳变表示0。
因此,这种编码也称为相位编码。
由于跳变都发生在每一个码元的中间,接收端可以方便地利用它作为位同步时钟,因此,这种编码也称为自同步编码。
】Manchester encoding uses the transition in the middle of the timing window to determine the binary value for that bit period. In Figure , the top waveform moves to a lower position so it is interpreted as a binary zero. The second waveform moves to a higher position and is interpreted as a binary one .编辑本段编码规则在曼彻斯特编码中,每一位的中间有一跳变,位中间的跳变既作时钟信号,又作数据信号;从低到高跳变表示"1",从高到低跳变表示"0"。
曼彻斯特解码原则+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。
两种曼彻斯特编码是将时钟和数据包含在数据流中,在传输代码信息的同时,也将时钟同步信号一起传输到对方,每位编码中有一跳变,不存在直流分量,因此具有自同步能力和良好的抗干扰性能。
但每一个码元都被调成两个电平,所以数据传输速率只有调制速率的1/2。
就是说主要用在数据同步传输的一种编码方式。
【在曼彻斯特编码中,用电压跳变的相位不同来区分1和0,即用正的电压跳变表示0,用负的电压跳变表示1。
因此,这种编码也称为相应编码。
由于跳变都发生在每一个码元的中间,接收端可以方便地利用它作为位同步时钟,因此,这种编码也称为自同步编码。
】2.曼彻斯特编码(Manchester Encoding),也叫做相位编码(PE);常用于局域网传输。
在曼彻斯特编码中,每一位的中间有一跳变,位中间的跳变既作时钟信号,又作数据信号。
但在不同的书籍中,曼彻斯特编码中,电平跳动表示的值不同,这里产生很多歧义:ﻫ1、在网络工程师考试以及与其相关的资料中:位中间电平从高到低跳变表示"0";ﻫ位中间电平从低到高跳变表示"1"。
ﻫ2、在一些《计算机网络》书籍中:ﻫ位中间电平从高到低跳变表示"1";ﻫ位中间电平从低到高跳变表示"0"。
ﻫ在清华大学出版的《计算机通信与网络教程》《计算机网络(第4版)》也是这么说的,就以此为标准,我们就叫这为标准曼彻斯编码。
至于第一种,我们在这里就叫它曼彻斯特编码。
但是要记住,在不同的情况下懂得变通哦,否则会被老师扣分数的哦。
这两者恰好相反,千万别弄混淆了。
现在我们要讲的就是差分曼彻斯特编码:ﻫ在信号位开始时不改变信号极性,表示辑"1"在信号位开始时改变信号极性,表示逻辑"0";ﻫ【注意】:如果在最初信号的时候,即第一个信号时:ﻫ如果中间位电平从低到高,则表示0;如果中间位电平从高到低,则表示1;后面的(从第二个开始)就看每个信号位开始时有没有跳变来决定:ﻫ下面我们来举个例子,来比较标准曼彻斯特编码、曼彻斯特编码、差分曼彻斯特编码:ﻫEM4100系列用的是:曼彻斯特编码!125K;EM4100系列RFID卡解码源程序分析1.ﻫ我们知道了曼彻斯特编码原则,那么反过来的过程就是解码了。
ﻫEM4100系列用的是:曼彻斯特编码!2.传统只读射频卡读卡器的设计一般采用U2270B或EM4095读写基站芯片加MCU模式,其成本高、功耗大。
本文介绍一种采用一片74HC4060+LM258/358加少量普通元件构成的读卡器电路和处理的程序设计方案,电路简单、功耗小、成本低。
74HC4060+LM258/358 电路为市面上已非常成熟RFID-125KHZ-I 卡且广泛采用的低功耗、低成本方案。
该方案在门禁、保安、考勤、展览会、公园、旅店、餐厅等公共场所的门票、优惠卡以及生产过程、邮政包裹、航空铁路运输、产品包装、交通等部门的物流、电子标签、防伪标志、一次性票证等众多领域上占据半壁江山。
3.推挽式放大电路输出後接LC串联谐振电路,当回路固有谐振频率与输入讯号频率相等时,电路发生串联谐振。
本文只要求对125kH z频率的讯号放大,所以根据串联谐振公式计算电路中元件参数,可得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#define TH0_H0xfe//定时器0 取样定时值设定为400us#defineTL0_L0x8f//8f2.定时器0中断优先级最高:PT0=1;3.//曼彻斯特码同步头检测,9个1采用逐个前移检测法//逐个前移检测法,即每检测到一个数据,如果是"1",并向数据库写入1,//如果是"0",就放弃当前检测的数据,并向当前数据流方向移动一位,//这样一来,就保证了不管数据流是在何种状态下,都能正确无误地抓取9个1,//同步头9个1的提取成功,曼彻斯特码译码器即和当前的数据流保持了同步,//并把余下的55位数据全部译完。
ﻩ4.ucharREM_Buffer[14];//曼彻斯特码解码后得到最终数据的缓存0~13/*曼彻斯特码解码后的数据放在REM_Buffer[0~13];REM_Buffer[0]=0xff 数据格式:1111 1111 同步头,8个1 REM_Buffer[1]=0x8x 数据格式:1xxx xxxx同步头,1个1,x表示无意义REM_Buffer[2]= 数据格式:D00D01D02D03 P0xxx八个版本位或厂商信息的前四位,x表示无意义;P0为行效验位REM_Buffer[3]= 数据格式:D10D11D12D13P1xxx 八个版本位或厂商信息的后四位,x表示无意义;P1为行效验位REM_Buffer[4]= 数据格式:D20D21D22D23P2xxx 三十二个数据,x表示无意义;P2为行效验位REM_Buffer[5]=数据格式:D30D31D32D33P3xxx 三十二个数据,x表示无意义;P3为行效验位REM_Buffer[6]= 数据格式:D40D41D42D43 P4xxx 三十二个数据,x表示无意义;P4为行效验位REM_Buffer[7]= 数据格式:D50D51D52D53 P5xxx 三十二个数据,x表示无意义;P5为行效验位REM_Buffer[8]=数据格式:D60D61D62D63P6x xx 三十二个数据,x表示无意义;P6为行效验位REM_Buffer[9]=数据格式:D70D71D72D73P7xxx三十二个数据,x表示无意义;P7为行效验位REM_Buffer[10]= 数据格式:D80D81D82D83P8xxx 三十二个数据,x表示无意义;P8为行效验位REM_Buffer[11]= 数据格式:D90D91D92D93 P9xxx三十二个数据,x表示无意义;P9为行效验位REM_Buffer[12]=数据格式:PC0PC1PC2PC30xxx 四个列效验位,x表示无意义;0为停止位原程序://2008.10.15//125K;EM4100系列RFID卡解码//#include <reg52.h>//使用AT89S51/52等系列单片机头文件#include <STC12C5410AD.h>//stc系列单片机专用头文件#include <intrins.h>#define uintunsignedint//定义#define uchar unsignedchar//定义#define ulong unsigned long//定义sbit REM=P2^1;// 曼彻斯特编码输入端sbit CLK=P3^3;//产生125KHZ 时钟信号端sbit LED=P2^5;//红灯sbit SPP=P1^0;//喇叭bitREM_BIT;// 曼彻斯特码高、低边沿跳变标志位,bit Efficacy_BIT;//待效验标志位,bit P_PC_BIT; //行,列效验标志位bit YES_NO_BIT; //效验正确,或效验错误标志位,//YES_NO_BIT=1表示效验正确;//YES_NO_BIT=0表示效验错误。