简易计算器设计毕业设计论文

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录
第一章计算器设计内容 (2)
(一)任务内容 (2)
(二)任务分析 (2)
第二章方案的设计 (3)
(一)方案设计论证 (3)
(二)方案概述与原理硬件电路图 (3)
第三章计算器设计基本原理 (5)
(一)AT89C51系列单片机 (5)
(二)LCD显示模块 (7)
(三)运算模块 (7)
(四)键盘接口电路 (8)
第四章主程序设计 (9)
第五章结论 (17)
第六章致谢 (18)
第七章参考文献 (19)
第一章计算器设计内容
(一)任务内容
本设计就是充分利用了8051芯片的I/O引脚。

系统以采用MCS-51系列单片机Intel8051为中心器件来设计计算器控制器,实现了能根据实际输入值显示并存储的功能,计算程序则是参照教材。

至于位数和功能,如果有需要可以通过设计扩充原系统来实现。

具体设计如下:
1.由于要设计的是简单的计算器,可以进行四则运算,为了得到教好的显示效果,采用LED显示数据和结果。

2.另外键盘包括数字键(0-9)、符号键(+、-、*、/)、等号键,故只需要16个按键即可,设计中采用手焊接的4*4矩阵键盘。

3.执行程序:开机显示零,等待键入数值,当键入数字,通过LED显示出来,当键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值后将显示键入的数值,按等号就会在LED上输出运算结果。

本计算器是以MCS-51系列8051单片机为核心构成的简易计算器系统。

该系统通过单片机控制,实现对4*4键盘扫描进行实时的按键检测,并把检测数据存储下来。

整个计算器系统的工作过程为:首先存储单元初始化,显示初始值和键盘扫描,判断按键位置,查表得出按键值,单片机则对数据进行储存与相应处理转换,之后送入LED显示器动态显示。

整个系统可分为三个主要功能模块:功能模块一,实时键盘扫描;功能模块二,数据转换成显示器显示;功能模块三,显示器动态显示。

(二)任务分析
在本次设计中,主要完成如下方面的设计任务:
1.简要阐述单片机技术发展的国内外现状及LED动态显示和矩阵键盘基本原理;
2.掌握51系列某种产品的最小电路及外围扩展电路的设计方法;
3.了解单片机数据转换功能及工作过程;
4.完成主要功能模块的硬件电路设计及必要的参数确定;
5.用PROTEUS软件完成原理电路图的绘制;
通过本次课题设计,应用《单片机应用基础》、《计算机应用基础》等所学相关知识及查阅资料,完成简易计算器的设计,以达到理论与实践更好的结合、进一步提高综合运用所学知识和设计的能力的目的。

第二章方案的设计
(一)方案设计论证
如图2..1是方案一原理方框图,它是由8051CPU,8255并行通信接口,四位七段位数码管,小键盘及部分电路组成。

图2.1计算器的组成方框图方案一
如图2.2是方案二原理方框图,它是由8086CPU,8255并行通信接口,四位七段位数码管,小键盘及部分电路组成。

方案评估:
方案一:释放了系统数据总线,但是方案缺乏经济性,因为采用了两片8255,浪费资源,舍弃!
方案二:此种方案较为经济,方便,具有模块化的特点,因为将计算和显示电路全部集成在了8255上,应用时,直接挂接8255即可实现要求!
(二)方案概述与原理硬件电路图
对上面框图的方案二的概述:
本次设计的简易计算器系统是由8086CPU、8255A并行通信接口芯片、四位七段LED数码管、小键盘、74LS138译码器芯片及部分门电路芯片组成,系统组成方框图如图 2.2所示。

这个计算器系统是通过4×4小键盘控制接口输入
需要计算的原始数据和运算符号,这些数据经过8255A并行通信接口输入给8051CPU并保存起来,CPU接收数据后根据不同的运算符来处理数据,然后CPU 把运算处理后的数据经过8255A并行通信接口输出给给四位七段LED数码管,最后后数码管把接收到的数据显示在数码管屏幕上,而74LS138译码器和相应的或门是给8255提供译码片选信号而设计的,只有CPU输出8255选通的地址才能使8255处于正常工作模式,系统才能有效工作,整个计算器系统的详细电路图如图2.3所示。

图2.3简易计算器硬件电路图
图2.3简易计算器原理图
简易计算器,由键盘、存储部件、计算处理部分、显示部分组成。

键盘采用行列扫描工作原理,此种工作方式尽管编程相对比较麻烦,但是可以大大节约了CPU的输入信号点。

