基于89C51的计算器设计.docx

上传人:b****8 文档编号:9577314 上传时间:2023-02-05 格式:DOCX 页数:45 大小:3.06MB
下载 相关 举报
基于89C51的计算器设计.docx_第1页
第1页 / 共45页
基于89C51的计算器设计.docx_第2页
第2页 / 共45页
基于89C51的计算器设计.docx_第3页
第3页 / 共45页
基于89C51的计算器设计.docx_第4页
第4页 / 共45页
基于89C51的计算器设计.docx_第5页
第5页 / 共45页
点击查看更多>>
下载资源
资源描述

基于89C51的计算器设计.docx

《基于89C51的计算器设计.docx》由会员分享,可在线阅读,更多相关《基于89C51的计算器设计.docx(45页珍藏版)》请在冰豆网上搜索。

基于89C51的计算器设计.docx

基于89C51的计算器设计

单片机系统

课程设计

成绩评定表

设计课题基于89C51的计算器设计

学院名称:

电气工程学院

专业班级:

自动化1102

学生姓名:

路同林

学号:

201123910214

指导教师:

王黎

设计地点:

31-630

设计时间:

2013-12-16~2013-12-27

指导教师意见:

 

成绩:

签名:

年月日

单片机系统

课程设计

 

课程设计名称:

基于89C51的计算器设计

专业班级:

自动化1102

学生姓名:

路同林

学号:

201123910214

指导教师:

王黎

课程设计地点:

31-630

课程设计时间:

2013-12-16~2013-12-27

单片机系统课程设计任务书

学生姓名

路同林

专业班级

自动化1102

学号

201123910214

题目

基于89C51的单片机设计

课题性质

工程设计

课题来源

自拟

指导教师

王黎

主要内容

(参数)

利用89C51单片机设计计算器,要求能够实现以下的功能:

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

2.加、减、乘、除四则运算。

3. 具备蜂鸣器按键提示功能  

4.具备复位功能 

具备删除功能:

如数字输入错误,可以通过删除键,对错误的数字进行删除操作;

任务要求

(进度)

第1天:

熟悉课程设计任务及要求,查阅技术资料,确定设计方案。

第2天:

按照确定的方案设计单元电路。

要求画出单元电路图,元件及元件参数选择要有依据,各单元电路的设计要有详细论述。

第3天:

画各部分流程图,进行软件设计,编写程序。

第4-5天:

撰写课程设计报告。

要求内容完整、图表清晰、语言流畅、格式规范、方案合理、设计正确。

主要参考

资料

[1]杨家成.单片机原理与应用及C51程序设计[M].北京:

清华大学出版社,2007

[2]夏路易石宗义.Protel99se电路原理图与电路板设计教程[M].北京:

北京希望电子出版社,2004

[3]阎石.数字电子技术基础[M].北京:

高等教育出版社,2009.

审查意见

 

系(教研室)主任签字:

年月日

1概述

1.1研究背景

计算器(Calculator)是微型电子计算机的一种特殊类型。

它与一般通用计算机的主要区别在于程序输入方式的不同。

计算器的程序一般都已经固定,只需按键输入数据和运算符号就会得出结果,很容易就能掌握。

而一般计算机的程序可以根据需要随时改动,或重新输入新的程序。

简易计算器主要用于加减乘除;科学计算器,又增添了初等函数运算(有的还带有数据总加、求平均值等统计运算)。

现代电子计算器首次问世是1963年。

那时的计算器是台式的,在美国波士顿的电子博览会上展出过。

与计算机相比,它小巧玲珑,计算迅捷,一般问题不必事先编写复杂的程序。

随着社会需求,计算器也从原有单一的数字加减计算演变为复杂的多种运算。

现在不在单一的在某一方面而是涉及到生活的方方面面.计算器为人们日常生活中省去了大量的时间和精力,成为现代社会最普遍、最实用的计算工具,作为学习电子行业的我们,就更应该更贴近生活,开发制作一些具有实用意义,又具有学习意义的小产品。

在设计中,把理论与实践相结合,用理论来指导实践,通过实践更好的掌握理论知识,达到全面提高各方面的专业知识和专业技能。

因此针对以上方面,在贴近自己的实际生活中,结合自己专业特点,选择用89c51单片机来设计简易计算器,一方面,简易计算器对我们来说比较熟悉,对没有很多设计经验的我们来说也比较容易能接受,容易激发我们的兴趣。

