基于51单片机的简易计算器设计报告.docx

上传人:b****8 文档编号:11955729 上传时间:2023-06-03 格式:DOCX 页数:41 大小:2.21MB
下载 相关 举报
基于51单片机的简易计算器设计报告.docx_第1页
第1页 / 共41页
基于51单片机的简易计算器设计报告.docx_第2页
第2页 / 共41页
基于51单片机的简易计算器设计报告.docx_第3页
第3页 / 共41页
基于51单片机的简易计算器设计报告.docx_第4页
第4页 / 共41页
基于51单片机的简易计算器设计报告.docx_第5页
第5页 / 共41页
基于51单片机的简易计算器设计报告.docx_第6页
第6页 / 共41页
基于51单片机的简易计算器设计报告.docx_第7页
第7页 / 共41页
基于51单片机的简易计算器设计报告.docx_第8页
第8页 / 共41页
基于51单片机的简易计算器设计报告.docx_第9页
第9页 / 共41页
基于51单片机的简易计算器设计报告.docx_第10页
第10页 / 共41页
基于51单片机的简易计算器设计报告.docx_第11页
第11页 / 共41页
基于51单片机的简易计算器设计报告.docx_第12页
第12页 / 共41页
基于51单片机的简易计算器设计报告.docx_第13页
第13页 / 共41页
基于51单片机的简易计算器设计报告.docx_第14页
第14页 / 共41页
基于51单片机的简易计算器设计报告.docx_第15页
第15页 / 共41页
基于51单片机的简易计算器设计报告.docx_第16页
第16页 / 共41页
基于51单片机的简易计算器设计报告.docx_第17页
第17页 / 共41页
基于51单片机的简易计算器设计报告.docx_第18页
第18页 / 共41页
基于51单片机的简易计算器设计报告.docx_第19页
第19页 / 共41页
基于51单片机的简易计算器设计报告.docx_第20页
第20页 / 共41页
亲,该文档总共41页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于51单片机的简易计算器设计报告.docx

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

基于51单片机的简易计算器设计报告.docx

基于51单片机的简易计算器设计报告

基于51单片机的简易计算器设计

【摘要】单片机的出现是计算机制造技术高速发展的产物,它是嵌入式控制系统的核心,如今,它已广泛的应用到我们生活的各个领域,电子、科技、通信、汽车、工业等。

本设计是基于51系列单片机来进行的数字计算器系统设计,可以完成计算器的键盘输入,进行加、减、乘、除八位数范围内的基本四则运算,并在LCD上显示相应的结果。

设计电路采用AT89S51单片机为主要控制电路,利用4*4矩阵键盘作为计算器的数字以及运算符的输入。

显示采用字符LCD静态显示。

软件方面使用C语言编程,并用开发板制作并演示。

【关键词】计算器,单片机,LCD,矩阵键盘

Abstract

Theemergenceofcomputerchipmanufacturingtechnology,rapiddevelopmentoftheproduct,whichisthecoreofembeddedcontrolsystems,andnow,ithasbeenwidelyappliedtoallareasofourlives,electronics,technology,communications,automotive,industrialandsoon. Thedesignisbasedonthe51computersfordigitalsystemdesigncalculator,youcancompletethecalculatorkeyboard,toadd,subtract,multiply,anddividewithinthescopeofthebasicsix-digitarithmetic,andthecorrespondingresultsontheLCDdisplay . AT89C51microcontrollercircuitdesignasthemaincontrolcircuit,useMM74C9224*4keypadasacalculatorscanICtoreadkeyboardinput. CharacterLCDdisplaywithastaticdisplay. SoftwareusingtheCprogramminglanguage,andusePROTUESsimulation. 

 

Keywords:

calculator,MCU,LCD,Matrixkeyboard 

 

 

一、系统总体设计

1.1设计概述

本设计使用AT89S52单片机作为主控芯片,通过计算机键盘进行数据输入,进行相应的加、减、乘、除的运算,并在LCD上显示相应的结果,主要功能特点如下:

