简单的曼彻斯特编码的C语言实现

合集下载

曼彻斯特解码程序

曼彻斯特解码程序

曼彻斯特解码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的曼彻斯特编解码实现

基于FPGA的曼彻斯特编解码实现

基于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。

将二进制数转换成差分曼彻斯特编码 c语言

将二进制数转换成差分曼彻斯特编码 c语言

首先需要了解二进制数和差分曼彻斯特编码的含义和原理: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语言实现

简单的曼彻斯特编码的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;}。

曼彻斯特编译码的CPLD实现

曼彻斯特编译码的CPLD实现
的曼彻 斯 特 编译 码 器 的逻辑 功 能 。
用户 可 以任 意 地对 芯 片进 行 编 程 、 密 , 软件 代替 加 用 硬件, 以实 现 自己 的设 计 要 求 。 当 用 户 需 要 更 改设 ( 场 可 现 计 时 , 可 轻 易 地 将 以 前 的 配 置 擦 除 , 新 进 行 配 又 重 置 。该 软件 支持 具 有 不 同结 构 的器 件 , 在 多 种平 能 台上 运行 , 允 许 设 计 者 自由选 择 他 们 使 用 的设 计 并
Ae h m公 司开 发 的 MA +P U 软 件 , 一 种 先 进 X L SI I 是
的芯 片软 件 , 有全 集成 化 的可 编 程逻 辑设 计环 境 , 具
F G / P D器 件 主要优 点 : P A CL
( ) 能集 成度 高 ; 1功 () 2 系统 设 计侠 ; () 计 灵 活 ; 3设 () 4 可靠 性 高 ; () 5 费用 低 。 MAX+H S Ⅱ软 件 组成 和 功能 MA X+P U I是 美 国 A e 公 司 开 发 的先 进 的 L SI hm
芯 片软 件 , 是一 种 全集 成 化 的可 编 程逻 辑设 计 环境 。
因此 可编 程逻 辑 器 件可 以通 过 软件 编程 而对 其硬 件 的结 构 和工 作 方 式 进 行 重 构 , 得 硬 件 的设 计 如 同 使 软 件设 计那 样 方 便 快 捷 , 大地 改 变 了传 统 的数 字 极
系统设 计 方 法 和设 计过 程 。 本文 介 绍 了在 该软 件 环境 下用 一种 高级 硬 件描 述 语 言 V L 1 现 数 字 基 带 传输 码— — 曼 彻 斯 特 HD [ 实 J
码 ( nh s r的编 解码 功 能 , 终 实 现 测井 系统 中 Macet ) e 最

AVR单片机 曼彻斯特编码 中断方式解码C程序文件

AVR单片机 曼彻斯特编码 中断方式解码C程序文件

96
{
97
if ((capbuf[j] + capbuf[j+1] + capbuf[j+2] + capbuf[j+3])%2 != capbuf[j+4])
98
{
99
return ; //行偶校验失败
100
}
101
}
102
PrintString("找到啦!\r\n");
103
for (i = 0, j = 0; i < 5; i++, j += 10)
104
{
105
num = capbuf[j] << 7;
106
num |= capbuf[j+1] << 6;
107
num |= capbuf[j+2] << 5;
108
num |= capbuf[j+3] << 4;
109
num |= capbuf[j+5] << 3;
110
num |= capbuf[j+6] << 2;
57 void UARTInit(void)
58 {
59
UCSR0B |= (1<<TXEN0)|(1<<RXEN0);
60
UBRR0H = 0;
61
UBRR0L = 12;
62
UCSR0C = 0x6;
63 }
64
65 void UARTSend(char c)
66 {
67
while(!(UCSR0A & (1 << UDRE0)));

曼彻斯特编解码电路设计毕业设计

曼彻斯特编解码电路设计毕业设计

毕业设计(论文)题目名称:曼彻斯特编解码电路设计学生姓名:院(系):电子信息学院专业班级:电气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软件中仿真通过;通过单片机最小系统,辅之外围电路,能够实现编解码。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

简单的曼彻斯特编码的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;
}。

相关文档
最新文档