另一方面,在单片机百花齐放的时代,我们需放点精力在单片机上,针对为何选89c51,因为它是一种通用型的单片机,性价比较高,虽然是8位的单片机,但现在应用的量及范围还很大,同时,因51单片机发展的历史长,学习资料比较多而且完善。

总之,这是我选择用89c51来设计简易计算器的原因。

1.2设计思想及基本功能

本设计是基于51系列单片机来进行的数字计算器系统设计,可以完成计算器的键盘输入,进行加、减、乘、除基本四则运算,并在LCD上显示相应的结果;设计电路采用AT89C51单片机为主要控制电路,4*4键盘的扫描读取键盘上的输入;显示采用字符LCD1602显示;软件方面使用C语言编程,并用PROTUES仿真。

利用89C51单片机设计计算器,要求能够实现以下的功能:

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

2.加、减、乘、除四则运算。

3.具备蜂鸣器按键提示功能  

4.具备复位功能 

5.具备删除功能:

如数字输入错误,可以通过删除键,对错误的数字进行删除操。

6.可以利用上一次计算值进行连续运算,计算结果可以是负数。

2总体方案设计

2.1方案选取

单片机在各种电子产品中的应用已经越来越广泛,很多的电子产品利用单片机所取得的便利得到了人们的好评,针对单片机控制的计算器系统的显示实现方案有两种:

方案一:

采用8位段数码管。

方案二:

采用液晶显示器件。

方案一:

采用8位段数码管。

将单片机得到的数据通过数码管显示出来。

该方案简单易行,但所需的元件较多,可读性差,一旦设定后很难再加入其他的功能,而且温度显示格式受限制,耗电量大,不宜用电池给系统供电。

方案二:

采用液晶显示器件。

液晶显示具有平稳、省电、美观等优点,更容易满足题目要求。

而且对后续的工艺兼容性高,只需将修改软件中程序设计即可,可操作性强,也易于读数。

LCD1602液晶显示器具有两行十六个字符的显示,能同时显示其它的信息如日期、时间、星期、温度。

经过对比我们选择了方案二,用LCD1602液晶显示器显示数据。

针对单片机控制的计算器系统的显示实现方案有两种:

方案一:

采用利用单片机的外部中断INT0(INT1)来检查是否有按键按下。

方案二:

采用查询法来检测是否有按键按下。

方案一:

采用利用单片机的外部中断INT0(INT1)来检查是否有按键按下,如图,利用中断来检测是否有按键按下虽然实时性很强而且能极大程度的节省单片机资源,CPU不必时时刻刻的检测是否有按键按下而不能把主权交给其他的任务,但是由于本系统没有其他的任务只有检测按键按下一个任务,从软件和硬件的复杂度上还是没必要采用中断的。

方案二:

采用查询法来检测是否有按键按下,如图,这样单片机不停地在一个循环里检测是否有按键按下,虽然很浪费系统资源,但是,从成本上考虑还是比较经济的。

经过的对比,我们选择方案二,采用查询法检测是否有按键按下。

2.2系统框图

图2.1系统框图

3硬件电路设计

3.1电源电路设计

单片机正常工作电压为5V,因此设计的电源电路主要是提供单片机工作电压。

下图是为单片机提供电压的电源电路。

在这个电路中采用了三端集成稳压器LM7805,可以输出5V的直流电压以供给单片机。

图电源指示

图3.1电源电路图

3.2晶振电路

电路中的晶振即石英晶体震荡器。

由于石英晶体震荡器具有非常好的频率稳定性和抗外界干扰的能力,所以,石英晶体震荡器是用来产生基准频率的。

通过基准频率来控制电路中的频率的准确性。

同时,它还可以产生振荡电流,向单片机发出时钟信号。

图3.2是单片机的晶振电路。

片内电路与片外器件就构成一个时钟产生电路,CPU的所有操作均在时钟脉冲同步下进行。

片内振荡器的振荡频率非常接近晶振频率,一般多在1.2MHz~24MHz之间选取。

C1、C2是反馈电容,其值在20pF~100pF之间选取,典型值为30pF。

本电路选用的电容为30pF,晶振频率为12MHz。

振荡周期=

机器周期

指令周期=

XTAL1接外部晶体的一个引脚,XTAL2接外晶体的另一端。

在单片机内部,接至上述振荡器的反相放大器的输出端。

采用外部振荡器时,对HMOS单片机,该引脚接外部振。

在石英晶体的两个管脚加交变电场时,它将会产生一定频率的机械变形,而这种机械振动又会产生交变电场,上述物理现象称为压电效应。