(1)LCD的第一行显示运算式子,第二行显示运算结果,在任何时候按下AC清零按键时候,都必须退出当前计算,返回初始状态,等下新的一次运算。

(2)当运算完第一次完整的计算以后,可以在不按任何按键的情况下,进行新的一轮运算,若运算完一次运算后继续按运算符按键,则利用之前一次的结果作为第一个算数,直接等待第二运算数的输入并完成计算,即可进行连续运算。

(3)可根据用户需要开启或关闭按键声音提示,即通过重复按声音开关按钮可关声音或开声音。

(4)可进行开方运算、可进行任意次方的运算,即能进行x的y次方的运算。

1.2设计思路

根据课程要求和设计指标,本系统采用MCS-51系列单片机作为主控机,通过拓展必要的外围电路,实现对计算器的设计,具体设计思路如下:

(1)由于要显示运算式和结果,为了达到良好的显示效果,本系统采用LCD1602液晶显示屏作为显示模块。

(2)计算器一般包含数字键(0~9),符号键(+、-、×、÷)、小数点按键,等号按键,故采用4*4矩阵键盘结合键盘扫描技术容易达到要求,并且电路和程序也比较简单。

(3)执行过程:

开机显示‘0’,等待按键输入,当键入数字,在LCD上显示出来,计算器内部吧数据储存起来,并等待下一按键输入,当键入+、-、×、÷运算符,计算器在内部进行转换,得到第一运算数,然后等待再次输入数值,按等于号就在LCD上显示结果,如果继续按下+、-、×、÷运算符,则直接利用第一次运算的结果进行下一次运算。

(4)AC清零功能:

在运算的任何时候键入AC键,则把数据清零,等待下一次运算。

为了实现此功能,本系统采用AC按键外部中断输入,运用中断技术,随时对计算器进行清零。

(5)音乐开关功能:

由于在输入的任何时候都有可能需要开启或关闭声音提示,所以声音开关按键也采用外部中断输入单片机,运用中断技术,随时开或关声音提示。

(6)开方和多次方运算功能的实现:

采用独立按键,再检测运算符的时候也检测这两个按键,一旦符合按下则进行开方或者多次方运算,程序可通过条用“math.h”头文件中的sqrt和pow函数实现。

(7)错误提示:

当输入超过范围时,则停止输入,等待输入运算符;当除数为0时,计算器会在LCD上提示错误;当被开方数小于0时,提示错误。

鉴于本设计的计算器的难度以及功能的要求,在本设计中决定使用语言功能丰富、表达能力强、使用方便灵活、可移植性好的C语言编写软件,这样有利于减轻工作量和代码量,提高设计效率。

若使用汇编语言编写程序,会出现汇编语言无法表达、移植困难等问题,而且对于开方和多次方的运算,汇编语言难以表达和设计,这是设计是很不利。

1.3系统总体模块图:

图1.1系统总体框图

1.4系统方案

经过反复推敲最终确定系统采用以下方案:

(1)采用AT89S52作为主控芯片;

(2)显示模块使用LCD1602液晶显示屏;

(3)输入模块使用4*4矩阵键盘;

(4)AC清零按键使用独立按键并接入单片机外部中断引脚;

(5)声音提示开关按键使用独立按键并接入单片机外部中断引脚;

(6)平方和开方按键由开发板上的独立按键实现;

(7)电源采用LM7805稳压电路。

二、硬件系统设计

2.1主控芯片AT89S52单片机

AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程DIP封装Flash存储器。

使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。

片上Flash允许程序存储器在系统可编程,亦适于常规编程器。

在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。

AT89S52具有以下标准功能:

8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。

另外,AT89S52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。

空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。

掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。

AT89S52的最大优点是可以在线编程,在调试程序的时候,可直接带电烧录程序,烧录完成即可自动复位运行,非常适合调试程序。

而且AT89S52可编程一千多次以上,的确是一种价格低廉的开发芯片。

单片机的最小系统设计:

图2.1单片机最小系统

2.2LCD1602液晶显示屏

