资源描述
沈阳航空航天大学电子信息工程学院电子设计应用软件训练总结报告学生姓名: 苗 腾 飞 专 业: 电子信息工程 班 级: 14020103 学 号: 2011040201116 指导教师: 贾 亮 训练时间:2013年 7月1日至 2013年7月12日电子信息工程学院电子设计应用软件训练任务【训练任务】 (一)PROTEL部分1、熟练掌握PROTEL软件的使用; 2、按要求绘制电路原理图; 3、能够按要求建立元件库和封装库; 4、按要求根据电路原理图绘制PCB版图(能够用自动布线和手动布线相结合)。 (二)软件设计部分 按照给定的软件设计任务完成相应的软件设计【基本要求及说明】 (一)PROTEL部分1、电路原理图图纸尺寸设置为A4; 2、电路原理图见附图; 3、按指定电路图在PROTEL 99中绘制原理图; 4、根据原理图绘制印制板图; 5、根据要求创建原理图器件和该器件的相应的封装。(二)软件设计部分 按软件设计要求实现相应的功能【按照要求撰写总结报告】 指导教师 年 月 日负责教师 年 月 日学生签字 年 月 日成绩评定表评语、建议或需要说明的问题:指导教师签字: 日期:成 绩PROTEL 训 练 任 务软 件 设 计 任 务问题描述 制作一个简单的通讯录,将个人的亲朋好友基本信息和通信方法(包括通信地址、邮政编码、住宿地、电话号码等)存入通讯录。基本要求 1提供按姓名、按电话号码等查询其他信息的功能; 2实现按姓名排序打印通信录的功能;3应具有友好的界面。 34 / 35PROTEL部分一、 任务说明本次电子设计应用软件训练的主要训练任务就是要我们熟练掌握Protel软件的使用,并能灵活的运用该软件完成电路原理图和PCB版图的设计。在完成上述两个任务的过程中,按照要求建立相应的元件库和封装库,创建原理图器件和该器件相应的封装,并能够对所绘制的原理图进行分析或仿真,最后根据训练过程完成此次应用软件训练的总结报告。我们应该认识到Protel的巨大作用,以及对电子信息工程的重要性。二、原理图绘制说明并新建一个元件库1.绘制原理图的说明电路原理图主要由元器件符号、电气连接线及功能注解等基本元素组成,设计者通过这些基本元素的组合和连接来表达设计意图。为了能快速绘制电路原理图和清晰表达设计意图,我们有必要掌握设计电路原理图的通用原则。设计者通常要遵循以下原则:(1) 信号流向尽量保证左进右出;(2) 信号的流入、流出端口最好在图纸边框附近;(3) 功能相关的项目集中放置;(4) 绘制导线时尽量避免导线的交叉和折弯;(5) 电路原理图疏密恰当,确保清晰美观以及方便后续项目的补充和插入。接下来将详细讲述原理图的绘制过程:首先启动Protel 99软件并新建原理图文件,在此时可以顺便更改原理图的名字以便以后查找。建立过程如图1所示:图1 原理图文件的创建接下来要设置电路图图纸信息,在此应按要求将电路原理图图纸设置为A4尺寸。点击菜单“设计”选项,然后在“Sheet选项”下找到标准风格进行页面大小设置,如图2所示:图2 页面大小设置按照题目所给的指定的电路原理图在图纸上放置元器件。根据电路的需要在设计管理器中选择元件库,单击“浏览”按钮,在“Miscellaneous Devices.lib”中找到74ALS138,如图3所示:图3 元件的放置 接下来依次将74ALS138放置到电路原理图中,放置过程中光标会变为十字状,此时按下键盘上的“TAB”键可以改变电阻的属性,此时就可以按照电路图进行设置。在封装类型框中填入电阻的封装类型SOP16,按空格键调整位置。用同样的方法放置八个PNP的晶体管Q1-Q8,填入封装类型TO92C,调整好位置。然后继续在设计管理器中找到RES1,按下“TAB”键修改参数,然后将其放置在合适位置,并将其封装设为“AXIAL0.4”。继续在元件库中找到J1、J2、J3,放置到合适位置,填好封装SIP5和SIP8,调整好位置。在放置元件以及排版过程中需要注意的是Protel在使用中经常要用到的快捷键,如“Page up”键可以对电路图进行放大,“Page down”键可以对电路图进行缩小,这对我们设计原理图以及封装都很有帮助,在对元件的位置进行调整、修改,并对元件的编号、封装进行定义和设定后,即可对所放置的元件进行布局布线。该过程实际就是一个画图过程,利用Protel提供的各种工具、指令进行布线,将工作平面上的器件用具有电器意义的导线、符号连接起来,构成一个完整的电路图,此过程中还要注意电源与地线的连接。之后要对布局布线后的元件进行调整,对元件位置进行重新调整,导线位置的删除、移动更改图形尺寸、属性及排列。这样,电路原理图就可以生成了。电路图原理图见附录图。2.元件库的建立由于现代电子技术的发展,我们使用的编辑环境不可能将所有器件收录到元件库中,这就要求我们会根据使用要求自己创建一个元件库,由于DPY在数据库中找不到,因此需要自行建立,现在具体说明制作元件和创建元件库的过程。首先从“文件”目录下选择“新建文件”,此时软件会弹出一个对话框供用户选择,我们选择“Schematic library document”文档,这样就打开了一个元件库编辑器窗口,将要创建的元件命名为DPY,在绘图工具栏中选出指定的矩形放置在工作区域内,矩形的位置以及宽窄可以自己确定,由于所要设计的器件是9引脚的,所以要事先确定好器件的形状,在此我们选择用正方形框,选择好器件外框后就要开始绘制引脚了。在常用工具里找到放置引脚选项,单击鼠标左键,引脚就会变成小十字跟随光标移动,此时按下键盘上的空格键引脚的方向就会逆时针方向旋转,每次旋转角度均为90度,调整好方向后就要对各个引脚进行编辑,此时按下键盘上的“TAB”键就会跳出引脚编辑对话框,此时我们就可以根据需要对引脚进行定义,这样以后我们就可以将引脚放置到合适的位置了。双击此元件,将其封装设定为IDC10,这样一个DPY元件就设计好了,把它保存起来,放置到自己的原理图库文件中,以后就可以随时调用了,新的元件库的建立就完成了。制作的DPY元件如图4所示。图4 制作元件DPY 由此可以得到如下原理图元件信息,如表1所示:表1 原理图元件表库名字元件标号元件库名RES1R8R16 Miscellaneous Devices.libCQ1Q8 Miscellaneous Devices.libDPYF1-F4自建元件库CON5J1 Miscellaneous Devices.lib74ALS138U1 Miscellaneous Devices.libCON8J2、J3Miscellaneous Devices.lib三.印制板图绘制说明1由生成的网络表文件,绘制印制板图原理图绘制完成后首先要进行电气规则检查,步骤为“设计”“电气规则检查”,如图6所示:图6电气规则检查如果此时检查没有错误便可以产生网络表文件,具体方法如下:点击“设计”中的“创建网络表”菜单命令,即可生成网络表文件,如图7所示:图7网络表的创建 接下来绘制印制板图。在PCB文档界面下点击“设计”菜单下的“网络表”,然后通过浏览找到自己新建的扩展名为.DDB的文件,这样就把网络表导入到PCB文件中了,然后软件会自动寻找设计中错误,比如:软件提示“Node not found”,则说明封装号与电路原理图不匹配,这就需要把原理图中对应元件的封装找到,然后将引脚更新即可。根据所要求的电路板的大小设置PCB版的尺寸,具体做法是在禁止布线状态下画出禁止布线层。当检查没有错误后便可以开始布线,由于电路结构有一定规律,比如电源的位置和电源指示灯应该放在一起,这样也便于分析其功能,于是选择部分手动布线,原则是必须符合信号流向规则,完成手动布线后便开始自动布线,点击“自动布线”并选择“全部”,对整个电路板进行布线。执行该命令后,系统将弹出自动布线设置对话框,采用对话框中的默认设置,就可以实现PCB板的自动布线。完成布线结果如附录图所示。2元件封装的创建在实际应用中元器件的种类很多,而且很多元器件并非标准封装,Protel 99 SE不可能提供所有元器件的封装,但是我们可以自己编辑元器件封装。下面我们可以按照以下步骤创建元器件封装:首先确定要使用的元器件封装,然后搜索Protel 99 SE元器件封装库查看是否已经提供该封装,如果有那么检查原理图符号引脚的“number”属性是否与封装焊盘的“Designer”对应,如果对应则可以直接使用,如果不对应则应查询元器件详细资料或用量具测量获得封装的详细几何尺寸,接着用画图工具绘制封装轮廓、添加焊盘、检查核对后保存。由于DPY的封装形式在软件封装库中没有,需要自己建立,现在可以采用IDC10的封装,在自己的封装库中建立如下:首先测量实际器件两引脚间距为2.54mm,然后开始在封装库中放置焊点,中间带有一个焊盘,移动光标使焊盘到达合适的位置后,单击鼠标将其定位,在放置焊盘时,先按“Tab”键进入焊盘属性对话框,设置焊盘属性。将工作层面切换到顶层布线层,执行菜单命令画线,然后画出绘制元件的外形轮廓方形。将原件重新命名,这样该元件的封装就成功创建了,DPY的元件封装如图8所示。图8 DPY封装经过自己新建封装库,这样就可以找到所有需要的元件封装,列封装表如表2所示:表2所用元件封装信息元件名称封装PCB封装库名DPYIDC10自建封装库R8-R16AXIAL0.4PCB Footprints.libU1SOP16PCB Footprints.libQ1-Q8TO92CPCB Footprints.libJ1CON5PCB Footprints.libJ2、J3CON8PCB Footprints.lib四、总结通过这次的Protel99软件的训练,我已经初步的掌握了Protel99软件的基本操作方法,并能够独立的运用该软件绘制电路原理图,灵活地根据电路原理图绘制PCB版图,并能够按要求建立元件库和封装库。除此之外,我还了解了一些元件的封装类型,如何设置网络标号等,我想这对我今后学习或者是工作都是大有裨益的。今后,我要多加练习该软件,达到熟练掌握的程度,也希望院里能多为同学们提供这样的机会,让我们在锻炼动手能力的同时,学到更多的有关我们专业的知识。本次电子设计应用软件训练的主要训练任务就是要我们熟练掌握Protel软件的使用,并能灵活的运用该软件完成电路原理图和PCB版图的设计。在完成上述两个任务的过程中,按照要求建立相应的元件库和封装库,创建原理图器件和该器件相应的封装,并能够对所绘制的原理图进行分析或仿真,最后根据训练过程完成此次应用软件训练的总结报告。我们应该认识到Protel的巨大作用,以及对电子信息工程的重要性。五、参考文献 1.赵景波,薛萍. Protel 2004电路设计应用范例. M.北京:清华大学出版社,20062.黎文模、段晓峰.Protel DXP电路设计与实例精解M.北京:人民邮电出版社,20063.尹琦、陈晓燕.Protel印制板设计布线技巧(第二版)J. 连云港化工高等专科学校院报,20004.清源计算机工作室.Protel99SE原理图与PCB及仿真M.北京:机械工业出版社,20055.张伟、王力.Protel99SE基础教程M.北京:人民邮电出版社,20066.刘天旺. Protel99SE电路设计应用教程M.北京:电子工业出版社,20087.赵广林.电路设计与制版,M北京:电子工业出版社,2005.附录电路原理图图9电路原理图附录 PCB 印制板图图10 PCB版图软件设计部分一、 任务说明本次课设的题目是制作一个简单的通讯录,将个人的亲朋好友基本信息和通信方法(包括通信地址、邮政编码、住宿地、电话号码等)存入通讯录。通过软件课程的学习及一些相关资料的阅读,对于本课题,其难点在于课题的第二项要求,即实现按姓名排序打印通信录的功能。第一项要求是提供按姓名、按电话号码等查询其他信息的功能。第三项要求是应具有友好的界面。二、软件设计 了解系统开发的需求分析、类层次设计、模块分解、编码测试、模块组装与整体调试的全过程,逐步熟悉程序设计的方法,并养成良好的编程习惯。制作一个简单的通讯录,将个人的亲朋好友基本信息和通信方法(包括通信地址、邮政编码、住宿地、电话号码等)存入通讯录。1)输入信息enter();2)显示信息display( );3)查找以姓名作为关键字 search( );4)查找以电话作为关键字rearsh( );5)删除信息delete( );6)存盘save ( );7)装入load( ) ;设计要求:1提供按姓名、按电话号码等查询其他信息的功能; 2实现按姓名排序打印通信录的功能;3应具有友好的界面。图11 系统总图数据结构及各模块分析:设计类,对象及基本数据类型:创建一个record类,它有五个数据成员:char name20; 姓名 char street20; 街道 char phone20; 电话 char eip20; 邮编 char stay20; 住址包含函数: 功能如下:void mainmenu(); 主菜单void searchmenu(); 查找菜单void enter(); 新添纪录 void search(); 按姓名查找void rearsh(); 按电话查询 void display(); 显示所有 void load(); 读取文件 void save(); 写入文件 void delete(); 按姓名删除 结构体:struct record char street20; char name20; char phone20; char stay20; char eip20;frien500;struct slnode record date; struct slnode *next; struct slnode *prior; 设计流程图(1) 主函数main():利用for( ; ; )和switch()实现主界面的显示与各选项的连接;流程图如下:开始输入要运行的功能的序号判断用户的输入写入数据读取数据追加数据查找数据备份数据删除数据还原数据结束图12主函数流程图(2)写入函数void input():利用文件的fwrite()语句来实现数据的保存;流程图如下:开始输入y或n用if判断输入了y还是nyn输入要输入的资料将数据保存到指定的文件里结束图13写入函数流程图(3)读取数据void read1():利用文件的fread()语句来实现数据的读取;流程图如下开始打开文件定义变量int ifor(i=0;i数据的行数;i+)fread()读出i行数据结束图14读取函数流程图(4)查找数据void search()通过strcmp()=NULL来实现数据的查找;流程图如下:开始定义变量int i;输入要查找的名字for(i=0;i数据的行数;i+)判断strcmp(i行数据,输入名字)=NULL吗?YN输出该行数据结束图15查找函数流程图(5)删除数据void delete1():通过将后一行数据覆盖前一行数据的方法来实现删除功能;流程图如下:判断strcmp(i行数据,输入名字)=0吗?Yfor(j=i+1;j数据的行数;j+)开始定义变量int i,j,n=0;for(i=0;i数据的行数;i+)输入要删除的名字将第j行数据覆盖第j-1行数据n=n+1Nfor(i=0;in-1;i+)写入第i行数据结束图16删除函数流程图(6)追加数据void append1():利用fread()来读出文件里的数据,从而确定数据的数量,再在最后一条数据后通过fopen(“文件名”,”ab”)来实现追加;流程图如下:开始定义变量int i,sum=0;for(i=0;i数据行数;i+)读去i行的数据sum=sum+1for(i=sum;i通讯录数据上限;i+)将数据加入到文件里用户输入要增加的数据结束图17追加数据流程图三、程序调试及结果检验无误后运行程序: 进入主界面: 如下图所示图18主界面选择1新添记录输入张三 37 18040030000 233714.沈阳王二 38 15777396288 011632 北京李四 21 15805573421 266951 合肥然后N回车选择2查找记录 选择1显示所有如下图所示图19所有记录显示按任意键返回主菜单:然后进行查找,选择按姓名查找:输入 张三如下图所示图20按姓名查找输入Y回车,继续查找,此次按电话号码查找 键入18040030000查询结果如下图21按电话号码查找输入N回车然后调试删除功能回到主菜单,选择3删除联系人请输入要删除的姓名如:李四如下图所示图22删除了信息四、结论通过设计一个通讯录,进一步熟悉C中类的概念、基本知识和技利用所学的基本知识和技能解决简单的面向对象的程序设计问题。了解系统开发的需求分析、类层次设计、模块分解、编码测试、模块组装与整体调试的全过程,加深对C的理解与Visual C+环境的使用:逐步熟悉程序设计的方法,并养成良好的编程习惯。加深了对c语言的理解,更深层次的认识了c语言。五、参考文献(1)谭浩强.C程序设计(第三版),M北京.清华大学出版社.2005 (2)刘彦明.计算机软件技术基础教程,M西安.西安电子科技大学出版社.2008 (3)杨秀金.数据结构,M西安.电子科技大学出版社.2001(4)黄梯云.管理信息系统(修订版),M北京.高等教育出版社.2000(5)徐孝凯、贺桂英.C语言教程,M北京.清华大学出版社.2004六、源程序#include #include #include #include struct record char name20; char street20; char phone20; char eip20; char stay20; frien500;struct slnoderecord date;struct slnode *next;struct slnode *prior;typedef slnode * linklist;linklist l;int num=0;FILE *fp; void mainmenu();void searchmenu();void enter();void search();void rearsh();void display();void load();void save();void delet();void listinsert();void initlist();void main() initlist();load();listinsert(); while (1)mainmenu(); typedef struct tagColAttint nColIndex;CString strColText;int nPrintX;int nSubItemIndex;COLATT;void load() if(fp=fopen(frien.bin,rb)=NULL) printf(ntt通讯录文件不存在); if (fp=fopen(frien,wb)=NULL) printf(ntt建立失败); exit(0); else printf(ntt通讯录文件已建立); printf(ntt按任意键进入主菜单); getch(); return; exit(0); fseek(fp,0,2); if (ftell(fp)0) rewind(fp); for (num=0;!feof(fp) & fread(&friennum,sizeof(struct record),1,fp);num+); printf(ntt文件导入成功); printf(ntt按任意键返回主菜单); getch(); return; printf(ntt文件导入成功); printf(ntt通讯录文件中无任何纪录); printf(ntt按任意键返回主菜单); getch(); return; void mainmenu()/主菜单 char choic; system(cls); printf(ntt*欢迎进入通讯录系统*); printf(ntt*1-新添纪录 *); printf(ntt*2-查找联系人 *); printf(ntt*3-删除联系人 *); printf(ntt*4-保存退出 *); printf(ntt*5-不保存退出 *); printf(ntt*); printf(ntt请选择:); choic=getch(); switch (choic) case 1:enter();break; case 2:searchmenu();break; case 3:delet();break; case 4:save();break;case 5:exit(0); default:mainmenu(); void searchmenu()/查询菜单 char choic; system(cls); printf(ntt* 查询菜单 *); printf(ntt* 1-显示所有 *); printf(ntt* 2-按姓名查询 *);printf(ntt* 3-按电话查询 *);printf(ntt* 4-返回主菜单 *); printf(ntt*); printf(ntt请选择:); choic=getch(); switch (choic) case 1:display();break; case 2:search();break;case 3:rearsh();break;case 4:mainmenu();break; void enter()/添加纪录 printf(ntt* 请输入信息 *n); printf(ntt姓名:); scanf(%s,&friennum.name); printf(ntt街道:); scanf(%s,&friennum.street); printf(ntt电话:); scanf(%s,&friennum.phone); printf(ntt邮编:); scanf(%s,&friennum.eip); printf(ntt住址:); scanf(%s,&friennum.stay); num+; printf(ntt是否继续添加?(Y/N):); if (getch()=y) enter(); return; void display()/显示所有 int i; system(cls); if(num!=0) printf(ntt* 以下为通讯录所有信息*); for (i=0;inum;i+) printf(ntt姓名: %s,frieni.name); printf(ntt街道: %s,frieni.street); printf(ntt电话: %s,frieni.phone); printf(ntt邮编: %s,frieni.eip); printf(ntt住址: %s,frieni.stay); printf(tt); if (i+1num) printf(ntt_); system(pause); printf(ntt*); else printf(ntt通讯录中无任何纪录); printf(ntt按任意键返回主菜单:); getch(); return; void save()/写入文件 int i; if (fp=fopen(frien,wb)=NULL) printf(ntt文件打开失败); for (i=0;inum;i+) if (fwrite(&frieni,sizeof(struct record),1,fp)!=1) printf(ntt写入文件错误!n); fclose(fp); printf(ntt通讯录文件已保存); printf(ntt按任意键退出程序ntt); exit(0); void listinsert()/增加一个结点 linklist s,p=l;for(int i=0;idate.name,frieni.name); strcpy(s-date.phone,frieni.phone); strcpy(s-date.street,frieni.street); strcpy(s-date.eip,frieni.eip); strcpy(s-date.stay,frieni.stay); s-prior=p-prior; s-next=p; p-prior-next=s; p-prior=s;p=p-next;void initlist()l=new slnode;l-next=l;l-prior=l;void search() int a=0; int findmark; int j; int i; char name20; printf(ntt请输入要查找的姓名:); scanf(%s,name); for (i=a;inum;i+) if (strcmp(frieni.name,name)=NULL) printf(ntt以下是您要查找的纪录:); findmark+; printf(ntt_); printf(ntt姓名: %s,frieni.name); printf(ntt街道: %s,frieni.street); printf(ntt电话: %s,frieni.phone); printf(ntt邮编: %s,frieni.eip); printf(ntt住址: %s,frieni.stay); printf(ntt_); if(i=0)printf(tt信息如上!); if (i+1)num) printf(ntt是否继续查找相同信息:(y/n); if (getch()=y) a=i;continue; else return; else printf(ntt按任意键返回主菜单); getch(); return; void rearsh() int a=0; int findmark; int j; int i; char phone20; printf(ntt请输入要查找的电话:); scanf(%s,phone); for (i=a;inum;i+) if (strcmp(frieni.phone,phone)=NULL) printf(ntt以下是您要查找的纪录:); findmark+; printf(ntt_); printf(ntt姓名: %s,frieni.name); printf(ntt街道: %s,frieni.street); printf(ntt电话: %s,frieni.phone); printf(ntt邮编: %s,frieni.eip); printf(ntt住址: %s,frieni.stay); printf(ntt_); if(i=0)printf(tt信息如上!); if (i+1)num) printf(ntt是否继续查找相同信息:(y/n); if (getch()=y) a=i;continue; else return; else printf(ntt按任意键返回主菜单); getch(); return; void delet() int a=0; int findmark=0; int j; int deletemark=0; int i; char name20; printf(ntt请输入要删除姓名:); scanf(%s,name); for (i=a;inum;i+) if (strcmp(frieni.name,name)=NULL) printf(ntt以下是您要删除的纪录:); findmark+; printf(ntt_); printf(ntt姓名: %s,frieni.name); printf(ntt街道: %s,frieni.street); printf(ntt电话: %s,frieni.phone); printf(ntt邮编: %s,frieni.eip); printf(ntt住址: %s,frieni.stay); printf(ntt_); printf(ntt是否删除?(y/n); if (getch()=y) for (j=i;jnum-1;j+) frienj=frienj+1; num-; deletemark+; printf(ntt删除成功); if(i+1)num) printf(ntt是否继续删除相同姓名的信息?(y/n); if (getch()=y) a=i; continue; printf(ntt是否继续删除?(y/n); if (getch()=y) delet(); return; if(i+1)GetItemCount();int nLineCount = list.GetItemCount();int ColOrderArray100;COLATT ca100;list.GetColumnOrderArray(ColOrderArray, nColCount);int nColX =nXMargin*nCharWidth;/检索各列的信息,确定列标题的内容长度。for(int i =0 ; i nHorRes) DeleteDC(pd.hDC);AfxMessageBox(字段太多,无法单行打印,用较大的纸,或横向打印。);return FALSE;DOCINFO di;di.cbSize = sizeof(DOCINFO);di.lpszDocName = ListCtrl Data Printing; di.lpszOutput = (LPTSTR) NULL; di.lpszDatatype = (LPTSTR) NULL; di.fwType = 0; StartDoc(pd.hDC, &di);StartPage(pd.hDC);/调整各列的宽度,以使各列在后面的打印输出时更均匀的打印在纸上。int space = (nHorRes-nXMargin*nCharWidth-nColX) / (nColCount -1);for(i =1; inColCount; i+)cai.nPrintX += i*space;/输出列标题for(i =0; inColCount; i+)TextOut(pd.hDC, cai.nPrintX, nYMargin, cai.strColText, strlen(cai.strColText);int nMaxLinePerPage = nVerRes/nCharHeight -3;int nCurPage =1;/输出各列的数据for(i =0; inLineCount; i+)for(int j =0; j nMaxLinePerPage)/新的一页EndPage(pd.hDC);StartPage(pd.hDC);nCurPage +;CString subitem = list.GetItemText(i, caj.nSubItemIndex);TextOut(pd.hDC, caj.nPrintX, nYMargin+(i+1-(nCurPage-1)*nMaxLinePerPage)*nCharHeight, subitem, strlen(subitem);EndPage(pd.hDC);EndDoc(pd.hDC);/打印结束DeleteDC(pd.hDC);return TRUE;文档可能无法思考全面,请浏览后下载,另外祝您生活愉快,工作顺利,万事如意!
展开阅读全文