学士学位论文基于c51的汉明码编码器和译码器的设计.docx
《学士学位论文基于c51的汉明码编码器和译码器的设计.docx》由会员分享,可在线阅读,更多相关《学士学位论文基于c51的汉明码编码器和译码器的设计.docx(23页珍藏版)》请在冰豆网上搜索。
学士学位论文基于c51的汉明码编码器和译码器的设计
基于C51的汉明码编码器和译码器的设计
摘要:
数字信号在传输过程中,由于受到干扰的影响,码元波形将变坏。
接收端收到后可能发生错误判决。
由乘性干扰引起的码间串扰,可以采用均衡的办法纠正,而加性干扰的影响可以采用差错控制的措施了。
汉明码就是一种能纠正一位错码且编码效率较高的线性分组码,它能纠正一个错码或检测两个错码。
关键词:
汉明码,编码,译码,C51
Abstract:
Thedigitalsignalduringtransmission,duetotheimpactofinterference,thesymbolwaveformdeterioration.Receivermayreceiveanerroraftertheverdict.Byamultiplicativeinter-symbolinterferencecausedbycrosstalk,abalancedapproachcanbeusedtocorrect,andtheadditiveeffectsofinterferencecanbeusedforerrorcontrolmeasures.Hammingcodeisacodetocorrectawrongandahighercodingefficiencyoflinearblockcodesthatcancorrectawrongcodeorwrongcodedetectiontwo.
Keywords:
Hammingcode,coding,decoding,C51language
目录
1绪论-3-
1.1问题的背景及提出-3-
1.2问题的研究及解决-3-
1.3设计研究的目的-4-
2Keil及Proteus简介-4-
2.1Proteus的简介-4-
2.2Keil软件及其调试功能简介-5-
2.3软件连接使用-6-
3(15,11)汉明码的原理-8-
3.1基本概念-8-
3.2监督矩阵H-9-
3.3生成矩阵G-10-
3.4伴随式(校正子)S-10-
4(15,11)汉明码编解码器的设计-11-
4.1(15,11)汉明码的编码思路-11-
4.2(15,11)汉明码的编码程序设计-12-
5(15,11)汉明码的译码思路及程序设计-16-
5.1(15,11)汉明码的译码思路-16-
5.2(15,11)汉明码的译码程序设计-18-
6编译程序的调试及仿真-20-
6.1系统仿真电路设计-20-
6.1.1系统电路框图-20-
6.1.2显示电路设计-20-
6.1.3键盘电路设计-21-
6.1.4整机设计-22-
6.2仿真分析-22-
6.2.1仿真流程图-22-
6.2.2调试过程-23-
7致谢-24-
8参考文献-24-
9附录-25-
附录一:
整机原理图-25-
附录二:
仿真效果图-25-
1绪论
1.1问题的背景及提出
近年来,对高效可靠的数字传输和存储系统的需求日益增长。
这种需求随着在商业、政府和军事领域面向数字信息的交换、处理和存储的大规模高速数据网的出现而变得更加迫切。
通信系统得主要质量指标是通信的有效性和可靠性。
在有噪声和损失存在的信道中,输入符号与接收符号不能一一对应,传输错误和判断错误的情况总会存在。
可靠数字传输系统的设计要求通信与计算机技术的融合,系统设计者所关心的一个主要问题就是如何控制差错以使得数据能够可靠重现。
在数字通信系统中,编码器分为两大类:
一类是信源编码,另一类是信道编码。
信源编码的目的是解决通信的有效性问题。
信道编码的目的是解决通信可靠性问题。
采用信道编码后,在信息码后增加了监督位,这样就可以增加了码元之间的相互关联,在接收端根据相应的译码规则,就能够察觉传输中有无误码,甚至能自动纠正错误。
我们把建立在代数学基础上的编码称为代数码。
在代数码中,常见的是线性码。
在线性码中信息位和监督位是由一些线性代数方程联系着的。
增加了冗余,必然降低了传输效率,却赢得了提高可靠性的好处。
那么为了纠正一位错码,在分组码中最少要增加多少监督位才行呢?
编码效率能否提高呢?
从这种思想出发进行研究,便导致汉明码的诞生。
汉明码是一种能够纠正一位错码且编码效率较高的线性分组码。
那么怎么实现汉明码的编码与译码呢?
本文将介绍基于C语言的汉明码的编码与译码系统,实现汉明码的编码与译码,从而实现传输的差错控制。
1.2问题的研究及解决
本设计研究基于C语言的汉明码的编码与译码系统。
根据汉明码的构成原理,我们需在信息位的后面加上监督位来监督码组中出现错码的位置,这样就方便在接收端对接收到的码组进行纠错以便得到正确的信息位,达到可靠的通信。
在本设计中,我们采用m序列循环产生预编码信号,经过汉明码编码系统产生带监督位的线性分组码。
发送这些码组,经过信道后这些码组由于受到干扰的影响,某些码元波形会变坏,在接收端经过汉明码译码系统来检验错码及纠正错码,它能纠正一个错码或者检测两个错码。
经过译码系统的检错与纠错,接收端就可以接收到正确的码组。
1.3设计研究的目的
通过运用proteus软件仿真对汉明码的编码译码有更深入的了解和认识,掌握汉明码的构造原理,了解汉明码在实际生活中的应用,掌握差错控制的基本方法,即在发送端的信息码元序列中,以某种确定的编码规则加入一些码元(称为监督码元),使信息序列与监督码元之间具有某种相关性。
在不断学习新的知识以及归纳复习老知识的同时,加强自身对通信系统设计的能力。
2Keil及Proteus简介
2.1Proteus的简介
ProteusISIS是英国Labcenter公司开发的电路分析与实物仿真软件[9]。
它运行于Windows操作系统上,可以仿真、分析(SPICE)各种模拟器件和集成电路,该软件的特点是:
①实现了单片机仿真和SPICE电路仿真相结合。
具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS232动态仿真、I2C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。
②支持主流单片机系统的仿真。
目前支持的单片机类型有:
68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各种外围芯片。
③提供软件调试功能。
在硬件仿真系统中具有全速、单步、设置断点等调试功能,同时可以观察各个变量、寄存器等的当前状态,因此在该软件仿真系统中,也必须具有这些功能;同时支持第三方的软件编译和调试环境,如KeilC51uVision2等软件。
④具有强大的原理图绘制功能。
总之,该软件是一款集单片机和SPICE分析于一身的仿真软件,功能极其强大。
Proteus主要用于绘制原理图并可进行电路仿真,ProteusARES主要用于PCB设计。
ISIS的主界面主要包括:
1是电路图概览区、2是元器件列表区、3是绘图区。
绘制电路图的过程如下:
单击2区的P命令即弹出元器件选择(PickDevices)对话框,Proteus提供了丰富的元器件资源,包括30余种元器件库,有些元器件库还具有子库。
利用该对话框提供的关键词(Keywords)搜索功能,输入所要添加的元器件名称,即可在结果(Results)中查找,找到后双击鼠标左键即可将该元器件添到2区,待所有需要的元器件添加完成后点击对话框右下角的OK按钮,返回主界面。
接着在2区中选中某一个元器件名称,直接在3区中单击鼠标左键即可将该元器件添加到3区。
由于是英国的软件,特别要注意的是绘图区中鼠标的操作和一般软件的操作习惯不同,这正像是司机座位和人行道走向和国内不同一样。
单击左键是完成在2区中被选中的元器件的粘贴功能;将鼠标置于某元器件上并单击右键则是选中该元器件(呈现红色),若再次单击右键的话则删除该元器件,而单击左键的话则会弹出该元器件的编辑对话框(EditComponent);若不需再选中任何元器件,则将鼠标置于3区的空白处单击右键即可;另外如果想移动某元器件,则选中该元器件后再按住鼠标左键即可将之移动。
元器件之间的连线方法为:
将鼠标移至元器件的某引脚,即会出现一个“×”符号,按住鼠标左键后移动鼠标,将线引至另一引脚处将再次出现符号“×”,此时单击鼠标左键便可完成连线。
连线时在需拐弯的地方单击鼠标左键即可实现方向的改变。
绘制好电路后,可利用1区的绿色边框对3区的电路进行定位。
2.2Keil软件及其调试功能简介
目前流行的51系列单片机开发软件是德国Keil公司推出的KeilC51软件,它是一个基于32位Windows环境的应用程序,支持C语言和汇编语言编程,其6.0以上的版本将编译和仿真软件统一为μVision(通常称为μV2)。
Keil提供包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,由以下几部分组成:
μVisionIDE集成开发环境(包括工程管理器、源程序编辑器、程序调试器)、C51编译器、A51汇编器、LIB51库管理器、BL51连接/定位器、OH51目标文件生成器以及Monitor-51、RTX51实时操作系统。
应用Keil进行软件仿真开发的主要步骤为:
编写源程序并保存——建立工程并添加源文件——设置工程——编译/汇编、连接,产生目标文件——程序调试。
Keil使用“工程”(Project)的概念,对工程(而不能对单一的源程序)进行编译/汇编、连接等操作。
工程的建立、设置、编译/汇编及连接产生目标文件的方法非常易于掌握。
首先选择菜单File—New…,在源程序编辑器中输入汇编语言或C语言源程序(或选择File—Open…,直接打开已用其他编辑器编辑好的源程序文档)并保存,注意保存时必须在文件名后加上扩展名.asm(.a51)或.c;然后选择菜单Project—NewProject…,建立新工程并保存(保存时无需加扩展名,也可加上扩展名.uv2);工程保存后会立即弹出一个设备选择对话框,选择CPU后点确定返回主界面。
这时工程管理窗口的文件页(Files)会出现“Target1”,将其前面+号展开,接着选择SourceGroup1,右击鼠标弹出快捷菜单,选择“AddFiletoGroup‘SourceGroup1’”,出现一个对话框,要求寻找并加入源文件(在加入一个源文件后,该对话框不会消失,而是等待继续加入其他文件)。
加入文件后点close返回主界面,展开“SourceGroup1”前面+号,就会看到所加入的文件,双击文件名,即可打开该源程序文件。
紧接着对工程进行设置,选择工程管理窗口的Target1,再选择Project—OptionforTarget’Target1’(或点右键弹出快捷菜单再选择该选项),打开工程属性设置对话框,共有8个选项卡,主要设置工作包括在Target选项卡中设置晶振频率、在Debug选项卡中设置实验仿真板等,如要写片,还必须在Output选项卡中选中“CreatHexFi”;其他选项卡内容一般可取默认值。
工程设置后按F7键(或点击编译工具栏上相应图标)进行编译/汇编、连接以及产生目标文件。
成功编译/汇编、连接后,选择菜单Debug—Start/StopDebugSession(或按Ctrl+F5键)进入程序调试状态,Keil提供对程序的模拟调试功能,内建一个功能强大的仿真CPU以模拟执行程序。
Keil能以单步执行(按F11或选择Debug—Step)、过程单步执行(按F10或选择Debug—StepOver)、全速执行等多种运行方式进行程序调试。
如果发现程序有错,可采用在线汇编功能对程序进行在线修改(Debug—InlineAssambly…),不必执行先退出调试环境、修改源程序、对工程重新进行编译/汇编和连接、然后再次进入调试状态的步骤。
对于一些必须满足一定条件(如按键被按下等)才能被执行的、难以用单步执行方式进行调试的程序行,可采用断点设置的方法处理(Debug—Insert/RemoveBreakpoint或Debug—Breakpoints…等)。
在模拟调试程序后,还须通过编程器将.hex目标文件烧写入单片机中才能观察目标样机真实的运行状况。
Keil软件Eval版(免费产品)的功能与商业版相同,只是程序的最大代码量不得超过2kB,但对初学者而言已是足够。
Keil软件由于其强大的软件仿真功能,友好的用户界面以及易于掌握的特点而受到工程技术人员的欢迎,有人甚至认为Keil是目前最好的51单片机开发应用软件。
2.3软件连接使用
a、假若KeilC与Proteus均已正确安装在C:
\ProgramFiles的目录里,把C:
\ProgrameFile\LabcenterElectronics\Proteus6Professional\MODELS\VDM51.dl复制到C:
\ProgramFile\KeilC\C51\BIN目录里。
b、用记事本打开C:
\ProgramFiles\keilC\C51\TOOLS.INI文件,在[C51]栏目下加入:
TDRV5=BIN\VDM51.DLL("ProteusVSMMonitor-51Driver")
其中“TDRV5”中的“5”要根据实际情况写,不要和原来的重复。
(步骤1和2只需在初次使用设置。
)
c、进入KeilCμVision2开发集成环境,创建一个新项目(Project),并为该项目选定合适的单片机CPU器件(如:
Atmel公司的AT89C51)。
并为该项目加入KeilC源程序。
d、单击“Project菜单/OptionsforTarget”选项或者点击工具栏的“optionfortarget”按钮
,弹出窗口,点击“Debug”按钮,出现如图所示页面。
在出现的对话框里在右栏上部的下拉菜单里选中“ProteusVSMMonitor一51Driver”。
并且还要点击一下“Use”前面表明选中的小圆点。
再点击“Setting”按钮,设置通信接口,在“Host”后面添上“127.0.0.1”,如果使用的不是同一台电脑,则需要在这里添上另一台电脑的IP地址(另一台电脑也应安装Proteus)。
在“Port”后面添加“8000”。
设置好的情形如图所示,点击“OK”按钮即可。
最后将工程编译,进入调试状态,并运行。
e、Proteus的设置
进入Proteus的ISIS,鼠标左键点击菜单“Debug”,选中“useromotedebugermonitor”,如图所示。
此后,便可实现KeilC与Proteus连接调试。
f、KeilC与Proteus连接仿真调试
单击仿真运行开始按钮
,我们能清楚地观察到每一个引脚的电频变化,红色代表高电频,蓝色代表低电频。
3(15,11)汉明码的原理
3.1基本概念
海明码是一种可以纠正一位差错的编码。
它是利用在信息位为k位,增加r位冗余位,构成一个n=k+r位的码字,然后用r个监督关系式产生的r个校正因子来区分无错和在码字中的n个不同位置的一位错。
它必需满足以下关系式:
2^r>=n+1 或 2^r>=k+r+1
海明码的编码效率为:
R=k/(k+r)
式中k为信息位位数,r为增加冗余位位数
线性分组码是一类重要的纠错码,应用很广泛。
在(n,k)分组码中,若督元是按线性关系相加而得到的,则称其为线性分组码。
现在以(15,11)分组码为例来说明线性分组码的特点。
设其码字为A=[a6,a5,a4,a3,a2,a1,a0],其中前4位是信息元,后3位是监督元,可用下列线性方程组来描述该分组码,产生监督元:
a2=a6+a5+a4
a1=a6+a5 +a3 (2.1.1)
a0=a6 +a4+a3
显然,这3个方程是线性无关的。
经计算可得(15,11)码的全部码字,如表2-1所示。
表2-1(15,11)码的全部码字
?
/P>
序
号
码 字
序
号
码 字
信息码元
监督元
信息码元
监督元
0
0 0 0 0
0 0 0
8
1 0 0 0
1 1 1
1
0 0 0 1
0 1 1
9
1 0 0 1
1 0 0
2
0 0 1 0
1 0 1
10
1 0 1 0
0 1 0
3
0 0 1 1
1 1 0
11
1 0 1 1
0 0 1
4
0 1 0 0
1 1 0
12
1 1 0 0
0 0 1
5
0 1 0 1
1 0 1
13
1 1 0 1
0 1 0
6
0 1 1 0
0 1 1
14
1 1 1 0
1 0 0
7
0 1 1 1
0 0 0
15
1 1 1 1
1 1 1
不难看出,上述(15,11)码的最小码距d0=3,它能纠1个错或检2个错。
汉明码是能够纠正单个错误的线性分组码,其特点是:
最小码距d0=3,码长n与监督位满足n=2r-1的关系,上述的(15,11)线性分组码就是一个汉明码。
3.2监督矩阵H
式(2.1.1)所示(15,11)汉明码的3个监督方程改写后可用矩阵形式表示为
a14
.
0110100 .
.a6
. a5
1110100 a4 0
1101010 ·a3 = 0 (2.2.1)
1011001 a2 0
a1
a0
并简记为 H·AT=0T或A·HT=0 (2.2.2)
H称为监督矩阵,一旦H给定,信息位和监督位之间的关系也就确定了。
H矩阵可以分成2部分
1110 100
H= 1101 010 =[PIr] (2.2.3)
1011 001
H·AT=0T,可以用来作为判断接收码字A是否出错的依据。
3.3生成矩阵G
把监督方程补充完整并改写为矩阵形式
a6 1000
a5 0100
a4 0010 a6
a3 = 0001 ·a5 (2.3.1)
a2 1110 a4
a1 1101 a3
a0 1011
A=[a6a5a4a3]·G (2.3.2)
其中
1000 111
0100 110
G= 0010 101 (2.3.3)
0001 011
G称为生成矩阵,由G和信息组就可以产生全部码字。
生成矩阵也可以分成2部分,即 G=[Ik Q] (2.3.4)
其中 111
Q= 110 =PT (2.3.5)
101
011
3.4伴随式(校正子)S
设发送码组A=[an—1,an—2,…,a1,a0],在传输过程中可能发生误码。
接收码组B=[bn—1,bn—2,…,b1,b0 ],收发码组之差定义为错误图样E,即
E=B-A (2.4.1)
令S=BHT,称为伴随式或校正子。
S=BHT=(A+E)HT =EHT (2.4.2)
上述(15,11)汉明码的伴随式与错误图样的对应关系如表2-2所示。
表2-2(15,11)汉明码S与E的对应关系
序
号
错误
码位
E
S
e6 e5 e4 e3 e2 e1 e0
s2 s1 s0
0
/
0 0 0 0 0 0 0
0 0 0
1
b0
0 0 0 0 0 0 1
0 0 1
2
b1
0 0 0 0 0 1 0
0 1 0
3
b2
0 0 0 0 1 0 0
1 0 0
4
b3
0 0 0 1 0 0 0
0 1 1
5
b4
0 0 1 0 0 0 0
1 0 1
6
b5
0 1 0 0 0 0 0
1 1 0
7
b6
1 0 0 0 0 0 0
1 1 1
4(15,11)汉明码编解码器的设计
4.1(15,11)汉明码的编码思路
(15,11)汉明码的编码就是将输入的四位信息码编成七位的汉明码,即加入三位监督位。
根据式(2.3.2)A=[a6a5a4a3]·G可知,信息码与生成矩阵G的乘积就是编好以后的(15,11)汉明码,而生成矩阵G又是已知的,由式(2.3.3)得