LCD1602,工业字符型液晶,能够同时显示16x02即32个字符(16列2行),故简称1602。

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

1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:

阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。

因为1602识别的是ASCII码,试验可以用ASCII码直接赋值,在单片机编程中还可以用字符型常量或变量赋值,如'A’。

1602LCD液晶具有功耗低、显示内容丰富、清晰,显示信息量大,显示速度较快,界面友好等而得到广泛应用,因此使用1602液晶显示屏,可以方便的显示多种字符,特别适用于单片机计算器的双行显示。

液晶显示模块的设计:

图2.2液晶显示模块

 

2.3键盘接口电路

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

矩阵键盘采用四条I/O线作为行线,四条I/O线作为列线组成键盘,在行线和列线的每个交叉点上设置一个按键。

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

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

矩阵键盘的工作原理:

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

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

矩阵键盘的设计:

图2.3矩阵键盘

2.4清零、音乐开关、开方和多次方运算功能模块

本设计要求在任何时候按下AC清零键,都必须退出当前操作,数据清零,准备下一次的运算,故应采用独立键盘产生下降沿输入给单片机外部中断处理。

对于声音开关按键,由于要求随时关闭或打开声音提示,本设计也采用独立按键产生下降沿输入给单片机的外部中断处理。

而开方或多次方运算,则可与矩阵键盘一起检测,也当做一个运算符处理。

具体功能按键设计如下图

图2.4AC清零模块

图中,AC为清零按键、KeyBeep为声音开关按键、KeySqrt为开方按键、KeyPow为多次方按键。

2.5电源模块设计

由于AT89S52和LCD1602都是采用5V供电,而且其他模块功能也采用5V电平,本系统采用LM7805作为稳压芯片,经过初级和次级的电容滤波,最终得到稳定的5V电压供给系统使用,其电路如下:

图2.55V稳压电路

三、软件系统设计

3.1总体设计

本系统采用大小循环嵌套方式的软件设计思想,大循环则一直在运行,使计算器一直处于工作状态,并不断扫描按键,小循环用于识别数字是否输入完,一旦检测到输入的是运算符,则转换输入数值并储存起来,最后按下等于号以后则根据运算符计算两个数值的大小,并通过LCD显示。

软件系统总框图如下:

图3.1总程序框图

3.2子程序设计

3.2.1液晶显示程序设计

LCD1602在上电以后,应该先等待50毫秒左右,让其内部芯片初始化后再对其进行操作。

在对其操作时,应参考其时序图,先把命令写入其内部寄存器设置它的工作方式和状态。

要显示数据的时候,先设置好显示坐标,再往里面写入要显示的ASCII码,LCD则通过刷新和替换来显示新的数据。

其程序流程图如下图所示:

3.2.2矩阵键盘扫描程序设计

由于矩阵键盘采用4行4列的结构,每一行每一列各对应一个I/O口,故程序应该逐行查询,一旦查询到有某一行的按键被按下了,则根据读取到的I/O总线口的数据即可查询到是哪一列的按键被按下了,最后对应行列返回一个按键值回主函数。

其程序流程图如下:

图3.3矩阵键盘程序流程图

3.2.3AC清零程序设计

根据系统要求以及硬件结构,AC按键直接接入单片机外部中段0,则程序应使用中断来清除各数据存储变量达到清零的目的,并把清零标志位至1,在主程序中不断查询标志位,若为1,则清零后。

其程序框图如右图:

 

3.2.4声音开关子程序设计

根据要求,声音开关使用外部中断1来处理,当按下声音开关时,触发单片机进入外部中断1,在中断程序里,通过对声音开关标志位取反,在按键扫描过程中,加入对声音标志位的判断,若为1,则发出声音,即可实现声音提示功能。

其程序框图如右图:

四、系统功能测试

4.1总体实物测试

制作出来的系统实物图如下:

4.2各项功能测试

表4-2各项功能测试

加法测试:

减法测试:

乘法测试:

除法测试:

开方测试:

多次方运算测试:

错误提示测试1:

错误提示测试2:

