基于STC89S51带时钟简易计算器设计附完整代码.docx

上传人:b****7 文档编号:9801807 上传时间:2023-02-06 格式:DOCX 页数:75 大小:456.06KB
下载 相关 举报
基于STC89S51带时钟简易计算器设计附完整代码.docx_第1页
第1页 / 共75页
基于STC89S51带时钟简易计算器设计附完整代码.docx_第2页
第2页 / 共75页
基于STC89S51带时钟简易计算器设计附完整代码.docx_第3页
第3页 / 共75页
基于STC89S51带时钟简易计算器设计附完整代码.docx_第4页
第4页 / 共75页
基于STC89S51带时钟简易计算器设计附完整代码.docx_第5页
第5页 / 共75页
点击查看更多>>
下载资源
资源描述

基于STC89S51带时钟简易计算器设计附完整代码.docx

《基于STC89S51带时钟简易计算器设计附完整代码.docx》由会员分享,可在线阅读,更多相关《基于STC89S51带时钟简易计算器设计附完整代码.docx(75页珍藏版)》请在冰豆网上搜索。

基于STC89S51带时钟简易计算器设计附完整代码.docx

基于STC89S51带时钟简易计算器设计附完整代码

基于STC89S51带时钟简易计算器设计

摘要:

计算器在人们的生活中是比较的常见的电子产品之一。

可是它还在发展之中,以后必将出现功能更加强大的计算器,基于这样的理念,本次设计是用单片机来设计的带闹钟的八位计算器。

该设计系统是以AT89C51为单片机,用LCD1602作为计算器的显示器,外接4X4的键盘,通过键盘扫描来对输入数的控制,并外接DS1302实现计时,软件程序采用均采用C语言编写,便于移植与升级。

下文详细介绍了整个系统的硬件组成结构、工作原理和系统的软件程序设计。

计算器将完成的功能有整数的加,减,乘,除等功能。

关键字:

计算器LCD160274LS245

一、引言

近年来,随着大规模集成电路的发展,单片机继续朝快速、高性能方向发展,从4位、8位单片机发展到16位、32位单片机。

单片机主要用于控制,它的应用领域遍及各行各业,大到航天飞机,小至日常生活中的冰箱、彩电,单片机都可以大显其能。

单片机技术与传感与测量技术、信号与系统分析技术、电路设计技术、可编程逻辑应用技术、微机接口技术、数据库技术以及数据结构、计算机操作系统、汇编语言程序设计、高级语言程序设计、软件工程、数据网络通信、数字信号处理、自动控制、误差分析、仪器仪表结构设计和制造工艺等的结合,使得单片机的应用非常广泛。

同时,单片机具有较强的管理功能。

采用单片机对整个测量电路进行管理和控制,使得整个系统智能化、功耗低、使用电子元件较少、内部配线少、成本低,制造、安装、调试及维修方便。

本设计是基于STC89S51单片机的带时钟的计算器,通过本次设计的产品可以实现简易的计算以及计时功能。

(一)课题背景

自从1976年Intel公司推出第一批单片机以来,80年代单片机技术进入快速发展时期,近年来,随着大规模集成电路的发展,单片机继续朝快速、高性能方向发展,从4位、8位单片机发展16位、32位单片机。

单片机主要用于控制,它的应用领域遍及各行各业,大到航天飞机,小至日常生活中的冰箱、彩电,单片机都可以大显其能。

单片机在国内的三大领域中应用得十分广泛:

第一是家用电器业,例如全自动洗衣机、智能玩具;第二是通讯业,包括电话、手机和BP机等等;第三是仪器仪表和计算机外设制造,例如软盘、硬盘、收银机、电表。

除了上述传统领域外,汽车、电子工业在国外也是单片机应用十分广泛的一个领域。

它成本低、集成度高、功耗低、控制功能多能灵活的组装成各种智能控制装置,由它构成的智能仪表解决了长期以来测量仪器中的误差的修正、线性处理等问题。

单片机将微处理器、存储器、定时/计数器、I/O接口电路等集成在一个芯片上的大规模集成电路,本身即是一个小型化的微机系统。

单片机技术与传感与测量技术、信号与系统分析技术、电路设计技术、可编程逻辑应用技术、微机接口技术、数据库技术以及数据结构、计算机操作系统、汇编语言程序设计、高级语言程序设计、软件工程、数据网络通信、数字信号处理、自动控制、误差分析、仪器仪表结构设计和制造工艺等的结合,使得单片机的应用非常广泛。

同时,单片机具有较强的管理功能。

