差分曼彻斯特编码课程设计及代码

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

课程设计报告计算机网络
题目:差分曼彻斯特模拟编码
姓名:
专业:
班级:
学号:
指导教师:
2013.12.21
目录
1.课程设计目的 (01)
2.课程设计要求 (01)
3.实验要求 (01)
4.差分曼彻斯特编码简介 (01)
5.设计思路 (02)
6.图像示意 (02)
7.算法流程图 (02)
8.实验模块分析 (03)
9.运行结果 (10)
10.实验总结 (11)
(1)结果分析 (11)
(2)实验感想 (12)
11.附录代码 (13)
一、课程设计目的:
通过课程设计,巩固《计算机网络》课程学习的内容,强化上机动手能力,为后续各门计算机相关课程的学习打下坚实基础。

课程设计为学生提供了一个独立实践的机会,将课本上的理论知识和实际应用问题进行有机结合,锻炼综合分析、解决实际问题的能力。

二、课程设计要求:
1、对系统进行功能模块分析、控制模块分析正确;
2、系统设计要实用;
3、编程简练,可用,功能全面,具有较好的健壮性;
4、说明书、流程图要清楚。

三、实验要求:
通过编译语言实现一个输入十六进制数输出差分曼彻斯特编码模拟图像实验。

四、差分曼彻斯特编码简介:
差分曼彻斯特编码是对曼彻斯特编码的一种改进,保留了曼彻斯特编码作为“自含时钟编码”的优点,仍将每比特中间的跳变作为同步之用,但是每比特的取值则根据其开始处是否出现电平的跳变来决定。

其原理是:每一位中间都有一个跳变,每位开始时有跳变表示“0”,无跳变表示“1”。

位中间跳变表示时钟,位前跳变表示数据。

其优点是:时钟、数据分离,便于提取。

五、设计思路:
输入16进制数据,能够输出差分曼却斯特波形图,通过数组转变,将十六进制数据转化成二进制数据,转化过程中,必须将一位十六进制数据转化成四位二进制数据,并判断差分曼彻斯特编码,输出模拟图像。

六、图像示意:
七、算法流程图:
判断输入数
据进制
不是二进制数,则运行结束
是二进制组成的数据
输入一个十六进制数
开始
将十六进制转换四位二进制数表示
八、实验模块分析:
将一个十六进制数转化为二进制数
void test()
{
char c[MAX];
int a[16]={0};
int i=0,j;
cout<<"请输入一个十六进制数:"<<endl;
cin>>c;
while(c[i])
{
if(c[i]>'0'&&c[i]<'9')
c[i]=c[i++]-48;
else
if(c[i]>='A'&&c[i]<='Z')
c[i]=c[i++]-55;
else if(c[i]>='a'&&c[i]<='z')
c[i]=c[i++]-87;
else
{
cout<<"输入错误,请从新输入"<<endl;
return;
}
}
i=0;
while(c[i])
{
for(j=3;j>=0;j--)
{
a[j]=c[i]%2;
c[i]/=2;
}
for(j=0;j<4;j++)
cout<<a[j]<<endl;
i++;
}
cout<<endl;
}
判断输入的数据是不是由01组成的序列。

若不是,则做出错处理。

bool check(char *ch)
{
//局部变量
bool flag=true;
int index=1;
char temp='n';
if(ch[0]=='\0')
{
cout<<"(----请输入上述转换的数据!----)"<<endl;
flag=false;
}
//只有ch[0]!='\0'时才会进入这个循环
while(ch[index]!='\0' && ch[0]!='\0')
{
if(ch[index]==' ') //如果输入的数据中有空格则忽略
{
index++;
continue;
}
if(ch[index]!='0' && ch[index]!='1')
{
cout<<"源数据有误!"<<endl<<endl;
//根据用户需要决定是否继续编码过程
cout<<"是否继续?[y/n]:";
cin>>temp;
if(temp!='y') exit(1);
flag=false;
break;
}
index++;
}
return flag;
}
差分曼彻斯特编码。

第一个数据若是1,则用10代替;若是0,则用01代替。

其他数据,后一个数据若是1,则数据起始位置不跳变;若是0,则数据起始位置产生跳变。

并且,每个数据中间都会产生跳变。