由以上测试结果可知,计算器的各项功能正常,基本能达到设计要求。

下面将进行多次测试,以检验计算器的性能指标。

4.3多次测试

本测试由加、减、乘、除、开方、多次方运算以及连续运算、自动开始新一轮运算、错误提示测试等组成,其测试结果如下表:

表4-3多次测试数据

测试次数

第一运算数

运算符号

第二运算数

运算结果

实际结果

1

244

+

3.625

247.625002

247.625

2

4557.554

-

5445745

-5441187.44602

-5441187.446

3

102.5

*

24

2460

2460

4

67

/

7.5

8.933334

8.933333333

5

8

(无输入)

2.828427

2.28427125

6

6

^

2

36

36

7

(无输入)

+

13

49

49

8

(无输入)

(无输入)

7

7

9

69

/

0

matherror

错误

10

-16

(无输入)

matherror

错误

结果分析:

对比运算结果和实际结果可知,进行一般的整形运算计算器能准确无误计算出来,但是当进行浮点运算时候,会产生精度丢失或者是有尾数产生,这是因为8051单片机对的浮点运算功能差,而且在keil开发环境中,float型和double型浮点数的精度都是一样的,其小数点的有效数字位数都是6~7位,这就决定了本设计的计算器的浮点数精度有限,只能通过小数点补偿来减少浮点数运算误差。

另外,由连续运算、新一轮运算测试、错误提示测试的结果以及运算过程中的AC清零、声音开关设置可见,本设计的计算器的功能基本能实现。

但是,由实际操作可发现本设计存在以下不足:

(1)某些按键不够灵敏,导致需要按很多次才能输入;

(2)当运算式子超过屏幕范围时,不能通过移动屏幕来完全显示式子;

(3)当连续出现错误操作时,如连续输入减号,程序不能自动复位,会产生连续错误;

(4)没有删除输入功能,当输入出错时,只能通过清零后重新输入;

(5)没有数据溢出提示功能。

五、总结

经过多次测量与调试,本计算器基本能实现设计要求中的功能。

在设计的过程中,也遇到了不少的困难,例如在LCD上显示任意位整数,显示任意位小数,在输入小数的时候小数点的处理问题,连续运算的结果保存与清空问题等等。

最后通过不断的查阅资料,请教别人,修改程序,下载调试等过程,终于把遇到的问题逐一解决了。

虽然某些问题解决得不够完美,但是都是经过自己的思考和努力解决的,在此过程自己也学到了很多东西,例如学会了矩阵键盘的扫描技术、LCD接口技术、LCD的显示技术、中断技术等等,这些技术对熟练单片机的使用以及单片机项目开发是非常有帮助的。

在设计的过程中的思考解决问题的思路和方法对以后的工作和生活都是非常有帮助的。

六、结束语

首先,感谢学校和老师安排这一次的单片机课程设计,在大学期间,做这类的课程设计是非常有必要的,特别是对我们大三的学生,有利于我们将理论与实践联系起来。

在两周的课程设计时间里,经过努力拼搏,查阅了很多资料和文献,终于完成了基于单片机的计算器的设计。

在设计的过程中,不仅巩固了以前学过的理论知识,而且还学会了很多书本上没有的知识,最重要的是把理论和实际结合起来,提高了自己的动手和独立思考的能力。

在本设计中,由于时间和能力有限,难免会有不足的地方还望老师批评指正,以便在以后的设计中改正。

这次课程设计得以顺利完成,少不了老师的指导和周围同学的指教,在此表示深切的感谢!

 

参考文献

[1]吴宁.80X86/Pentium微型计算机原理及应用[M].北京:

电子工业出版社,2004:

1-249.

[2]蔡美琴.MCS-51系列单片机系统及其应用[M].北京:

高等教育出版社,2003:

1-169.

[3]肖金球.单片机原理与接口技术[M].北京:

清华大学出版社,2004:

1-323

[4]郭天祥.新概念51单片机C语言教程:

入门、提高、开发、拓展全攻略.北京:

电子工业出版社,2009P22

