多功能计算器的设计 - 图文

更新时间:2024-03-22 02:19:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

2013 届毕业设计(论文)

题 目: 多功能计算器的设计 学 院: 浦江学院 专 业: 电子信息工程 班 级: 电子 0904 姓 名: 于颖 指导教师: 袁建华 起讫时间: 2012-11-01~2013-06-10

2013年6月

多功能计算器的设计

摘要

本设计就是利用单片机的原理来进行多功能计算器的设计的,设计过程中的主控制器选用了AT89C52单片机,采用TC1602液晶显示器,输入按键为4×4矩阵键盘,通过软硬件相结合,来实现整数的“加”、“减”、“乘”、“除”运算。在计算器基本功能顺利完成的基础上,对系统进行了简单的扩展,增加了电子表功能,达到预期的要求,系统功能也更加完善。本计算器系统简单,实用性强,成本低,使用维护方便,软件功能强,运行稳定可靠等优点。

关键词:计算器,运算,扩展

I

Design of multi-function calculator

ABSTRACT

This design principle is the use of single-chip design for multi-function calculator, the design process of the main controller selects the AT89C52 microcontroller, using TC1602 LCD monitors, input keys for the 4 × 4 matrix keyboard, through a combination of hardware and software to achieve integer \\\\addition to\operation. The successful completion of the basic functions of the calculator, based on a simple extension of the system, increasing the spreadsheet functions, to achieve the desired requirements, the system functions more perfect. This calculator system is simple, practical, low cost, easy maintenance, software features strong, stable and reliable.

Key Words:Calculator , Operation , Expand

III II

目 录

摘要 ....................................................................... I ABSTRACT .................................................................. II 第一章 绪论 ................................................................ 1

1.1引言 ................................................................. 1 1.2设计任务 ............................................................. 1 1.3论文结构 ............................................................. 2 第二章 课题背景 ............................................................. 3

2.1 AT89Cxx系列单片机的简介 ............................................. 3 2.2计算器系统简介 ....................................................... 4 2.3计算器的总体功能描述 ................................................. 5 第三章 计算器的硬件系统设计 ................................................. 6

3.1计算器的硬件系统框架 ................................................. 6 3.2最小系统的设计 ....................................................... 6 3.3键盘接口电路的设计 ................................................... 8 3.4显示电路的设计 ....................................................... 9 3.5 DS1302实时时钟电路的设计 ........................................... 10 第四章 计算器的软件系统设计 ................................................ 12

4.1汇编语言和C语言的特点及选择 ........................................ 12 4.2主模块程序的设计 .................................................... 13 4.3键盘扫描模块程序的设计 .............................................. 14 4.4运算模块程序的设计 .................................................. 16 4.5显示模块程序的设计 .................................................. 17 4.6 DS1302实时时钟模块程序的设计 ....................................... 19 第五章 计算器系统的组装与调试 .............................................. 21

5.1软件系统的调试与仿真 ................................................ 21 5.2硬件系统的组装与调试 ................................................ 22 第六章 总结和展望 .......................................................... 25 参考文献 ................................................................... 26

III

附录一 计算器电路原理图 .................................................... 27 附录二 程序代码 ............................................................ 28 致谢 ....................................................................... 41

IV III

南京工业大学本科生毕业设计(论文)

第一章 绪论

1.1引言

当今社会,随着科技的不断发展与进步,人民生活水平和物质水平的不断提高,多种多样的电子产品走进了千家万户,给我们的生活、学习、工作、娱乐提供了很多的便利。在这当中,计算器作为一种简单,快捷的操作,正确率高,被广泛用于便携式计算工具,已经成为人类生活中不可或缺的助手。

单片机是计算机、自动控制和大规模集成电路技术相结合的产物,融计算机结构和控制功能于一体,因此除单片机外它还有其他名称,例如“嵌入式微处理器”、“微控制器”、“嵌入式微控制器”等。如今,单片机凭借其微小的体积和低廉的成本在各个领域被广泛使用,例如用于家用电器、工业控制等,所以许多大学里都开设了单片机原理与应用这方面的课程。这是一门结合了技术性和实践性的学科,学习及研究它不论对我们自身还是社会的发展都是及其有意义的。

计算器就是利用单片机制作的产物,所以本设计的主控制器选用了AT89C52单片机,采用TC1602液晶显示器,输入按键为4×4矩阵键盘,通过软硬件相结合,来实现整数的“加”、“减”、“乘”、“除”运算。在此基础上还加入了DS1302实时时钟电路的设计,使其本省还具有了电子表的功能。

1.2设计任务

这次设计主要是通过单片机的原理和应用,在电子技术基础的基本理论的指导下,我采用Protues仿真软件和Keil编程软件来进行设计计算器,然后制作实物。它的主要设计任务有以下几个部分,首先是硬件系统的设计,然后运用keil进行软件系统部分的设计。利用protues仿真平台,进行软件部分调试及仿真;对照设计好的仿真图进行计算器实物的焊接。在将软件程序放入硬件之后,对整体电路进行调试与测试,看是否存在问题。

1

第一章 绪论

1.3. 论文结构

本文共由六章组成,第二章为基础理论部分,介绍单片机的发展现状、AT89Cxx系列单片机的简介,计算器系统简介计算器的总体功能描述,;第三章为计算器的硬件系统设计,从结构上分析计算器的硬件系统框架,最小系统的设计,键盘接口电路的设计,显示电路的设计及DS1302实时时钟电路的设计;第四章介绍计算器的软件系统设计,主要介绍主模块程序的设计,键盘扫描模块程序的设计,运算模块程序的设计,显示模块程序的设计以及DS1302实时时钟模块程序的设计;第五章为计算器系统的组装与调试,对系统的软硬件分别进行了调试;第六章为论文总结,对本次毕业设计做了相关小结并提出了下一步要做的工作。

2

南京工业大学本科生毕业设计(论文)

第二章 课题背景

