课程设计报告
3.1.1用PROTEUS 绘制原理图
运行PROTEUS VSM 的ISIS 后出现相应的界面, 点状的栅格区域为绘图区。左侧的上方为电路图概览区, 下方是元器件列表区。单击P 后出现的Pick Device添加元器件的对话框, 输入所要添加的器件名称, 则该器件就会出现在右侧, 单击OK 按钮, 完成一个元器件的添加。重复以上过程, 添加好电路中所需的元器件。
在元器件列表区选中某元器件后, 在电路图概览区会出现该元器件, 用鼠标将其拖至绘图区, 将所有需要的元器件在绘图区放置好, 即可开始连线。连线方法很简单, 将鼠标移至元器件引脚后会出现一个小十字, 单击鼠标左键后移动鼠标, 将线引至某一引脚处会再次出现小十字, 再次单击左键就完成了一条连线。在布线时, 如果需要转弯,可以在转弯处单击鼠标左键。图4-1就是绘制完成的电路图。
10
课程设计报告
图4-1 在PROTEUS绘制的电路图
3.1.2 PROTEUS 对单片机内核的仿真
电路图绘制完成后, 再添加AT89C51 的应用程序。将鼠标移至AT89C51 上, 单击鼠标右键使之处于选中状态, 在该器件上单击左键, 打开如图4-2所示的对话框。在 Program File 栏添加编译好的十六进制格式的程序文件AA.hex(可以接受3 种格式的文件) , 单击OK 按钮完成程序添加工作,图4-2。 下面就可以进行系统仿真了。单击主界面下方的按钮开始系统仿真。PROTEUS 所进行的是一种交互式仿真, 在仿真进行中可以对各控制按钮、开关等进行操作, 系统对输入的响应会被真实的反映出来。仿真结果如图4-3。开始仿真后,开关,按钮通过鼠标单击来改变状态,所改变状态的结果会在LED和数码管显示出来。仿真结果与设计方案相符。
图4-3计算器仿真界面
11
课程设计报告
3.2 计算器硬件调试
按照系统硬件连线图连接好系统并调试 (由于个人原因没有做实物调试,只有软件测试) 1、调试程序
(1)把编写好的16进制文件(jtd.hex) 输入单片机AT89S51仿真器和对其进行初始化。 (2)给实验板进行通电,观察运行结果,不一致则跳到第一步进行反复调试,直到与预定目的一致。
2、硬件调试中常见故障:
(1)逻辑错误:它是由设计错误或加工过程中的工艺性错误所造成的。这类错误包括错线、开路、短路等。
(2元器件失效:有两方面的原因:一是器件本身已损坏或性能不符合要求;二是组装错误造成元件失效,如电解电容、二极管的极性错误、集成电路安装方向错误等。
(3)可靠性差:引起可靠性差的原因很多,如金属化孔、接插件接触不良会造成统时好时坏,经不起振动;走线和布局不合理也会引起系统可靠性差。
(4)电源故障:若样机有电源故障,则加电后很容易造成器件损坏。电源故障包括电压值不符合设计要求,电源引线和插座不对,功率不足,负载能力差等。调试方法:包括多级调试和联机调试。在调试过程中要针对可能出现的故障认真分析,直至检查出原因并且排除。
四、结 论
通过这次单片机课程设计,不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且还学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。创新可以是在原有的基础上进行改进,使之功能不断完善,成为真己的东西。设计结果能够符合题意,成功完成了此次课程设计要求,不只在乎这一结果,更加在乎的,是这个过程。这个过程中,花费了大量的时间和精力。在高老师的精心指导和严格要求下,获得了丰富的理论知识,极大地提高了实践能力,单片机领域这对我今后进一步学习及工作有极大的帮助。
12
课程设计报告
附1:硬件仿真图
附2:程序清单
#include
13
课程设计报告
char i,j,temp,num,num_1;
long a,b,c; //a,第一个数 b,第二个数 c,得数 float a_c,b_c;
uchar flag,fuhao; //flag表示是否有符号键按下,fuhao表征按下的是哪个符号 uchar code table[]={7,8,9,0,4,5,6,0,1,2,3,0,0,0,0,0}; uchar code
table1[]={7,8,9,0x2f-0x30,4,5,6,0x2a-0x30,1,2,3,0x2d-0x30,0x01-0x30,0,0x3d-0x30,0x2b-0x30};
unsigned char hy[]={\void delay(uchar z) // 延迟函数 {uchar y; for(z;z>0;z--) for(y=0;y<110;y++);} void check() // 判断忙或空闲 {do{P1=0xFF; rs=0; //指令 rw=1; //读
lcden=0; //禁止读写
delay(1); //等待,液晶显示器处理数据 lcden=1; //允许读写
}while(busy==1); //判断是否为空闲,1为忙,0为空闲 }
void write_com(uchar com) // 写指令函数 {P1=com; //com指令付给P0口 rs=0; rw=0; lcden=0; check(); lcden=1; }
14