基于51单片机的简易计算器2_第1页
基于51单片机的简易计算器2_第2页
基于51单片机的简易计算器2_第3页
基于51单片机的简易计算器2_第4页
基于51单片机的简易计算器2_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、0基于 51 单片机的计算器设计2015 年 5 月 1 日1目录目录摘 要.3一、 前言.41) 主要的问题及目标:.42) 针对上述目标,做出以下的设计:.43) 系统设计依据:.4二、 系统方案设计.41. 方案一.52. 方案二.5三、 理论分析与计算.6四、 系统电路设计.61. 显示模块.62. 输入模块.73. 控制模块.84. 元器件的选择.95. 特殊器件的简介.96. 各单元模块的连接.9五、 系统软件设计.101. 设计原理.102. 程序结构框图.103. 程序流程框图.11六、 系统测试.131 测试方法.142 计算器功能测试.143 测试结果分析.14七、 结束语

2、.1521. 心得感悟.152. 改进的设想.15八、 附录.151. 系统设计图.152. 设计程序.15摘 要电子计算器是日常生活中常用的电子计算仪器,他广泛应用于超市、大中型商场、大小企业与学校中。具有精度高。体积小、应用范围广泛、易于操作等优点。本作品以 MCS-51 系列中的 AT89C51 单片机为核心,能够实现单步加、减、乘、除运算。该系统通过检测矩阵键盘扫描,判断是否按键,实现对 4*4 键盘扫描进行实时的按键检测,并把检测数据存储下来。经数据转换把数值送入lcd1602 液晶屏显示。整个计算器系统的工作过程为:首先存储单元初始化,显示初始值和键盘扫描,判断按键位置,查表得出按

3、键值,单片机则对数据进行储存与相应处理转换,之后送入 lcd1602 显示。整个系统可分为三个主要功能模块:功能模块一,实时键盘扫描;功能模块二,数据转换为了数码管显示;功能模块三,lcd1602 显示。能实现 6 位或 6 位以内的精确运算,若输出数据超过 6 位则会以科学计数法显示。关键词:关键词:AT89C51 单片机;计算器;加减乘除;矩阵键盘;液晶屏31、前言本设计是基于 51 系列单片机来进行的数字计算器系统设计,可以完成计算器的键盘输入,进行加、减、乘、除基本四则运算,并在 LCD 上显示相应的结果;设计电路采用 STC89C51 单片机为主要控制电路,显示采用1602LCD 显

4、示;软件方面使用 C 语言编程。最后用 PROSE99 画 PCB,焊接万用板,进行硬件调试。1) 主要的问题及目标:键盘输入数值显示能实现加、减、乘、除四则运算;可计算小数,负数;当计算器执行过程中有错误时,会在液晶屏上做出相应的提示。当除数为 0 时,程序运算出错,液晶屏会显示+INF。2) 针对上述目标,做出以下的设计:以 STC89C51 位主控芯片,P0 口连接 1602 液晶屏,P1 口连接 4*4 矩阵键盘。将所有输入数据已浮点型进行运算,故最大输入数据为 16 位。为了更好的显示效果使用采用 1602 液晶屏作为显示模块。由于按键包含数字键“09”与“+”“-”“*”“/”“.

5、”“=”这16 个按键。故以 4*4 矩阵键盘作为输入模块。以 3 节串联的 5 号电池作为电源。3) 系统设计依据:实用性可靠性美观性42、系统方案设计1. 方案一显示模块采用数码管,数值只能显示一行,且无法显示“+”“*”“/”“=”等符号。使用效果欠佳。电源模块采用USB,电压为5.0V,符合单片机的要求。但使计算器不方便使用,必须通过USB通电,实用性不强。功能设计中添加复位键,可以使电路恢复到起始状态,确保微机系统中稳定可靠,避免计算器出现“死机”“程序走飞”等现象。但添加复位键会使计算器显得繁琐。双精度型(double ),占用64位的存储空间。在操作值很大的数字时,双精度型是最好

6、的选择。2. 方案二显示模块:数码管电源模块:USB功能设计:有复位键数据类型:双精度浮点型电源模块:USB显示模块:1602lcd电源模块:电池盒功能设计:上电复位数据类型:单精度浮点型方案一方案二5以1602lcd作为显示器,可显示双行数据,还可以显示多种运算符号。实用性强,便于计算器的升级。将独立电源盒作为电源,以3节5号电池串联,电压可达4.5V,可以使单片机正常工作。并且易于携带,给使用者带来很大便利。采用上电复位,将复位电路与电源开关结合。既可以确保微机系统中稳定可靠的运行,又使计算器更为精简。 单精度浮点型(float )专指占用32位存储空间的单精度值。单精度在一些处理器上比双

