基于proteus的AT89C51单片机实现计算器的加减乘数开方等功能文档格式.docx
- 文档编号:13799196
- 上传时间:2022-10-13
- 格式:DOCX
- 页数:31
- 大小:217.22KB
基于proteus的AT89C51单片机实现计算器的加减乘数开方等功能文档格式.docx
《基于proteus的AT89C51单片机实现计算器的加减乘数开方等功能文档格式.docx》由会员分享,可在线阅读,更多相关《基于proteus的AT89C51单片机实现计算器的加减乘数开方等功能文档格式.docx(31页珍藏版)》请在冰豆网上搜索。
一、任务说明
本设计是一个实现加、减、乘、除的计算器,它的硬件主要由四部分组成,一个AT89C51单片机芯片,一个八位共阳极的数码管,一个四乘四的键盘,一个排阻做P0口的上拉电阻,它可以实现结果低于65535的加、减、乘、除运算。
采用动态显示,由八位共阳极数码管通过P0口,P2口与单片机相连,数码管的A,B,C,D,E,F,G,DP分别依次与单片机的P0.0—P0.7相连,P0口做为字码控制端,数码管的1,2,3,4,5,6,7,8各引脚分别与单片机的P2.0—P2.7相连,P2口做为数码管的位控制端,动态显示是每次数码管只显示一位,由于人的视觉停留是0.05到0.2秒之间,当数码管依次点亮各个位时,使循环的频率高于人的视觉停留时间,人们就会认为数码管是同时点亮的,就可以达到动态显示的效果。
采用4*4键盘。
采用软件识别键值并执行相应的操作,键盘的第0行到第3行依次与单片机的P3.4—P3.7管脚相连,键盘的第0列到第3列依次与单片机的P1.0—P1.3管脚相连,程序运行时依次扫描各行,查询是否有键按下,如果有则进入键盘识别处理程序,实现相应的运算,然后通过数码管输出结果,如果没有按键就调用显示程序显示一个0,等待按键按下,在进入按键扫描程序。
这样循环执行。
基本功能如下:
1.计算器可显示8位数字,开机运行时,只有数码管最低位显示为“0”,其余位全部不显示;
2.第一次按下时,显示“D1”;
第二次按下时,显示“D1D2”;
第三次按下时,显示“D1D2D3”,8个全显示完毕,再按下按键下时,给出“嘀”提示音,并且输入的第九个数不接收,仍然显示原来的八位数;
3.可以对计算结果小于65535的两个无符号数进行+、-、*、/运算,并显示计算结果,如果输入的预计算的数超过65535,则运算时报错,显示“ERROR”,如果结果超过65535仍然报错,显示“ERROR”,以提示使用者输入错误,应清零后在从新输入。
4.运算时,如果输入错了可按清零键清零,重新输入数据,运算过程中,如果运算的表达式是加、减、乘、除混合运算,可以连续运算,不需按等号键,运算规则是从左到右,不区分运算等级,即+、-、*、/认为是同级别的运算。
二、原理图绘制说明
首先得设计一个显示程序,这个显示程序应是动态显示,思路有两个:
(1)让P2口做位扫描,P0口做段码输出,在调用显示程序时,P2口循环选通数码管每一位的,P0口也依次循环输出相对应位的代码。
如何控制数字显示呢?
可先将0-9、熄灭,11个段码放入列表中,在设置八个显示缓冲区,数码管要显示的数字就存放在这八个单元中,通过控制八个缓冲区的内容来控制输出的数字。
如:
要显示的是1234则将缓冲区从低位开始依次放入04H、03H、02H、01H剩余四位放入11H(代表数码管熄灭的代码),要注意的是,当调用显示程序时,通过程序根据八个数码管缓冲区的数字调用相对应的代码就可以循环输出,但是我们看到的是同时显示1234,因为视觉停留的原故。
当它的循环频率大于人的视觉停留时间,人们就认为它是同时显示的。
虽然八个数码管都输出了,但是高四位送的代码是熄灭,即不显示,当不输入数字时使八个缓冲区初始化为,第一位放00H,其余放11H,就可以只显示0,等待输入数据,这样就控制了显示位数实现了动态显示。
(2)让P2口做位扫描,P0口做段码输出,设置一个单元用来记录输入数字的位数,这样可以不用循环扫描每一位,而是根据输出位数判断扫描哪些位。
如上面的例子,当显示1234时,不用在向高四位送入11H,也不需要熄灭的代码了。
调用显示程序时先选通第一位(最低位),送出代码1,然后判断是否显示完毕,(通过记录数字个数单元的内容减一是否得0来判断),如没显示完则显示下一位,如显示完则跳出。
在本设计中选用后者。
其次是设计键盘扫描程序,这里采用4*4矩阵键盘,通过软件识别,行和列可接在同个端口上,也可接在不同端口上,本设计行接在P3口的高四位,列接在P1口的低四位,通过循环扫描行,读取列的数据判断是否有键按下,如果有则调用按键识别程序识别是哪个键,执行相应的操作,按键识别是根据按键时得到的列代码与行代码组合,来判断是哪个键的。
按键识别后,如果是数字键则直接放入数码管显示缓冲区,如果再次有数字键按下,则应将缓存区的数字向高位移一位,将刚输入的数放入最低位,并且记录按键次数,每输入一个键值都调用显示程序显示出来,如果是运算符,则执行相应的运算,然后在调用显示程序显示结果。
最后是运算程序的加入,运算程序很简单,只要把+、-、*、/分别做成模块,用到时即可调用,本设计的难点是键盘识别和数值显示,因为这里边涉及到键盘输入的数值在内部要转换成10进制运算,运算结果要转换成各个位的显示数字输出。
在硬件的选择和连接上,单片机选择AT89C51,数码管选择共阳机八位数码管,键盘4*4矩阵键盘,P0口接上拉电阻,数码管的A,B,C,D,E,F,G,DP分别依次与单片机的P0.0—P0.7管脚相连,P0口做为单片机的字码控制端,数码管的1,2,3,4,5,6,7,8各引脚分别与单片机的P2.0—P2.7管脚相连,键盘的第0行到第3行依次与单片机的P3.4—P3.7,键盘的第0列到第3列依次与单片机的P1.0—P1.3,AT89C51接12MHZ晶振。
P3.0接风鸣器。
计算器原理图如图1所示:
图1计算器原理图
三、流程图绘制及说明
1、显示程序设计
显示程序流程图如图2所示。
考虑到显示程应具有通用性,在不进行输入时显示0,输入时显示输入的数字或运算结果,而且要使8个数码管同时显示不同的数字,选用动态显示应是最佳的。
将30H-37H单元设置成数码管显示缓冲区,分别存放数码管各个位要显示的数据,40H单元作为输入数据的计数单元。
因为运算结果超出范围时应报错,使数码管显示“ERROR”即可,将数码管的0-9的代码和“ERROR”代码存于LABLE1列表中。
当调用显示程序时,显示程序根据40H单元的记录的个数决定数码管显示的位数。
如果输入错误将在数码管上显示“ERROR”。
这样就得到了显示程序的入口:
30H-37H,依次存放个位-千万位。
40H,存放输出的数字位数。
出口:
数码管,P0输出字段码P2输出位选码。
图2数码管显示流程图
2、键盘识别程序设计
键盘识别程序流程图如图3所示。
首先将P3口送0EOH,将P1口先送1在读P1口的数据当P1口低四位全一时说明没有键按下,在扫描下一行,如果P1口不全一,则有键按下,将P3口高四位与P1口低四位组合成一个字节,放入R5寄存器中,按键去抖,判键是否松开,如松开则将得到的键值判别是哪个键,如果是数字键则首先将其对应的数字(按键代码对应如下表)放入缓冲区30H,同时将将键值放入结果缓冲区,并调用显示程序,显示键值,在调用扫描键盘程序,如果在有键值输入则将原来的数值在数码管显示缓冲区向高位依次移一位,将刚键入的数值放入最低位,并将原来的数值乘十加上刚键入的数放人结果缓冲区,然后调用显示程序,如果是运算符,则记录运算符标志,加法用01H表示,减法用02H表示,乘法用03H表示,除法用04H表示,并将结果缓冲区的数转移到中间结果缓冲区,将结果缓冲区清零,等待输入运算数据,当按等号时,根据记录的运算符标志,判断是那种运算,执行运算将结果依次除10取余数放入结果显示缓冲区,调用显示程序。
依次循环执行。
键码
键值
EE
7
BE
1
ED
8
BD
2
EB
9
BB
3
E7
/
B7
-
DE
4
7E
CL
DD
5
7D
0
DB
6
7B
=
D7
*
77
+
图3键盘扫描流程图
3、运算程序设计
运算程序流程图如图4所示。
运算程序分四个模块,即加减乘除。
分别采用两字节运算,因此运算结果不能超出两字节,否则会溢出。
溢出时显示ERROR。
加法程序:
入口:
R0被加数低位字节地址指针,R1加数低位字节地址指针,R3字节数。
出口:
R0和值地位字节地址指针,R3和值字节数。
运算时用R0,R1间接寻址,从低字节算起,高字节采用带进位加(ADDC),计算结果回送到R0所指的单元中,并将和字节数放入R3单元中,如果R3大于等于3说明溢出。
减法同加法类似,入口:
R0被减数低位字节地址指针,R1减数低位字节地址指针,R3字节数。
只是判断溢出是通过CY位,如果运算后CY位有借位,则将07H位置1,否则置0。
乘法程序:
R3,被乘数低位地址字节,R2,被乘数高位地址字节,R7,乘数低位地址字节,R6,乘数高位地址字节。
R4,R5,R6,R7结果字节由高到低。
通过判断R5是否为零就可以知道运算结果是否溢出,如果溢出调用溢出程序。
除法程序:
被除数放在R4R5R6R7,R4R5,内容为零,R4高R5低,除数放在R2R3,R2高R3低。
商放在R6R7,R6高R7低,余数放在R4R5,R4高R5低。
N
Y
图4运算程序流程图
3.4风鸣器程序设计
这个程序是实现当输入八个数字时,如果在输入数字它便鸣叫,提示使用者输入以满,不允许在键入值,只需在键盘程序中,加入判别输入是否超过八个如果超过则调用风鸣器程序,使P3.0由低电平转入高电平,延迟1ms返回。
四、proteus仿真说明
1.开机显示:
运行显示0,等待键入数值。
如图5所示。
图5开机显示界面
2.加法运算:
键入被加数1000,显示1000。
如图6所示。
图6键入加数1000显示
键入“+”显示原来键入的数值,等待键入加数。
如图7所示。
图7键入+号显示界面
键入加数5000,显示5000。
如图8所示。
图8键入加数5000显示界面
键入“=”显示结果,6000。
如图9所示。
图9键入=号显示界面
3.减法运算:
键入清零键“CL”。
如图10所示。
图10清零显示界面
键入被减数4000,显示4000。
如图11所示。
图11键入被减数4000界面
键入“-”显示上次键入的值,等待键入减数。
如图12所示。
图12键入-号显示界面
键入减数2000,显示录2000。
如图13所示。
图13键入减数显示界面
键入等号“=”显示结果2000。
如图14所示。
图14键入=号显示界面
4.乘法运算:
清零后键入被乘数5000,显示5000。
如图15所示
图15键入被乘数5000显示界面
键入乘号“*”,显示上一次键入的数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 proteus AT89C51 单片机 实现 计算器 加减 乘数 开方 功能