基于51单片机的简易计算器2.docx

上传人:李医生 文档编号:11713686 上传时间:2021-09-01 格式:DOCX 页数:31 大小:185.08KB
返回 下载 相关 举报
基于51单片机的简易计算器2.docx_第1页
第1页 / 共31页
基于51单片机的简易计算器2.docx_第2页
第2页 / 共31页
基于51单片机的简易计算器2.docx_第3页
第3页 / 共31页
基于51单片机的简易计算器2.docx_第4页
第4页 / 共31页
基于51单片机的简易计算器2.docx_第5页
第5页 / 共31页
点击查看更多>>
资源描述

《基于51单片机的简易计算器2.docx》由会员分享,可在线阅读,更多相关《基于51单片机的简易计算器2.docx(31页珍藏版)》请在三一文库上搜索。

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

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

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

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

5、4*4 矩阵键盘作为输入模块。以 3 节串联的 5 号电池作为电源。3) 系统设计依据:实用性可靠性美观性8二、系统方案设计万案一万案一显示模块:数码管电源模块:USB功能设计:有复位键数据类型:双精度浮点型1 .方案一显示模块:16021cd电源模块:电池盒功能设计:上电复位数据类型:单精度浮点型显示模块采用数码管,数值只能显示一行,且无法显示、”“*”“/”“=” 等符号。使用效果欠佳。电源模块采用USB电压为5.0V,符合单片机的要求。但使计算器不方便使 用,必须通过US6S电,实用性不强。功能设计中添加复位键,可以使电路恢复到起始状态,确保微机系统中稳 定可靠,避免计算器出现“死机”

6、“程序走飞”等现象。但添加复位键会使计 算器显得繁琐。双精度型(double ),占用64位的存储空间。在操作值很大的数字时,双 精度型是最好的选择。2 .方案二以16021cd作为显示器,可显示双行数据,还可以显示多种运算符号。实用性强,便于计算器的升级。将独立电源盒作为电源,以3节5号电池串联,电压可达4.5V ,可以使单片机正常工作。并且易于携带,给使用者带来很大便利。采用上电复位,将复位电路与电源开关结合。既可以确保微机系统中稳定可靠的运行,又使计算器更为精简。单精度浮点型( f1oat )专指占用32位存储空间的单精度值。单精度在一些处理器上比双精度更快而且只占用双精度一半的空间,但

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

8、模块液晶显示器(LCD的主要原理是一电流刺激液晶分子产生点、线、面并配 合背部灯管构成画面。本系统采用的1602夜晶为5V电压驱动,带背光,可显示 两行,每行16个字符,能显示汉字,内置128个字符的ASCII字符集字库,只有 并行接口,无用行接口。LCD 1602RJ6( 1602)JI6C2 .输入模块4*4矩阵键盘将16个按键排成4行4列,第一行将每个按键的一端连在一起构成行线,第一列将每个按键的另一端连接在一起构成列线,共有4行4列8根线,将这八根线接到单片机的8个I/O 口上,通过程序扫描键盘就可检测16个键。矩阵键盘U七气S363 .控制模块AT89C51 是一种带 4K字节 FL

9、ASH#储器(FPEROMFlash Programmable and Erasable Read Only Memory )的低电压、高性能 CMOS肮微处理器,俗称单 片机。AT89C51是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片 机的可擦除只读存储器可以反复擦除 1000次。该器件采用ATMEH密度非易失 存储器制造技术制造,与工业标准的MCS-5甘旨令集和输出管脚相兼容。由于将 多功能8位CPUf口闪烁存储器组合在单个芯片中,ATMEL勺AT89C51是一种高 效微控制器,AT89C51是它的一种精简版本。AT89C51单片机为很多嵌入式控制 系统提供了一种灵活性高且价廉

10、的方案。U21P)G二一 1田。an I39土311中1PJ3EI3P34SON56rJ D 3父?由t33FJqHITrJ u on i3213U事n国1n依口m。2122Z35nTO量上ftTC,m w不1425F25 由6 IQ?工VI28Al9RrsrrKtDId111 ,a瓯AID?R5UIX)口lL_J4 .元器件的选择1602LCD 4*4矩阵键盘、10千欧排阻、自锁开关、20pF电容、12MHZ1振、 103千欧电位器。5 .特殊器件的简介自锁开关是指开关自带机械锁定功能,按下去,松手后按钮是不会完全跳 起来的,处于锁定状态,需要再按一次,才解锁完全跳起来。按下后接通,弹 起来

11、后断开。6 .各单元模块的连接如图所示: 液晶接P6,键盘接P1 口。液晶使能端P2.5 ,液晶数据命令选择端P2.6 ,液晶读写选择端P2.7 。电源正负极分别接到VC0HGND五、系统软件设计1. 设计原理以keilV4.0设计。采用大循环嵌套的设计思想。程序主要由“液晶显示模块”“矩阵键盘扫描模块”“运算模块”构成。大循环一直进行,是计算器一直处于工作状态。不停地调用键盘扫描函数,将键盘输入的数据送给液晶显示与运算模块,经运算模块计算出结果后,只需调用液晶显示的子函数就可将答案显示到液晶屏上。2. 程序结构框图调用头文件变量定义位定义主函数I初始化矩阵键盘扫描程序大循环1602显木程序运