采用单片机对整个测量电路进行管理和控制,使得整个系统智能化、功耗低、使用电子元件较少、内部配线少、成本低,制造、安装、调试及维修方便。

目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。

导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录象机、摄象机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。

更不用说自动控制领域的机器人、智能仪表、医疗器械了。

(二)设计目的及系统功能

本设计的目的是以单片机为核心设计出一个简易的计算器和显示时间的小型系统。

通过使用KILL以及protel等一些相关的软件进行相应的编辑调试及方正来实现用较低成本开发出新的产品。

通过本课题设计,综合运用单片机及接口技术,锻炼动手操作能力,综合运用能力,学习论文的写作方法和步骤。

设计的带时钟计算器有以下功能及特点:

(1)能够实现8位的整数的加减乘除的计算

(2)能够实现时间的显示,并能够实现时间的调整

(3)能够实现闹钟,并能够实现闹钟的调整

二、系统方案设计

(一)主体设计及相关方案选择

1、模式转换键的方案选择

本次设计的目的是实现计算器和带日历时钟的功能,要实现两个功能的相互转换有两种方案:

(1)利用按键实现相应的两种模式的换如图(2.11.1(a))

(2)利用开关的高低电平实现相应的模式的转换如图(2.11.1(b))

(a)(b)

图2.11.1

在两种方案中方案

(1)由与按钮按下前后的状态是相同的,所以在程序的执行期间不但要实现对键盘的扫描还要实现单独的对于这个键的扫描,所以这加大了程序中键盘扫描的时间控制的难度,而且对于稳定性,有时由于程序中其他事件对于时间的占用使得按键有时不太灵敏,导致使用者对于产品的个人印象有所下降。

但是相对于方案

(1),方案

(2)由于采用了电平方式触发模式的转换,在不同的模式下有不同的电平,在程序个执行期间只要稍微去判断一下相应的引脚的电平就能够轻易的发现用户的模式转换的意向从而实现对于模式的控制,如此便能够实现相对稳定的监控用户的模式意向,使得用户使用更加的舒适。

而且在实现的过程中,单片机的I/O引脚还未用完,所以这个方案不但尽可能的利用到了各个单片机I/O引脚还增强了整体的系统的稳定性和使用的舒适度。

综上就能够很轻易去选择地二个方案。

2、显示方案的选择

信息的显示是两个模式都需要实现的,然而在选用相应的显示方案的时候有如下的两种方案:

(1)利用LED数码管实现数据的显示

(2)利用LCD1602实现数据的显示

首先,方案

(1)显示的亮度足够大,在几乎所有的情况下都能够看的比较清楚,而且产品的成本比较低。

但是缺点是控制难度较LCD1602液晶显示器难,且硬件的驱动较为复杂。

然而选择方案

(2)显示,则能够实现程序对于输出的控制简单的目标,而且LCE1602显示相对于LED显示功耗较低比较符合现在发展的能源节约的目标,而且在实现显示时,LCD1602能够提供更多的诸如字符显示的功能,使得系统显示更加清楚明了,方便用户读取需要的信息。

但是其缺点是成本较LED显示较高。

综合LED和LCD1602的优点及缺点以及系统对于产品的性能要求,最终还是选择LCD1602作为系统的显示器,主要是它能够有效地降低单片机的工作负荷使得程序更加合理化,用户观看界面更加的美观、清晰、明了。

3、时间计时方案的选择

时间的计时有两种方案的选择:

(1)利用单片机的中断计时器进行中断计时

(2)利用DS1302时钟芯片进行计时,单片机从芯片读取时间

在选择计时器是首先需要考虑的是计时的准确性,在这点上应选择DS1302进行计时,其次是成本,对于单片机的中断计时而言几乎不需要另外增加成本,而对于DS1302则成本较高,对于软件的设计显然使用单片机的内部中断时软件的代码量较少而且软件结构比较简单,但是对于使用而言我们应该选择计时较为正确的一个方案,而且DS1302的成本也不会增加多少所以,在本系统中我倾向于选择第二套方案。

4、系统软件结构设计

系统有万年历及时钟的部分,要实现这个功能那么就需要实现两种模式的相互转换,其主要的框图如下(2.14.1):

图2.14.1

(2)计算部分设计

计算部分主要的部分为计算和输入的处理部分,首先是输入部分需要设置两个数组用于存储两个计算的数据,其次是要分不同的情况将数据存入不同的组在进行计算。

在计算部分有两个方案:

(1)利用进位对数据的每位逐计算并进位

(2)数据转化为相应数据类型后直接计算

对于两种算法,第一种显然对于单片机的计算量能够减轻而且能够节约RAM的使用量,首先是不需要进行数据类型的转化,而且在计算后无需转化,其次是产生的中间变量较少能够节约资源,但缺点是计算方法较第二种复杂很多。