一般情况下,无论是机械振动的振幅,还是交变电场的振幅都非常小。

但是,当交变电场的频率为某一特定值时,振幅骤然增大,产生共振,称之为压电振荡。

这一特定频率就是石英晶体的固有频率,也称谐振频率。

石英晶振起振后要能在XTAL2线上输出一个3V左右的正弦波,以便使MCS-51片内的OSC电路按石英晶振相同频率自激振荡。

通常,OSC的输出时钟频率fOSC为0.5MHz-16MHz,典型值为12MHz或者11.0592MHz。

电容C1和C2可以帮助起振,典型值为30pF,调节它们可以达到微调fOSC的目的。

图3.2单片机晶振电路图

3.3复位电路

影响单片机系统运行稳定性的因素可大体分为外因和内因两部分:

(1)外因射频干扰,它是以空间电磁场的形式传递在机器内部的导体(引线或零件引脚)感生出相应的干扰,可通过电磁屏蔽和合理的布线/器件布局衰减该类干扰;电源线或电源内部产生的干扰,它是通过电源线或电源内的部件耦合或直接传导,可通过电源滤波、隔离等措施来衰减该类干扰。

(2)内因振荡源的稳定性,主要由起振时间频率稳定度和占空比稳定度决定起振时间可由电路参数整定稳定度受振荡器类型温度和电压等参数影响复位电路的可靠性。

复位是单片机的初始化操作。

单片机启运运行时,都需要先复位,其作用是使CPU和系统中其他部件处于一个确定的初始状态,并从这个状态开始工作。

因而,复位是一个很重要的操作方式。

但单片机本身是不能自动进行复位的,必须配合相应的外部电路才能实现。

复位电路的基本功能是:

系统上电时提供复位信号,直至系统电源稳定后,撤销复位信号。

为可靠起见,电源稳定后还要经一定的延时才撤销复位信号,以防电源开关或电源插头分-合过程中引起的抖动而影响复位图3.3所示的RC复位电路可以实现上述基本功能。

图3.3复位电路图

3.5键盘电路

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

为此,我们引入了矩阵键盘的应用,采用四条I/O线作为行线,四条I/O线作为列线组成键盘。

在行线和列线的每个交叉点上设置一个按键。

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

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

矩阵键盘的工作原理:

计算器的键盘布局如图2所示:

一般有16个键组成,在单片机中正好可以用一个P口实现16个按键功能,这种形式在单片机系统中也最常用。

由图3矩阵键盘内部电路图可以知道,当无按键闭合时,P30~P33与P34~P37之间开路。

当有键闭合时,与闭合键相连的两条I/O口线之间短路。

判断有无按键按下的方法是:

第一步,置列线P34~P37为输入状态,从行线P30~P33输出低电平,读入列线数据,若某一列线为低电平,则该列线上有键闭合。

第二步,行线轮流输出低电平,从列线P34~P37读入数据,若有某一列为低电平,则对应行线上有键按下。

综合一二两步的结果,可确定按键编号。

但是键闭合一次只能进行一次键功能操作,因此须等到按键释放后,再进行键功能操作,否则按一次键,有可能会连续多次进行同样的键操作。

图3.4按键布局

图3.5键盘接口电路

3.6显示电路

图3.7LCD1602实物图

液晶屏LCD1602的介绍:

LCD1602已很普遍了,具体介绍我就不多说了,市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。

字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样。

图3.8LCD1602引脚图

液晶屏LCD1602的功能及应用

表3.1引脚接口说明表

第1脚:

VSS为地电源。

第2脚:

VDD接5V正电源。

第3脚:

VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。

第4脚:

RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。

第5脚:

R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。

当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。

第6脚:

E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。

第7~14脚:

D0~D7为8位双向数据线。

第15脚:

背光源正极。

第16脚:

背光源负极。