void Differential_Manchester_Encody(char *ch)
{
int index=1;
char temp; //用temp来记录前一个数据后半部分是0还是1 cout<<"差分曼彻斯特编码图像为: "<<endl;
if(ch[0]=='0')
{
cout<<"-_ ";
temp='1';
}
else
{
cout<<"_- ";
temp='0';
}
while(ch[index]!='\0') //编码未完成才继续{
if(ch[index]==' ')
{
index++;
continue;
}
if(ch[index]=='1') {
if(temp=='1')
{
cout<<"_- ";
temp='0';
}
else
{
cout<<"-_ ";
temp='1';
}
}
else
{
if(temp=='1')
{
cout<<"-_ ";
temp='1';
}
else
{
cout<<"_- ";
temp='0';
}
}
index++;
}
cout<<endl<<endl;
}
主函数部分:
int main()
{ test();
//char buffer[MAX];//存放输入数据的缓冲区
char c[MAX];
//buffer[MAX]=c[MAX];
char temp='y';
while(temp=='y')
{
cout<<"非归零码为: "<<endl;
gets(c); //利用gets而不用cin是为了当输入的数据中含有空格时能读取完整的码
if(check(c)) //首先检查输入的数据是否符合要求,01串符合要求
{
Differential_Manchester_Encody(c);
//根据用户需要决定是否继续编码过程
cout<<"continue or not[y/n]:";
cin>>temp;
getchar(); //这个getchar()是必须存在的,否则gets 函数会读取cin>>temp中的回车
}
}
return 0;
}
九、运行结果:
十、实验总结:
1、结果分析:
(1)差分曼彻斯特码编码规则:
从上图可看出差分曼彻斯特码的编码规则,即:
i.每个单位周期内,以1/2周期的时刻处,分为高低两个等时长
电平。

有两种:上升(先高后低)或下降(先低后高)。

ii.数据流的二进制编码中,第一个数据位是1,则编码为下降。

0则相反。

iii.数据流的二进制编码中,其它数据位,则根据此位跟前一位的电平比较。

相同则编码为不跳变(跟上一位后半部分一样)。

不同则相反。

(2)差分曼彻斯特码特点:在信号为开始时不改变信号极性,表示
逻辑“1”;在信号为开始时改变信号极性,表示逻辑“0”。


比特为1时,前T/2比特位的电平与上一个比特位的后T/2的
比特位的电平相同;当比特为0时,前T/2比特位的电平与上
一个比特位的后T/2比特位的电平相反。

2、实验感想:
首先,让我对差分曼彻斯特编码原理有了进一步的了解。

差分曼彻斯特码又叫数字双相码,每个时钟中间都有一次跳变这个跳变作同步之用。

其次,通过这次课程设计,我认识到了完成一项课程设计工作不但需要对知识的掌握和理解,还需要不懂就问,同学间共同努力来解决课程设计当中的种种困难,开拓创新能力的目的。

最后,通过这次课程设计,让我对说明书的模板有了更清晰的了解,加深了我思想中对文章模范化的概念,对我一年后的毕业论文也起了轮廓性作用。

这将会变成我们在大学生活中获得的又一笔巨大的财富。

附录代码:
#include<iostream>
using namespace std;
#define MAX 1024
bool check(char *ch)
{
bool flag=true;
int index=1;
char temp='n';
if(ch[0]=='\0')
{
cout<<"(----请输入上述转换的数据!----)"<<endl;
flag=false;
}
while(ch[index]!='\0' && ch[0]!='\0')
{
if(ch[index]==' ') //如果输入的数据中有空格则忽略
{
index++;
continue;
}
if(ch[index]!='0' && ch[index]!='1')
{
cout<<"源数据有误!"<<endl<<endl;
cout<<"是否继续?[y/n]:";
cin>>temp;
if(temp!='y') exit(1);
flag=false;
break;
}
index++;
}
return flag;
}
void test()
{
char c[MAX];
int a[16]={0};
int i=0,j;
cout<<"请输入一个十六进制数:"<<endl;
cin>>c;
while(c[i])
{
if(c[i]>'0'&&c[i]<'9')
c[i]=c[i++]-48;
else
if(c[i]>='A'&&c[i]<='Z')
c[i]=c[i++]-55;
else if(c[i]>='a'&&c[i]<='z')
c[i]=c[i++]-87;
else
{
cout<<"输入错误,请从新输入"<<endl;
return;
}
}
i=0;
while(c[i])
{
for(j=3;j>=0;j--)
{
a[j]=c[i]%2;
c[i]/=2;
}
for(j=0;j<4;j++)
cout<<a[j]<<endl;
i++;
}
cout<<endl;
}
void Differential_Manchester_Encody(char *ch) {
int index=1;
char temp;
cout<<"差分曼彻斯特编码图像为: "<<endl;
if(ch[0]=='0')
{
cout<<"-_ ";
temp='1';
}
else
{
cout<<"_- ";
temp='0';
}
while(ch[index]!='\0')
{
if(ch[index]==' ')
{
index++;
continue;
}
if(ch[index]=='1')
{
if(temp=='1')
{
cout<<"_- ";
temp='0';
}
else
{
cout<<"-_ ";
temp='1';
}
}
else
{
if(temp=='1')
{
cout<<"-_ ";
temp='1';
}
else
{
cout<<"_- ";
temp='0';
}
}
index++;
}
cout<<endl<<endl;
}
int main()
{
test();
char c[MAX];
char temp='y';
while(temp=='y')
{
cout<<"非归零码为: "<<endl;
gets(c);
if(check(c)) {
Differential_Manchester_Encody(c);
cout<<"continue or not[y/n]:";
cin>>temp;
getchar();
}
}
return 0;
}
19。

相关文档
最新文档