第二种方案最突出的优点是算法简单易于理解,但耗费的资源较多,在这次的设计中由于单片机的各项资源都能够满足第二种方案,所以我选择了第二种方案。

(3)时钟部分设计

时钟部分主要是闹钟存储和时间显示,在先前的方案中已选择了用DS1302计时所以在这个部分主要是要完的任务较为简单,主要对DS1302的数据的读取和修改其次是在函数中比较当前时间和闹钟存储器中的数据是否相等,如果相等那么就是能闹钟控制引脚,再等待键盘的输入,当有任意键输入时关闭闹钟,其次是监测时钟指定功能键是否又按下,如果有则进行相应的处理,否则不断地进行键盘扫描和时钟读取的动作。

三、硬件设计

(一)单片机接口部分设计

1、单片机I/O口分配

(1)LCD显示数据口接P0口,RS为P2^0,P2^1为RW,P2^2为E口

(2)键盘为4*4键盘,接在P1口,盘P2^3作为模式手动转换输入口

(3)时钟芯片接P2.5——RET,P2.6——SCLK,P2.7——I/O

(4)P2.4为蜂鸣器接口

(5)P2.3为模式(计算器及万年历)转换键接口

2、单片机周围电路

(1)首先是时钟部分,由于对于单片机的时钟部分没有其他特殊要求所以在此次设计使用的单片机的时钟信号原件为12MHz的晶振,只用常用的晶振电路如下图(3.12.1):

图3.12.1

(2)其次是复位电路,由于在使用时无需对系统进行复位所以在设计时不选用可复位的单片机复位电路而是用不能进行再次复位的单片机的复位电路,其电路图如下(3.12.2):

图3.12.2

其中,C的电容为10uF,R为8.2K。

(二)输入部分设计

输入部分有时间输入和用户操作数据的输入两部分,首先时间输入部分的芯片的接法如下图(3.1.1):

图3.1.1

Vcc_5V:

为电路中的主电源;Vcc2,也就是BT1为备份电源。

当Vcc2>Vcc1+0.2V时,由Vcc2向DS1302供电,当Vcc2

Vcc_5V:

为电路中的主电源;Vcc2,也就是BT1为备份电源。

当Vcc2>Vcc1+0.2V时由Vcc2向DS1302供电,当Vcc2

  键盘接口电路是单片机系统设计非常重要的一环,作为人机交互界面里最常用的输入设备。

我们可以通过键盘输入数据或命令来实现简单的人机通信。

  一般来说,按键按照结构原理可分为两类,一类是触点式开关按键,如机械式开关、导电橡胶式开关等;另一类是无触点式开关按键,如电气式按键,磁感应按键等。

前者造价低,后者寿命长。

目前,微机系统中最常见的是触点式开关按键(如本学习板上所采用按键)。

  按键按照接口原理又可分为编码键盘与非编码键盘两类,这两类键盘的主要区别是识别键符及给出相应键码的方法。

编码键盘主要是用硬件来实现对键的识别,非编码键盘主要是由软件来实现键盘的识别。

  全编码键盘由专门的芯片实现识键及输出相应的编码,一般还具有去抖动和多键、窜键等保护电路,这种键盘使用方便,硬件开销大,一般的小型嵌入式应用系统较少采用。

非编码键盘按连接方式可分为独立式和矩阵式两种,其它工作都主要由软件完成。

由于其经济实用,较多地应用于单片机系统中。

键盘的电路图如下(3.1.2):

图3.1.2

(三)输出部分设计

输出部分主要部件是LCD1602,它是一个2*16的液晶显示屏,相对于单片机的数据输出端的引脚为P0口为数据输出口P2^0为RS数据/命令选择控制输出口P2^1为RW读/写选择控制输出口,P2^2为EN使能信号控制口输出,具体连接如下图(3.3.1)

图3.3.1

由于P0口在单片机内部没有上拉电阻,如果直接接上会使得单片机总电流大于71mA,那么容易损坏单片机,所以在实际电路中必须使用上拉电阻将减少流经单片机的总电流,且如图所示需要有R=10K的可变电阻用于调节液晶显示器的对比度,以适应不同用户的对于对比度的不同要求。

(四)模式控制、发声及其他部分设计

模式选择部分为一个双态开关(高电平或低电平)用来方便调节系统至当前的用户所需的模式,在开关接高电平时选择的是计算器模式,接低电平时选择的是时间模式。

发声部分使用的是蜂鸣器,由于单片机的I/O口驱动能力有限所以在输出时外加了一个放大电路,其图如下(3.4.1):

