电子设计应用软件训练总结报告.docx
《电子设计应用软件训练总结报告.docx》由会员分享,可在线阅读,更多相关《电子设计应用软件训练总结报告.docx(36页珍藏版)》请在冰豆网上搜索。
电子设计应用软件训练总结报告
xxxxxx大学xxxxxx学院
电子设计应用软件训练
总结报告
学生姓名:
专业:
班级:
学号:
指导教师:
训练时间:
20xx年6月22日至20xx年7月3日
PROTEL部分
一、任务内容及要求说明
训练任务
(1)熟练掌握PROTEL软件的使用;
(2)按要求绘制电路原理图和PCB版图(能够用自动布线和手动布线相结合);
(3)能够按要求建立元件库和封装库。
基本要求及说明
(1)电路原理图图纸尺寸按照给定的任务作相应的设置;
(2)电路原理图见PROTEL训练任务部分;
(3)按指定电路图在PROTEL99中绘制原理图和印制板图;
(4)按照给定要求创建原理图器件和该器件的相应的封装
图1.1要求原理图
二、原理图绘制说明
Ø新建工程
1.在菜单栏选择File→New→Project;
2.NewProjects面板出现;
3.选择“PCBproject”;
4.更改工程名称和存储位置。
图1.2新建PCB工程选项窗口
Ø新建原理图纸
1.单击File→New→Schematic,或者在Files面板的New单元选择:
SchematicSheet;
2.在图纸界面右击选择Options→DocumentOptions;
3.将图纸大小改为A4;
4.通过选择File→SaveAs来将新原理图文件重命名(扩展名为*.SchDoc)
图1.3Files面板的New单元
图1.4DocumentOptions选项窗口
Ø新建元件库
1.在菜单栏选择File→New→Library→SchematicLibrary;
2.通过选择File→SaveAs来将新元件库文件重命名(扩展名为*.SchLib);
3.在左侧面板下方选择SCHlibrary选项,点击“Add”按钮新建元件并为新元件命名;
4.按照所需元件要求绘制元件。
图1.5选择元件库选项
图1.6添加元件并命名
Ø新建封装库
1.在菜单栏选择File→New→Library→PCBLibrary;
2.通过选择File→SaveAs来将新封装库文件重命名(扩展名为*.PcbhLib);
3.在左侧面板下方选择PCBlibrary选项,右击选择“NewBlankComponent”新建封装,双击元件名进行重命名和相关参数设置;
4.按照元件给定的参数绘制封装。
图1.7选择PCB库选项并新建封装
Ø元器件的查找
1.点击右侧面板Libraries,选择
,在Project选项下找到建好的元件库,将所需要用的库文件添加进Libraries;
2.直接在Libraries面板中查找元器件;
图1.8将所需要用的库文件添加进Libraries
图1.9在Libraries面板中查找元器件
Ø绘制原理图
1.找到所需元器件后,直接将其拖动至原理图中的相应位置。
在拖动过程中,可以使用快捷键对元器件进行一些操作:
1)Space、ShiftSpace旋转元件
2)X、Y翻转元件
3)Tab修改元件属性
4)G切换捕捉栅格(10、5、1)
5)左键单击放置元件
6)右键单击停止放置
2.按照要求修改元件属性
放置元件时按“Tab”键修改,也可以在放置好的元件双击修改
3.按照给定的引脚标号进行对应用导线连接,在一些不便连线的地方放置网络标号。
4.检查所画原理图与给定原理图是否一致。
Ø元器件封装的选择
常用元件的封装系统默认都已给定,自己绘制的元件需要手动添加绘制的封装
1.双击需添加封装的元件,在属性面板中选择“Add”添加封装;
2.点击“Browse”选择封装库及所需封装;
3.点击菜单栏File→Save或者用快捷键Ctrl+S保存原理图。
图1.10为元件添加封装
图1.11选择封装库及封装
三、印制板图绘制说明
1.在菜单栏中选择File→New→PCB新建一个PCB文档;
2.通过选择File→SaveAs来将文件重命名(拓展名为*.PcbDoc);
3.选择Design→ImportChangesFrom课程设计.PrjPcb;
4.点击“ValidateChanges”检测,如有错误需更改原理图;
5.点击“ExecuteChanges”执行更改导入原理图;
6.通过原理图在pcb板上对原器件的位置进行调整,尽量减少更多布线的长度和交叉;
7.进行自动布线;
8.对自动布线未连接和不符合布线规则的连线进行手动布线之完成整个PCB版图的绘制;
9.保存。
图1.12原理图的检测及导入
图1.13导入的元件
四、总结
此次课程设计是一项比较浩大的“工程”,在此之前,我从未进行过这样的设计,因此这次算得上是一次不大不小的突破。
回顾本次课程设计,难点颇多,主要集中于以下几点:
1)之前从未接触过类似Protel99SE,AltiumDesigner这样的电子电路设计软件,且没有过相关使用电脑进行电路设计的经验。
2)对于元器件的认识和对于PCB板、封装的基本概念不够成熟,致使进度推进比较缓慢。
3)PCB布线对于整体布局能力的要求较高。
通过几天的课程设计,以上的问题大都得到了较为圆满的解决。
我也认识到了计算机技术对于电子设计的强大辅助能力和EDA技术的巨大发展前景,这更加激发了我对于该软件和本专业相关课程学习的兴趣。
我在本次课程设计过程中也积累了一定的PCB设计绘制经验和能力,这对于解决日后学习工作中遇到的相关问题都是难能可贵的财富。
五、参考文献
1.袁鹏平,何志刚,罗开玉.快速精通AltiumDesigner6电路图和PCB设计,[M]北京:
化学工业出版社,2008.12.
2.刘强.AltiumDesigner原理图与PCB设计及仿真.[M]杭州:
电子工业出版社,2003.
3.张伟、王力.Protel99SE基础教程.[M]北京:
人民邮电出版社,2006年.
4.刘天旺.Protel99SE电路设计应用教程.[M]杭州:
电子工业出版社,2008年.
5.谈世哲.Protel99SE电子工程实践基础与典型范例.[M]杭州:
电子工业出版社,2008.
6.吉雷.Protel99从入门到精通.第二版.[M]西安:
西安电子科技大学出版社,2002.
附录I电路原理图
附录II印制板图
软件设计部分
一、问题描述
利用哈夫曼编码进行信息通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。
试写一个哈夫曼码的编/译码系统。
一个完整的系统应具有以下功能:
(1)I:
初始化(Initialization)。
从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件hfmTree中。
(2)E:
编码(Encoding)。
利用已建好的哈夫曼树(如不在内存坝u从文件hfmTree中读人),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。
(3)D:
译码(Decoding)。
利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。
(4)P:
打印代码文件(Print)。
将文件CodeFile以紧凑格式显示在终端上,每行50个代码。
同时将此字符形式的编码文件写入文件CodePrin中。
(5)T:
打印哈夫曼树(TreePrinting)。
将已在内存中的哈夫曼树以直观的方式(树或凹人表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。
二、设计过程
1.储存结构
typedefstruct
{
intweight;
intflag;
intparent;
charch;
intlchild;
intrchild;
}HafNode;
typedefstruct
{
intbit[MAX];
intstart;
intweight;
charch;
}Code;
2.关于主要算法的想法
A、编码算法:
1)根据输入的数据,从中选取两棵根结点权值最小且没有被选的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为左右子树上根结点的权值之和。
2)哈夫曼树已经建立后,从叶子到根逆向求每一个字符的哈夫曼编码。
B、译码算法:
译码的过程是分解电文中的字符串,从根出发,如果为字符‘0’就找左孩子,如果为字符‘1’就找右孩子,直至叶子结点,得到该子串相应的字符并输出。
3.
系统模块划分
图2.1过程或函数调用关系图
4.流程图
图2.2生成哈夫曼树流程图
图2.3生成哈夫曼编码流程图
图2.4打印代码流程图
图2.5初始化流程图
图2.6编码过程流程图
图2.7译码过程流程图
三、调试过程及实验结果
1.在程序根目录下建立“abc.txt”将字符集和频度的实际统计数据放入,其中第一个数字为字符个数,字符与频度输入格式为:
“A64”;
2.在程序根目录下建立“ToBeTran.txt”将所需编码的正文“THISPROGRAMISMYFAVORITE”放入其中;
图2.8字符集与频度和编码正文
3.运行程序;
4.对程序各功能进行调试;
5.打开根目录检查各输出文件是否正确。
图2.9程序主菜单
图2.9初始化
标注:
编码过程中可以选择手动输入和从文件输入两种输入类型
图2.10文件输入编码过程
图2.11手动输入编码过程
图2.12译码过程
图2.13打印代码文件
图2.14打印哈弗曼树
图2.15保存在文件里的哈夫曼编码
图2.16编码、译码、代码打印结果
四、心得体会
通过这次课程设计,我了解到:
“数据结构”在计算机科学中是一门综合性的基础课。
而在这次课程设计中所用到的数据结构知识是C语言基础之上的,若是C语言基础知识不牢固,要想做好这次课程设计是有一定的困难的。
所以在设计编写这个程序的时候,也顺便复习了C语言的相关内容,加深了我对C语言的理解和应用,并且也深深体会到了数据结构的重要性。
在本次课程设计过程中,我体会到自己以前所学的东西太少太浅显了,很多知识都不知道,也遇到了不少实际问题,使我发现了在学习过程中的不足。
在代码设计时,也出现了一些基本的C语言语法错误,如函数的嵌套定义,结构体的定义等,在老师和同学的帮助下都一一解决了,但是这也反映了我的C语言基础知识不够扎实,在以后学习过程中要加强这方面的学习。
通过本次课程设计,我对编写程序的过程有了进一步的理解。
数据结构的问题最主要的内容在于算法思想,而程序编写次之。
在编写程序时,如果算法思想
是正确的,那么这个程序就已经成功了一多半。
算法思想在数据结构中占有重要地位。
五、参考文献
1.严蔚敏、吴伟民.数据结构题集(C语言版),[M]北京:
清华大学出版社,1992.
2.严蔚敏吴伟名编著,《数据结构》[M].,清华大学出版社,2001年.
3.谭浩强.C程序设计.第三版,[M]北京:
清华大学出版社,2005.
4.秦锋.数据结构(C语言版).[M]北京:
清华大学出版社,2011
5.裘宗燕.从问题到程序科学,[M]北京:
北京大学出版社,1999年
六、程序清单
#include
#include
#include
#defineMAX100
#defineMAXVALUE10000
typedefstruct
{
intweight;
intflag;
intparent;
charch;
intlchild;
intrchild;
}HafNode;
typedefstruct
{
intbit[MAX];
intstart;
intweight;
charch;
}Code;
typedefstruct
{
charbit[MAX];
charch;
intweight;
}Coding;
voidhaffman(intweight[],charch[],intn,HafNodehaffTree[])//生成哈夫曼树的函数
{
inti,j,m1,m2,x1,x2;
for(i=0;i<2*n-1;i++)
{
if(i{
haffTree[i].weight=weight[i];
haffTree[i].ch=ch[i];
}
else
haffTree[i].weight=0;
haffTree[i].parent=-1;
haffTree[i].flag=0;
haffTree[i].lchild=-1;
haffTree[i].rchild=-1;
}
for(i=0;i{
m1=m2=MAXVALUE;
x1=x2=0;
for(j=0;j{
if(haffTree[j].weight{
m2=m1;
x2=x1;
m1=haffTree[j].weight;
x1=j;
}
elseif(haffTree[j].weight{
m2=haffTree[j].weight;
x2=j;
}
}
haffTree[x1].parent=n+i;
haffTree[x2].parent=n+i;
haffTree[x1].flag=1;
haffTree[x2].flag=1;
haffTree[n+i].weight=haffTree[x1].weight+haffTree[x2].weight;
haffTree[n+i].lchild=x1;
haffTree[n+i].rchild=x2;
}
FILE*fp;
fp=fopen("huffman.txt","w+");
printf("%d\n",n);
fprintf(fp,"%d\n",n);
for(i=0;ifprintf(fp,"%c%d%d%d\n",haffTree[i].ch,haffTree[i].parent,haffTree[i].lchild,haffTree[i].rchild);
for(i=n;i<2*n-1;i++)
fprintf(fp,"%d%d%d\n",haffTree[i].parent,haffTree[i].lchild,haffTree[i].rchild);
fclose(fp);
}
voidHaffmanCode(HafNodehaffTree[],intn,CodehaffCode[])/*生成哈夫曼编码的函数*/
{
Code*cd=(Code*)malloc(sizeof(Code));
inti,j,child,parent;
for(i=0;i{
cd->start=n-1;
cd->weight=haffTree[i].weight;
cd->ch=haffTree[i].ch;
child=i;
parent=haffTree[child].parent;
while(parent!
=-1)
{
if(haffTree[parent].lchild==child)
cd->bit[cd->start]=0;
else
cd->bit[cd->start]=1;
cd->start--;
child=parent;
parent=haffTree[child].parent;
}
for(j=cd->start+1;jhaffCode[i].bit[j]=cd->bit[j];
haffCode[i].start=cd->start+1;
haffCode[i].weight=cd->weight;
haffCode[i].ch=cd->ch;
}
}
voidInit(intweight[],charch[])//初始化操作,生成哈夫曼树及哈夫曼编码
{
FILE*fp;
inti,j,n;
charch1,wj[15];
printf("现在进行初始化操作,请导入文件,输入I\n");
scanf("%c",&ch1);
if(ch1=='I')
{
printf("请输入文件名:
\n");
scanf("%s",wj);
fp=fopen(wj,"r");
fscanf(fp,"%d",&n);
}
HafNode*myHaffTree=(HafNode*)malloc(sizeof(HafNode)*(2*n+1));
Code*myHaffCode=(Code*)malloc(sizeof(Code)*n);
for(i=0;i{
if(ch1=='I')
fscanf(fp,"%c%d",&ch[i],&weight[i]);
}
if(ch1=='I')
fclose(fp);
haffman(weight,ch,n,myHaffTree);
HaffmanCode(myHaffTree,n,myHaffCode);
fp=fopen("hfmtree.txt","w+");
for(i=0;i{
printf("%c%d",myHaffCode[i].ch,myHaffCode[i].weight);
fprintf(fp,"%c%d",myHaffCode[i].ch,myHaffCode[i].weight);
for(j=myHaffCode[i].start;j{
printf("%d",myHaffCode[i].bit[j]);
fprintf(fp,"%d",myHaffCode[i].bit[j]);
}
fprintf(fp,"\n");
printf("\n");
}
fclose(fp);
printf("初始化成功,哈夫曼树存于文件hfmtree.txt中\n");
}
voidCaozuo_E()//哈夫曼编码过程的函数,用于将文件编码
{
FILE*fp,*fp1,*fp2;
charzf[500];
fp=fopen("hfmtree.txt","r");
Codingch[100];
charc;
inti=0;
while(feof(fp)==0)
{
fscanf(fp,"%s%d%s",&ch[i].ch,&ch[i].weight,&ch[i].bit);
i++;
}
fclose(fp);
printf("现在进行编码操作。
。
。
\n请选择:
\nA.键盘输入B.文件输入\n");
scanf("%s",&c);
if(c=='A')
{
printf("请输入字符串:
\n");
scanf("%s",zf);
}
intj;
if(c=='B')
{
printf("对文件ToBeTran.txt中的正文进行编码\n");
fp1=fopen("ToBeTran.txt","r");
}
printf("编码结果存入文件CodeFile.txt中并显示如下:
\n");
fp2=fopen("CodeFile.txt","w+");
if(c=='A')
{
intlen,k;
len=strlen(zf);
for(k=0;kfor(j=0;j
if(ch[j].ch==zf[k])
{
fprintf(fp2,"%s",ch[j].bit);
printf("%s",ch[j].bit);
}
printf("\n");
}
if(c=='B')
{
while(feof(fp1)==0)
{
fscanf(fp1,"%c",&c);
for(j=0;j
if(ch[j].ch==c)
{
fprintf(fp2,"%s",ch[j].bit);
printf("%s",ch[j].bit);
}
}
fprintf(fp2,"\n");
printf("\n");
fclose(fp1);
}
fclose(fp2);
printf("编码过程完成!
\n\n");
}
voidCaozuo_D()//译码操作
{
FILE*fp,*fp1;
fp=fopen("huffman.txt","r");
inti,n;
fscanf(fp,"%d",&n);
HafNode*myHaffTree=(HafNode*)malloc(sizeof(HafNode)*(2*n+1));
for(i=0;ifscanf(fp,"%s%d%d%d\n",&myHaffTree[i].ch,&myHaffTree[i].parent,&myHaffTree[i].lchild,&myHaffTree[i].rchild);
for(i=n;i<2*n-1;i++)
fscanf(fp,"%d%d%d\n",&myHaffTree[i].parent,&myHaffTree[i].lchild,&myHaffTree[i].rchild);
fclose(fp);
printf("将文件CodeFile.txt中的代码进行译码\n");
fp=fopen("CodeFile.txt","r");
printf("结果存入TextFile.txt中并显示如下:
\n");
fp1=fopen("TextFile.txt","w+");
charch;
i=2*n-2;
while(!
feof(fp))
{