输出采用了带锁存功能的数码显示器。

通过单片机对位进行选通,并根据计算记过不断的刷新输出。

第三章简易计算器设计基本原理
(一)AT89C51系列单片机简介
根据功能和指示要求,本系统选用以MCS-51单片机为主控机。

通过扩展必要的外围接口电路,实现对计算器的设计。

2.189c51系列单片机简介
89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS8位微处理器,俗称单片机。

单片机的可擦除只读存储器可以反复擦除100次。

该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。

由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的89C51是一种高效微控制器,89C2051是它的一种精简版本。

89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

STC89c51的引脚说明:
MCS-51系列单片机中的8031、8051及8751均采用40Pin封装的双列直插DIP结构,下图是它们的引脚配置,40个引脚中,正电源和地线两根,外置石英振荡器的时钟线两根,4组8位共32个I/O口,中断口线与P3口线复用。

如表3.1所示对这些引脚的符号,功能加以说明。

表3.1LED的引脚说明
符号引脚说明符号引脚说明
VSS电源地DB4Data I/O
VDD电源正极(+5V)DB5Data I/O
V0液晶显示偏压输入DB6Data I/O
RS数据/命令选择端(H/L)DB7Data I/O
R/W读写控制信号(H/L)
E使能信号
DB0Data I/O RST复位端(H:正常工作,
L:复位)
DB1Data I/O VEE负电源输出(-10V)
DB2Data I/O BLA背光源正极(+4.2)
DB3Data I/O BLK背光源正极
Pin9:RESET/VPC复位信号复用脚,当8051通电,时钟电路开始工作,在RESET引脚上出现24个时钟周期以上的高电平,系统即初始复位。

初始化后,程序计数器PC指向0000H,P0-P3输出口全部为高电平,堆栈指针写入07H,其它专用寄存器被清“0”。

RESET由高电平下降为低电平后,系统即从0000H地址开始执行程序。

然而,初始复位不改变RAM(包括工作寄存器R0-R7)的状态,8051的初始态。

8051的复位方式可以是自动复位,也可以是手动复位。

此外,RESET/Vpd 还是一复用脚,VCC掉电其间,此脚可接上备用电源,以保证单片机内部RAM的数据不丢失。

为保证单片机在上电后保证正常运行本设计采用了图3.1所示的上电自动复位、手动复位电路两种复位方式。

内部时钟方式、外部时钟方式两种时钟方式见图3.2所示。

图3.1上电自动复位与手动复位电路
图3.2内部时钟电路与外部时钟电路
硬件系统是指构成微机系统的实体和装置,通常由运算器、控制器、存储器、
输入接口电路和输入设备、输出接口电路和输出设备等组成。

单片机实质上是一
个硬件的芯片,在实际应用中,通常很难直接和被控对象进行电气连接,必须外
加各种扩展接口电路、外部设备、被控对象等硬件和软件,才能构成一个单片机
应用系统。

本设计选用以AT89c51单片机为主控单元。

显示部分:采用LED静
态显示。

按键部分,采用4*4键盘。

如下图3.3是AT89C51硬件电路原理图。

图3.3AT89C51硬件电路原理图
(二)LED显示模块
本设计采用LED数码管器来显示输出数据。

LED的特性有:1.亮度高,可以在光线明亮的地方及没有光照的条件下均可正常完成显示功能。

2.驱动电流小,内含锁存电路,只需要选通位,不断的刷新数据即可。

3.元件使用寿命长。

工作电流小,更换方便,可以在较复杂的环境下正常工作。

因此本设计采用LED数码管显示器做为本设计的显示元件。

(三)运算模块
MCS-51单片机是在一块芯片中集成了CPU、RAM、ROM、定时器/计数器和多功能I/O等计算机所需要的基本功能部件。

如果按功能划分,它由以下功能部件组成,即微处理器(CPU),数据存储器(RAM),程序存储器(ROM/EPROM),并行I/O口,串行口,定时器/计数器,中断系统及特殊功能寄存器(SFR)。

单片机是靠程序运行的,并且可以修改。

通过不同的程序实现不同的功能,尤其是特殊的一些功能,通过使用单片机编写的程序可以实现高智能、高效率以及高可靠性,因此采用单片机作为计算器的主要功能部件,可以很快的实现运算功能。

运算模块由键盘和显示屏组成。

单片机通过按键来实现输入数据和操作方式的控制,在运算过程中,对所设的数据进行四则运算时,要先确定选用的是哪一个运算符,若是+或*,则要判断结果是否会溢出,溢出则显示错误提示,没有溢
出则显示运算结果,若是/,则要判断除数是否为零,为零时显示错误提示,不
为零显示运算结果。