7、精度更快而且只占用双精度一半的空间,但是当值很大或很小的时候,它将变得不精确。当你需要小数部分并且对精度的要求不高时,单精度浮点型的变量是有用的。结合上述考虑论证,小组采用方案二作为计算器系统的设计方案。结合上述考虑论证,小组采用方案二作为计算器系统的设计方案。3、理论分析与计算本作品为了要实现键盘输入,液晶显示屏输出,加、减、乘、除计算,上电复位等功能。小组做出以下的分析与计算:将4*4矩阵键盘连接到单片机的P1口上,液晶显示屏连接到P0口上。并在软件中用矩阵键盘扫描程序对其实时检测,将键盘输入的数据显示到液晶屏上,并通过运算程序计算,最终将计算结果输出到液晶屏上。将输入与输出数据以单精度浮

8、点型定义,以%g或%f显示输出数据,可显示精确数字或以科学计数法表示。64、系统电路设计1. 显示模块液晶显示器(LCD)的主要原理是一电流刺激液晶分子产生点、线、面并配合背部灯管构成画面。本系统采用的1602液晶为5V电压驱动,带背光,可显示两行,每行16个字符,能显示汉字,内置128个字符的ASCII字符集字库,只有并行接口,无串行接口。2. 输入模块4*4矩阵键盘将16个按键排成4行4列,第一行将每个按键的一端连在一起构成行线,第一列将每个按键的另一端连接在一起构成列线,共有4行4列8根线,将这八根线接到单片机的8个I/O口上,通过程序扫描键盘就可检测16个键。73. 控制模块 AT89

9、C51 是一种带 4K 字节 FLASH 存储器(FPEROMFlash Programmable and Erasable Read Only Memory)的低电压、高性能 CMOS 8 位微处理器,俗称单片机。AT89C51 是一种带 2K 字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除 1000 次。该器件采用 ATMEL 高密度非易失存储器制造技术制造,与工业标准的 MCS-51 指令集和输出管脚相兼容。由于将多功能 8 位 CPU 和闪烁存储器组合在单个芯片中,ATMEL 的 AT89C51 是一种高效微控制器,AT89C51 是它的一种精简版本。AT

10、89C51 单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。84. 元器件的选择1602LCD、4*4矩阵键盘、10千欧排阻、自锁开关、20pF电容、12MHZ晶振、103千欧电位器。5. 特殊器件的简介自锁开关是指开关自带机械锁定功能,按下去,松手后按钮是不会完全跳起来的,处于锁定状态,需要再按一次,才解锁完全跳起来。按下后接通,弹起来后断开。6. 各单元模块的连接P0 单片机P2P1P31602LCD键盘晶振9如图所示:液晶接PO口,键盘接P1口。液晶使能端P2.5,液晶数据命令选择端P2.6,液晶读写选择端P2.7。电源正负极分别接到VCC和GND。5、系统软件设计1. 设计原

11、理以keilV4.0设计。采用大循环嵌套的设计思想。程序主要由“液晶显示模块”“矩阵键盘扫描模块”“运算模块”构成。大循环一直进行,是计算器一直处于工作状态。不停地调用键盘扫描函数,将键盘输入的数据送给液晶显示与运算模块,经运算模块计算出结果后,只需调用液晶显示的子函数就可将答案显示到液晶屏上。2. 程序结构框图10定义变量,便于后面程序的使用。位定义:液晶使能端P2.5,液晶数据命令选择端P2.6,液晶读写选择端P2.7。初始化:液晶开显示,清屏。矩阵键盘扫描程序:包含软件去逗,在大循环中不断调用键盘扫描程序当检测到有键按下后,如果是有效值就进行处理,否则继续扫描键盘。3. 程序流程框图矩阵

12、键盘扫描程序1602 显示程序运算模块主函数初始化大循环处理错误调用头文件变量定义位定义11否是否是否是开始初始化键盘扫描有键按下?返回值为 09?计算第一次输入的数值键盘扫描有按键按下?12是否是否返回值为09?计算第二次输入的数值计算运算结果有按键按下?LCD 显示136、系统测试1测试方法将计算器断电,把万用表调到蜂鸣器档上,把万用表两表笔放在待测的两个端子上,若短路蜂鸣器就会响。经测得开关处电路存在短路,经修复后电路焊接正常。2计算器功能测试加法测试:减法测试:乘法测试:除法测试:错误处理:3测试结果分析经测试,各项功能均已达成。对于一般的整形运算,计算器能准确无误的计算出来。由于使用