2.1 AT89Cxx系列单片机的简介

MCS-51系列单片机具有性能优越,技术成熟,可靠性高,成本效益的优点,所以其迅速占领了工业测量和控制及自动化工程的主要市场,成为主流的芯片应用。由于其卓越的性能和完美的结构,导致后来许多微控制器制造商多遵循参考它的架构。和爱特梅尔公司一样,飞利浦,达拉斯和其他领先的半导体公司已经推出与MCS-51单片机产品兼容。这些知名厂商加入51系列获得了突飞猛进的发展,进一步丰富和发展的51系列,产品性能有了很大的提高。

其主要特性有:

1、80C51核心处理单元。

2、64/32/16/8KB片内Flash ROM,具有在应用可编程(IAP)、在系统可编程(ISP)的功能,可实现远程软件升级,无需编程器。

3、1K字节RAM; 4、双DPTR数据指针;

5、支持6时钟或12时钟模式;

6、4个8位I/O口, P1口、P2口、P3口可直接驱动LED; 7、SPI和增强型UAPT;

8、有PCA(可编程计数器阵列),具有PWM的捕获/比较功能; 9、3个16位定时器/计数器; 10、可编程看门狗定时器; 11、低EMI方式(ALE禁止); 12、兼容TTL和COMS逻辑电平; 13、掉电模式和低功耗模式等; 14、全静态操作0Hz~24Hz;

图2-1为AT89Cxx系列单片机的引脚排列图:

3

第二章 课题背景

图2-1 AT89Cxx系列单片机引脚排列图

2.2计算器系统简介

计算器的组成包括运算器、控制器、存储器、键盘、显示器、电源和一些可选外围设备及电子配件通过人工或机器设备。低级计算器运算器,控制器由数字逻辑电路简单的串行操作,随机存取存储器是只有一个或两个细胞,用于累加存储。高级计算器和只读存储器由微处理器来实现各种复杂的计算程序,有更多的随机存取记忆体单元来存储程序和数据输入。键盘是计算机输入成员,一般的接触或传感器类型。为了减少计算器的大小,一键常常有多种功能。计算机显示输出部件,发光二极管显示器,液晶显示器等。除了显示的结果,但也经常会有溢出指示,错误指示。计算器的电源使用AC电源适配器或电池,电池或太阳能供电的AC转换器转换器充电。为了节约能源,计算器生产大规模集成电路采用CMOS工艺(互补型金属 - 氧化物 - 半导体集成电路),内部配备掉电定时器电路不自动操作。计算器可选外设,微型打印机,盒式磁带驱动器和磁机。

4

南京工业大学本科生毕业设计(论文)

2.3计算器的总体功能描述

这次设计是多功能计算器的设计,所以它实现的不仅仅是简单的运算,还添加了电子表的功能,其主要实现功能如下所述:

1、本设计为基于单片机的多功能计算器的设计,它的基本功能是进行四则运算“加”、“减”、“乘”、“除”;

2、进行基本的四则运算,键盘由16个键组成,其中包含数字键0~9,符号键“+”、“-”、“*”、“/”、“=”和清零键;

3、设计运算的过程中的数字和符号在显示器上都需要显示,按下“=”号键时,计算结果自动显示出来;

4、可以连续多次的运算,也就是说前面计算所得的结果还可以作为后面运算的第一个值;

5、错误提示,例如除数为0,或者运算结果超过了计算器本身设定的范围时(溢出),可以在显示器上提示错误并内部归零;

6、附加功能:在以上几点完成的情况下对系统进行下一步的扩展,增加了时钟芯片,这样系统既可以作为计算器,也可作为电子表,电子表具有调时。

5

第三章 计算器的硬件系统设计

第三章 计算器的硬件系统设计

3.1计算器的硬件系统框架

计算器的硬件系统框架如图3-1所示:

电源系统 复位、晶振电路 按键及键扫电路 显示电路 单片机 实时时钟电路 图3-1 计算器的硬件系统框架图

3.2最小系统的设计

单片机最小系统一般由单片机,复位电路和晶振电路组成,我们在设计中总是喜欢把按键输入、显示输出等加到上述电路中。

1、单片机的选择

在前面我们已经介绍了AT89C系列的单片机,本设计中我们采用AT89C52单片机,它的性能好,价格低。其引脚图如图3-2所示。

6

南京工业大学本科生毕业设计(论文)

图3-2 AT89C52引脚图

2、晶振电路的设计

本次设计的系统对于时间要求不是很高,只要按图来进行设计就可以使系统可靠起振并运行的稳定。但是由于图中的电容C2、C3的作用是对系统时钟频率的微调和稳定,所以在这次计算器系统的实际应用中一定要注意正确选择参数(本设计采用30pF),振荡频率范围是1.2MHz~12MHz,这里采用11.0592MHz是因为可以准确地得到9600波特率和19200波特率,便于和计算机进行串口通讯。晶振电路的设计如下图3-3所示。

图3-3 晶振电路

3、复位电路的设计

本次设计对复位电路部分的考虑还是蛮周到的,因为复位电路对这次设计来说是很重要的。当程序运行出错或操作错误导致系统死锁状态时,为了让系统化险为夷,需要按复

7

第三章 计算器的硬件系统设计

位键重新启动单片机。

复位操作包过加电复位和手动复位,其中,按键手动复位分为电平方式和脉冲方式两种。这次设计中,手动复位明显比加电复位更适合,所以在这里采用按键手动复位中的按键电平复位,电路设计如图3-4所示。

图3-4 按键电平复位电路

3.3键盘接口电路的设计

这次设计是基于单片机的计算器的设计,并没有要求进行复杂的运算,因此,采用4×4矩阵式键盘16个键来实现基本的“加” 、“减” 、“乘” 、“除”运算即可。

矩阵式键盘的硬件结构比较简单,有行输出口和列输出口构成行列式键盘,按键设置在行、列的交点上。

4×4矩阵式键盘具体按键安排如表3-1:

表3-1 4×4矩阵式键盘

第0列 第1列 第2列 第3列 第0行 0 1 2 3 第1行 4 5 6 7 第2行 8 9 + - 第3行 * / = 复位

电路设计如图3-5所示,图中1.、2、3、4分别接单片机的P10~P13口,5、6、7、8分别接P14~P17口。

8

南京工业大学本科生毕业设计(论文)

图3-5 键盘接口电路

3.4显示电路的设计

单片机应用系统中常用的LED显示器件有LED数码管显示器和LED液晶显示器两种。液晶显示器和LED数码管显示器对比来说虽然价格贵点,但是它的显示功能强大,体积小、功耗低、界面清晰,便于观察。

这次设计进行的是计算器设计,如果用液晶作为显示器,两行就足够了,一行显示算式,一行显示结果,所以这次设计选择TC1602字符型液晶模块进行显示。

TC1602的工作原理:

TC1602显示模块采用点阵图形来显示字符,显示分为2行、每行16个字符或1行16个字符两种模式,常用模式为2行16个字符。它包含16个引脚,引脚功能如下表3-2:

表3-2 TC1602显示模块

第1脚GND 第2脚Vcc 第3脚VL 第4脚RS 电源地 接+5V电源 液晶显示器调整对比度端 寄存器选择信号线。高电平时进行读操作,低电平时选择指令寄存器 第5脚RW 第6脚E 读写信号线 使能端,当E端由高电平跳变成低电平时,可以写入数据 9

第三章 计算器的硬件系统设计

第7~14脚 第15脚BLA 第16脚BLK 8位双向数据线D0~D7 背光电源正极输入端 背光电源负极输入端。BLA接正,BLK接负便会点亮背光灯

TC1602引脚电路图如图3-6所示:

图3-6 TC1602电路图

图中7~14脚接单片机的P0口。

TC1602液晶显示模块内置有字符发生ROM,字符发生RAM和字符显示RAM,字符发生存储器已经存储了192个不同的点阵字符图形,每一个字符都有固定的代码,可以通过查表找出所需要显示的字符的地址让其在液晶中显示出来。

3.5 DS1302实时时钟电路的设计

在这次设计中,DS1302时钟电路是系统扩展的一个模块,属于附加功能,它跟计算器是不属于一个部分的,在上学期创新设计的基础上,我多添加了这个模块,这样我的计算器除了计算功能外,还多了一项电子表的功能,使系统功能完善了许多。我设计的计算器和电子表两种模式可以用一个独立按键来进行切换,而且是在同一块液晶屏上显示。

实时时钟电路DS1302的主要特点是采用串行数据传输,可以为电源提供可编程的充电功能,并且还可以关闭充电功能,采用普通32.768kHz晶振,工作电压为2.5V~5.5V。它可以对年、月、日、周、日、时、分、秒进行计时,还具有闰年补偿等多种功能。但是这次设计,我设计的只是电子表,所以只需要时、分、秒,很多功能不可以体现出来,我准备在以后对系统进一步扩展,比如可以做个万年历,这样时钟芯片就可以得到充分的利用。其引脚功能如表3-3所示:

10

南京工业大学本科生毕业设计(论文)

表3-3 DS1602引脚功能 第1脚Vcc2 第2脚X1和第3脚X2 第4脚GND 第5脚RST 第6脚I/O 第7脚SCLK 第8脚Vcc1 DS1302引脚电路图如图3-7所示: 第1脚Vcc2 振荡源,外接32.768HZ的晶振 地线 复位/片选线 串行数据输入/输出端(双向) 串行时钟输入 后背电源 图3-7 DS1302电路图 在对该模块进行设计时,我选用了4个独立式按键,它们的功能分别是:“设置” 、“确认” 、“+” 、“-” ,用来准确的设置时间。设置方法如下:首先按设置键1下,可按“+”、“-”对“小时”进行设置,设置完毕按确认键退出;和前面一样,按设置键2下对“分”进行设置,按设置键3下对“秒”进行设置。

11

第四章 计算器的软件系统设计

第四章 计算器的软件系统设计

这次设计需单片机硬件电路及软件编程相结合,在单片机的应用系统程序设计时,一般选用汇编语言和C语言。通过4.1的概述,这次设计我选择用C语言进行编程。

4.1 汇编语言和C语言的特点及选择

这次设计我用的是硬件电路和软件编程相结合的设计方案,所以选择合适的编程语言是很重要。在进行单片机的应用系统程序设计时,常见的有汇编语言和C语言两种。C语言虽然执行效率没有汇编语言高,但是它语言简单,便于操作,运算丰富,表达化类型多种多样,数据结构类型也很丰富,可以大大提高大大提高单片机应用系统研制开发的效率,而且它的易移植性也有助于打破不同单片机系列之间的界限。如今单片机的发展水平已经达到了一定高度,内部资源相当丰富,CPU的处理速度非常快。我觉得这次设计用C语言来控制单片机是一个不错的选择。所以在这次设计中我选择C语言来编写程序代码。

主函数设计:

/******************函数声明*****************/ #include #include

#define uchar unsigned char uchar key;

uchar rrr=0xff;

uchar alldata[12]={0}; uchar love[14];

uchar exit=0,yes=0,kind=0,fu=0,pfu=0,position1=0,position2=0; unsigned long data1=0,data2=0,data3=0,ddata=0; uchar keyscan(void); void display(uchar); void prodis(void); void clear(void); void datapc(void); void remove0(void); void data3dis(void);

void main() {

init();

12

南京工业大学本科生毕业设计(论文)

while(1) {

key=keyscan(); delay(); if(exit==1)

{display(key);} } }

4.2主模块程序的设计