(四)键盘接口电路
计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用大量的I/O口资源,因此在很多情况下都不采用这种方式,而是采用矩阵键盘的方案。

矩阵键盘采用四条I/O 线作为行线,四条I/O线作为列线组成键盘,在行线和列线的每个交叉点上设置一个按键。

这样键盘上按键的个数就为4×4个。

这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率。

矩阵键盘的工作原理:
如图3.4所示是计算器的键盘内部电路图,布局一般有16个键组成,在单片机中正好可以一个P口实现16个按键功能,这种形式在单片机系统中也最常用。

图3.4矩阵键盘内部电路图
第四章主程序方案设计
KEIL C51是美国KEIL Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。

用过汇编语言后再使用C来开发,体会更加深刻。

Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。

另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。

在开发大型软件时更能体现高级语言的优势。

下面详细介绍Keil C51开发系统各部分功能和使用。

KEIL C51单片机软件开发系统的整体结构C51工具包的整体结构,如图3.1所示,其中UVISION与ISHELL分别是C51for Windows和for DOS的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。

开发人员可用IDE本身或其它编辑器编辑C或汇编源文件。

然后分别由C51及A51编译器编译生成目标文件(.OBJ)。

目标文件可由LIB51创建生成库文件,也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)。

ABS文件由OH51转换成标准的Hex文件,以供调试器dScope51或tScope51使用进行源代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM 中。