图3.4.1

为了能够在断电的状态下也能够同时计时而且DS1302也能够支持双电源,所以在DS1302周围添加一个小的电池用于对DS1302断电状态下的供电,所以DS1302接线如下图(3.4.2)所示:

图3.4.2

四、软件设计

(一)显示部分设计

1、显示部分的设计思路

字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,

当前使用的是16*2,1602液晶模块内部的控制器共有11条控制指令,如下表(3.21.3)所示:

表4.1.1

由于在不同的模块内不都需要将不同的数据显示到LCD1602,然而在数出数据时由于有比较多的数据是用于提示用户的信息,如时间显示的(D,S等),所以在每个模块显示时会有很多的重复的代码,而且在不同的模块都需要对数据进行修改。

为了简化数据的显示部分的结构,而且使得显示部分比较清晰所以为显示分配了32个字节的物理存储空间作为显示的数据的缓存区,在以后的各个模块的数据需要输出时,只需要将数据写到相应的显示的数据缓冲区的位置,以后的显示部分可以全部由显示模块进行相应的处理,减轻了各个模块的工作的量。

由于显示部分自成一个独立的模块,又要实现数据的正常显示,那么就只能每次在数据更新后调用显示函数,从而实现了数据的同步更新和显示。

在显示时,由于在时间模式下需要有相应的时间修改和闹钟的调整,所以在模块中还针对相应的标志号对显示的局部加上相应的指示光标一提示用户正在修改的是哪一项数据,使得用户使用的时候更加方便。

2、显示部分的实现代码

voiddisplay()//利用定时器中断实现间时显示

{

DisplayListChar(0,0,dsp0);

DisplayListChar(0,1,dsp1);

}

voidDisplayListChar(unsignedcharX,unsignedcharY,unsignedchar*DData)

{

unsignedcharListLength=0;

Y&=0x01;

X&=0x0f;

while(X<16)

{

DisplayOneChar(X,Y,DData[ListLength]);

ListLength++;

X++;

}

}

(二)输入部分设计

1、输入部分设计思路

在单片机应用系统中,通常使用机械触点式按键开关,其主要功能是把机械上的通断转换成为电气上的逻辑关系。

也就是说,它能提供标准的TTL逻辑电平,以便与通用数字系统的逻辑电平相容。

此外,除了复位按键有专门的复位电路及专一的复位功能外,其它按键都是以开关状态来设置控制功能或输入数据。

当所设置的功能键或数字键按下时,计算机应用系统应完成该按键所设定的功能。

因此,键信息输入是与软件结构密切相关的过程。

对于一组键或一个键盘,通过接口电路与单片机相连。

单片机可以采用查询或中断方式了解有无按键输入并检查是哪一个按键按下,若有键按下则跳至相应的键盘处理程序处去执行,若无键按下则继续执行其他程序。

机械式按键再按下或释放时,由于机械弹性作用的影响,通常伴随有一定时间的触点机械抖动,然后其触点才稳定下来。

抖动时间的长短与开关的机械特性有关,一般为5~10ms。

在触点抖动期间检测按键的通与断状态,可能导致判断出错。

即按键一次按下或释放被错误地认为是多次操作,这种情况是不允许出现的。

为了克服按键触点机械抖动所致的检测误判,必须采取去抖动措施,可从硬件、软件两方面予以考虑。

一般来说,在键数较少时,可采用硬件去抖,而当键数较多时,采用软件去抖。

检测到有键按下时,应延时等待一段时间(可调用一个5ms~10ms的延迟子程序),然后再次判断按键是否被按下,若此时判断按键仍被按下,则认为按键有效,若此时判断按键没有被按下,说明为按键抖动或干扰,应返回重新判断。

键盘真正被按下才可进行相应的处理程序,此时基本就算实现了按键输入,进一步的话可以判断按键是否释放。

2、实现代码

charkeyscan()

{

unsignedchari,j,k=0;

unsignedcharkeycode[]={0xef,0xdf,0xbf,0x7f};

unsignedcharkeytable[]={0xee,0xed,0xeb,0xe7,0xde,0xdd,0xdb,0xd7,0xbe,

0xbd,0xbb,0xb7,0x7e,0x7d,0x7b,0x77};

P1=0x0f;

if(P1!

=0x0f)

{for(i=0;i<4;i++)

{P1=keycode[i];

for(j=0;j<4;j++)

{k=i*4+j;

if(P1==keytable[k])

{

while(P1==keytable[k]);

returnk;

}

}

}

}

elsereturn80;

}

(三)计算部分设计

