简单的曼彻斯特编码的C语言实现
- 格式:docx
- 大小:14.18 KB
- 文档页数:3
曼彻斯特解码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功能:一张卡号,如果出现全部相同的数字或者该卡号只有两种数据,则认为是错误的卡号。
基于FPGA的曼彻斯特编解码实现
徐鲁
【期刊名称】《信息技术与信息化》
【年(卷),期】2022()4
【摘要】石油测井中为了安全稳定的实现地面收发系统,井下收发终端及相关仪器的工作,信道的传输是保证仪器正常工作非常关键的部分。
井下环境复杂,信号容易出现失真、传输错乱、同步错误等各种情况,为了减小和消除相关影响,选择一种在井下复杂环境仍能有效传输相关信号的方式是很有必要的。
曼彻斯特码数据与时钟统一编码拥有足量的时钟信息,无直流分量,十分适合复杂环境的数据传输工作。
针对相关传输问题基于曼彻斯特编解码技术提出一种适用于石油井下的数据传输方案,针对传统测井地面系统采用专用芯片实现曼彻斯特码编码解码的不足,以ALTERA 公司的EP4CE6F17C8N现场可编程逻辑门阵列即FPGA为核心芯片实现曼彻斯特码数据编码解码的设计方法。
利用Modelsim仿真软件对程序时序进行仿真验证,确保了时序的正确,验证了基于EP4CE6F17C8N芯片的编解码程序的设计方法是有效的。
【总页数】4页(P142-145)
【作者】徐鲁
【作者单位】长江大学
【正文语种】中文
【中图分类】TN9
【相关文献】
1.基于FPGA的曼彻斯特码编解码器的实现
2.基于FPGA的1553B总线曼彻斯特编解码器设计与实现
3.用FPGA实现曼彻斯特编解码
-STD-1553B总线曼彻斯特编解码器的FPGA实现
5.基于FPGA的曼彻斯特编解码器设计与实现
因版权原因,仅展示原文概要,查看原文内容请购买。
曼彻斯特编码曼彻斯特编码(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和1两个数字组成,表示一种逻辑状态。
在计算机内部,所有的信息都是以二进制数的形式存储和处理的。
2. 差分曼彻斯特编码是一种通过改变数据直流分量来进行数据传输的编码方式。
在这种编码方式中,每个数据位的变化都会产生两种状态的信号,通过这种方式来避免数据传输过程中的信号偏移和噪声干扰。
接下来我们可以通过C语言来实现将二进制数转换成差分曼彻斯特编码的程序:```c#include <stdio.h>// 函数功能:将二进制数转换成差分曼彻斯特编码// 参数说明:binary为输入的二进制数,length为二进制数的位数void manchester_encode(int binary[], int length) {int manchester[length * 2]; // 差分曼彻斯特编码后的数组for (int i = 0; i < length; i++) {if (binary[i] == 0) {manchester[i * 2] = 1; // 低电平manchester[i * 2 + 1] = 0; // 高电平} else {manchester[i * 2] = 0; // 高电平manchester[i * 2 + 1] = 1; // 低电平}}// 输出差分曼彻斯特编码后的数组for (int i = 0; i < length * 2; i++) {printf("%d", manchester[i]);}printf("\n");}int main() {int binary[] = {1, 0, 1, 0, 0, 1}; // 输入的二进制数int length = sizeof(binary) / sizeof(binary[0]); // 二进制数的位数manchester_encode(binary, length); // 调用函数进行编码return 0;}```在这段程序中,我们首先定义了一个函数`manchester_encode`来实现将二进制数转换成差分曼彻斯特编码的功能,其参数包括输入的二进制数和二进制数的位数。
简单的曼彻斯特编码的C语言实现曼彻斯特编码是减小信号交流分量,实现固定信号占空比的基本方法。
用C语言实现如下:#include <stdio.h>#define uint8_t unsigned char#define uint16_t int#define BOOL int#define TRUE 1#define FALSE 0BOOL app_ManchesterEncode(uint8_t *indata,uint8_t *outdata,uint16_t inlength);BOOL app_ManchesterDecode(uint8_t *indata,uint8_t *outdata,uint16_t inlength);uint8_t indata[10]={0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef,0x43,0xb8};uint8_t middata[20];uint8_t outdata[10];uint16_t inlength;int main(){int length=10;int i=0;app_ManchesterEncode(indata,middata,length);if(app_ManchesterDecode(middata,outdata,length*2)==FALSE)printf("decode failed!\n");printf("in:");for(i=0;i<length;i++)printf(" %2.2x",indata[i]);printf("\n");printf("mid:");for(i=0;i<length*2;i++)printf(" %2.2x",middata[i]);printf("\n");printf("out:");for(i=0;i<length;i++)printf(" %2.2x",outdata[i]);printf("\n");}BOOL app_ManchesterEncode(uint8_t *indata,uint8_t *outdata,uint16_t inlength) {uint16_t i=0;uint8_t j=0;for(i=0;i<inlength;i++){outdata[2*i]=0;outdata[2*i+1]=0;for(j=0;j<8;j++)if(j<4)outdata[2*i+1]|=(((indata[i]>>j)&0x01)?2:1)<<j*2;elseoutdata[2*i]|=(((indata[i]>>j)&0x01)?2:1)<<(j*2-8);}return TRUE;}BOOL app_ManchesterDecode(uint8_t *indata,uint8_t *outdata,uint16_t inlength) {uint16_t i=0;uint8_t j=0;for(i=0;i<inlength/2;i++){outdata[i]=0;for(j=0;j<8;j++){if(j<4){if((indata[2*i+1]>>(j*2)&0x03)==0x01);else if((indata[2*i+1]>>(j*2)&0x03)==0x02)outdata[i]|=0x01<<j;else{printf("at i=%d j=%d data:%2.2x ",i,j,indata[2*i+1]&0x03);return FALSE;}}else{if((indata[2*i]>>(j*2-8)&0x03)==0x01);else if((indata[2*i]>>(j*2-8)&0x03)==0x02)outdata[i]|=0x01<<j;else{printf("at i=%d j=%d\n",i,j);return FALSE;}}}}return TRUE;}。
毕业设计(论文)题目名称:曼彻斯特编解码电路设计学生姓名:院(系):电子信息学院专业班级:电气10602指导教师:辅导教师:时间:2010年3月15日至2010年6月10日目录毕业设计(论文)开题报告 (V)曼彻斯特编解码电路设计 (12)Manchester encoding and decoding circuit (13)前言 0曼彻斯特编解码电路设计 (1)1 选题背景 (1)普通NRZ码存在的问题 (1)应用背景 (1)2 方案论证 0曼彻斯特码简介 0曼彻斯特编解码解析 0曼彻斯特编解码具体实现方式 (1)方案选择 (2)3 硬件电路设计 (5)系统实物照片展示 (5)系统的硬件框图 (6)AT89S52单片机简介 (7)单片机外围电路 (9)信号调理电路 (13)4 软件设计 (16)资源利用 (16)曼彻斯特码编解码方式分析 (18)程序流程图 (19)编码实现 (21)改良方向 (24)参考文献 (26)致谢 (27)附录1:地下液位测量系统实物照片 (28)长江大学毕业设计(论文)任务书学院(系)电子信息学院专业电气工程及自动化班级电气10602学生姓名熊香春指导教师/职称吴爱平/讲师1.毕业设计(论文)题目曼彻斯特编解码电路设计2.毕业设计(论文)起止时刻:2010年3月15日-2010年6月10日3.毕业设计(论文)所需资料及原始数据(指导教师选定部份)所需资料:(1)《MCS-51单片机原理与应用》(2)《单片机的C语言编程》(3) 通信原理原始数据传输速度为20Kb/S,一帧数据有16个字节,一帧的命令有2个字节。
4.毕业设计(论文)应完成的主要内容(1)利用C语言编程实现曼彻斯特编码、解码模块,并在PROTUES软件中仿真;(2)设计曼彻斯特信号调理电路;(3)毕业论文中必需包括如下内容:大体原理介绍、整体框图、软件流程图、软件原理介绍、源程序清单。
5.毕业设计(论文)的目标及具体要求利用单片机和C语言编程实现曼彻斯特编码、解码模块,并在PROTUES软件中仿真通过;通过单片机最小系统,辅之外围电路,能够实现编解码。
MIL-STD-1553B总线曼彻斯特编解码器的FPGA实现张吉康; 刘恩海; 魏宏刚; 赵汝进【期刊名称】《《电子设计工程》》【年(卷),期】2019(027)015【总页数】5页(P103-107)【关键词】MIL-STD-553B总线; 曼彻斯特II型码; FPGA; VerilogHDL【作者】张吉康; 刘恩海; 魏宏刚; 赵汝进【作者单位】中国科学院光电技术研究所四川成都610209; 中国科学院大学北京100049【正文语种】中文【中图分类】TN79+1MIL-STD-1553B总线简称1553B总线,是一种集中式的时分制、命令/响应、多路传输的半双工串行数据总线标准[1]。
由于1553B总线具有应用灵活、可靠性高等优势,其已经在航空航天等军事领域有着广泛地应用[2],现在它同样广泛地应用在商业和工业系统中。
目前1553B应用主要采用专用的1553B协议芯片[3],比如DDC公司的BU-61580等。
系列专用芯片虽然实现了协议的功能,但在某些特定应用环境下芯片功能的冗余造成极大的资源浪费,且芯片使用灵活性较差,价格昂贵,占用PCB面积大[4],在一定程度上限制了设计者的应用开发。
1553B协议规定总线上传输的数据编码采用的是曼彻斯特II型双相码,曼彻斯特编解码器的性能会直接影响1553B总线的通信质量[5]。
1553B总线编解码器工作频率需达到兆赫兹以上,对时序的要求高;目前主流的FPGA器件集成了丰富的可编程逻辑门电路,具有精确高速的时序处理能力,在高速信号处理领域应用广泛。
因此,本文根据1553B总线具体的应用环境,为了降低工程成本、提高资源利用率及提高应用开发的灵活性,基于FPGA设计并实现了1553B总线中曼彻斯特II型码的编解码器。
1 曼彻斯特II型码原理1.1 1553B总线MIL-STD-1553B总线其全称是“飞机内部时分制指令/响应型多路传输数据总线”,数据编码采用曼彻斯特II型双相码,传输速率为1 Mb/s[6]。
实验十五曼彻斯特码编解码实验实验内容1. 熟悉曼彻斯特码编码实验2.熟悉曼彻斯特码译码实验一、实验目的1.掌握曼彻斯特码的编解码规则的过程2.掌握曼彻斯特码的编解码原理3. 学习通过CPLD编程实现曼彻斯特码编译码实验二、实验电路工作原理在实际的基带传输系统中,并不是所有码字都能在信道中传输。
例如,含有直流和低频成分的基带信号就不适宜在信道中传输,因为它有可能造成信号严重畸变。
同时,一般基带传输系统都从接收到的基带信号流中提取收定时信号,而收定时信号却又依赖于传输的码型,如果码型出现长时间的连“0”或连“1”符号,则基带信号可能会长时间的出现0电位。
从而使收定时恢复系统难以保证收定时信号的准确性。
实际的基带传输系统还可能提出其它要求,因而对基带信号也存在各种可能的要求。
归纳起来,对传输用的基带信号的主要要求有两点:①对各种代码的要求,期望将原始信息的符号编制成适合于传输用的码型,②对所传码型的电波波形要求,期望电波波形适宜于在信道中传输。
前一问题称为传输码型选择,后一问题称为基带脉冲的选择。
这是两个既有独立性又有联系的问题,也是基带传输原理中十分重要的两个问题。
传输码(又称线路码)的结构将取决于实际信道特性和系统工作的条件。
在较为复杂的基带传输系统中,传输码的结构应具有下列主要特性:①能从其相应的基带信号中获取定时信息;②相应的基带信号无直流成分和只有很小的低频成分;③不受信息源统计特性的影响,即能适应于信息源的变化;④尽可能地提高传输码型的传输效率;⑤具有内在的检错能力,等等。
曼彻斯特码(Manchester code)又称裂相码、双向码,是一种用电平跳变来表示1或0的编码,它是计算机网络中常用的两种编码方法(曼彻斯特编码和差分曼彻斯特编码)。
未经编码的二进制基带数字信号就是高电平和低电平不断交替的信号。
至于用低电平代表1或0都是可以的。
使用这种最简单的基带信号的最大问题就是当出现一长串的连1或0时,在接收端无法收到的比特流中提取位同步信号。
#include "Manchester.h"/*******************************************************************************程序说明基于单片机的曼彻斯特编码程序,功能是将一个8位的数据(一个字节)进行曼彻斯特编码曼彻斯特编码的原则是:电平从高到低跳变表示'1',电平从低到高跳变表示'0'*******************************************************************************//*******************************************************************************曼彻斯特编码函数参数DataIn:将要进行编码的单字节数据返回值manchesterOut:编码后返回的与参数对应的曼彻斯特编码值*******************************************************************************/unsigned int CharToManchester(unsigned char Encode_Data){uint ManchesterOut = 0;uchar i = 0;for(i=0;i<8;i++){if(( Encode_Data&0x80)==0x80) //说明该位为1{ManchesterOut = ManchesterOut + 1; //写1ManchesterOut = ManchesterOut << 1;//左移一位,相当于在最低位写0if(i<7){ManchesterOut <<= 1;//移位准备编码下一位Encode_Data <<= 1; //待编码数据左移1位,为下一位数据编码做准备}}else if(( Encode_Data&0x80)==0)//说明该位为0{ManchesterOut <<= 1;//不写1移位相当于写0ManchesterOut += 1;//写1if(i<7){ManchesterOut <<= 1;//移位准备编码下一位Encode_Data <<= 1; //待编码数据左移1位,为下一位数据编码做准备}}}return ManchesterOut;//返回编码后的16位值}/*******************************************************************************曼彻斯特译码函数参数Manchester_In:将要进行编码的单字节数据返回值Decode_Data:译码后返回的与参数对应的值*******************************************************************************/uchar ManchesterToChar(uint Manchester_In){uchar Decode_Data = 0;uchar j = 0;uchar error=0;for(j=0;j<8;j++){if((Manchester_In&0xc000)==0x8000) //说明该位为10{Decode_Data = Decode_Data+1;if(j<7){Decode_Data <<= 1;//移位准备译码下一位Manchester_In<<= 2; //待译码数据左移2位,为下一位数据译码做准备}}else if((Manchester_In&0xc000)==0x4000) //说明该位为01{//Decode_Data = Decode_Data<<1; //直接左移1位代表写0if(j<7){Decode_Data <<= 1;//移位准备译码下一位Manchester_In<<= 2; //待译码数据左移2位,为下一位数据译码做准备}}else{error=1;break;}}。
曼彻斯特码1曼彻斯特原理介及其编码规则............................... 错误!未定义书签。
2 曼彻斯特码的各方面应用ﻩ错误!未定义书签。
3曼彻斯特码与差分曼彻斯特码................................ 错误!未定义书签。
1 曼彻斯特原理介及其编码规则Manchester编码是一种常用的基带信号编码。
它具有内在的时钟信息,因而能使网络上的每一个系统保持同步。
在Manchester编码中,时间被划分为等间隔的小段,其中每小段代表一位数据。
每一小段时间本身又分为两半,前半个时间段所传信号是该时间段传送比特值的反码,后半个时间段传送的是比特值本身。
可见在一个时间段内,其中间点总有一次信号电平的变化,因此携带有信号传送的同步信息而不需另外传送同步信号。
Manchester编码采用电平由高到低变化的下降沿代表0,电平由低到高变化的上升沿代表1;发送和接收的同步工作方式保证了信息传递的方便和可靠。
为了减少控制器与位置反馈单元之间的连线数目,信息的传递可采用两根线的串行方式。
发送端和接收端的同步靠信息脉冲串之前的同步脉冲串来实现。
在电信领域,曼彻斯特码,(也称作相位码或者PE)是一种数据通讯线性码,它的每一个数据比特都是由至少一次电压转换的形式所表示的曼彻斯特编码被因此被认为是一种自定时码。
自定时意味着数据流的精确同步是可行的。
每一个图1 二进制码和曼彻斯特码对比图比特都准确的在一预先定义时间时期的时间中被传送。
但是,今天有许许多多的复杂的编码方法(例如8B/10B编码),在达到同等目的情况下只需要更少带宽负荷并且只有更少的同步信号相位模糊。
二进制码与曼彻斯特码波形的对比关系如图1所示。
在曼彻斯特编码中,用电压跳变的相位不同来区分1和0,即用正的电压跳变表示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功能:一张卡号,如果出现全部相同的数字或者该卡号只有两种数据,则认为是错误的卡号。
最近为了考嵌入式系统设计师,看了曼彻斯特编码/差分曼彻斯特编码觉得有很多疑惑,教程说得太简单,不理解,根本不会写出数字编码(如:010*********)的曼彻斯特编码/差分曼彻斯特编码。
之后就在网上搜索,查出来的都大同小异,以下就是:曼彻斯特编码的编码规则是:在信号位中电平从低到高跳变表示0;在信号位中电平从高到低跳变表示1;差分曼彻斯特编码的编码规则是:在信号位开始时不改变信号极性,表示逻辑"1";在信号位开始时改变信号极性,表示逻辑"0";不论码元是1或者0,在每个码元正中间的时刻,一定有一次电平转换。
曼切斯特和差分曼切斯特编码是原理基本相同的两种编码,后者是前者的改进。
他们的特征是在传输的每一位信息中都带有位同步时钟,因此一次传输可以允许有很长的数据位。
曼切斯特编码的每个比特位在时钟周期内只占一半,当传输“1”时,在时钟周期的前一半为高电平,后一半为低电平;而传输“0”时正相反。
这样,每个时钟周期内必有一次跳变,这种跳变就是位同步信号。
差分曼切斯特编码是曼切斯特编码的改进。
它在每个时钟位的中间都有一次跳变,传输的是“1”还是“0”,是在每个时钟位的开始有无跳变来区分的。
差分曼切斯特编码比曼切斯特编码的变化要少,因此更适合与传输高速的信息,被广泛用于宽带高速网中。
然而,由于每个时钟位都必须有一次变化,所以这两种编码的效率仅可达到50%左右这是在网上下载的,看了之后还是萌萌哒,完全搞不懂。
还好,经过一番努力,终于找到快速画出曼彻斯特编码/差分曼彻斯特编码的方法了,以下是我从网上找到的资料并且总结的,给自己留下个纪念吧。
再来做下08年中级网络工程师真题,你会了吗?答案:C【附加总结类文档一篇,不需要的朋友可以下载后编辑删除,谢谢】2015年文化馆个人工作总结在XXXX年X月,本人从XXXX学院毕业,来到了实现我梦想的舞台--XX区文化馆工作。
在这里我用艰辛的努力,勤劳的付出,真诚而认真地工作态度认真的做好自身的每一项文化馆相关工作,取得了较为良好的工作业绩。
计算机网络课程设计实验报告------曼彻斯特的编码模拟-----来自东华理工大学学子课程设计报告课程设计题目:曼彻斯特的编码模拟学生姓名:*****专业:计算机科学与技术班级:*******学号:***********指导教师:*****2013年12月19日目录第1章需求分析 (2)1. 1 引言 (2)1. 2 任务概述 (2)1. 3 功能划分 (2)1. 4 运行需求及其他 (3)第2章总体设计 (3)2. 1 系统方案 (3)2. 2 软件结构 (4)第3章详细设计 (5)第4章实验源码 (6)第5章实验测试 (9)5. 1 测试步骤及内容 (9)5. 2 测试总结 (10)第6章实验总结 (11)第第一一章章 需需求求分分析析1. 1 引 言为方便日后软件的维护及升级,编写此需求说明书。
按照此次课程设计的相关要求,在老师的指导下设计完成了程序。
程序推荐在VC++ 6.0的环境下运行。
以下是程序中用到的相关变量及函数名称释义:int d[20][4],用来存储转换后的二进制数的数组char c[20], 用来存储十六进制数据的数组int i , 用来进行运算及统计数组长度的变量int g , 用来存储数组长度的变量int u , 用来计算输出二维数组第一维的维数的变量int j 用来计算输出二维数组第二维的维数的变量int e, 用来判断是否进行图像输出void Man() 将字符串数据转换为十进制数,然后进行二进制转换的函数void Tu() 显示曼彻斯特的模拟编码设计过程中使用到的参考资料有如下:1、C 程序设计(第四版)----谭浩强 著,清华大学出版社2、计算机网络(第三版)----吴功宜 著,清华大学出版社3、软件工程(2010年6月第一版)----景秀丽、吕洪林著,中国水利水电出版社1. 2 任务概述任务的目的是输入十六进制数据,输出曼彻斯特编码模拟的波形图。
最终使程序能够在VC++6.0中运行。
简单的曼彻斯特编码的C语言实现
曼彻斯特编码是减小信号交流分量,实现固定信号占空比的基本方法。
用C语言实现如下:
#include <stdio.h>
#define uint8_t unsigned char
#define uint16_t int
#define BOOL int
#define TRUE 1
#define FALSE 0
BOOL app_ManchesterEncode(uint8_t *indata,uint8_t *outdata,uint16_t inlength);
BOOL app_ManchesterDecode(uint8_t *indata,uint8_t *outdata,uint16_t inlength);
uint8_t indata[10]={0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef,0x43,0xb8};
uint8_t middata[20];
uint8_t outdata[10];
uint16_t inlength;
int main()
{
int length=10;
int i=0;
app_ManchesterEncode(indata,middata,length);
if(app_ManchesterDecode(middata,outdata,length*2)==FALSE)
printf("decode failed!\n");
printf("in:");
for(i=0;i<length;i++)
printf(" %2.2x",indata[i]);
printf("\n");
printf("mid:");
for(i=0;i<length*2;i++)
printf(" %2.2x",middata[i]);
printf("\n");
printf("out:");
for(i=0;i<length;i++)
printf(" %2.2x",outdata[i]);
printf("\n");
}
BOOL app_ManchesterEncode(uint8_t *indata,uint8_t *outdata,uint16_t inlength) {
uint16_t i=0;
uint8_t j=0;
for(i=0;i<inlength;i++)
{
outdata[2*i]=0;
outdata[2*i+1]=0;
for(j=0;j<8;j++)
if(j<4)
outdata[2*i+1]|=(((indata[i]>>j)&0x01)?2:1)<<j*2;
else
outdata[2*i]|=(((indata[i]>>j)&0x01)?2:1)<<(j*2-8);
}
return TRUE;
}
BOOL app_ManchesterDecode(uint8_t *indata,uint8_t *outdata,uint16_t inlength) {
uint16_t i=0;
uint8_t j=0;
for(i=0;i<inlength/2;i++)
{
outdata[i]=0;
for(j=0;j<8;j++)
{
if(j<4)
{
if((indata[2*i+1]>>(j*2)&0x03)==0x01)
;
else if((indata[2*i+1]>>(j*2)&0x03)==0x02)
outdata[i]|=0x01<<j;
else
{
printf("at i=%d j=%d data:%2.2x ",i,j,indata[2*i+1]&0x03);
return FALSE;
}
}
else
{
if((indata[2*i]>>(j*2-8)&0x03)==0x01)
;
else if((indata[2*i]>>(j*2-8)&0x03)==0x02)
outdata[i]|=0x01<<j;
else
{
printf("at i=%d j=%d\n",i,j);
return FALSE;
}
}
}
}
return TRUE;
}。