[5]谭浩强.从语言程序设计(第三版).北京:

清华大学出版社,2005:

1-378.

附录

附1:

计算器原理图

附2:

主程序清单

#include

#include

#include"lcd1602_8.h"

uinttemp,num;//键盘扫描数值

ucharkeynum1=0,keynum2=0,sign=0,i=0,j=0;//按键计数,符号标示

ucharnum1[8]={0},num2[8]={0};//按键存储数组

floatans1=0,ans2=0,ans=0,point=0;//运算数据

bitconflag=0;//继续运算标志位

bitnewcalc=0;//新运算标志

bitac=0;//清零标志,1为清零

bitbeepflag=0;//蜂鸣器标志位

bitsqrtflag1=0;//开方1标志位

bitsqrtflag2=0;//开方2标志位

sbitkeybeep=P3^3;//蜂鸣器开关按键

sbitbeep=P2^7;//蜂鸣器控制口

sbitkeysqrt=P3^4;//开方按键

sbitkeypow=P3^5;//任意次方按键

ucharkeyscan();

voidmaininit(void);

/****主程序***/

voidmain(void)

{

maininit();//初始化

while

(1)//整个系统大循环,让计算器一直处于工作状态

{

while

(1)//第一运算数扫描

{

if(ac==1)

break;//若清零,则退出输入

if((keyscan()!

='N')&&((num>=0&&num<=9)||num=='.'))//记录按下的数字

{

if(newcalc==1)//新一次运算开始

{

lcdwrite_com(0x01);//清屏

newcalc=0;

lcd_setxy(0,0);

}

if(keynum1<=7)//限制输入位数

{

if(num=='.')

{

lcdwrite_data('.');//显示小数点

}

else

lcdwrite_num1(num);

num1[keynum1]=num;

keynum1++;

}

}

elseif(num=='+'||num=='-'||num=='*'||num=='/'||num=='='||num=='^'||keysqrt==0)

{

if(keynum1==0&&num1[0]==0)//若直接输入运算符而没有输入数字则执行连续运算

{

here:

ans1=ans;

sign=num;

lcdwrite_com(0x01);

delayms(5);

lcd_setxy(0,0);

lcdwrite_float(ans1);

if(sqrtflag2!

=1&&num!

='N')

lcdwrite_data(num);

break;

}

for(i=0;keynum1>0;i++)//计算按下的数字的大小

{

if(num1[i]!

='.')

ans1=ans1*10+num1[i];

elseif(num1[i]=='.')

break;

keynum1--;

}

for(keynum1--,i++,j=0;keynum1>0;j++,i++,keynum1--)

point=point*10+num1[i];

for(;j>0;j--)

point*=0.1;

ans1=ans1+point;

sqrtflag1=0;//清除开方标志

sqrtflag2=0;//清除开方标志

if(keysqrt==0)//计算开方

{

delayms(5);

if(keysqrt==0)

{

if(beepflag==1)//若开声音则每一次按键均鸣叫

{

beep=0;

delayms(100);

beep=1;

}

ans=sqrt(ans1);

sqrtflag1=1;

lcdwrite_data(0xe8);

while(keysqrt==0);

delayms(10);

while(keysqrt==0);

break;

}

}

sign=num;//记住运算符号

lcdwrite_data(num);

break;//输入运算符号则退出第一运算数的输入

}

}

while

(1)

{

if(ac==1)

break;//若清零,则退出输入

if(sqrtflag1==1)//若第一次按键为开方,则直接显示结果

{

break;

}

if((keyscan()!

='N')&&((num>=0&&num<=9)||num=='.'))//记录按下的数字

{

if(keynum2<=7)

{

if(num=='.')

{

lcdwrite_data('.');//显示小数点

}

else

lcdwrite_num1(num);

num2[keynum2]=num;

keynum2++;

}

}

elseif(num=='='||keysqrt==0)

{

sqrtflag2=0;//清除开方标志

if(keysqrt==0)//进入开方

{

delayms(5);

if(keysqrt==0

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

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2