课程设计报gao.docx
《课程设计报gao.docx》由会员分享,可在线阅读,更多相关《课程设计报gao.docx(28页珍藏版)》请在冰点文库上搜索。
![课程设计报gao.docx](https://file1.bingdoc.com/fileroot1/2023-6/2/5a408ae9-530f-48d8-a191-75e70b9930e9/5a408ae9-530f-48d8-a191-75e70b9930e91.gif)
课程设计报gao
沈阳航空航天大学电子信息工程学院
电子设计应用软件训练总结报告
学生姓名:
专业:
通信工程
班级:
14020201
学号:
指导教师:
房启志
训练时间:
2013年7月1日至2013年7月12日
PROTEL部分
1.任务说明
(1)熟练掌握PROTEL软件的使用;
(2)按要求绘制电路原理图和PCB版图(能够用自动布线和手动布线相结合);
(3)能够按要求建立元件库和封装库。
2.原理图绘制说明并新建一个元件库
原理图设计最基本的要求是正确性,其次是布局合理,最后是在正确性和布局合理的前提下力求美观。
根据以上所述的电路原理图设计步骤,电路原理图设计过程如下:
(1)启动原理图设计服务器
进入Protel99SE,创建一个数据库,执行菜单File/New命令,从框中选择SchematicDocument图标,双击该图标,建立原理图设计文档。
双击文档图标,进入原理图设计服务器界面。
图1:
原理图设计界面
(2)设置原理图设计环境
执行菜单Design/Options,设置图纸大小为A4纸。
图2:
设置纸张大小界面
(3)装入所需的元件库
在设计管理器中选择BrowseSch页面,在Browse区域中的下拉框中选择Library,然后单击Add/Remove按钮,在弹出的窗口中寻找Protel99SE子目录,在该目录中选择Library\Sch路径,在元件库列表中选择所需的元件库,单击Add按钮,即可把元件库增加到元件库管理器中。
图3:
添加元器件库
(4)放置元件
根据实际电路的需要,到元件库中找出所需的元件,若找不到,可以点击Edit按键制作一个新元器件,然后用元件管理器的Place按钮将元件放置在工作平面上,再根据任务原理图把元件调整好。
图4:
放置CON3元件
图5:
查找2N2222元器件
(5)原理图布线
利用Protel99SE提供的各种工具、指令进行布线,将工作平面上的器件用具有电气意义的导线、符号连接起来,构成一个完整的电路原理图。
图6:
对各元器件连线
(6)元器件位置调整和编辑元器件属性
利用Protel提供的功能对原理图做进一步的修改,同时对元件编号及封装号进行定义。
图7:
对4093元件封装号进行定义
(7)元器件检测
使用Protel99SE提供的电气法则检测,执行Tool/REC命令,若有错误,则进行修改。
图8:
电气法则检测
图9:
电气法则检测结果
图10:
检测错误提示
(8)生成网络表
网络表是电路原理图或印制电路板元器件连接关系的文本文件,是原理图设计和PCB设计的接口网络表可以由原理图生成,执行Design/CreateNetlist可以生成具有元件名、元件封装、参数及元件之间连接关系的网络表。
[
1K
AXIAL0.3
R1
]
[
2K
AXIAL0.3
R3
]
[
3K
AXIAL0.3
R2
]
[
5K
AXIAL0.3
R4
]
[
J1
SIP2
CON2
]
[
J2
SIP3
CON3
]
[
JP1
SIP4
4HEADER
]
[
Q1
SAN
2N2222
]
[
U1
DIP6
4N25
]
[
U2
DIP-14
74LS14
]
[
U3
SOP-14
4093
]
(
GND
J1-2
J2-3
JP1-1
Q1-3
U1-2
U1-4
U2-7
U3-7
)
(
Net5K_2
5K-2
Q1-1
)
(
NetJ1_1
1K-1
J1-1
)
(
NetU2_1
U2-1
U3-1
U3-2
)
(
VCC
3K-1
JP1-3
U2-14
U3-14
)
(
VDD
2K-1
JP1-4
)
3.印制版图绘制说明
Protel99SE提供了完整的电路板设计环境,使得设计电路版更加方便高效,应用该软件设计的电路板过程如下:
(1)启动电路板设计服务器
执行菜单File/New命令,从框中选择PCBDocument图标,双击该图标,建立PCB设计文档。
双击文档图标,进入PCB设计服务器界面。
图11:
PCB服务器界面
(2)装入元件封装库
执行菜单命令Design/Add/RemoveLibrary,在“Add/Remove”对话框中选取所有元件所对应的元件封装库,例如:
PCBFootprint,InternationalRectif
图12:
添加对应的元件封装库
(3)建立元件封装库iers等。
根据老师给的相关数据对三极管2N2222进行自制封装,图形如下。
图13:
2N2222对应的封装
图14:
74LS14对应的封装
图15:
更新PCB
图16:
更新后的PCB图
(4)元器件布局
可以采用自动布局和手动布局相结合的方式,执行菜单命令Tools/AutoPlacement/AutoPlacer可以自动布局。
(5)自动布线
执行菜单命令AutoRouting/All,并在弹出的窗口中单击Routeall按钮,程序即对印刷电路板进行自动布线。
只要参数,元件布局合理,自动布线的成功率几乎是100%。
图17:
自动布线的提示
图18:
自动布线后的图
(6)手动布线
对于自动布线不太满意的地方可以采取手动布线的方式,这样可以是电路板设计的更加合理。
4.总结
通过这次的实习,对Protel有了一定的了解和认识,掌握了该软件的基本操作。
在实习的过程中,有过许多错误的操作,在这次设计中还是走了很多弯路,运用Protel99SE软件不熟悉,但在老师的指导下以及同学的帮助下,现在基本能够熟练运用。
通过本次实习,我明白了Protel99SE的许多用途,特别是在仿真领域里的运用。
实习过程中,遇到不少问题在电器检查时,开始有很多错误,是由于引脚或元器件没标注好的原因。
封装过程中,有的元件需要自己手工绘制,对于自制的封装元件库还是会出现由于名称不对而无法封装的情况,制作PCB要以元件实物的型号和大小为依据,由于元件种类繁多,所以要具体情况具体来制作PCB封装,PCB封装尺寸的大小更注重在管脚的距离上,管脚距离的大小决定了实物元件能否装在PCB板上,要从原理图生成PCB就要保证每个元件都有对应的封装,大小要对应,符号也要对应。
Protel99SE软件对以后我们专业课的学习具有很大的辅助作用,当然,这几天的学习并不能完全掌握PROTEL,我们只是初步掌握了它的基本功能,它的其它功能我希望能在以后的学习中逐步掌握。
相信在以后我能熟练地掌握这一软件。
5.参考文献
[1]曹丙霞,赵艳华.Protel99SE原理图与PCB设计.北京:
电子工业出版社,2007(5).
[2]邢增平.Protel99SE设计专家指导.北京:
中国铁道出版社,2004
(2).
[3]李东生,张勇,许四毛编著.Protel99SE电路设计教程.北京:
北京工业出版社,2007
(1).
[4]刘坤,高征红,晁阳编著,Protel99SE电路设计实例教程.北京:
清华大学出版社,2008(5).
[5]程露,郑毅,向先波编著,Protel99SE多层电路板设计与制作.北京:
人民邮电出版社,2007(5).
附录I电路原理图
附录II印制板图
软件设计部分
1.任务说明
(1)这个实验要求我用栈实现车厢调度。
(2)车厢的个数是由用户输入的。
(3)程序会自动给车厢进行从1到n的编号。
(4)用户输入车厢个数后,程序打印出所有可能的车厢出站顺序。
2.任务设计过程
(1)对算法的描述
这个实验中,要求用到栈.实现栈的基本操作,即实现类型。
程序对栈的任何存取(即更改,读取和状态判别等操作)必须借助于基本操作。
在操作过程中的任何状态下都有两种可能的操作:
“入”“出”。
每个状态下处理问题的方法都是相同的,具有递归特性,栈实现是方便的
在算法中还要用到递归算法,其本质为:
一个数的进栈以后有两种处理方式:
要么立刻出栈,或者下一个数的进栈。
一个数的出栈以后也有两种处理方式:
要么继续出栈(栈不为空),或者下一个数的入栈。
车厢调度题目,题目的目的是有n辆车依次进入一个车站,把所有可能的出站的序列输出,题目要求使用栈数据结构完成出站和入站操作。
根据栈的数据特性,最先进栈的最后出栈。
而且对问题进行分析可知对栈来说只有出栈和入栈两种操作,所以问题具有递归的特性,所以对这个题目的核心解法就是采用递归的操作。
问题着眼于进栈的n辆车,当这n辆车完成进栈操作,所有的出栈的可能都已经出来了。
首先从第一辆进行分析,它只有一种可能:
进栈。
对于后面的n-1辆车,如果栈不为空,则有两种可能,一种是它进栈,另一种是栈中的顶元素出栈。
所以整个过程可以的结果就是一颗二叉树,只要完成对这棵二叉树的遍历,就可以把所有的结果输出,下面我用n=3来说明这个例子。
(2)栈的基本操作
①构造一个栈
voidInitStack2(SqStack*S,intbase_size)
{
S->base=(int*)malloc(base_size*sizeof(int));
if(!
S->base)
{
puts("ERROR!
");
return;
}
S->top=S->base;
S->stacksize=base_size;
}/*构造一个空栈*/
②插入新的栈顶元素
voidPush2(SqStack*S,inte)
{
*(S->top++)=e;
}/*插入元素e为新的栈顶元素*/
③输出栈顶元素
voidPop2(SqStack*S)
{
inte;
if(S->top==S->base)
{
puts("ERROR");
return;
}
e=*--S->top;
printf("%d",e);
}/*若栈不空,则删除s的栈顶元素,用e返回其值*/
④主函数的源代码
voidmain()
{
inti;
intk;
stackinput,s,output;
initstack(&input,N);
initstack(&s,N);
initstack(&output,N);
printf("请输入车厢数量:
\n");
scanf("%d",&k);
printf("可能的出站序列为:
\n");
for(i=k;i>0;i--)
push(&input,i);
stackseq(&input,&s,&output);
}
(3)程序流程图
主要是对main函数和Stacksep函数画流程图。
图2:
Main函数流程图:
图3:
Stackseq函数流程图
3.程序调试过程以及实验结果
(1)调试分析
①此车厢调度的基本要求比较简单,只要掌握好栈的基本特性和基本操作,一般都能顺利完成。
②此系统需要运用递归算法,所以还必须对整个系统有个清晰的认识和思路,这样才能更好的掌握运行的详细过程与结果。
每个步骤都有两种可能,那怎样解决操作问题呢?
我决定先以入栈为主,能入先入,操作完毕后恢复至分步时的状态,再进行出栈的操作,这样两种可能就都完成了。
③此系统中还有一个要求就是显示出操出作序列的状态的变化过程,因此,必须弄清楚栈的基本性质,谁先入栈,谁先出栈,每一步的过程必须清晰明了。
④数据存储是用了一个数组,便于存储。
(2)运行结果
新建一个程序,输入相应的程序,编译链接无误后,运行程序,按界面提示输入车厢数量,以车厢数n=4为例。
图4:
运行界面
输入车厢数量为4后,程序实行车厢调度,并将所有可能的车厢出站顺序打印出来,有下面的显示界面可知一共有14种车厢出站顺序。
图5:
运行结果显示
4.结论
通过本次软件实习,不仅加深了对以前所学知识的认识,而且我学到很多书本上未曾涉及的知识点,在实习时发现了很多问题,这些问题都是我们最常见的也是经常犯的。
经过从书本及利用互联网资源和老师及同学的帮助,终于完成了本次试验任务,基本达到实习要求,可以实现输出火车车厢的调度情况,这次实习对自己的编程及调试程序的能力有很大的帮助。
同时,体会到对于我们学过的知识,我们不仅要尽量深入而透彻地去理解以及渗透,因为,在我看来,只有充分的了解渗透才能更好的将课本所学的知识运用到实验和生活中去。
总体来说栈结构是比较容易的结构,所以现在能对栈的基本操作能比较熟练的运用了。
但是由于此次设计用到了递归算法,基于对递归算法平时训练不是很多,故存在一些设计的问题同时,在此过程中,我发现了一些自己的不足。
5.参考文献
[1]刘彦明编著,计算机软件技术基础教程.西安:
西安电子科技大学出版社,2008(3).
[2]谭浩强著,C程序设计(第三版),北京:
清华大学出版社,2005.
[3]张桂芳著,广西民族学院学报(自然科学版),2002(02)第8卷,40-45.
[4]严蔚敏,吴伟民著.数据结构(C语言版),北京:
清华大学出版社.2010(3).
[5]严蔚敏,吴伟民著,数据结构习题集,北京:
清华大学出版社,1998.
6.程序清单
#include
#include
#defineN20
typedefstruct
{
int*stk;
inttop;
intsize;
}stack;
voidinitstack(stack*s,intn)
{
s->stk=(int*)malloc((s->size=n)*sizeof(int));
s->top=0;
}
voidcopystack(stack*ss,stack*s)
{
inti;
if(ss->stk)free(ss->stk);
ss->stk=(int*)malloc((ss->size=s->size)*sizeof(int));
ss->top=s->top;
i=s->top-1;
for(;i>=0;i--)
ss->stk[i]=s->stk[i];
}
voidoutputstack(stack*s)
{
inti;
for(i=0;itop;i++)printf("%5d",s->stk[i]);
printf("\n");
}
intstackempty(stack*s)
{
return!
s->top;
}
voidpush(stack*s,intx)
{
s->stk[s->top++]=x;
}
intpop(stack*s)
{
returns->stk[--s->top];
}
voidstackseq(stack*input,stack*s,stack*output)
{
/*初始状态:
栈input中存放要输入的元素,s,output为空
结束状态:
input和s均为空*/
stackii,ss,oo;
if(stackempty(input))
{/*如果数据已经全部输入完毕*/
if(stackempty(s))
outputstack(output);/*而且栈中也没有剩余,则输出序列*/
else
{
push(output,pop(s));/*栈中元素进入输出序列*/
stackseq(input,s,output);/*重新调度*/
}
}
else
{/*还有元素要输入*/
if(!
stackempty(s))
{/*我们需要保存现有状态*/
initstack(&ii,1);copystack(&ii,input);
initstack(&ss,1);copystack(&ss,s);
initstack(&oo,1);copystack(&oo,output);
push(&oo,pop(&ss));
stackseq(&ii,&ss,&oo);
}
push(s,pop(input));/*再输入一个元素*/
stackseq(input,s,output);
}
}
voidmain()
{
inti;
intk;
stackinput,s,output;
initstack(&input,N);
initstack(&s,N);
initstack(&output,N);
printf("请输入车厢数量:
\n");
scanf("%d",&k);
printf("可能的出站序列为:
\n");
for(i=k;i>0;i--)
push(&input,i);
stackseq(&input,&s,&output);
}