`1602液晶模块内部的控制器共有11条控制指令,如下表所示

表3.2控制命令表

1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。

(说明:

1为高电平、0为低电平)指令1:

清显示,指令码01H,光标复位到地址00H位置。

指令2:

光标复位,光标返回到地址00H。

指令3:

光标和显示模式设置I/D:

光标移动方向,高电平右移,低电平左移S:

屏幕上所有文字是否左移或者右移。

高电平表示有效,低电平则无效。

指令4:

显示开关控制。

D:

控制整体显示的开与关,高电平表示开显示,低电平表示关显示C:

控制光标的开与关,高电平表示有光标,低电平表示无光标B:

控制光标是否闪烁,高电平闪烁,低电平不闪烁。

指令5:

光标或显示移位S/C:

高电平时移动显示的文字,低电平时移动光标。

指令6:

功能设置命令DL:

高电平时为4位总线,低电平时为8位总线N:

低电平时为单行显示,高电平时双行显示F:

低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。

指令7:

字符发生器RAM地址设置。

指令8:

DDRAM地址设置。

指令9:

读忙信号和光标地址BF:

为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。

指令10:

写数据。

指令11:

读数据

写时序:

读时序:

3.7程序下载电路

串口ISP下载线,ISP(in-systemprogramming)--在线系统编程,一种无需将存储芯片(如EPROM)从嵌入式设备上取出就能对其进行编程的过程,缩略为ISP。

ISP(in-systemprogramming)--在线系统编程,一种无需将存储芯片(如EPROM)从嵌入式设备上取出就能对其进行编程的过程,缩略为ISP。

在系统编程需要在目标板上有额外的电路完成编程任务。

其优点是,即使器件焊接在电路板上,仍可对其(重新)进行编程。

在系统可编程是Flash存储器的固有特性(通常无需额外的电路),Flash几乎都采用这种方式编程。

ISP下载线就是一根用来在线下载程序的线,类似USB线,但不一样。

串口ISP下载线。

可以用MAX232芯片进行搭建。

需要104电容等基本原件。

相关原件及电路图都可在网上找到。

值得注意的是104电容应选择电解电容而不是瓷片电容。

后者不能很好传输数据,而且容易失败。

建议使用电解电容。

4系统软件设计

系统软件设计主要包括显示子程序,键盘子程序,输入处理程序。

4.1主程序软件设计

主程序的流程图如图所示。

图4.1主流程图

主程序构成无限循环,主要完成单片机初始化,之后是程序进入一个死循环,从而不断地检测是否有按键按下,如果有按键按下则进入按键处理,在按键处理函数中有显示函数来进行数值显示。

 

图4.2输入处理流程图

处理函数式主程序中的关键环节主要进行一些输入处理和显示,硬件图中共有按键16个分别是:

789+

456-

123*

0=/%

输入识别部分可以分为三类,1、数值输入(0~9),2、等于(=)3、运算符号输入(+、-、/、*、%)。

对于数值输入,可以先判断是数值1还是数值2输入,通过标记符W来判断,如果W=1,则是数值1输入,再进行输入类型判断,如果是数值输入值num1=num1*10+key,如果是等于输入,而且还是在对数值1进行处理则进行初始化,如果是符号输入,则将符号位W=2,进入数值2输入处理,并记录符号,在对数值2进行处理是同数值1一样只有当输入是‘=’号是不再是初始化而是进行运算数值1和数值2处理并输出结果。

在输出结果后如果想利用前一次运算结果进行计算,则直接输入符号,不用进行num1输入,这时系统会自动将将上一次运算结果的值赋给数值1,然后将标记W=2,进行数值2输入。

4.2键盘程序设计

在操作按键时,无论是按下还是松开,触点在闭合和断开时均会产生抖动,此时逻辑电平是不稳的,如果得不到正确处理,可能会引起单片机对按键命令的错误执行。

解决这个问题的简单方法是利用软件延时。

在单片机处理按键操作后都延时5ms,如果确定是按键后再延时20ms,这样基本可以避免键盘的抖动。

然后由单片机进行键码分析,并执行相应的命令,显示并且返回。

下图是键盘程序设计流程图。

图4.2键盘程序流程图

按键设置采用了扫描法,要判断键盘中有无键按下时将全部行线Y0-Y3置低电平,列线置高电平,然后检测列线的状态。

只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。

若所有列线均为高电平,则键盘中无键按下。

判断闭合键所在的位置时,在确认有键按下后,即可进入确定具体闭合键的过程。

其方法是:

依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。

在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。

若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。

例如将单片机的P1口用作键盘I/O口,键盘的列线接到P1口的低4位,键盘的行线接到P1口的高4位。

列线P1.0-P1.3分别接有4个上拉电阻到正电源+5V,并把列线P1.0-P1.3设置为输入线,行线P1.4-P.17设置为输出线。

4根行线和4根列线形成16个相交点,这些交点即为键盘按键。

在单片机应用系统设计中,系统有两性能很大一部分取决于键盘处理程序。

在按键时按得快了没有反应,按慢了一连响应几次,总给人迟钝感,不能使人满意。

在该设计中用以下思路设计的键处理程序。

首先要判断有没有键值,若有键值,再判断是否为首次按下:

(1)若首次按下:

判断是否与上次按下的键值相同

a.若相同再判断:

是否已经按下了300ms?

1).若已经按下300ms则将此键做为连键处理。

2).若不是连键则判断:

是否按下20ms?

1>.若确认按下20ms,得到有效键值等待弹起

2>.若不是按下20ms直接结束处理(ret)。

b.若不相同则将标志清零结束处理(ret)。

(2)若不是首次按下:

将键值暂存起来,标志置位结束处理。

如果无键值,则判断是否有键值已被确认

(1)若有键已被确认:

判断按键是否首次抬起

a.若首次抬起:

判断抬起延时时间(20ms)是否到达

1>.若延时到则将标志处理结束处理。

2>.若延时未到直接结束处理(ret)。

b.若非首次抬起:

直接结束处理(ret)。

(2)若没有键被确认:

直接结束处理(ret)。

5系统仿真与调试

仿真部分采用proteus软件,此软件功能强大且操作较为简单,可以很容易的实现各种系统的仿真。

首先打开proteus软件,在元件库中找到要选用的所有元件,然后进行原理图的绘制;绘制好后再选择已经编译好的*.hex文件,选择运行,观察显示结果,根据显示的结果和课题的要求再修改程序,再运行查,直到满足要求。

以下是本次实验通过proteus的结果的截图:

图5.1proteus仿真结果1

图5.2proteus仿真结果2

通过proteus软件仿真,已经能够满足本次课程设计任务书中的要求,下面通过实物的单片机开发板来进行调试,通过usb连接电脑拷入程序,运行,也能够完成任务书的要求,结果如下:

图5.3单片机开发板调试结果1

图5.4单片机开发板调试结果图2

图5.5单片机开发板调试结果2

 

6总结

课程设计是培养学生运用所学的专业知识,发现,提出,分析和解决实际问题,锻炼实际动手能力的重要环节,是对学生实际工作能力的具体训练和考察,随着科学技术日新月异的发展,单片机已经成为当今计算机应用中空前活跃的领域,在生活中可以说遍布我们生活之中。

 

这次设计进一步端正了我的学习态度,学会了实事求是,严谨的作风,对自己要严格要求。

急于求成是不好的,通过此次毕业设计我深有体会。

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

我觉得动手之前,应该有清楚的步骤,这一步是很重要的。

就目前来说,我的动手能力虽然还有差距,但我知道,通过我的不懈努力,在动手方面,我会得到提高。

这一点,我坚信。

 

在此次的毕业设计中我最大的体会就是进一步认识到了理论联系实践的重要性。

一份耕耘,一份收获。

通过这段时间的设计,让我明白科学的思维方法和学习方法是多么重要,只有这样才能够有很高的效率,才能够让自己的工作更完美。

总而言之,此次毕业设计让我学到了好多平时在课堂上学不到的东西,增加了我的知识运用能力,增强我的实际操作能力。

谢谢老师给我们提供这么好的机会,为我们之后走向社会奠定了一个好的基础。

参考文献

[1]杨家成.单片机原理与应用及C51程序设计[M].北京:

清华大学出版社,2007

[2]夏路易石宗义.Protel99se电路原理图与电路板设计教程[M].北京:

北京希望电子出版社,2004

[6]阎石.数字电子技术基础[M].北京:

高等教育出版社,2009.

附录1系统原理图

附录2源程序

单片机AT89s521602液晶矩阵键盘16个占用P1^0-P1^7

键盘符号

789+

456-

123*

0=/%

功能:

1:

能实现十位数内运算及2147483647~2147483648

2:

不能进行负数运算

3:

可以进行用上次运算结果进行计算

4:

运算结果可以是负数

5:

等号再不做输出运算结果用时做清除键

6:

不能进行小数运算

**********/

#include

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

ucharcodetab[]={"0123456789=%/*-+"};

ucharcodekc[]={0xe7,0xeb,0xdb,0xbb,0xed,0xdd,0xbd,0xee,0xde,0xbe,0xd7,0xb7,0x77,0x7b,0x7d,0x7e};//按键表

ucharcoderesul[]={"OUT"};//输入行标志

ucharcodechushi[]={"INT"};//输出行标志

longresult;

#definepP1

sbitRS=P2^0;

sbitRW=P2^1;

sbitLCDE=P2^2;

/**********延时函数**********

输入参数

a:

延时a(ms)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1