13、浮点型数据,计算器只能进行67位以内的精确运算。147、结束语1. 心得感悟经过两个星期的设计与制作,本小组完成了基于51单片机的计算器的设计。期间我们遇到许多困难和问题都一一解决,最终完全达到了预期的目标,体会到团体合作与成功的喜悦。我感到只有亲手实践才能更深刻,更全面的学好知识,并且要在设计制作中多加入自己的想法,力求创新而不要模仿前人做过的作品。在设计的每一小步都要尽自己最大努力做到最好,这样才能做出出色的作品。2. 改进的设想1)使计算器能完成多步混合运算的功能。2)添加一个功能键,当按下功能键后改变矩阵键盘的键值。将第四列改为平方,开根号,求模,求余。再次按下此键后第四列改回加,减,

14、乘,除。并设计一个led灯来显示键值是否被改变。8、附录1. 系统设计图2. 设计程序#include#include#include15#define uchar unsigned char #define uint unsigned int#define check_busysbit rs = P27;sbit rw = P26;sbit en = P25;void delay(int z)int x,y; for (x=z;x0;x-) for(y=110;y0;y-);/*判忙函数*/ bit LCD_check_busy()/当LCD“忙”时,LCD的DATA.7位输出为高电平信号,

15、当LCD“不忙”时,LCD的DATA.7位输出为低电平信号 P0= 0 xFF;/为便于检测16 rs=0;/rs=0,rw=1,en=1 忙 rw=1;/ void busy(void) P1=0 xff; RS=0; RW=1; E=1; while(P1&0 x80)=0 x80); E=0; en=0; _nop_(); en=1; return (bit)(P0 & 0 x80); / else /*lcd1602判忙函数 bit LCD_Check_Busy(void) bit result;/修改了判忙函数 DataPort= 0 xFF; RS=0; RW=1;

16、 EN=1; _nop_(); 17 result=(bit)(DataPort & 0 x80); EN=0; return result;*/ return 0; /*写入命令函数*/ void write_com(uchar com) while(LCD_check_busy(); /忙则等待 rs=0; rw=0; en=1; P0= com; _nop_(); en=0;18 /*写入数据函数*/ void write_dat(uchar dat) while(LCD_check_busy(); /忙则等待 rs=1; rw=0; en=1; P0= dat; _nop_()

17、; en=0; /*写入字符函数*/void LCD_write_char(uchar x,uchar y,uchar dat) if (y = 0) write_com(0 x80 + x); 19 else write_com(0 xC0 + x); write_dat( dat); /*写入字符串函数*/? void write_string(uchar x,uchar y,uchar *s) while (*s) LCD_write_char(x,y,*s); s+; x+; 20/*初始化函数*/ void LCD_init() write_com(0 x38); /*显示模式设置*

18、/ delay(5); write_com(0 x06);/*显示光标移动设置*/ delay(5); write_com(0 x0C); /*显示开及光标设置*/ write_com(0 x01); /*显示清屏*/ /*按键扫描函数,返回扫描键值*/uchar keyscan() /键盘扫描函数,使用行列反转扫描法 unsigned char cord_h,cord_l;/行列值中间变量 P1=0 x0f; /行线输出全为0 cord_h=P1&0 x0f; /读入列线值21 if(cord_h!=0 x0f) /先检测有无按键按下 delay(10); /去抖 if(P1&

19、;0 x0f)!=0 x0f) cord_h=P1&0 x0f; /读入列线值 P1=cord_h|0 xf0; /输出当前列线值 cord_l=P1&0 xf0; /读入行线值 while(P1&0 xf0)!=0 xf0);/等待松开并输出 return(cord_h+cord_l);/键盘最后组合码值 return(0 xff); /返回该值unsigned char keypro() switch(keyscan() 22 case 0 x7e:return +;break; case 0 x7d:return -;break; case 0 x7b:retur

20、n x;break; case 0 x77:return /;break; case 0 xbe:return 3;break; case 0 xbd:return 6;break; case 0 xbb:return 9;break; case 0 xb7:return =;break; case 0 xde:return 2;break; case 0 xdd:return 5;break; case 0 xdb:return 8;break; case 0 xd7:return 0;break; case 0 xee:return 1;break; case 0 xed:return 4

21、;break; case 0 xeb:return 7;break; case 0 xe7:return .;break; default:return 0 xff;break; 23/*主函数*/void main() unsigned char num,i,sign; unsigned char temp16; /最大输入16个 bit firstflag; float a=0,b=0; unsigned char s; LCD_init(); /初始化液晶屏 delay(10);/延时用于稳定,可以去掉 write_com(0 x01); /清屏 while (1) /主循环 num=keypro(); /扫描键盘 if(num!=0 xff) /如果扫描是按键有效值则进行处理 24 if(i=0) /输入是第一个字符的时候需要把该行清空,方便观看 write_com(0 x01); if(+=num)| (i=16) | (-=num) | (x=num)| (/=num) | (=num)/输入数字最大值16,输入符号表示输入结束 i=0; /计数器复位 if(firstflag=0) /如果是输入的第一个数据,赋值

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论