普通计算器序设计:
//****************************************//
//通用计算器的编写,能够实现两位的加减计算+,-,*,/
#include<reg51.h>
#include<string.h>
#include"LED.h"
#include"keyboard.h"
#include"calculation.h"
#define uchar unsigned char
#define uint unsigned int
double num[2];
uchar sign[2];
uchar numble1[10];
uchar numble2[10];
void main()
{int i=0,j=0,k=0,flag=0,a=0,b,c=0,e=0,opNum=0;
long int sum1,sum0;
double sum2;
init();
write_com(0x80);
while(!mark)
{matrixkeyscan();}
mark=0;
while(expression[j]!='=')
if(!In(expression[j],OP))//如否不是运算符就入操作数栈if(opNum==0)
{opNum=expression[j]-48;
++j;
if(In(expression[j],OP))
flag=1;
else
opNum=opNum*10+(expression[j]-48);
++j;
if(In(expression[j],OP))
flag=1;
if(flag==1)
num[i]=opNum;
opNum=0;
i++;
flag=0;
else
sign[k]=expression[j];
++j;
k++;
sum1=Operator(num[0],sign[0],num[1]);
sum2=Operator(num[0],sign[0],num[1]);
sum0=sum1;
while(sum1!=0)
numble1[a]=sum1%10+48;
sum1=sum1/10;
a++;
b=strlen(numble1);
write_com(0x80+0x40);
for(c=b-1;c>=0;c--)
write_data(numble1[c]); delayms(10);
write_data('.');
sum2=sum2*1000;
sum0=sum2-sum0*1000;
numble2[0]=sum0/100+48; numble2[2]=sum0%10+48; numble2[1]=(sum0/10)%10+48; if(numble2[2]>=(5+48)) numble2[1]=numble2[1]+1; write_data(numble2[0]); delayms(5);
write_data(numble2[1]); delayms(5);
while(1);
//************************** //键盘扫描程序驱动
//文件名:keyboard.h
//************************** #ifndef__keyboard_H__
#define__keyboard_H__
#include<reg51.h>
#include"LED1602.h"
#define uchar unsigned char #define uint unsigned int uint move=0;
uchar mark=0;
uchar code table[]={'0','1','2','3','4','5','6','7','8','9'}; uchar expression[20];
uchar code OP[]={'+','-','*','/','=','\n'};
void matrixkeyscan()
uchar temp,key;
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
delayms(10);
temp=P3;
temp=P3&0xf0;
if(temp!=0xf0)
temp=P3;
switch(temp)
case0xee:key=0;break;
case0xde:key=1;break;
case0xbe:key=2;break;
case0x7e:key=3;break;
while(temp!=0xf0)
{temp=P3;temp=temp&0xf0;}
write_data(table[key]);
delayms(5);
expression[move]=table[key];
move++;
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{delayms(10);
temp=P3;
temp=P3&0xf0;
if(temp!=0xf0)
{temp=P3;
switch(temp)
{case0xed:key=4;break;
case0xdd:key=5;break;
case0xbd:key=6;break;
case0x7d:key=7;break;
while(temp!=0xf0)
{temp=P3;temp=temp&0xf0;} write_data(table[key]); delayms(5);
expression[move]=table[key]; move++;
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
delayms(10);
temp=P3;
temp=P3&0xf0;
if(temp!=0xf0)
temp=P3;
switch(temp)
{case0xeb:key=8;break;
case0xdb:key=9;break;
case0xbb:key=10;break;
case0x7b:key=11;break;}
while(temp!=0xf0)
temp=P3;
temp=temp&0xf0;
if(key<10)
write_data(table[key]); delayms(5);}
else
{write_data(OP[key-10]);
delayms(5);}
expression[move]=table[key];
move++;
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
delayms(10);
temp=P3;
temp=P3&0xf0;
if(temp!=0xf0)
temp=P3;
switch(temp)
case0xe7:key=12;break;
case0xd7:key=13;break;
case0xb7:key=14;break;
case0x77:key=15;break;
while(temp!=0xf0)
{temp=P3;temp=temp&0xf0;}
if(key==14)
mark=1;
write_data(OP[key-10]);
delayms(5);
expression[move]=table[key];
move++;
#endif
//*********************************************** //LED1602驱动程序
//文件名:LED1602.h
//*********************************************** #ifndef__LED1602_H__
#define__LED1602_H__
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcden=P2^4;
sbit lcdrs=P2^5;
void delayms(uint xms)
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
void write_com(uchar com)
lcdrs=0;
P0=com;
delayms(5);
lcden=1;
delayms(5);
lcden=0;
void write_data(uchar date)
lcdrs=1;
P0=date;
delayms(5);
lcden=1;
delayms(5);
lcden=0;
void init()
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
#endif
//*************************************************** //数学计算程序
//文件名:calculation.h
//**************************************************** #ifndef__calculation_H__
#define__calculation_H__
#define uchar unsigned char
#define uint unsigned int
double Operator(double first,char theta,double second) switch(theta)
case'+':
return first+second;
break;
case'-':
return first-second;
break;
case'*':
return first*second;
break;
case'/':
return first/second;
break;
default:
break;
char In(char c,char*OP)
int i=0;
while(OP[i]!='\0')
if(OP[i]==c)
return1;
i++;
return0;
#endif
第五章结论
经过长时间的寻找相关知识,我终于顺利的完成了毕业设计。

一开始我思考了很久,从哪个方向开始入手,但通过不断的寻找计算器相关内容的书籍,经历了一次又一次的困难,慢慢累积了很多宝贵的经验。

在整个设计中遇到的主要困难有三点,第一:基础知识掌握的不牢固,常用的电路的形式和功能不清楚。

第二:对一些常用的应用软件缺少应用,体现在画电路图和系统的仿真的时候,对这些软件的操作不熟练,浪费了很多时间。

第三:相关知识掌握的不全面,缺少设计的经验。

这次的设计端正了我学习的态度,学会了如何严谨对待自己,不能够一知半解。

急于求成是不好的,我有所感受。

如果忽略了那些必要的步骤,急于求成,不仅会浪费时间,还会适得其反。

在设计开始之前,头脑里必须要清楚的知道应该怎么做,这一点是很重要的。

第六章致谢
本次毕业设计让我学到了很多专业知识,也让我学到了许多解决问题的办法。

让我认识到设计是一项综合技能的展现,需要对专业知识融会贯通,同时更体会到需要团队的协作及知识的研究与分享。

非常感谢我的指导老师,寝室的同学,及我所在实习公司的同事。

是他们给我的设计提出了诸多宝贵的实践经验,在我设计的过程中能无私地给予指导、鼓励。

谢谢大家!
第七章参考文献
1徐爱钧.智能化测量控制仪表原理与设计[M].北京:北京航天航空大学出版社,2014.
2孙育才,等.MCS-51系列单片微型计算机及其应用[M].上海:东南大学出版社,2016.
3李萍.智能仪器实验指导书[M].大连:大连交通大学,2014.
4单片机应用技术(C语言)[M].北京:中国劳动社会保障出版社,2013.
5武庆生,仇梅,等.著.单片机原理与应用[M].北京:电子科技大学出版,2015. 6朱定华.单片机原理与接口技术[M].西安:电子工业出版社,2013.
7龚运新.单片机C语言开发技术[M].北京:北京清华大学出版社,2014.
8周立功.单片机实验与实践[M].北京:北京航空航天大学出版社,2013.。

相关文档
最新文档