专业设计报告简易计算器设计Word格式文档下载.docx
《专业设计报告简易计算器设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《专业设计报告简易计算器设计Word格式文档下载.docx(29页珍藏版)》请在冰点文库上搜索。
附录17
1.源程序17
2.仿真图23
3.硬件电路调试图24
电气信息学院课程设计评分表25
第一章方案与设计
1.1设计目标和实现方法
为了满足计算器的基本要求,可以实现基本的运算(加减乘除)和数据清零可重新运算,我们采用基于单片机设计计算器,并用LED数码管显示两个进行运算的两位数和运算后的结果,使用4*4的矩阵键盘实现数据输入。
设计仿真和调试要用到Protues、Keil等软件。
1.2方案论证与设计
根据功能和指标要求,本系统选用MCS51单片机为主控机。
通过扩展必要的外围接口电路,实现对计算器的设计。
具体设计考虑如下:
(1)由于要设计的是简单的计算器,要求可以进行两个两位数的四则运算,对数字的大小范围要求不高,所以选用5个LED数码管显示数据和结果。
(2)另外键盘包括数字键(0~9)、符号键(+、-、×
、÷
)、清除键和等号键,故需要16个按键。
(3)使用keil软件编写程序,并在Protues上进行电路仿真调试,仿真调试成功后将程序下载到单片机开发板上进行硬件调试。
键盘输入
复位电路
时钟电路
系统模块图:
主控电路
电源
显示模块
程序流程图如下图所示:
第二章模块介绍
2.1主控模块
MCS-51单片机是在一块芯片中集成了CPU、RAM、ROM、定时器/计数器和多功能I/O等一台计算机所需要的基本功能部件。
如果按功能划分,它由如下功能部件组成,即微处理器(CPU)、数据存储器(RAM)、程序存储器(ROM/EPROM)、并行I/O口、串行口、定时器/计数器、中断系统及特殊功能寄存器(SFR)。
单片机是靠程序运行的,并且可以修改。
通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,通过使用单片机编写的程序可以实现高智能,高效率,以及高可靠性。
因此我们采用单片机作为计算器的主要功能部件,可以进行很快地实现运算功能。
单片机芯片如下图所示:
单片机、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线,其内部结构如图所示:
中央处理器:
中央处理器(CPU)是整个单片机的核心部件,是8位数据宽度的处理器,能处理8位二进制数据或代码,CPU负责控制、指挥和调度整个单元系统协调的工作,完成运算和控制输入输出功能等操作。
数据存储器(RAM):
其内部有128个8位用户数据存储单元和128个专用寄存器单元,它们是统一编址的,专用寄存器只能用于存放控制指令数据,用户只能访问,而不能用于存放用户数据,所以,用户能使用的RAM只有128个,可存放读写的数据,运算的中间结果或用户定义的字型表。
程序存储器(ROM):
共有4096个8位掩膜ROM,用于存放用户程序,原始数据或表格。
定时/计数器:
有两个16位的可编程定时/计数器,以实现定时或计数产生中断,用于控制程序转向。
并行输入输出(I/O)口:
4组8位I/O口(P0、P1、P2和P3),用于对外部数据的传输。
P0口是一个8位漏极开路型双向I/O口,内部不带上拉电阻,当外接上拉电阻时,口能以吸收电流的方式驱动八个LSTTL负载电路。
通常在使用时外接上拉电阻,用来驱动多个数码管。
P1口能驱动4个LSTTL负载。
在使用时外不需要外接上拉电阻,直接驱动发光二极管。
端口置1时内部上拉电阻将端口拉到高电平,作输入用。
P2口,是一个带内部上拉电阻的8位双向I/O口,P2口能驱动4个LSTTL负载。
端口置1时,内部上拉电阻将端口拉到高电平,作输入用。
P3口,是一个带内部上拉电阻的8位双向I/O口,P2口能驱动4个LSTTL负载,这8个引脚还用于专门的第二功能。
P1-P3端口在做输入使用时,因内部有上接电阻,被外部拉低的引脚会输出一定的电流。
除此之外P3端口还用于一些专门功能,具体如下:
P3引脚
兼用功能
P3.0
串行通讯输入(RXD)
P3.1
串行通讯输出(TXD)
P3.2
外部中断0(INT0)
P3.3
外部中断1(INT1)
P3.4
定时器0输入(T0)
P3.5
定时器1输入(T1)
P3.6
外部数据存储器写选通WR
P3.7
外部数据存储器写选通RD
全双工串行口:
内置一个全双工串行通信口,用于与其它设备间的串行数据传送,该串行口既可以用作异步通信收发器,也可以当同步移位器使用。
中断系统:
有两个外中断、两个定时/计数器中断和一个串行中断,可满足不同的控制要求,并具有2级的优先级别选择。
时钟电路:
内置最高频率达12MHz的时钟电路,用于产生整个单片机运行的脉冲时序,需外置振荡电容。
为了能够更好地理解单片机的结构特附上MCS-51系列单片机的内部结构示意图:
2.2显示模块
发光二极管LED是单片机应用系统中的一宗简单而常用的输出设备,其在系统中的主要作用是显示单片机的输出数据、状态等。
因而作为典型的外围器件,LED显示单元是反映系统输出和操作输入的有效器件。
LED具备数字接口可以方便的和大年纪系统连接;
它的优点是价格低,寿命长,对电压电流的要求低及容易实现多路等,因而在单片机应用系统中获得了广泛的应用,所以在此设计中选用LED作为显示器件。
LED显示器由七段发光二极管组成,排列成8字形状,因此也称为七段LED显示器,器排列形状如下图所示:
为了显示数字或符号,要为LED显示器提供代码,即字形代码。
七段发光二极管,再加上一个小数点位,共计8段,因此提供的字形代码的长度正好是一个字节。
简易计算器用到的数字0~9的共阴极字形代码如下表:
0~9七段数码管共阴级字形代码
显示字型
g
f
e
d
c
b
a
段码
1
3fh
06h
2
5bh
3
4fh
4
66h
5
6dh
6
7dh
7
07h
8
7fh
9
6fh
本次设计中需要用到的运算符“+、-、*、/”可自行定义。
2.3按键模块
计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,会占用大量的I/O口资源,因此我们引入了矩阵键盘的应用,采用四条I/O线作为行线,四条I/O线作为列线组成键盘。
在行线和列线的每个交叉点上设置一个按键。
这样键盘上按键的个数就为4×
4个。
这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率。
按键连接电路如下图所示:
在矩阵式键盘电路中,行连接线和列连接线分别占用4条I/O口线,共连接16个按键。
此处列线连接的接口为输入口,用于输入按键的列位置信息,行线连接的接口为输出口,用于输出扫描电平。
本次设计中键盘控制程序需完成的任务有:
监测是否有键按下,有键按下时,延时消除按键抖动影响;
不管一次按键持续多长时间,仅执行一次按键功能程序。
当无按键闭合时,P10~P13与P14~P17之间开路;
当有键闭合时,与闭合键相连的两条I/O口线之间短路。
判断有无按键按下的方法是:
第一步,置列线P14~P17为输入状态,从行线P10~P13输出低电平,读入列线数据,若某一列线为低电平,则该列线上有键闭合。
第二步,行线轮流输出低电平,从列线P14~P17读入数据,若有某一列为低电平,则对应行线上有键按下。
综合一二两步的结果,可确定按键编号。
2.4时钟电路
在MCS--51单片机内有一个高增益的反相放大器,其输入端为XTAL1,输出端为XTAL2,又该放大器构成的振荡电路和时钟电路一起构成了单片机的时钟方式。
单片机的时钟连接方式可分为内部时钟方式和外部时钟方式,此处采用内部时钟方式,如下图所示:
此处要注意的是,在内部方式时钟电路中必须在XTAL1和XTAL2引脚两端跨接石英晶体振荡器和两个微调电容构成震荡电路。
下图为两种时钟方式简图,以便于比较理解。
内部时钟方式外部时钟方式
2.5复位电路
单片机复位是使CPU和系统中的其他功能都处在一个确定的初始状态,并从这个状态开始工作。
单片机复位的条件是:
必须使RST/Vpd或RST加上持续两个周期的高电平。
在RST引脚出现高电平后的第二个周期执行复位。
单片机常见的复位电路有上电复位和按键复位电路。
本设计的复位电路如下图所示:
两种复位电路简图如下:
上电复位电路按键复位电路
第三章运算主程序设计
首先初始化参数,送LED低位显示“0”,高位不显示。
然后扫描键盘看是否有键输入,若有,读取键码。
判断键码是数字键、清零键还是功能键(“+”“-”“*”“/”“=”),是数值键则送LED显示并保存数值,是清零键则做清零处理,是功能键则又判断是“=”还是运算键,若是“=”则计算最后结果并送LED显示,若是运算键则保存相对运算程序的首地址。
主程序的流程图如下所示:
第四章仿真调试
在程序设计方法上,模块化程序设计是单片机应用中最常用的程序设计方法。
设计的中心思想是把一个复杂应用程序按整体功能划分成若干相对独立的程序模块,各模块可以单独设计、编程和调试,然后组合起来。
这种方法便于设计和调试,容易实现多个程序共存,但各个模块之间的连接有一定的难度。
根据需要我们可以采用自上而下的程序设计方法,此方法先从主程序开始设计,然后再编制各从属程序和子程序,层层细化逐步求精,最终完成一个复杂程序的设计。
这种方法比较符合人们的日常思维,缺点是一级的程序错误会对整个程序产生影响。
功能和操作:
加减乘除运算和显示。
①上电后,屏幕初始化。
②计算。
按下数字键,屏幕显示要运算的第一个数字,再按下符号键,屏幕上显示所设置的运算符号,然后再按下数字键,屏幕显示要运算的第二个数字,此时屏幕上为此次运算的算式,最后按下“﹦”号键,屏幕上显示出计算结果。
③如果要再次计算,可以按下“ON/C”键清零,或者按下单片机的复位键,重新初始化。
第五章总结与体会
本次课程设计历时两个星期左右,通过这两个星期的学习,发现了自己的很多不足,自己知识的很多漏洞,看到了自己的实践经验还是比较缺乏,理论联系实际的能力还急需提高。
在这次课程设计中,学到很多东西,对单片机有了进一步的了解。
在这次课程设计中,通过对键盘控制电路的设计,使我了解键盘设计的基本方法,学到更多有关于电路方面的知识,真正的将理论和实践联系在一起。
更重要的是学到了用电脑软件实现电路原理的知识,用电脑的仿真方法使得设计更为简便,这对于我们电子专业来说是很重要的。
这次的课程设计让我看到自己力量的渺小,我发现仅靠自己掌握的东西想要做好课程设计实在是太难了。
在程序设计的过程中总是会遇到自己不能解决的问题,在此我必须要感谢跟我做同一个课题的同学给我的帮助,没有他们的帮助我不可能顺利的完成课程设计,从心底表示由衷的感谢。
通过这次课程设计使我懂得了理论知识与实际相结合的重要性,只有理论知识是远远不够的,只有两者相结合,才能提高自己的动手能力和独立思考的能力,才能发现在设计过程中所遇到的问题。
由于这次的课程设计是在我们刚开始做单片机的实验,这就使得对keil和proteus都不熟悉的我们感到格外的困难,但功夫不负有心人,通过和同学的讨论及寻找参考资料,最终终于完成了课程设计。
对我而言,知识上的收获重要,精神上的丰收更加可喜。
让我知道了学无止境的道理。
我们每一个人永远不能满足于现有的成就,人生就像在爬山,一座山峰的后面还有更高的山峰在等着你。
挫折是一份财富,经历是一份拥有。
这次课程设计必将成为我人生旅途上一个非常美好的回忆。
参考文献
[1]郑锋等.51单片机应用系统典型模块开发大全(第3版)[M].北京:
中国铁道出版社,2013.11
[2]张齐等.单片机原理与嵌入式系统设计——原理、应用、Protues仿真、实验设计[M].北京:
电子工业出版社,2011.8.
[3]黄勤.单片机原理及应用[M].北京:
清华大学出版社,2010.7
附录
1.源程序
#include<
reg51.h>
#defineucharunsignedchar
#defineuintunsignedint
ucharcodeTable[14]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x49,0x40,0x0f,0x4f};
voiddisplay1(uinta);
voiddisplays(uintb);
voiddisplay2(uintc);
voiddisplayx(uintx);
voiddelayms(uintj)
{uinti;
for(;
j>
0;
j--)
{i=10;
while(--i);
}
}
intfastfound()
{ucharkeyin,n;
P3=0xf0;
keyin=P3;
keyin=keyin&
0xf0;
if(keyin!
=0xf0)
for(n=0;
n<
10;
n++);
return
(1);
else
return(0);
intkeyfound()
{uchart,key;
P3=0xf7;
t=P3;
t=t&
if(t!
{delayms
(1);
{t=P3;
switch(t)
{case0xe7:
key=7;
break;
case0xd7:
key=8;
case0xb7:
key=9;
case0x77:
key=13;
while(t!
t=t&
return(key);
P3=0xfb;
{case0xeb:
key=4;
case0xdb:
key=5;
case0xbb:
key=6;
case0x7b:
key=12;
P3=0xfd;
{case0xed:
key=1;
case0xdd:
key=2;
case0xbd:
key=3;
case0x7d:
key=11;
P3=0xfe;
{case0xee:
key=15;
case0xde:
key=0;
case0xbe:
key=14;
case0x7e:
key=10;
uintcount(uintx1,uintx2,uints)
{uintnum=0;
switch(s)
{case10:
num=x1+x2;
break;
case11:
num=x1-x2;
case12:
num=x1*x2;
case13:
num=x1/x2;
default:
P0=0x79;
return(num);
voiddisplay1(uinta)
{uinti,j;
i=a/10;
j=a%10;
P2=0x03;
P0=Table[i];
delayms
(1);
P2=0x04;
P0=Table[j];
voiddisplays(uintb)
{P2=0x05;
P0=Table[b];
voiddisplay2(uintc)
i=c/10;
j=c%10;
P2=0x06;
P2=0x07;
voiddisplayx(uintx)
{uinti,j,k,l,m;
i=0;
j=x/1000;
k=x%1000/100;
l=x%1000%100/10;
m=x%1000%100%10;
P2=0x05;
P0=Table[k];
P0=Table[l];
P0=Table[m];
voidmain()
{
uintx=0;
while
(1)
{uintnum1,num2,symbol=0;
uinttemp1=0,temp2=0,temp3=0,temp4=0,flg=0,temp;
{num1=temp1*10+temp2;
display1(num1);
displays(symbol);
num2=temp3*10+temp4;
display2(num2);
if(fastfound()==1)
{temp=keyfound();
flg++;
if((temp>
9)&
&
(temp<
14))
{symbol=temp;
while(fastfound()==1);
if(temp==14)
{while(fastfound()==1);
gotoloop;
if(temp==15)
{num1=0,num2=0,symbol=10;
if(flg==1)
{temp1=keyfound();
}
if(flg==2)
{temp2=keyfound();
if(flg==4)
{temp3=keyfound();
if(flg==5)
{temp4=keyfound();
loop:
x=count(num1,num2,symbol);
{displayx(x);
}
2.仿真图
3.硬件电路调试图
电气信息学院课程设计评分表
项目
评价
优
良
中
及格
差
设计方案合理性与创造性(10%)
开发板焊接及其调试完成情况*(10%)
硬件设计或软件编程完成情况(20%)
硬件测试或软件调试结果*(10%)
设计说明书质量(20%)
答辩情况(10%)
完成任务情况(10%)
独立工作能力(10%)
出勤情况(10%)
综合评分
指导教师签名:
________________