用8051+1601LCD设计的整型计算器.docx
- 文档编号:5195030
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:24
- 大小:293.01KB
用8051+1601LCD设计的整型计算器.docx
《用8051+1601LCD设计的整型计算器.docx》由会员分享,可在线阅读,更多相关《用8051+1601LCD设计的整型计算器.docx(24页珍藏版)》请在冰豆网上搜索。
用8051+1601LCD设计的整型计算器
浙江海洋学院
设计题目 用8051+1601LCD设计的整型计算器
摘要
当今时代,是一个新技术层出不穷的年代。
单片机具有体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。
单片机由运算器、控制器、存储器、输入输出设备构成,相当于一个微型的计算机(最小系统),和计算机相比,单片机缺少了外围设备等。
概括的讲:
一块芯片就成了一台计算机。
单片微型计算机简称单片机,是典型的嵌入式微控制器,常用英文字母的缩写MCU表示单片机,单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。
它所给人带来的方便不可否认,本设计是由单片机实现的模拟计算器它不仅能实现数据的加减乘除运算而且还能使数据及其计算结果在LCD管上显示出来能够实现0-256的数字四则运算。
本设计是用单片机AT89C52来控制采用共阳极数码显示软件部分是由C语言来编写的。
为了满足计算器的基本要求,可以基本的运算(加减乘除),数据归零和出错警告提示,我们采用基于单片机设计计算器,并用LCD液晶显示数据,4*4的矩阵键盘实现数据输入,程序语言我们使用c语言。
设计任务:
利用键盘和数码管设计一个简单的数学计算器可以完成简单的如加减乘除的四则运算并将运算结果在数码管上显示出来。
关键词:
加减乘除运算;单片机AT89C52;LCD液晶显示;4*4的矩阵键盘实现数据输入
1.引言...............................................................................................................5
2.方案论证与设计........................................................................................5
2.1 要求与内容....................................................................................5
2.2设计方案..........................................................................................5
3.硬件设计.....................................................................................................6
3.1 单片机最小系统.............................................................................6
3.2LCD显示模块...................................................................................7
3.3 输入模块...........................................................................................8
4.软件设计....................................................................................................9
4.1输入程序流程图设计....................................................................9
5.实验结果与讨论.....................................................................................11
5.1 仿真实验...........................................................................................11
5.2 结果讨论...........................................................................................14
6.心得体会.......................................................................................................14
7.附录A;源程序..........................................................................................14
8.参考文献.......................................................................................................19
用8051+1601LCD设计的整型计算器
引 言
不同于通用计算机应用程序设计,单片机C语言程序设计必须针对具体的微控制器及外围电路来进行。
现代的电子计算器能进行数学运算的手持电子机器,拥有集成电路芯片,但结构简单,比电脑结构简单得多,可以说是第一代的电子计算机(电脑),且功能也较弱,但较为方便与廉价,可广泛运用于商业交易中,是必备的办公用品之一。
随着社会需求,计算器也从原有的单一的数字加减计算演变为复杂的多种运算。
计算器为人们的日常生活省去了大量的时间和精力,成为现代社会最普遍的计算工具。
老师交给我们这个课题,我觉得非常有实践价值。
作为学习电气专业的大学生,就应该更贴近生活,做一些有学习价值的小东西。
这么做可以通过自己的实践,更好的把实践和理论相结合,全方面提高自己的专业文化水平。
本课程设计主要在运算过程中,如果通过计算器来完成,就会减少计算量,该程序可以在简单计算器键面下进行简单运算。
方案设计
设计要求
用单片机AT89C51来控制采用共阳极数码显示软件部分是由C语言来编写的。
为了满足计算器的基本要求,可以基本的运算(加减乘除),数据归零和出错警告提示,我们采用基于单片机设计计算器,并用LCD液晶显示数据,4*4 的矩阵键盘实现数据输入,程序语言我们使用c语言。
设计方案
2.1.1 单片机芯片的选择
根据功能和指标要求,本系统选用MCS-51系列单片机AT89C51为主控机。
通过扩展必要的外围接口电路,实现对计算器的设计。
计算器电路包括三个部分:
显示电路、4*4键扫描电路、单片机微控制电路。
用七段数码管作为显示电路,矩阵键盘作为输入电路。
模块图如下1.1。
图1.1
1.硬件设计
单片机最小系统
单片机最小系统选用AT89C52提供以下标准功能:
8字节FLASH闪速存储器,256字竹内部RAM,32个I/O口线,3个16位定时/计数器,一个6向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。
同时,AT89c52可降至OHz的静态逻辑操作,并支持两种软件可选的节电上作模式。
空闲方式停止CPU的工作,但允许RAM,定时/计数器.串行通信口及中断系统继续工作。
掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位.如图3.1
图3.1
3.2.LCD显示模块
1601采用标准的14脚接口,其管脚功能介绍如下:
1:
VSS为电源地
2:
VDD接5V电源正极
3:
VEE为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高。
4:
RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
5:
RW为读写信号线,高电平
(1)时进行读操作,低电平(0)时进行写操作。
6:
E(或EN)端为使能(enable)端。
7~14:
D0~D7为8位双向数据。
具体看图3.2
图3.2
1.1.输入模块
计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用大量的I/O口资源,因此在很多情况下都不采用这种方式。
为此,引入了矩阵键盘的应用,采用四条I/O线作为行线,四条I/O线作为列线组成键盘。
在行线和列线的每个交叉点上设置一个按键。
这样键盘上按键的个数就为4×4个。
这种行列式键盘结构能有效地提高单片机系统中I/O 口的利用率
图3.3
软件设计
4.1输入程序流程图设计
该计算器系统的软件设计分为以下几个模块:
(1)主程序模块,
(2)读键输入程序流程图,(3)显示程序 (4)计算程序。
(1)运算主程序设计
首先初始化参数,送LED低位显示“0”,高位不显示。
然后扫描键盘看是否有键输入,若有,读取键码。
判断键码是数字键、清零键还是功能键(“+”“-”“*”“/”“=”),是数值键则送LED显示并保存数值,是清零键则做清零处理,是功能键则又判断是“=”还是运算键,若是“=”则计算最后结果并送LED显示,若是运算键则保存相对运算程序的首地址。
运算主程序框图如图4.1(具体程序看附件:
源程序)
图4.1
(2)读键输入程序流程图
为了实现键盘的数据输入功能和命令处理功能,每个键都有其处理子程序,为此每个键都对应一个码——键码。
为了得到被按键的键码,现使用行扫描法识别按键。
列扫描信号进行读入行的信号判断该列是否有列的输出——是则进行按照行列计算键盘的值,查表取得键码并返回——若否则进行再次扫描。
其程序框图4.2如下:
图4.2
(3)显示程序
本电路采用的是LCD 液晶显示输出数据,在流程图中应包括对LCD液晶显示器初始化,取要显示的数据,要是有两位数据需要显示,则在显示完第一位数据后需要进行延迟来显示第二位数据,则根据以上要求,显示模块的流程图如图4.3(具体程序看附件:
源程序)
图4.3
总程序框图如图4.4
图4.4
实验结果与讨论
实验仿真
依据各功能模块的功能要求和工作过程画出程序的流程图,然后根据流程图和系统的硬件连接写出详细的程序,接着对各个子程序进行编译,调试,运行,看看是否能达到其功能,然后再将整个程序糅合在一起进行整体软件调试。
在整体调试中,需注意寄存器组不能重复,在进入中断时,哪些寄存器内容和参数需入栈保护,以及调用子程序时各参数必须统一,在编译通过时,最好能把整个程序再单步执行一遍。
单步执行时看看每步执行完后数据各个特殊功能寄存器中数据的变化,这样才能确保整个程序按照系统的工作过程和功能要求执行。
仿真结果如图5.1所示。
图5.1
图5.2为1+1=2的调试结果;图5.3为2—1=1的调试结果;图5.4为2*2=4的调试结果;图5.5为6/2=3的调试结果。
图5.2
图5.3
图5.4
图5.5
结果讨论
本设计以AT89C52单片机为系统的控制核心,采用proteus仿真软件进行测试。
Proteus是一款比较常用的单片机仿真软件,用proteus和keil配合进行仿真提高系统运行效率与稳定性。
设计出的计算器能准确计算整数的四则运算,但计算能力有限,不能计算小数,计算范围也小。
心得体会
一拿到老师给的课题设计,我们毫无头绪,不知道从哪里开始入手。
但是通过网上的查询和老师的耐心教导,逐渐了解的这个单片机设计。
课程设计中所涉及的知识点比较多,程序编写比较困难,花了大量的时间。
但通过小组成员的共同努力,成功的实现了该课题的制作,从中也受益匪浅,体会到了程序编写的基本流程和规范问题,要有一个好的编程习惯。
通过这次实训的设计以及亲手去操作,从中认识到想到的东西需要有课本的知识作为基础才能看懂。
通过这次的课题设计,我最大的体会是进一步认识到了理论联系实践的重要性,理论和实践缺一不可。
想要更好的完成一个课题,还要具科学的思维方法和学习方法。
感谢老师给我们这么好的一次机会,为我们以后去社会奠定了一个好的基础。
学会了如何面对挑战和迎接挑战,不能对知识一知半解,要有求实的能力。
我相信我以后一定会做的更好。
2.附录A;源程序
//-----------------Main.c--------------
//名称:
用8051与1601LCD设计的整数计算器
//---------------------------------------
#include<reg51.h>
#include<ctype.h>
#include"calc.h"
static datalonglvalue;static datalongrvalue;
static datachar currtoken;
staticdatacharlasttoken;
staticdatacharlastpress;
staticxdatacharoutputbuffer[MAX_DISPLAY_CHAR];
//输出缓冲//----------------------------------------------
//主程序 //-------------
voidmain(){
//变量初始化 lvalue=0;
rvalue=0;
currtoken='=';
lasttoken='=';
//初始化LCDinitialise();
calc_putput(OK); calc_evaluate(); }
//-----------------------------------------
//获取按键值并进行计算处理
//-----------------------------------------
voidcalc_evaluate()
{chardatakey;
int data i;
char xdatanumber[MAX_DISPLAY_CHAR];
charxdata *bufferptr;
//清除缓冲for(i=0;
i<=MAX_DISPLAY_CHAR;
i++) number[i]=' ';
bufferptr=number;
while
(1) {
key=calc_getkey();
if(calc_testkey(key))
{ if(bufferptr!
=&number[MAX_DISPLAY_CHAR-2])
{ *bufferptr=key;
calc_display(number);
bufferptr++; }}
else {if(lasttoken=='0')
lvalue=calc_asciidec(number);
else rvalue=calc_asciidec(number);
//清除数字蝗虫 bufferptr=number;
for(i=0;i<=MAX_DISPLAY_CHAR;
i++)
number[i]='';
//处理操作符currtoken=key;
if(currtoken=='C')
calc_opfunctions(currtoken);
elsecalc_opfunctions(lasetoken);
//清除输出缓冲
for(i=0;
i<=MAX_DISPLAY_CHAR;i++)
outpufbuffer[i]=' ';
bufferptr=number;
if(currtoken!
0x3d)
lasttoken=currtoken; }
lastpress=key;}}
//-------------------------------------------
// 根据运算符按键进行运算处理
//--------------------------------------------
voidcalc_opfunctions (char token)
{ chardata result;
switch(token)
{ case '+':
if(currtoken=='='||isdigit(lastpress))
{ lvalue+=rvalue;
result=calc_chkerror(lvalue); }
else result=SLEEP;
break;
case '-':
if(currtoken=='='||isdigit(lastpress))
{ lvalue-=rvalue;
result=calc_chkerror(lvalue); }
elseresult=SLEEP;
break;
case'*':
if(currtoken=='='||isdigit(lastpress))
{ lvalue*=rvalue;result=calc_chkerror(lvalue);
}else result=SLEEP;
break; case'/':
if(currtoken=='='||isdigit(lastpress))
{lvalue/=rvalue;
result=calc_chkerror(lvalue);
}
else result=SLEEP;
break;
//取消 case'C':
lvalue=0;
rvalue=0;
currtoken='0';
lasttoken='0';
result=OK;
break;
default:
result=SLEEP;
}
calc_output(result);}
//--------------------------------------------------------
//检查待显示数据的上界和下界//
例如,99999999and -99999999
//--------------------------------------------------------
nt calc_chkerror(longnum)
{
if(num>=-99999999&&num<=99999999)
returnOK;
else returnERROR;
}
//-----------------------------------------------------------
//根据操作状态输出
//-----------------------------------------------------------
{switch(status)
{ caseOK:
calc_deaplay(calc_decascii(lvalue));
break;
caseSLEEP:
break;
case ERROR:
calc_display("Exception");
break;
default:
calc_display("Exception")break;
}
}
//----------------------------------------------------
//将ASCII字符串转换为浮点数
//----------------------------------------------------
long calc_asciidec (char*buffer)
{longdata value;
longdatadigit;
value=0;
while(*buffer!
='')
{ digit=*buffer-'0';
value=value*10+digit;
buffer++ } returnvalue;
}
//----------------------------------------------------
//将浮点数转换为ASCII字符串
//----------------------------------------------------
char*calc_decascii(longnum)
{longdatatemp=num;
char xdata*avvayptr=&outputbuffer[MAX_DISPLAY_CHAR];
longdatadivisor=10;
long dataresult;
chardataremainder,asciival;
int datai;
//如果计算结果为0。
则在缓冲中插入0并结束
if(!
temp)
{*arrayptr='0';
gotodone;
}
if(temp<0)
//处理负数
{outputbuffer[0]='-';
temp-=2*temp;
}for(i=0;
i<sizeof(outputbuffer);
i++)
{ remainber=temp%divisor;
result=temp/divisor;
if((!
remainder)&&(!
result))
*arrayptr='';
else
{ asciival=remainder+'0';
*arrayptr=asciival;
} temp/=10;
//为“—”号保留位置
if(arrayptr!
=&outputbuffer[1])
arrayptr--;
}
done:
returnoutputbuffer;}
//------------------------------------------------
//测试按键时数字还是操作符,
如果是数字则返回1.是操作符时返回0
//------------------------------------------------
charcalc_testkey (charkey)
{ if(isdigit(key))return1;
else teturn0;}
//------------------------------------------------
//调用input例程搜索按键,并返回按键的ASCII码值//------------------------------------------------
charcalc_getkey()
{
chardata mykey;
do{ mykey=input();
}
while(mykey==0);
returnmykey;}
//--------------------------------------------
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 8051 1601 LCD 设计 整型 计算器