1、计算部分设计思路

本此设计需要实现的计算器部分大致可分为两个模块:

(1)计算控制模块

(2)数据计算模块

在计算控制模块入口部分设置有模式检测部分,在每次的键盘扫描前先扫描模式控制口,如果模式控制口为低电平那么就返回主函数并设置标志位为0,从而实现模式从计算模式转到时间模式。

其次是检测当前输入状态,如果输入的是数据那么需要根据相应的标志位判断当前输入的是第一个数还是第二个数从而将数据存入相应的地址空间以便于在计算部分提取数据进行计算,如果输入的为运算符号,那么需要确定当前的所处的输入状态。

如果再输入符号前没有数据输入,那么将提示输入错误,如果在输入当前符号前已经有一个数据输入,那么,就将数据存入标志改变到相应的状态,以便下一次数据存入到正确的空间,并将当前符号保存下来用于计算时的调用,如果输入当前符号前已经有两个数据了,那么先将前面已经数据的数据进行对应的计算并将结果存入第一个变量存储区,将存入标志调整到第二个数据输入状态,存储计算符号,进入等待下一次数据输入。

在数据计算模块,首先需要对计算控制模块传过来的字符串进行转换,将两个字符串转换成相应的整形数据,并进行计算,如果计算结果为负数那么,将负数标志置为使能,计算后再调用计算器的数据显示处理模块,计算其数据显示首先需要将整型数据转换为字符串并存入显示缓存,并检测数据正负标志,若果为负数则将最高位(即显存的最低位)设置为'-'号,并将计算后的数据存入第一个数据区,返回计算器控制模块,到此就一轮计算结束。

其次是需要运算的继承性(即将上次的数据作为下次数据的运算数据,减少用户在计算式不断重复的输入上次计算的结果),在进入下一次的计算时先将上次计算的数据存入第一个计算数据存储单位,判断第二次数据输入的第一个数据是运算符还是数字,如果是数字,那么将所有数据清空,并将数据存入第一个需要计算的数据的存储单元,如果第一个数据位运算符那么就保存运算符,下次输入的数据存入第二个数据区,以便可以在上次的运算的基础上进行下一次的运算给使用者带来方便。

2、计算部分设计框图

图4.32.0

3、计算部分实现代码

voidcounter()

{

unsignedchardat,set_nu=0;//dat用于存放当前键盘输入值,set_nu存放当前数组数据所到达的位置

unsignedchara[8]={0},b[8]={0};//a[8],b[8]存放当前输入的运算数据

unsignedcharsymbol=10;//符号存储

unsignedcharj,k=0;

unsignedcharin_flag=0;//in_flag为输入是否完全标志1为输入了1个参数,2为输入了两个参数

for(j=0;j<16;j++)

dsp0[j]=0;

for(j=0;j<16;j++)

dsp1[j]=0;

dsp0[0]='0';

display();

//调用键盘扫描程序

loop:

dat=keyscan();

if((j=P2&0x08)==0)//转至时钟程序

{

mod_flag=0;

return;

}

if(dat<20)

{

//当键值为符号

if(dat>9)

{

if(in_flag==0&&dat!

=15)

{

error();

display();

}

if(in_flag==3)

in_flag=1;

if(dat==15)//当键值为15,即清零时

{//将输出现存区清空,将结果标志置零

for(set_nu=0;set_nu<8;set_nu++)//清空被运算数a[8]存储位

a[set_nu]=0;

for(set_nu=0;set_nu<8;set_nu++)//清空被运算数b[8]存储位

b[set_nu]=0;

for(j=0;j<16;j++)

dsp1[j]=0;

for(j=0;j<16;j++)

dsp0[j]=0;

dsp0[0]='0';

display();

set_nu=0;

in_flag=0;//当下次输入数据是存入a[8]

}

elseif(dat>9&&dat<14)//10为加法、11为减法、12为乘法、13为除法、14等号

{

if(in_flag==2)//原来已经有还未计算的值

{

calculate(symbol,a,b);

symbol=dat;

for(j=0;j<8;j++)

b[j]=0;

in_flag=2;//再次输入数据时将数据存入b[8]

}

elseif(in_flag==1)//原来只输入一个数据

{

symbol=dat;

in_flag=2;//当再次输入数据时数据存入b[8]

}

}

elseif(dat==14)

{

calculate(symbol,a,b);

in_flag=3;//当下次输入数据时存入a[8],不对结果进行存储

symbol=10;

}

for(j=0;j<8;j++)

b[j]=0;

set_nu=0;

gotoloop;

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

当前位置:首页 > 总结汇报 > 学习总结

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

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