主模块是可以说是本次设计的主框架。在进行结构化程序设计时经常会用到“从上到下”和“从下到上”两种方式,而“从上到下”法的核心便于主框架的构建。它的好坏直接影响到程序最终功能的实现。本设计的主要目的是实现计算功能,而不是电子表,仅在计算器功能的基础上,成功完成附加功能的电子表格,所以时间的优先级的设计,该系统应被引导到一种计算模式,而不是电子表格模式,设计完成后我可以根据需要在两者之间切换,主模块的程序流程图如图4-1所示。

13

第四章 计算器的软件系统设计

开始

初始化液晶屏、DS1302及相关变量

N

判断模式切换键是否按下 计算模式 Y 电子表模式 N

判断模式切换键是否按下 Y

返回 图4-1 主模块程序流程图 4.3键盘扫描模块程序的设计

矩阵按键扫描程序是用来节省I/O口的,它可以根据按键数目的多少来节省对应的I/O口。键盘扫描模块程序的流程图如图4.2所示。

键盘扫描子程序应具有以下功能:

(1)如果键有按下,就计算键值。它的方法为:行输出口输出全为0,读列输入口信息,如果列输入值全为1,没有键按下;如果不是为全1,有键按下,对应的计算键值。

14

南京工业大学本科生毕业设计(论文)

(2)去除按键抖动。在按键操作过程中,按键受到弹性的影响会导致按键的机械触

电在闭合及断开的瞬间发生抖动的现象,导致按键不能马上实现完全闭合或断开,并使输入电压信号也会出现抖动现象,抖动时间的长短根据按键的机械特性决定。在实际应用中,应大于20ms,否则,就会发生按一次做多次处理的情况,从而程序不能正常执行。

开始 N 是否有键按下 Y N 确实有键按下 消抖 Y N 按键是否释放 Y

返回 图4-2 键盘扫描模块程序流程图

判断并计算键号,执行相应命令

(3)判断按键是否释放。首先要计算出闭合键的键值,然后对按键判断是否释放。如果按键释放就等待;如果键已经释放,那么就再延时消抖。

(4)命令处理。输入闭合键的键值后,程序自动实现该键已经设定的功能。

15

第四章 计算器的软件系统设计

4.4运算模块程序的设计

在这个模块中,我要实现“加”、“减”、“乘”、“除”四种整数的运算,需要定义三个数:x、y、z ,类型为长整型(-2147485648~+2147485647);其中x为第一个数,y为第二个数,z为两数运算的结果。这次设计还要求可以根据需要进行连续多次的运算,即把c的值赋给x,输入运算符,再输入y,按下“=”号,再得到z,再赋给x,以此反复执行。

在运算中x的值有可能是负数,而y必定是正数,所以我在进行“加”、“减”、“乘”三种运算时都可能会有溢出,都需要进行报错;在除法运算时,若除数为0,也需要报错。

设d=+2147485647,e=-2147485648,判断溢出的方法是: (1)加法:当0d-y,则溢出; (2)减法:当ex-e,则溢出; (3)乘法:当0d/x,则溢出;

当ee/x,则溢出;

这次需要当心的地方就是在设计过程中除法运算时为了保留四位小数需对z转化为float型并进行×10000的操作,可以想象当z> +214748.5647时,z扩大一万倍就不再属于长整型的范围了,这就产生了溢出错误。为了阻止这种情况的发生,这次设计规定了当z> +214748.3645或z<-214748.5648时,结果显示不保留小数;当z<+214748.5647或z>-214748.5648时,结果显示保留四位小数。运算模块程序流程图如图4-3所示。

16

南京工业大学本科生毕业设计(论文)

开始

除数是否为0 加 减 乘 除 判断是哪个运算符 N Y 错误信息送运算结果 Y 是否溢出 显示缓冲区 N

图4-3 运算模块程序流程图

4.5显示模块程序的设计

在这次设计中,显示器上只需要显示数字和符号,不需要显示图形或者汉字,而且需要显示的数字和符号都有在TC1602液晶模块内置的字符发生存储器里,在编程时,通过

17

数值送显示缓冲区 第四章 计算器的软件系统设计

查表就可得到相应字符的代码。

显示程序的流程图如图4-4所示。

开显示 液晶初始化

判断是否显示字符 N Y Y 送地址 相应功能的设置 N

判断是否显示完 送数据 Y

返回 图4-4 显示程序流程图

在这个模块中,我们需要了解液晶的基本操作时序——写指令和写数据。写指令:输入:RS=L,RW=L,D0~D7=指令码,E=高脉冲;输出:无。写数据:输入:RS=H,RW=L,D0~D7=数据,E=高脉冲;输出:无。

18

南京工业大学本科生毕业设计(论文)

4.6 DS1302实时时钟模块程序的设计

从前面已经了解到了时钟芯片的功能很强大,设计这部分程序前,我必须对DS1302有关日历、时间的寄存器进行深入的了解。在本设计中,我只用到了时间,所以我在这里就只对时间寄存器进行解释,时(85H、84H)、分(83H、82H)、秒(81H、82H)寄存器及控制寄存器(8FH、8EH)介绍如表4-1所示。

表4-1 时、分、秒、控制寄存器介绍

读寄存写寄存bit7 bit6 bit5 器 81H 83H 85H 器 80H 82H CH 10秒 10分 20时 8FH 8EH WP 0 0 bit4 bit3 bit2 bit1 bit0 范围 秒 分 10时 0 0 0 0 0 时 00~59 00~59 0~23 84H 0 0 ——— 从表中,可以很明了的知道以上寄存器的功能和使用方法,需要说明的是控制寄存器的位7(WP)是写保护位,其他七位都为0,在对任何时钟和RAM进行写操作前,WP必须为0。当WP为1时,禁止对任一寄存器进行写操作,也就是说在电路上电的初始态WP为1,必须先将它置为0,才可进行写操作。还有秒寄存器的位7位定义为时钟暂停标志(CH)位置为1时,时钟振荡器停止,DS1302时钟芯片处于低功耗状态;为0时,时钟开始运行。

例如,执行以下语句,就在时钟芯片中写入了时间——11:20:05。

