沈阳航空航天大学软件课设报告

更新时间:2024-06-24 03:08:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

沈阳航空航天大学电子信息工程学院

电子设计应用软件训练

训练时间:总结报告

学生姓名:胡海涛 专业:电子信息工程 班级:34020104 指导老师:屈乐乐

年6月22日至2015年7月3日

2015

PROTEL部分

一.任务说明

(1) 熟练掌握 PROTEL 软件的使用;

(2) 按要求绘制电路原理图和 PCB 版图(能够用自动布线和手动布线相结合); (3) 能够按要求建立元件库和封装库。

二.原理图绘制说明

1.(1)运行protel软件,点击file进行编辑,点击NEW(新建),确定存储,进入操作页面,建立原理图文档,如图1所示;

图1:新建文件窗口示意图

(2)设置纸张大小,执行Design中的Option设置A4,如图2所示;

图2:纸张设置窗口示意图

(3)在第一步的图1页面进入Schematic Document,把需要的元件导入元件库,根据电路原理图相互连接。如图3所示;

图3:放置元件示意图

(4)命名并定义引脚封装,具体封装定义见表1;

Part Type 30pF 30pF 22uF SW-PB SW-PB SW-PB VRI 7805 Bell Dpy Red-CA Dpy Red-CA AT89C2051 DS18B20 Speaker 12M 4.7K 1K 1K 1K 9012 Designator C1 C2 C3 S1 S2 S3 U4 U5 DS1 DS2 U1 U2 LS1 Y1 R1 R2 R3 R4 PNP Footprint RADO.4 RAD0.4 RB.3/.6 AXIAL0.6 AXIAL0.6 AXIAL0.6 TO-220 AXIAL0.5 DIP16 DIP16 DIP20 TO-92B SIP2 XTAL1 AXIAL0.9 AXIAL0.9 AXIAL0.9 AXIAL0.9 TO-18 (5)连线后检查,点击TOOL中的第一栏ERC命令,点击OK进行检测,如图4所示;

图4:电器规则检查结果

在进行绘制原理图过程中,原理图内元件可能在元件库中不存在,这时需要自己绘制。首先点击file进行编辑,点击NEW进入图1界面,点击Schematic library Document进行绘制。通过绘图工具栏和IEEE工具栏进行绘制。最后点击Add或Place即可。如图5所示;

图5:建立元件示意图

三.印制板图绘制说明

1.创建网络表

点击Design中CreatNetlist,自动生成新网络表格,如图6所示;

图6:网络表示意图

2.生成PCB图

新建一个PCB文件,点击file进入图1界面,点击PCB Document,点击视图下合适版面,如图7所示;

图7:PCB界面图

3.绘制印制板图

选择好PCB图,点击Keepout layer选项,把PCB图框上,再进行自动布线,完成布线后,印制板图绘制工作就完成了。 4.直接放置元件绘制印制板图

新建一个PCB文件,打开后,调节Browse中的Libraries然后选择合适的元件放置即可。如图8所示;

图8:元件放置示意图

5.绘制PCB元件

点击file中的新建文件,进入图1界面,点击PCB Library Document进行元件绘制,绘制完成进行保存。如图9所示

图9:绘制PCB元件示意图

6.

PCB

10

四.总结

通过该次软件课程设计,我学会了protel的基本操作,可以运用其进行简单的电路原理图和PCB板的绘制制作等工作。在进行设计过程中,我通过自己查阅相关书籍和网上视频教学,自己慢慢研究和探索,期间遇到不少困难,通过咨询指导老师得到了解决。在克服不少困难后最终将课设任务顺利完成。在protel的运用中,前期不明白元件封装如何操作,不清楚网络表格的建立和之前的电路图检测等,比如在制作元件时的命名问题非常重要,还有导入库的操作等,之前这些都是不怎么清楚的。包括最开始的自己制作元件库没有的元件中遇到的困难,还有元件封装名称通过上网搜索进行对应等。这些都让我经历

了从不会到会的一个过程,收获很多,学到很多。

附录一:电路原理图

附录二:印制板图

软件设计部分

1.任务说明

