51开发板开发计算器程序

举报
炒香菇的书呆子 发表于 2022/01/06 22:47:33 2022/01/06
【摘要】 用4*4键盘做一个模拟计算器,实现最高四位的加,减,乘,除功能,按键识别和显示部分我都会,按键后将运算符前后的数据区分开

A51单片机开发计算器

日期::date:2022年1月6日

学习内容:::book:

  • 51单片机开发计算器验收

  • 华为云沙箱实验

  • markdown语法学习

###1. A51单片机开发计算器

1.1 计算器概述

1、加数和被加数的输入位数固定为4位;
2、相加结果显示要考虑进位的输出显示(即5位输出);
3、注意对“0”——“9”、“+”、“=”以外按键输入的处理;
4、注意对相加结果进行十进制处理;
5、输入加数和被加数时,显示器上显示的数字要像平时用的计算器输入一样,即:每输入一个数字,原来显示的数字要往左移。
6、可以完成累加功能,即可以完成如下内容:3265+3885+1254+2358+7779+……

1.2 设计任务

如图所示,用AT89S51的并行口P1接4×4矩阵键盘,P1.0-P1.3作输入线,以P1.4-P1.7作输出线;在数码管上显示每个按键的“0-F”序号。对应的按键的序号排列如图所示

img

(1. 开机时,显示“0”

(2. 第一次按下时,显示“D1”;第二次按下时,显示“D1D2”;第三按下时,显示“D1D2D3”,8个全显示完毕,再按下按键下时,给出“嘀”提示音。

(3. 数字0-9点阵显示代码的形成

**1.3 **系统主要功能

用4*4键盘做一个模拟计算器,实现最高四位的加,减,乘,除功能,按键识别和显示部分我都会,就是按键后怎样将运算符前后的数据区分开

1.输入一位就显示一位,在输入一个运算符之前最多只能输入四位。

2.将运算符前,后的数据区分开来,同时将运算符前后输入的数据转换为一个10进制数。

3.对输入的数据进行处理,即进行算术运算,最重要的是对于除法时,如果有小数位时,显示部分应该做处理。

2. 计算器硬件设计

硬件系统是指构成微机系统的实体和装置,通常由运算器、控制器、存储器、输入接口电路和输入设备、输出接口电路和输出设备等组成。单片机实质上是一个硬件的芯片,在实际应用中,通常很难直接和被控对象进行电气连接,必须外加各种扩展接口电路、外部设备、被控对象等硬件和软件,才能构成一个单片机应用系统。

2.1 4×4矩阵式键盘识别技术

系统的硬件构成及功能

硬件电路原理图

img

2.2 系统板上硬件连线

(1. 把“单片机系统“区域中的P3.0-P3.7端口用8芯排线连接到“4X4行列式键盘”区域中的C1-C4 R1-R4端口上;

(2. 把“单片机系统”区域中的P0.0/AD0-P0.7/AD7端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个a-h端口上;要求:P0.0/AD0对应着a,P0.1/AD1对应着b,……,P0.7/AD7对应着h。

2.3 程序设计内容

(1. 4×4矩阵键盘识别处理

(2. 每个按键有它的行值和列值 ,行值和列值的组合就是识别这个按键的编码。矩阵的行线和列线分别通过两并行接口和CPU通信。每个按键的状态同样需变成数字量“0”和“1”,开关的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么;还要消除按键在闭合或断开时的抖动。两个并行口中,一个输出扫描码,使按键逐行动态接地,另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。

2.4 程序框图

P3=FFH, P3.0=0

有键按下吗?

延时10ms

真得有键按下吗?

根据当前状态识别按键

P3=FFH, P3.1=0

有键按下吗?

延时10ms

真得有键按下吗?

根据当前状态识别按键

P3=FFH, P3.2=0

有键按下吗?

延时10ms

真得有键按下吗?

根据当前状态识别按键

P3=FFH, P3.3=0

有键按下吗?

延时10ms

真得有键按下吗?

根据当前状态识别按键

img

2.4点阵式LED“0-9”数字显示技术

电路原理图

img

2.5硬件系统连线

(1). 把“单片机系统”区域中的P1端口用8芯排芯连接到“点阵模块”区域中的“DR1-DR8”端口上;

(2). 把“单片机系统”区域中的P3端口用8芯排芯连接到“点阵模块”区域中的“DC1-DC8”端口上;

3.程序设计内容

(1). 数字0-9点阵显示代码的形成

如下图所示,假设显示数字“0”

1 2 3 4 5  6 7 8

00 00  3E  41  41  41  3E 00

因此,形成的列代码为

00H,00H,3EH,41H,41H,3EH,00H,00H;

只要把这些代码分别送到相应的列线上面,即可实现“0”的数字显示。

送显示代码过程如下所示

送第一列线代码到P3端口,同时置第一行线为“0”,其它行线为“1”,延时2ms左右,送第二列线代码到P3端口,同时置第二行线为“0”,其它行线为“1”,延时2ms左右,如此下去,直到送完最后一列代码,又从头开始送。

数字“1”代码建立如下图所示

1 2 3 4 5  6 7 8

其显示代码为

00H,00H,00H,00H,21H,7FH,01H,00H

数字“2”代码建立如下图所示

1 2 3  4 5  6  7  8

00H,00H,27H,45H,45H,45H,39H,00H

数字“3”代码建立如下图所示

1 2 3  4 5  6  7  8
00H,00H,22H,49H,49H,49H,36H,00H

数字“4”代码建立如下图所示

1 2 3  4 5  6  7  8

00H,00H,0CH,14H,24H,7FH,04H,00H

数字“5”代码建立如下图所示

1 2 3  4 5  6  7  8
00H,00H,72H,51H,51H,51H,4EH,00H

数字“6”代码建立如下图所示

1 2 3  4 5  6  7  8
00H,00H,3EH,49H,49H,49H,26H,00H

数字“7”代码建立如下图所示

1 2 3  4 5  6  7  8
00H,00H,40H,40H,40H,4FH,70H,00H

数字“8”代码建立如下图所示

1 2 3  4 5  6  7  8
00H,00H,36H,49H,49H,49H,36H,00H

数字“9”代码建立如下图所示

1 2 3  4 5  6  7  8
00H,00H,32H,49H,49H,49H,3EH,00H

4. 系统的软件设计

本系统的软件系统主要可分为主程序、4×4矩阵式键盘识别程序、点阵式LED“0-9”数字显示程序三大模块。在程序设计过程中,加强了部分软件抗干扰措施,下面对部分模块作介绍。

4.1 系统主程序设计

ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
; 全局初始化
 MOV SP, #60H ; 堆栈
 MOV IE, #00H ; 禁止所有中断
; 寄存器组 00
 CLR RS1
 CLR RS0
 ; 工作区IRAM(20H-5FH)默认全为0
INIT20TO5F:
 MOV R0, #20H ; START AT 20H
 MOV R7, #40H ; 64 BYTES TO ZERO
LOOP20TO5F:
 MOV @R0, #00H
 INC R0
 DJNZ R7, LOOP20TO5F
; ---------------------------------
 SETB STAT.0 ; 初始状态为等号状态
 MOV R7, #00H
 MOV SCON, #00H ; 串行工作方式0
; -------------------------------------
;; DISPLAY INIT
; -------------------------------------
   LCALL LCDINIT
   MOV  COM,#06H
   LCALL PR1
   MOV  COM,#0C0H
   LCALL PR1
MAIN_LOOP:
***\*3.2  4×4矩阵式键盘\*******\*汇编源程序\**** 
KEYBUF   EQU 30H 
​      ORG 00H 
START:    MOV KEYBUF,#2 
WAIT:MOV P3,#0FFH 
​      CLR P3.4MOV A, P3ANL A,#0FH  
​      XRL A,#0FH 
​      JZ NOKEY1LCALL DELY10MSMOV A,P3ANL A,#0FH 
​      XRL A,#0FH 
​      JZ NOKEY1MOV A,P3ANL A,#0FH 
​      CJNE A,#0EH,NK1MOV KEYBUF,#0LJMP DK1 
NK1:     CJNE A,#0DH,NK2MOV KEYBUF,#1LJMP DK1 
NK2:     CJNE A,#0BH,NK3MOV KEYBUF,#2LJMP DK1 
NK3:     CJNE A,#07H,NK4MOV KEYBUF,#3LJMP DK1 
NK4:     NOP 
DK1:MOV A,KEYBUFMOV DPTR,#TABLEMOVC A,@A+DPTRMOV P0,A 
DK1A:    MOV A,P3ANL A,#0FH 
​      XRL A,#0FH 
​      JNZ DK1A 
NOKEY1:MOV P3,#0FFH 
​      CLR P3.5MOV A,P3ANL A,#0FH 
​      XRL A,#0FH 
​      JZ NOKEY2LCALL DELY10MSMOV A,P3ANL A,#0FH 
​      XRL A,#0FH 
​      JZ NOKEY2MOV A,P3ANL A,#0FH 
​      CJNE A,#0EH,NK5MOV KEYBUF,#4LJMP DK2 
NK5:     CJNE A,#0DH,NK6MOV KEYBUF,#5LJMP DK2 
NK6:     CJNE A,#0BH,NK7MOV KEYBUF,#6LJMP DK2 
NK7:     CJNE A,#07H,NK8MOV KEYBUF,#7LJMP DK2 
NK8:     NOP 
DK2:MOV A,KEYBUFMOV DPTR,#TABLEMOVC A,@A+DPTRMOV P0,A 
DK2A:    MOV A,P3ANL A,#0FH 
​      XRL A,#0FH 
​      JNZ DK2A 
NOKEY2:MOV P3,#0FFH 
​      CLR P3.6MOV A,P3ANL A,#0FH 
​      XRL A,#0FH 
​      JZ NOKEY3LCALL DELY10MSMOV A,P3ANL A,#0FH 
​      XRL A,#0FH 
​      JZ NOKEY3MOV A,P3ANL A,#0FH 
​      CJNE A,#0EH,NK9MOV KEYBUF,#8LJMP DK3 
NK9:     CJNE A,#0DH,NK10MOV KEYBUF,#9LJMP DK3 
NK10:    CJNE A,#0BH,NK11MOV KEYBUF,#10LJMP DK3 
NK11:    CJNE A,#07H,NK12MOV KEYBUF,#11LJMP DK3 
NK12:    NOP 
DK3:MOV A,KEYBUFMOV DPTR,#TABLEMOVC A,@A+DPTRMOV P0,A 
DK3A:    MOV A,P3ANL A,#0FH 
​      XRL A,#0FH 
​      JNZ DK3A 
NOKEY3:MOV P3,#0FFH 
​      CLR P3.7MOV A,P3ANL A,#0FH 
​      XRL A,#0FH 
​      JZ NOKEY4LCALL DELY10MSMOV A,P3ANL A,#0FH 
​      XRL A,#0FH 
​      JZ NOKEY4MOV A,P3ANL A,#0FH 
​      CJNE A,#0EH,NK13MOV KEYBUF,#12LJMP DK4 
NK13:    CJNE A,#0DH,NK14MOV KEYBUF,#13LJMP DK4 
NK14:    CJNE A,#0BH,NK15MOV KEYBUF,#14LJMP DK4 
NK15:    CJNE A,#07H,NK16MOV KEYBUF,#15LJMP DK4 
NK16:    NOP 
DK4:MOV A,KEYBUFMOV DPTR,#TABLEMOVC A,@A+DPTRMOV P0,A 
DK4A:    MOV A,P3ANL A,#0FH 
​      XRL A,#0FH 
​      JNZ DK4A 
NOKEY4:LJMP WAIT 
DELY10MS:MOV R6,#10 
D1:     MOV R7,#248DJNZ R7,$ 
​      DJNZ R6,D1RET 
TABLE:    DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H 
​      DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H 
​      END 
***\*3.3 点阵式LED09”数字显示\*******\*汇编源程序\**** 
TIM		EQU 30H 
CNTA	EQU 31H 
CNTB	EQU 32H 
​    ORG 00H 
​		LJMP STARTORG 0BH 
​		LJMP T0XORG 30H 
START:	MOV TIM,#00H 
​		MOV CNTA,#00H 
​		MOV CNTB,#00H 
​		MOV TMOD,#01H 
​		MOV TH0,#(65536-4000)/256MOV TL0,#(65536-4000) MOD 256SETB TR0SETB ET0SETB EASJMP $ 
T0X:MOV TH0,#(65536-4000)/256MOV TL0,#(65536-4000) MOD 256MOV DPTR,#TABMOV A,CNTAMOVC A,@A+DPTRMOV P3,AMOV DPTR,#DIGITMOV A,CNTBMOV B,#8MUL ABADD A,CNTAMOVC A,@A+DPTR 
   MOV P1,AINC CNTAMOV A,CNTACJNE A,#8,NEXTMOV CNTA,#00H 
NEXT:	INC TIMMOV A,TIMCJNE A,#250,NEXMOV TIM,#00H 
​		INC CNTBMOV A,CNTBCJNE A,#10,NEXMOV CNTB,#00H 
NEX:	RETI 
TAB:	DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH 
DIGIT:	DB 00H,00H,3EH,41H,41H,41H,3EH,00H 
​		DB 00H,00H,00H,00H,21H,7FH,01H,00H 
​		DB 00H,00H,27H,45H,45H,45H,39H,00H 
​		DB 00H,00H,22H,49H,49H,49H,36H,00H 
​		DB 00H,00H,0CH,14H,24H,7FH,04H,00H 
​		DB 00H,00H,72H,51H,51H,51H,4EH,00H 
​		DB 00H,00H,3EH,49H,49H,49H,26H,00H 
​		DB 00H,00H,40H,40H,40H,4FH,70H,00H 
​		DB 00H,00H,36H,49H,49H,49H,36H,00H 
​		DB 00H,00H,32H,49H,49H,49H,3EH,00H 
​		END 

5. 结论

由于所采用的浮点程序库的限制(MCU平台只找到这个……),浮点运算采用3字节二进制补码表示,有效数字6位。对于输入输出,采用3字节BCD码浮点数格式,有效数字只有4位,因此最终有效数字只有4位。可进行连续输入,例如:1.23+4.56*8.23/234.8 ,但是运算结果为从左到右,这也是8位简易计算器的方式。可进行错误判断,溢出、除零等错误将显示一个字符 E 。由于键盘只有16个按键,安排如下:
±--------------+
| 7 | 8 | 9 | + |
| 4 | 5 | 6 | - |
| 1 | 2 | 3 | * |
| 0 | . | = | / |
±--------------+

按键的缺少导致取消了一些特殊函数,即开根号,三角函数(sin, cos, tan, ctg)的实现,由于这些函数在浮点程序库中均已提供,如果硬件允许,在原来的框架上添加这些附加功能是很容易的(可以看作和+, -, *, /等价的按键操作,调用不同的子程序进行运算即可)按两次 = 等于清灵。因为按键实在太少,才采用了这个做法。
不足
使用3字节的浮点数表示,不可避免的带来了数表示的不精确,加上有效数字比较少,因此计算结果很容易产生误差,尤其是进行连续多次运算后,结果和精度较高的科学计算器的误差会很快达到0.01以上,当然这个差距和所测试的用例也有关系,4位有效数字导致了数字123456只能表示为123400,最后两位有效数字被摒弃了。
同时,虽然纯整数可以进行较为高精度的运算,实现也较为容易,但是考虑到要和浮点数混合在一起处理,如果在算法上分别考虑整数和浮点数,整个程序框架代码将会膨胀不少,因此将其简化为统一作为浮点数对待。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。