write_ds1302(0x8e,0x00); //去保护 write_ds1302(0x84,0x12); //写小时,11时 write_ds1302(0x82,0x30); //写分钟,20分 write_ds1302(0x80,0x01); //写秒钟,05秒 write_ds1302(0x8e,0x80); //写完后,上保护 DS1302时钟程序流程图如图4-5所示。

19

第四章 计算器的软件系统设计

地址增加 写1302地址 延时 复位端产生一个高电平 相关变量初始化 开始 DS1302去保护 复位端产生一个高电平 写1302地址 延时 向该地址写数据 将该地址数据读出 地址增加 N N 数据是否写完 数据是否读完 Y Y 图4-5 DS1302时钟程序流程图

显示数据

20

南京工业大学本科生毕业设计(论文)

第五章 计算器系统的组装与调试

5.1软件系统的调试与仿真

在本次设计中,C程序是在Keil软件中编写并编译的,在程序编写中主要出现了以下问题:

(1)在进行编程的时候,因为程序过长过复杂,容易出现少了或多了一个“}”的现象。

(2)有的变量所定义的类型错误,虽然程序没有错误,但仿真后结果错误。 (3)事先未被定义的被调函数放在了主调函数的后面,导致错误。 (4)事先定义的芯片引脚与仿真图中引脚不是同一个。

(5)仿真的结果有时正确有时是乱码,例如:6+15=21正确,但若是运算2148787845+26,结果就是乱码。这是因为系统本身定义的是长整型,而此结果已经溢出,不属于长整型了,我们一眼就能看出是溢出,应该提示错误信息,但是计算机不能,所以在编写程序时不能直接判断运算结果是否大于长整型,而应该间接判断,判断方法在运算模块的设计中已讲解过。

在Keil和Protues的联合调试下,经过了多次认真的分析与修改,程序终于能实现我预期的要求。

Protues仿真如图5-1所示。

21

第五章 计算器系统的组装与调试

图5-1 Protues 仿真图

5.2硬件系统的组装与调试

在成功的进行软件仿真后,下一步要做的就是焊接硬件实物了,焊在焊接前一定要认真阅读焊接注意事项,并在万能电路板上对各元件的放置进行合理布局,此时不仅要考虑正面整体的美观,还要考虑背面布线的方便性,尽可能减少布线的复杂度。

焊接好后要做的就是进行调试,这个过程中遇到的问题如下:

(1)通过STC-ISP软件把在Keil中生成的.hex文件加载到单片机中,开机,进行运算,发现液晶屏点亮但不显示任何数据,经过对电路的检查,发现本应接地液晶第3脚(VL)接到了电源端,改正后液晶可以显示。

(2)液晶虽然可以显示了,但在进行计算时并不能正确显示,经过多次检查,发现硬件并无错误,断定为软件的错误,最后发现软件中液晶初始化不完整,可是在仿真时是正确的,这充分说明了仿真与实际硬件的区别。

经过多次的调试,我的计算器终于能达到同仿真时一样的效果了。 计算器实物如图5-2所示。

22

南京工业大学本科生毕业设计(论文)

图5-2 计算器实物图

计算器进行各种运算的截图如图5-3所示。

(a)加 (b) 减

(c)乘 (d) 除

23

第五章 计算器系统的组装与调试

(e) 除数为0 (f)溢出错误

(g)时间显示

图5-3 运算器各种运算截图

从上图可以看出,我做的计算器在运算部分和时钟部分都能成功地运行了,它可以做到基本的四则运算,还可以正确的显示时间,同时,在计算结果超出它本身的运算范围的时候它会用英文提示错误。

24

南京工业大学本科生毕业设计(论文)

第六章 总结和展望

我的题目是多功能计算器的设计,对于我们这些实践中的新手来说,这是一次考验。如何才能把课堂上学到的东西和实际应用中的相结合?如何能让自己的水平有更多的提高?如何让自己的计划变得更有序性,而不会忙无一用?这都是需要我考虑和努力的地方。通过这次课程设计使我学到很多很多东西,学会了如何让去制定计划,如何去实现这个计划,而且掌握了在执行过程中如何去克服心理上的不良情绪。不仅加深巩固了以前学过的知识,而且学到了许多书本上没有提到过的知识,学会了一种系统的研究方法,可以进行一些简单的编程。同时通过这次设计,我体会到了大学四年学习中存在的不足,例如没有深刻的理解以前老师教过的知识,没有系统的掌握所学内容,对C语言的运用能力也很差。

本来我是想增加键盘按键来实现除四则基本运算以外的运算功能的,但在实践中我发现并不是我想的那么简单,在编写程序的时候我遇到了困难,使得我的想法只能被打断,所以我又想到了在运算以外的其他部分添加功能,由于以前有电子时钟方面的实验经历,所以我决定把它作为附加功能。在实物焊接的后期我还是遇到了一些困扰,因为如何把时间显示在液晶显示器上而不影响计算器本省运算功能的操作出现了问题,但最终经过我的深思熟虑还是巧妙的化解了这个难题。

在这次设计中刚开始我遇到了很多问题,最终还是被我成功的解决了,基本实现了我最初的设想,也成功的实现了时钟功能。通过这次毕业设计使我懂得了要把理论上学会的东西与实际中的结合起来,只有把二者合起来,通过理论得出结论,才能提高自己的实际动手能力和独立思考的能力,更好的为社会服务。

虽然我完成了计算器的设计,但我觉得在设计过程中还是存在许多不足的,只能算是初步的完成了当初的想发。现在市场上的计算器功能都很多,我只能完成其中的一小部分,限于个人水平、时间及条件的限制,这次毕业设计我也只能做到那么多。如果以后还有时间对其进行的完善的话,我会添加一些平方,开方等实用的功能,但这些功能的实现我还要进行更加系统的学习。

25

参考文献

参考文献