本题要求运用LISP实现简单特定形式的计算,考虑用栈来实现。建立两个栈,一个存放进行运算的数字,一个存放用于运算的符号,首先存放数字 ,存放符号用“)”为结束,当“)”出现时开始进行出栈操作,然后进行简单的加减乘除运算。运算要点如下:从左到右地扫描表达式

(1)扫描到操作数时,直接输出。

(2)第二次扫描到‘(’时进行递归调用,从头进行扫描。

(3)扫描到算术量时将其压入栈,并与前一个压入栈的算术量求和。 (4)最后的栈头元素即为所求。

2.设计过程

根据本课设题目的要求,本设计程序依据利用栈依次从里向外计算括号内数的思想设计成一个简单的LISP算术表达式计算器。该程序首先建立一个栈,通过PUSH函数和POP函数的入栈,出栈功能实现栈中元素“先进后出,后进先出”的特性。然后动态建立一大小为K的整型数组,把开辟的数组指针赋给a,从而实现栈函数的构造过程。然后再建立栈的对象,再建立一个字符型数组ch,然后向该数组输入表达式,最后进入表达式判断阶段。若LISP表达式为一操作数,则直接输出;若该表达式为运算符,则经过主函数的扫描计算,最终输出结果。

2.1栈的建立

这是一个子函数stack(int k=100),首先建立一个足够大的栈,动态定义其大小为100,然后对其置空初始化,再根据判断其是否为空返回不同的值。其设计流程图如图1。

2.1栈的建立

这是一个子函数stack(int k=100),首先建立一个足够大的栈,动态定义其大小为100,然后对其置空初始化,再根据判断其是否为空返回不同的值。其设计流程图如图1。

返回top 开始 定义栈a 初始化栈a N 是否为空? Y Top=-1 Top=big

图1:栈的建立

2.2入栈

这是一个子函数PUSH,首先赋给输入值k,再判断栈是否为非空,若为非空则将k压入栈中;若为满栈,则输出错误。其流程图如图2所示。

返回 !full()? Y a[top]=k top++ wrong push 开始 输入k值 N 图2:PUSH函数 2.3出栈

这是一个子函数POP,首先判断是否非空,若是则输出栈头元素a[top],若不是,则返回0并参与运算。其设计流程图如图3所示。

结束 !empty()? 返回a[top] top-- 返回0 开始 图3:POP函数

2.4构建函数

首先动态开辟一个大小为K的数组,然后把开辟数组的指针赋给a,然后将K-1赋给Big,将-1赋给Top,从而实现函数的构造过程,函数构造完毕,退出此进程,此段程序结束。其设计流程图如图4所示。

big=k-1 top=-1 结束 动态开辟一个大小为k的数组 把开辟数组的指针赋给a 开始 图4:构建函数 2.5主函数

这是整个程序的核心所在。首先要建立一个栈V1,将所求表达式赋值给字符变量ch。接下来就是从头扫描字符,这也是一个循环的过程。若ch[i]不是‘(’,则直接入栈,若是则跳向下下个字符,;再判断是不是‘(’?,若不是,则将

ch[i]入栈,跳向下一个字符;再判断是不是‘(’?,若还不是则入栈。这其中?若是,?若是则都要进行从头扫描。接下来进行一个总的判断“!=‘(’&&!=‘)’?”, 若成立,跳向下一字符,若不成立跳过本步;接下来判断是否为‘)’,若是则把入栈的两个元素出栈后相加再入栈,跳向下一字符。最后对此循环作一个判断,若ch[i]是0则接着进行循环,若不是则跳出循环输出栈顶元素,即为所求。其设计流程如图5所示。

三、调试过程及实验结果

3.1调试过程:

本程序在调试的过程中遇到了很多问题,首先程序中有不少的缀余成分,尤其是总循环的部分本来就是一个很复杂的逻辑问题,有缀余更是会使理解难上加难,这一部分是通过一步一步调试更正的。最后得到的程序能完成题目中所给的要求。主要的主函数的修改如下图所示。

修改前 修改后 3.2实验结果:

(1)运行程序之后,会看到一个如 图6所示的LISP计算器的界面,输入系统所需测试表达式。这也是一个待输入界面。

图5:主函数 Y Y 开始 建立栈V1 i=0 输入ch N ch[i]!=0? Y ch[i]=='('? Y 输出v1.pop() N 结束 i=i+2 ch[i]='c'? N i=i+1 N ch[i]='c'? ch[i]!=')'? 将ch[i]入栈 将ch[i]入栈 ch[i]!=')'&&ch[i]!='('?Y i=i+1 ch[i]==')'? Y v1.push(v1.pop()+v1.pop()); i++ N N

图6. 计算器界面---测试数据

图7.(+2(+58))测试结果图

图8.(+(+(+12)(+34))(+(+56)(+78)))测试结果图

四、结论

本程序十分简洁,且理解上也比较容易,完成了简单的算术表达式的计算问题,但是没能够实现其四则运算的问题,还有按照原思路应该是建立两个栈,一个存放数值,一个存放运算符,比较运算符的优先级然后对其控制的值作相应的运算。由于本人软件知识有限,所以得出的程序只是实现了片面的功能,对运算符采取了跳过的处理方式,只对表达式中的值作和,再输出。 经过了将近两周的软件课设,根据题目要求对源程序作了相当大的改动,这其中包括对缀余程序的删除,对错误程序的修正。另外程序参考了网上的模版,但其中不明白的地方有很多,问了很多人,也查阅了以前学过的关于栈的知识,最后也不是彻底的能弄明白。我对于我的程序不是很满意,因为这并不是一个简单的LISP计算器,计算器最起码能进行四则运算,但此计算器只能完成类似题目中所给的运算。虽然程序有些欠缺的地方,但毕竟是花了十多天的时间在程序上,收获还是很多的,算是对一学期的软件课作了一个总结,也从搜索资料中学会了运用图书馆和网络,总之软件课设使我受益匪浅,对以后的工作和学习都有很大的帮助。

五.程序清单: #include #include typedefstruct {char *cbase; char *ctop;

intistacksize; }cstack; typedefstruct { int *ibase; int *itop;

intistacksize; }istack;

intinitstack (cstack&c) { c.cbase = new char[100]; c.ctop = c.cbase; return 0; } intinitstack (istack&i) { i.ibase = new int[100]; i.itop = i.ibase; return 0; } intcpush(cstack&c,charce)

{ *(c.ctop++) = ce; return 0; } intipush(istack&i,intie)

{ *(i.itop++) =ie; return 0; } intcpop(cstack&c,char&ce)

{ ce = *(--c.ctop); return 0; } intipop(istack&i,int&ie)

{ ie = *(--i.itop); return 0; } voidgetfun(); int result=1;

static char array[100]; voidgetfun() { intlenth=0;

printf(\请输入LISP表达式: \gets(array); } voidjisuan()

{ intlenth=0; charce; int a; int b; cstack c; istack i; initstack (c); initstack (i); lenth = strlen(array); for(int n=0;n

{ cpop(c,ce); if(i.ibase==i.itop) { printf(\else

{ ipop(i,b); a=b;

if(i.ibase==i.itop) { printf(\break; } else { ipop(i,a);

if(ce=='+') b=b+a; if(ce=='-') b=b-a; if(ce=='*') b=b*a; if(ce=='/') b=b/a;

ipush(i,b); } } } else

if((array[n]=='+')||(array[n]=='-')||(array[n]=='*')||(array[n]=='/')) { ce=array[n]; cpush(c,ce); }

if(array[n]>='0'&&array[n]<='9') { b=(int)(array[n]-'0'); ipush(i,b); } } ipop(i,b);

if(i.ibase==i.itop)

printf(\式计算结果为:%d\\n\intbuchong() { int i;

intlenth=0; getfun();

lenth = strlen(array); if(lenth==1)

{ if(array[0]>47&&array[0]<58)

printf(\表达式结果为:%d\\n \else

result=0; return 0; } int main() {

char open[5]; do

{ buchong(); if(result==0) jisuan();

printf(\是否退出 ?\\n否请按y,退出请按任意键\gets(open); }

while(open[0]=='y'||open[0]=='Y'); return 0; }

本文来源:https://www.bwwdw.com/article/dzt3.html

Top