基于51单片机的简易计算器设计报告Word文档下载推荐.docx
- 文档编号:18193406
- 上传时间:2022-12-14
- 格式:DOCX
- 页数:35
- 大小:2.21MB
基于51单片机的简易计算器设计报告Word文档下载推荐.docx
《基于51单片机的简易计算器设计报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于51单片机的简易计算器设计报告Word文档下载推荐.docx(35页珍藏版)》请在冰豆网上搜索。
(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
4
67
/
7.5
8.933334
8.933333333
5
8
√
(无输入)
2.828427
2.28427125
6
^
36
7
13
49
9
69
matherror
错误
10
-16
结果分析:
对比运算结果和实际结果可知,进行一般的整形运算计算器能准确无误计算出来,但是当进行浮点运算时候,会产生精度丢失或者是有尾数产生,这是因为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<
reg52.h>
math.h>
#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=='
-'
*'
/'
^'
||keysqrt==0)
if(keynum1==0&
num1[0]==0)//若直接输入运算符而没有输入数字则执行连续运算
{
here:
ans1=ans;
sign=num;
delayms(5);
lcdwrite_float(ans1);
if(sqrtflag2!
=1&
num!
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;
j++,i++,keynum1--)
point=point*10+num1[i];
for(;
j>
j--)
point*=0.1;
ans1=ans1+point;
sqrtflag1=0;
//清除开方标志
sqrtflag2=0;
//清除开方标志
if(keysqrt==0)//计算开方
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);
break;
}
sign=num;
//记住运算符号
lcdwrite_data(num);
//输入运算符号则退出第一运算数的输入
}
}
while
(1)
if(sqrtflag1==1)//若第一次按键为开方,则直接显示结果
if(keynum2<
=7)
{
num2[keynum2]=num;
keynum2++;
||keysqrt==0)
if(keysqrt==0)//进入开方
if(keysqrt==0)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 51 单片机 简易 计算器 设计 报告