[1] 何立民.MCS-51系列单片机应用系统设计[M].北航版 ,1991 [2] 刘桂敏. 单片机系统中复合键和一键多功能的设计[J].辽宁科技大学学报, 2011 [3] 胡汉才.单片机原理及其接口设计[M].清华大学出版社,1997 [4] 赵亮. 单片机从入门到精通系列讲座——矩阵键盘应用[J],电子制作, 2008 [5] 胡花.单片机原理及应用技术[M].江西高校出版社, 2008

[6] 刘杰,梁华国. 矩阵式静态编码键盘及其接口电路[J]. 阜阳师范学院学报(自然科学版), 2004

[7] 谢嘉奎.电子线路(非线性部分第四版)[M].高等教育出版社,2008

[8] 徐玮. 51单片机综合学习系统——1602字符型液晶显示篇[J] . 电子制作, 2008 [9] 张红, 于平. 基于单片机控制的LED点阵显示屏系统[J]. 微计算机信息 , 2009

[10] 孙育才.MCS-51系列单片微型计算机及其应用[M].东南大学出版社,2004 [11] 陈洪财.单片机C语言和汇编语言使用开发技术[M].哈尔滨工程大学出版社,2008 [12] 王效华、张咏梅.单片机原理及应用[M].北京交通大学出版社,2007

[13] 彭伟.单片机C语言程序设计实训100例[M].电子工业出版社,2009

[14] 王东峰,王会良,董冠强.单片机C语言应用100例[M].电子工业出版社,2009 [15] 程兴国. 基于Proteus和Keil构建的单片机虚拟实验室[J].福建电脑, 2009

[16] KPeter.Background Compensation forIRthermometers[J].Sensor,1990,7(3):67~ 68.

26

南京工业大学本科生毕业设计(论文)

附录一

计算器的硬件电路原理图

计算器硬件电路原理图

27

附录

附录 二

源程序:

#include //头文件 #define uint unsigned int #define uchar unsigned char sbit lcden=P2^6; //定义引脚 sbit rs=P2^4; sbit rw=P2^5; sbit busy=P0^7; sbit key=P3^3; sbit setkey=P3^4; sbit surekey=P3^5; sbit pluskey=P3^6; sbit reducekey=P3^7;

sbit ds1302_clk=P2^0; sbit ds1302_io=P2^1; sbit ds1302_rst=P2^2; bit w;

unsigned temp0,temp1,hour,min,sec,next; char i,j,num;

long int a,b,c,d,e; //a第一个数 b第二个数 c得数 int k,temp,kk;

uchar flag,fuhao; //flag表示是否有符号键按下,fuhao表征按下的是哪个符号 uchar err[]={0x72,0x6f,0x72,0x72,0x65,}; uchar code table[]={ 0,1,2,3,

4,5,6,7, 8,9,0,0, 0,0,0,0};

uchar code table1[]={ 0,1,2,3, 4,5,6,7,

8,9,0x2b-0x30,0x2d-0x30,

0x2a-0x30,0x2f-0x30,0x3d-0x30,0x01-0x30,};

void delay(uchar z) //延迟函数1ms {

uchar y;

for(z;z>0;z--)

for(y=0;y<110;y++); }

void delay1(uint t) //迟延函数 50us

28

南京工业大学本科生毕业设计(论文)

{ uchar j; for(;t>0;t--)

for(j=19;j>0;j--); }

void delay2(uint t) //迟延函数50ms { uchar j; for(;t>0;t--)

for(j=6245;j>0;j--); }

void write_ds1302byte(unsigned char temp1) //ds1302写字节函数 { unsigned char i;

for (i=8;i>0;i--) { ds1302_io=temp1&0x01; ds1302_clk=0; ds1302_clk=1; temp1>>=1; } }

void write_ds1302( unsigned char address,unsigned char dat ) //ds1302写数据函数 {

ds1302_rst=0; ds1302_clk=0; ds1302_rst=1;

delay(1); write_ds1302byte(address); write_ds1302byte(dat); ds1302_rst=0; }

unsigned char read_byte() //ds1302读字节函数 { unsigned char i; for(i=8;i>0;i--) { if(ds1302_io) temp0=temp0|0x80; ds1302_clk=1; ds1302_clk=0; temp0=temp0>>1; } return temp0; }

29

附录

unsigned char read_ds1302(unsigned char address) //ds1302读数据函数 {

unsigned char temp1; ds1302_rst=0; ds1302_clk=0; ds1302_rst=1; write_ds1302byte(address); temp1=read_byte(); ds1302_rst=0; ds1302_clk=1; return temp1; }

void ds1302_init() //ds1302初始化 {

write_ds1302(0x8e,0x00); //wp为0,允许写操作 delay(5);

write_ds1302(0x84,0x12); //写入小时 12点 delay(5);

write_ds1302(0x82,0x30); // 写入分 30分 delay(5);

write_ds1302(0x80,0x00); //写入秒 00秒 delay(5);

write_ds1302(0x8e,0x80); //WP为1,禁止写操作 }

void check() //判忙函数 { do{

P0=0xFF; rs=0;

rw=1; //读rs rw的值为01 lcden=0; //E=0,禁止读写

delay(1); //等待,液晶显示器处理数据 lcden=1; //E=1,允许读写

}while(busy==1); //判断是否为空闲,1为忙,0为空闲 }

void write_com(uchar com) //LCD写指令函数 {

P0=com; rs=0; rw=0; lcden=0; check();

30

南京工业大学本科生毕业设计(论文)

lcden=1; }

void write_date(uchar date) //LCD写数据函数 {

P0=date; rs=1; rw=0; lcden=0; check(); lcden=1; }

void lcdinit() //LCD初始化 { delay2(2);

write_com(0x38); //设定DDRAM地址,5*7点阵,8位数据接口 delay1(4);

write_com(0x38); //(硬件中必须有,否则初始化不完整;软件仿真时可以没有) delay1(4);

write_com(0x0c); //开显示,光标关,不闪烁 delay1(10);