12、算模块处理错误定义变量,便于后面程序的使用。位定义:液晶使能端P2.5,液晶数据命令选择端P2.6,液晶读写选择端P2.7。初始化:液晶开显示,清屏。矩阵键盘扫描程序:包含软件去逗,在大循环中不断调用键盘扫描程序当检测 到有键按下后,如果是有效值就进行处理,否则继续扫描键盘。3. 程序流程框图ii开始 是有键按下?否返回值为09?r是计算第一次输入的数值键盘扫描有按键按下?20返回值为09?计算第二次输入的数值计算运算结果有按键按否LCD显示六、系统测试1 .测试方法将计算器断电,把万用表调到蜂鸣器档上,把万用表两表笔放在待测的 两个端子上,若短路蜂鸣器就会响。经测得开关处电路存在短路,经修复

13、 后电路焊接正常。2 .计算器功能测试加法测试:1 -V J减法测试:乘法测试:除法测试:3 .测试结果分析经测试,各项功能均已达成。对于一般的整形运算,计算器能准确无误的计算出来。由于使用浮点型数 据,计算器只能进行67位以内的精确运算。七、结束语1. 心得感悟经过两个星期的设计与制作, 本小组完成了基于 51 单片机的计算器的设计。期间我们遇到许多困难和问题都一一解决,最终完全达到了预期的目标,体会到团体合作与成功的喜悦。我感到只有亲手实践才能更深刻,更全面的学好知识,并且要在设计制作中多加入自己的想法,力求创新而不要模仿前人做过的作品。在设计的每一小步都要尽自己最大努力做到最好,这样才能

14、做出出色的作品。2. 改进的设想1) 使计算器能完成多步混合运算的功能。2) 添加一个功能键,当按下功能键后改变矩阵键盘的键值。将第四列改为平方,开根号,求模,求余。再次按下此键后第四列改回加,减,乘,除。并设计一个led灯来显示键值是否被改变。八、附录1. 系统设计图2. 设计程序#include#include#include#define uchar unsigned char#define uint unsigned int#define check_busysbit rs = P2八7;sbit rw = P2八6;sbit en = P2八5;void delay(int z)in

15、t x,y;for (x=z;x0;x-)for(y=110;y0;y-);/* 判忙函数 */bit LCD_check_busy() 当 LCD “忙”时,LCD 的 DATA.7位输 出为高电平信号,当LCD “不忙”时,LCD的DATA.7位输出为低电 平信号P0= 0xFF;/为便于检测rs=0;/rs=0,rw=1,en=1 忙rw=1;/ void busy(void) P1=0xff; RS=0; RW=1;E=1; while(P1&0x80)=0x80); E=0; en=0;_nop_();en=1;return (bit)(P0 & 0x80);/ else/*lcd1

16、602 判忙函数bit LCD_Check_Busy(void)bit result; /修改了 判忙函数DataPort= 0xFF;RS=0;RW=1;EN=1;_nop_();result=(bit)(DataPort &0x80);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;/* 写入数据函数*/void write_dat(uchar dat)while(LCD_ch

17、eck_busy(); / 忙则等待rs=1;rw=0;en=1;P0= dat;_nop_();en=0;/* 写入字符函数*/ void LCD_write_char(uchar x,uchar y,uchar dat)if (y = 0)write_com(0x80 + x);2122elsewrite_com(0xC0 + x);*write_dat( dat);/* 写入字符串函数/?void write_string(uchar x,uchar y,uchar *s)while (*s)LCD_write_char(x,y,*s);s+;x+;/* 初始化函数*/void LCD_

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

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

20、k;case 0xbe:return 3;break;case 0xbd:return 6;break;case 0xbb:return 9;break;case 0xb7:return =;break;case 0xde:return 2;break;case 0xdd:return 5;break;case 0xdb:return 8;break;case 0xd7:return 0;break;case 0xee:return 1;break;case 0xed:return 4;break;case 0xeb:return 7;break;case 0xe7:return .;brea

21、k;default:return 0xff;break;/* 主函数 */ 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(0x01); / 清屏/主循环while (1)num=keypro();/扫描键盘 if(num!=0xff) /如果扫描是按键有效值则进行处理26if(i=0)/输入是第一个字符的时候需要把该行

22、清空,方便观看write_com(0x01);if(+=num)| (i=16) | (-=num) | (x=num)|(/=num) | (=num)/ 输入数字最大值16,输入符号表示输入结束i=0; /计数器复位if(firstflag=0) /如果是输入的第一个数据,赋值给a,并把标志位置1,到下一个数据输入时可以跳转赋值给 bsscanf(temp,%f,&a);firstflag=1;elsesscanf(temp,%f,&b);for(s=0;s16;s+) / 赋值完成后把缓冲区清零,防止下次输入影响结果temps=0;LCD_write_char(0,1,num);if(n

23、um!=)/判断当前符号位并做相应处理sign=num; /如果不是等号记下标志位elsefirstflag=0;/检测到输入=号,判断上次读入的符合switch(sign)case +:a=a+b;break;case -:a=a-b;break;case x:a=a*b;break;case /:a=a/b;break;default:break;sprintf(temp,%g,a); /输出浮点型,无用的 0 不输出write_string(1,1,temp);/ 显示到液晶屏sign=0;a=b=0;/用完后所有数据清零for(s=0;s16;s+)temps=0;else if(i16)/?if(0=i)& (temp0=0) )/ 如果第一个字符是0 ,判读第二个字符if(num=0)/如果是小数点则正常输入,光标位置加1write_com(0x01);elsetemp0=num;i+; /如果是 1-9数字, 说明 0没有用,则直接替换第一位 0LCD_write_char(0,0,num);/ 输出数据elsetempi=num;LCD_write_char(i,0,num);/ 输出数据i+;31

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

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1