write_com(0x06); //增量方式不移位 delay1(4);

write_com(0x80); //设置数据地址指针 delay1(4);

write_com(0x01); //清屏 delay1(10); }

void init() //相关变量初始化 {

lcden=1; delay(1); i=0; j=0;

a=0; //第一个参与运算的数 b=0; //第二个参与运算的数 c=0; //a与b的运算结果

flag=0; //flag表示是否有符号键按下, fuhao=0; // fuhao表示按下的是哪个符号 }

void LCDTestWord(bit i,unsigned char word) {

if(i==0)

31

附录

{write_com(word); } else {

write_date(word); } }

void display_hour(void) //显示时 {

hour=read_ds1302(0x85);

LCDTestWord(0,0x80+0x02); LCDTestWord(1,(hour/16)+0x30);

LCDTestWord(1,hour+0x30); }

void display_min(void) //显示分 {

min=read_ds1302(0x83); LCDTestWord(0,0x80+0x04);

LCDTestWord(1,0x3a);

LCDTestWord(1,(min/16)+0x30); LCDTestWord(1,min+0x30); LCDTestWord(1,0x3a); }

void display_sec(void) //显示秒 {

sec=read_ds1302(0x81);

LCDTestWord(0,0x80+0x08); LCDTestWord(1,(sec/16)+0x30); LCDTestWord(1,sec+0x30); }

void display_name(void) //显示笑脸 {

write_com(0x80+0x4a); write_date(0x5e); write_date(0x5f); write_date(0x5e); }

void UpDate(void) //显示时间函数

32

南京工业大学本科生毕业设计(论文)

{

display_hour(); display_min(); display_sec(); }

void SetTime(unsigned char count) //设置时间子函数 {

unsigned char address,item; unsigned char max,mini; write_com(0x80+0x40);

if(count==3) { write_date(0x73);address=0x81; max=59;mini=0;} if(count==2) {write_date(0x6d);address=0x83; max=59;mini=0;} if(count==1) {write_date(0x68);address=0x85; max=23;mini=0;}

item=read_ds1302(address); //读取DS1302某地址上的数值赋给item item=(item/16)*10+item;

if(pluskey==0) //PlusKey加 item++; //数加 1 if(reducekey==0) //ReduceKey减 item--; //数减 1 if(item>max)

item=mini; //查看数值有效范围 if(item

write_ds1302(0x8e,0x00); item=(item/10)*16+item;

write_ds1302(address-1,item); //将调整好的item值写入DS1302 UpDate(); }

void Key(void) //设置时间函数 {

if (setkey==0) // 设置时间 {

delay(20); //按键消抖

if(setkey==0&&w==0) //当是正常状态时就进入调时状态 {

w=1; //进入调时 SetTime(next); //调整 }

if(setkey==0&&w==1) //当是调时状态,本键用于调整下一项 {

next++;

if(next>3) {next= 0;}

SetTime(next); //调整

33

附录

}

while(setkey==0); //等待键松开 }

if(surekey==0) // 当在调时状态时就退出调时 {

delay(20); //按键消抖 if(surekey==0&&w==1) {

w=0; next=0;

write_com(0x80+0x40); write_date(0x20); }

while(surekey==0); //等待键松开 }

if (pluskey==0) //加调整 {

delay(20); //按键消抖 if(pluskey==0&&w==1) {

SetTime(next); //调整 }

while(pluskey==0); //等待键松开 }

if (reducekey==0) //减调整 {

delay(20); //按键消抖 if(reducekey==0&&w==1) {

SetTime(next); //调整 }

while(reducekey==0); //等待键松开 } }

void error() //报错函数 {

write_com(0x80+0x4f); for(k=0;k<5;k++) write_date(err[k]);

a=0;b=0;flag=0;fuhao=0; }

void keyscan() //键盘扫描函数(包含运算模块程序)

34

南京工业大学本科生毕业设计(论文)

{P1=0xfe; //扫描第0行 if(P1!=0xfe)

{ delay(20); //消抖 if(P1!=0xfe) {

temp=P1&0xf0; switch(temp) {

case 0xe0:num=0; break; case 0xd0:num=1; break; case 0xb0:num=2; break; case 0x70:num=3; break; } }

while(P1!=0xfe);

if(num==0||num==1||num==2||num==3)//如果按下的是'0','1','2'或'3' { if(j!=0) { write_com(0x01); j=0; }

if(flag==0)//没有按过符号键 { a=a*10+table[num]; }

else //如果按过符号键 { b=b*10+table[num]; } }

i=table1[num]; write_date(0x30+i); }

P1=0xfd; //扫描第1行 if(P1!=0xfd) { delay(20); if(P1!=0xfd) {

temp=P1&0xf0; switch(temp) {

case 0xe0:num=4; break; case 0xd0:num=5; break; case 0xb0:num=6; break; case 0x70:num=7; break; } }

35

附录

while(P1!=0xfd);

if(num==4||num==5||num==6||num==7)//如果按下的是'4','5','6'或'7' {

if(j!=0)

{write_com(0x01); j=0; }

if(flag==0)//没有按过符号键 { a=a*10+table[num]; }

else//如果按过符号键 { b=b*10+table[num]; } }

i=table1[num];

write_date(0x30+i); }

P1=0xfb; //扫描第3行 if(P1!=0xfb) { delay(20); if(P1!=0xfb) {

temp=P1&0xf0; switch(temp)

{ case 0xe0:num=8; break; case 0xd0:num=9; break; case 0xb0:num=10; break; case 0x70:num=11; break; } }

while(P1!=0xfb);

if(num==8||num==9)//如果按下的是'8','9' { if(j!=0)

{ write_com(0x01); j=0; }

if(flag==0) //没有按过符号键 { a=a*10+table[num]; }

else //如果按过符号键 { b=b*10+table[num]; } } else if(num==10) //表示按下的是'加号键 '

36

南京工业大学本科生毕业设计(论文)

{ flag=1; fuhao=1; }

else if(num==11)//表示按下的是'减号键' { flag=1; fuhao=2; }

i=table1[num];

write_date(0x30+i); }

P1=0xf7; //扫描第4行 if(P1!=0xf7) { delay(20); if(P1!=0xf7)

{ temp=P1&0xf0; switch(temp)

{ case 0xe0:num=12; break; case 0xd0:num=13; break; case 0xb0:num=14; break; case 0x70:num=15; break; } }

while(P1!=0xf7); switch(num)

{ case 12:{ write_date(0x30+table1[num]);flag=1;fuhao=3; }//表示按下的是'乘号键' break;

case 13:{ write_date(0x30+table1[num]);flag=1;fuhao=4; } //表示按下的是 '除号键' break; case 14:{ j=1;

if(fuhao==1) //进行加法运算;

{ write_com(0x80+0x4f);//光标前进至第二行最后一个显示处

write_com(0x04); //设置从后住前写数据,每写完一个数据,光标后退一格

if(((a>0&&ad-a)) { error(); break;} // 加法溢出错误 c=a+b; if(c==0) write_date(0x30); if(c<0) c=-c; while(c!=0)

{ write_date(0x30+c); c=c/10; } if(a+b<0) write_date(0x2d); write_com(0x80+0x40);

37

附录

a=a+b;b=0;flag=0;fuhao=0; }

else if(fuhao==2) //进行减法运算 {write_com(0x80+0x4f); write_com(0x04);

if(((a<0&&a>e)&&b>a-e)) { error(); break;} //减法溢出错误 if(a-b>0) c=a-b; else c=b-a; if(c==0) write_date(0x30); while(c!=0)

{write_date(0x30+c); c=c/10; }

if(a-b<0)

write_date(0x2d); //写'负号' write_com(0x80+0x40); a=a-b; b=0;flag=0;fuhao=0; }

else if(fuhao==3) //进行乘法运算 { write_com(0x80+0x4f); write_com(0x04); if(((a>0&&ad/a)||((a<0&&a>e)&&b>e/a)) 溢出错误 if(a!=0) {c=a*b;

if(c<0) c=-c;

if(c==0) write_date(0x30); while(c!=0)

{write_date(0x30+c); c=c/10; } }

else write_date(0x30);

if(a*b<0) write_date(0x2d); //写'负号' write_com(0x80+0x40);

a=a*b;b=0;flag=0;fuhao=0; }

else if(fuhao==4) { write_com(0x80+0x4f); write_com(0x04); i=0; if(b!=0)

38

{ error(); break;} //乘法 南京工业大学本科生毕业设计(论文)

{ if(((a>0)&&((a/b)<(d/10000)))||((a<0)&&((a/b)>(e/10000)))) {c=(long)((a*1.0/b)*10000); if(c<0) c=-c; if(c>=1000) { while(c!=0) {

write_date(0x30+c); c=c/10; i++; if(i==4)

write_date(0x2e); } } else if(c<1000) { write_date(0x30+c); write_date(0x30+c/10); write_date(0x30+c/100); write_date(0x30); write_date(0x2e); } }

else if(((a>0)&&((a/b)>(d/10000)))||((a<0)&&((a/b)<(e/10000)))) { c=a/b; if(c<0) c=-c; while(c!=0) {

write_date(0x30+c); c=c/10; } }

if(a/b==0) write_date(0x30);

if(a*1.0/b<0) write_date(0x2d); //写'负号' write_com(0x80+0x40); a=a/b;b=0; flag=0;fuhao=0; } else error(); } } break;

case 15:{write_com(0x01);a=0;b=0;flag=0;fuhao=0;} //表示按下的是'清零键' break; }

39

}

P1=0xf0; }

main() { key=1; setkey=1; surekey=1; pluskey=1; reducekey=1; next=0; kk=0;

d=2147483647; e=-2147483648; lcdinit() ; init();

read_ds1302( ); //ds1302_init(); while(1) { if(kk==0)

{ while(key==1) { kk=1;

keyscan(); } }

write_com(0x01);

a=0;b=0;flag=0;fuhao=0; if(kk==1)

{ while(key==1) { kk=0; Key();

display_hour(); display_min(); display_sec();

display_name(); } }

write_com(0x01); } }

附录

40

南京工业大学本科生毕业设计(论文)

致谢

这次毕业设计的完成要特别感谢我的指导老师袁建华老师,在教学繁忙、事务缠身的情况下,袁老师多次抽出时间,对我的论文进行悉心的指导,帮我们找出所存在的问题并改正,这能让我们在正式答辩的时候从容面对,不慌乱。平时袁老师再忙也与我们保持电话、短信联系,对我们每个人都给予了高度关注,督促并帮助我们按时完成本次设计。

还有我的舍友我的同学,虽然他们自己也很忙,当我遇到问题时只要他们能帮一定会帮。在这里真诚地对所有关心我、帮助我、鼓励我的老师、同学、朋友道声:“谢谢!”

最后我要感谢的是我亲爱的南工大以及南工大的每一位老师和同学。

41

南京工业大学本科生毕业设计(论文)

致谢

这次毕业设计的完成要特别感谢我的指导老师袁建华老师,在教学繁忙、事务缠身的情况下,袁老师多次抽出时间,对我的论文进行悉心的指导,帮我们找出所存在的问题并改正,这能让我们在正式答辩的时候从容面对,不慌乱。平时袁老师再忙也与我们保持电话、短信联系,对我们每个人都给予了高度关注,督促并帮助我们按时完成本次设计。

还有我的舍友我的同学,虽然他们自己也很忙,当我遇到问题时只要他们能帮一定会帮。在这里真诚地对所有关心我、帮助我、鼓励我的老师、同学、朋友道声:“谢谢!”

最后我要感谢的是我亲爱的南工大以及南工大的每一位老师和同学。

41

本文来源:https://www.bwwdw.com/article/eea8.html

Top