首页 > 其他分享 >电子综合实习-电子计算器

电子综合实习-电子计算器

时间:2022-10-15 20:45:02浏览次数:56  
标签:运算 浮点 函数 电子 数码管 3.3 计算器 实习 小数

1 电子计算器简介

1.1 设计目的

电子计算器相比于人手算可谓有着不可或缺的优势,首先电子计算器有着极高的计算速度,其次它还可以保证很高的稳定性和准确性,这对于学理工科的我们来说可谓是一大帮手,同时由于51单片机的价格低廉,结构简单,这从而使得利用单片机来设计电子计算器拥有极高的价值性和实用性。

 

1.2 设计要求

本课题的主要内容是采用单片机实现一个简单的电子计算器,通过这个实习进一步加深《C语言程序设计》、《单片机原理及应用》等相关课程中的理论知识,熟练掌握单片机的编程、调试和应用系统的开发。

要求:

(1)行列式按键的读取、数码管动态扫描显示;

(2)实现计算结果在0~9999范围内的正负整数的加、减、乘、除。

(3)16个按键的功能划分:

数字键:0-9;

功能键:加法键、减法键、乘法键、除法键、等于键、复位键

发挥部分:

能进行浮点小数的输入及运算。

 

2 硬件设计

2.1 51单片机最小系统

51单片机最小系统是指能使单片机正常工作的最简电路,如图2.1所示,其中大体包括三个部分:

  1. AT89C51单片机;
  2. 晶振电路模块;
  3. 复位电路模块。

图2.1 51单片机最小系统

2.1.1 AT89C51单片机

AT89C51是一种带4K字节FLASH存储器的低电压、高性能CMOS 8位微处理器。如图2.1.1所示,AT89C51有40个引脚,32 个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。

AT89C51 提供以下标准功能:4k 字节Flash 闪速存储器,256字节片内数据存储器(00H -7FH为片内RAM,80H-FFH为特殊功能寄存器SFR),32 个I/O 口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。

图2.1.1 AT89C51单片机 

2.1.2 晶振电路模块

如图2.1.2所示,该模块由一个12MHz的晶振和两个30pF的电容构成,其中晶振的作用是产生一个稳定的时钟信号,而电容的作用则是将晶振中一些无用的高频信号过滤掉,提高整个模块工作的稳定性。

该模块的主要用途有两个:

(1)为单片机的正常工作提供一个稳定的工作时序;

(2)为定时器的定时提供一个准确的脉冲信号,本次实习共使用了两个定时器,其中定时器0设置在了工作模式1,初值为60536,用于每隔5ms执行一次数码管的动态显示工作;而定时器1也设置在了工作模式1,初值为15536,同时外加变量T1_NUM的循环迭代,用于每隔500ms令数码管的某一位片选取反,从而达到闪烁的目的。

图2.1.2 晶振电路模块

2.1.3 复位电路模块

如图2.1.3所示,该模块由一个按钮,一个电容和一个电阻构成,其中电容与电阻构成了一个RC的充电回路,当通电的一瞬间,由于电容两端电压无法瞬间突变,因此RST会在大概50ms的时间内保持高电平,50ms之后RST上的电平则可认为是低电平,这样就能达到上电复位并使单片机正常工作的作用。

同时,在电容的两端还外加了一个轻触按钮,当按下该按钮时,RST上的电平则会重新变为高电平,让单片机复位,而当松开该按钮后,由于电容的充电作用,RST上的电平则会重新置为低电平,单片机正常工作。

图2.1.1 复位电路模块

 

2.2 矩阵键盘模块

如图2.2所示,该模块由16个轻触按钮构成,其中同一行的按钮的一端都相连,同一列的按钮的一端也相连。在编程时采用行输出,列输入的方法将按键的列信息读入后;再采用列输出,行输入的方法将按键的行信息也读入后,便可得知此刻是哪一个键被按下了。

图2.2 矩阵键盘模块

此外,如表2.2所示,特别说明一下本次矩阵键盘的按键布局。此次矩阵键盘共有16个键,其中有10个为数字键入键,另外6个均为功能键,下面对其各自的用途进行简单的说明:

  1. C:全部清零键。按下该键后计算器将清零一切信息。
  2. CE:单个撤回键。按下该键后将向前撤回一个数字或者运算符。
  3. ".":小数点。按下该键后,编辑位的前一位将会加上一个小数点,而单片机在进行运算时,将会进行浮点运算。
  4. Operator:运算符。按下该键后运算符将会从"+ - × ÷"这四个运算符中循环替换。
  5. Confirm:运算符确认键。按下该键后则代表已确认运算符的选择,则数码管会清零,便于下一个运算数的输入。
  6. "=":等于号。等于按下该键后,单片机将会执行运算并显示结果。

7

8

9

C

4

5

6

.

1

2

3

Operator

CE

0

Confirm

=

表2.2 矩阵键盘布局

 

2.3 数码管显示模块

如图2.3所示,该模块由两个四位的七段共阴极数码管构成,其中段选位为高电平有效,片选位为低电平有效,另外该模块还需特别注意,由于P0口在不加上拉电阻之前是没有任何驱动能力的,因此在连接此模块时,P0口一定要外加上拉电阻。

该模块的主要用途是用于显示矩阵键盘所按下的键值,以及最后计算的结果。

图2.3 数码管显示模块

 

3 软件设计(汇编)

3.1 变量的定义

由于本次程序定义的变量较多,所以在介绍各函数之前,先说明一下每个变量的作用和用途。

表3.1.1为用于浮点型运算所定义的变量。

定义的变量名

地址

备注

NUM1_EXPONENT

030H

浮点数1的指数位

NUM1_MANTISSA1

031H

浮点数1的尾数位

NUM1_MANTISSA2

032H

NUM1_MANTISSA3

033H

NUM2_EXPONENT

034H

浮点数2的指数位

NUM2_MANTISSA1

035H

浮点数2的尾数位

NUM2_MANTISSA2

036H

NUM2_MANTISSA3

037H

SUM_EXPONENT

038H

结果的指数位

SUM_MANTISSA1

039H

结果的尾数位

SUM_MANTISSA2

03AH

SUM_MANTISSA3

03BH

NUM1_DECIMAL_L

03CH

运算数1小数部分

NUM1_DECIMAL_H

03DH

NUM2_DECIMAL_L

03EH

运算数2小数部分

NUM2_DECIMAL_H

03FH

表3.1.1

表3.1.2为用于使矩阵键盘和数码管正常工作所定义的变量。

定义的变量名

地址

备注

DELAY1

041H

用于延时函数的循环迭代

DELAY2

042H

DELAY3

043H

T1_NUM

044H

用于扩展定时器1的定时时间

LED_NUM

045H

用于控制数码管每一次显示时打开该位片选的时间

LED_CS

046H

用于记录数码管每一次显示时需打开的片选

TWINKLE

047H

用于记录数码管目前闪烁的位置

KEY_X

048H

用于记录当前按键的行信息

KEY_Y

049H

用于记录当前按键的列信息

KEY_XY

04AH

用于记录当前按键的位置,由行信息与列信息按位相与而成

表3.1.2

表3.1.3为用于记录按键所输入的数及运算数1和运算数2所定义的变量。

定义的变量名

地址

备注

DECIADD

04EH

用于记录小数点在数码管上的地址

OPERADD

04FH

用于记录运算符在数码管上的地址

KEYADD

050H

用于记录当前需显示的键值在数码管上的地址

KEYNUM1

051H

数码管上的第一个数

KEYNUM2

052H

数码管上的第二个数

KEYNUM3

053H

数码管上的第三个数

KEYNUM4

054H

数码管上的第四个数

KEYNUM5

055H

数码管上的第五个数

KEYNUM6

056H

数码管上的第六个数

KEYNUM7

057H

数码管上的第七个数

KEYNUM8

058H

数码管上的第八个数

NUM1_LOW

059H

运算数1

NUM1_HIGH

05AH

NUM2_LOW

05BH

运算数2

NUM2_HIGH

05CH

表3.1.3 

表3.1.4为用于双字节移位乘法和双字节移位除法所定义的变量。

定义的变量名

地址

备注

MULTI1_LOW

060H

乘数1

MULTI1_HIGH

061H

MULTI2_LOW

062H

乘数2

MULTI2_HIGH

063H

ADDEND_LOW

064H

加数

ADDEND_HIGH

065H

PRODUCT_LOW

066H

PRODUCT_HIGH

067H

DIVIDEND_LOW

068H

被除数

DIVIDEND_HIGH

069H

DIVISOR_LOW

06AH

除数

DIVISOR_HIGH

06BH

QUOTIENT_LOW

06CH

QUOTIENT_HIGH

06DH

REMAINDER_LOW

06EH

余数

REMAINDER_HIGH

06FH

表3.1.4  

表3.1.5最主要为用于将十进制输入转化为二进制数据和将二进制数据转化为十进制输出所定义的变量。

定义的变量名

地址

备注

POSITION_DEC

070H

用于记录十进制数每一位数所在的位置,方便加权求和用

POSITION_BIN

071H

用于记录二进制数每一位数所在的位置,方便加权求和用

LEN_RESULT

072H

用于记录输出结果的长度

LEN_NUM

073H

用于记录被除数左移的次数

POPDATA

074H

用于暂存出栈数据

OPERATOR_MOMENT

075H

用于记录临时的运算符,最主要用于改变运算符的显示

OPERATOR

076H

用于记录最终确定的运算符

KEYNUM_LAST

077H

用于记录上次显示的字符

FLAG_NEGATIVE

078H

用于决定输出结果是否需要输出负号

FLAG_FLOAT

079H

用于决定运算方式是否采用浮点运算

LEN1_DECIMAL

07AH

用于记录运算数1小数部分的长度,决定了下面比较值的大小

LEN2_DECIMAL

07BH

用于记录运算数2小数部分的长度,决定了下面比较值的大小

NUM1_DECI_COMP

07CH

用于记录运算数1转浮点型时小数部分需要比较的值

NUM2_DECI_COMP

07DH

用于记录运算数2转浮点型时小数部分需要比较的值

表3.1.5

 

3.2 中断程序

本次程序共使用了两个中断源,一是定时器0,二是定时器1,其中定时器0用于每隔5ms动态显示一次数码管,定时器1用于每隔1s闪烁一次数码管的某一位。

3.2.1 定时器0中断

当定时器0产生中断时,第一步工作是将所用到的A累加器及工作寄存器中所用到的值放于堆栈中并对定时器0赋初值,其后调用数码管显示函数,流程图如图3.2.1所示,通过在一个极短的间隔内依次选通一个数码管并显示对应的值,从而产生视觉暂留现象,使我们在同一时间内能看到八个数码管所显示的不同的值。最后在完成函数的调用后将堆栈中的内容弹出,并返回主函数。

图3.2.1 数码管显示函数流程图

3.2.2 定时器1中断

当定时器1产生中断时,同样压栈、赋初值,并在第10次进中断时,用"按位与"和"按位或"的方法取反闪烁位,最后出栈,返回主函数。

 

3.3 主函数

程序在一开始会进行一些初始化的设置,其中包括设置堆栈指针,以及定义定时器工作方式,打开中断和定时器,在完成这些工作后,程序即会进入主函数,如图3.3所示,在程序进入主函数后,会一直循环判断是否有键按下,且按下的键值为多少,该进行何种操作及运算。

图3.3 主函数流程图

3.3.1 矩阵键盘的读取

在经过20ms的延时去抖函数后,若仍有按键被按下,则程序会调用并执行该函数,该函数的流程图如图3.3.1所示,函数会通过行输出,列输入的方法读取矩阵键盘的列信息,再通过列输入,行输出的方法读取矩阵键盘的行信息,再通过"按位与"的方法,将两者组合为按键位置的信息,当使用者松手后,则立刻执行查表程序并得知该按键所需显示的数值后,即可返回主函数并执行下一步的功能。

图3.3.1 矩阵键盘的读取函数流程图

3.3.2 存储运算数

当判断到有运算符或等于号的输入时,则意味着运算数1或运算数2已经输入完成,则程序会调用并执行该函数,如图3.3.2所示,程序会先清零运算数1或运算数2,并通过地址指针的方式,依次向前取数再乘以相应的10的指数并与其相加,从而得到所输入的运算数1或运算数2的真实值。

其中,若运算数为负数,则将储存其补数;若运算数为小数,则将其分为整数部分和小数部分两部分,分别储存。

图3.2 存储运算数函数流程图

3.3.3 显示结果

当运算操作完成后,程序会将所得结果送入运算数1中,并调用和执行该函数。如图3.3.3所示,程序会首先判断运算数1的正负,若为负数,则先在数码管的第一位显示负号,并取其补数覆盖原有的运算数1,后与正数的操作相同。

正数的操作为:将运算数1除以10,令商覆盖原有的运算数1并求其余数,并使用PUSH指令,使其余数放于堆栈当中,然后依次循环此操作,直到运算数1除以10的结果为0,则跳出循环,将刚才放入堆栈中的数依次取出给到数码管的当前位进行显示,直至堆栈中的数完全取出。

最后判断小数标志位是否为1,若为1,则清零标志位,显示小数点,并将小数部分的结果给到运算数1,后重复上述步骤,用于显示小数部分的结果。

图3.3.3 显示结果函数流程图

3.3.4 双字节移位乘法运算

由于此次的任务需要进行0~9999的运算,所以编程中需要用双字节来扩充运算数的存储,因而无法使用已给的单字节乘法运算的指令,因此需要根据乘法计算的原理,自行编写双字节移位乘法运算的函数。如图3.3.4所示,双字节移位乘法的步骤如下:首先清零积和计数n(其中计数n用于记录运算数2右移的次数,当运算数2右移向外溢出16次时,则意味着该函数运算完成),然后右移运算数2,使其最低位溢出给C,并自增n,再判断C的值,若C为1,则意味着运算数1需左移n次,并把结果与积相加;若为0,则不进行任何操作,如是循环16次,即可得到最后的积。

图3.3.4 双字节移位乘法函数流程图

3.3.5 双字节移位除法运算

由于此次的任务需要进行0~9999的运算,所以编程中需要用双字节来扩充运算数的存储,因而无法使用已给的单字节除法运算的指令,因此需要根据除法计算的原理,自行编写双字节移位除法运算的函数。如图3.3.5所示,双字节移位乘法的步骤如下:首先清零被除数,然后左移运算数1,使其溢出一位给到被除数,并判断此时的被除数大于或等于除数吗,若大于或等于,则先将被除数减去除数,并置位C且左移商使其放于商的最低位中;否则,清零C并左移商使其放于商的最低位中。如是循环16次,并把此时的被除数的结果给到余数,即可得到运算数1除以运算数2的商和余数。

图3.3.5 双字节移位除法函数流程图

3.3.6 负数乘除法运算

在计算机的存储中,负数是通过取其补数的方法来存储的,而在实际的运算中,补数的加减也确实满足实际的结果,但是在乘除的运算中,却只有正数乘以负数是满足的,其他情况下都不满足实际的结果,因此在乘除的运算当中,需将负数转化为正数来进行运算,再通过运算数负号的个数来判断最后的结果为负还是为正,流程图如图3.3.6所示。

图3.3.6 负数乘除法流程图

3.2.7 浮点型加法运算

浮点型的加法运算是本次任务的重点工作。此工作共包含三部分:

  (1)将所输入的小数转化为浮点型的存储格式存储起来;

  (2)将所输入的两个浮点型小数通过浮点型相加的函数相加;

  (3)将所得到的结果转换为10进制的方式输出于数码管。

(1)转换为浮点型存储格式

首先介绍的是第一步,即把所输入的小数转化为浮点型的存储格式存储起来。如图3.2.7.1所示,首先将运算数的整数部分放入浮点型存储格式中的尾数位的后两个字节当中,其后将浮点型存储格式中的指数部分置为151,其原因是,整数部分在尾数位的左边时所对应的指数部分应该是127,而将其放于尾数位的后两个字节中,也就相当于将整数部分向右移动了24位,因此127+24=151,此时的指数部分为151。

然后左移小数部分的值并判断这个值是否大于所比较的值(关于所比较的值,以下做个简单说明:若小数位中的值为一位数,即6,则意味着此时的小数为0.6,则所比较的值应为10;若小数位中的值为两位数,即66,则意味着此时的小数为0.66,则所比较的值为100,若小数位中的值为三位数时,以此类推,所比较的值应为1000),若大于或等于则小数部分的值减去所比较的值,并置位C且同时左移尾数放于尾数的最低位中,指数位减1;若小于,则直接清零C且同时左移尾数放于尾数的最低位中,指数位减1。重复以上操作,直到尾数位左移产生的溢出位为1,则按照浮点型存储的格式,此时还应将整个四字节的浮点型存储数整体向右移一位。

图3.2.7.1 转换为浮点型存储格式流程图

(2)浮点型相加函数

其次介绍的是第二步,即把所输入的两个浮点型小数通过浮点型相加的函数将其相加。如图3.2.7.2所示,首先应将指数位与尾数位通过左移和"按位或"运算的方法分离开来,由于这个步骤不是重点,因此以下流程图将其省略,其次取两者中指数位较大的一方为结果的指数位,则指数位较小的一方,需通过右移尾数的方法使其指数位的值增大直至与另一方的指数位相等,则令两数的尾数相加,最后判断相加的尾数位是否存在进位现象,若存在的话,则尾数位右移一位,指数位加一,若不存在的话则完成浮点型的加法运算。

图3.2.7.2 浮点型相加函数流程图

(3)转换为十进制方式输出

最后介绍的是第三步,即把浮点型运算的结果转换为十进制的方式输出于数码管。如图3.2.7.3所示,首先通过不断左移尾数位取出整数部分,若指数部分原本便小于127,则右移尾数位为之后小数部分的输出做好准备。取出整数部分后则可调用显示结果函数将其显示了,其后再加上小数点并取出小数部分,在此规定小数部分最多只显示三位,即加数为取整,其中n为尾数位左移的次数,最后再将小数部分显示出来,即可完成浮点型加法运算。

图3.2.7.3 转换为十进制方式输出流程图

 

4 仿真结果

4.1 加法运算仿真结果

图4.1.1 加数1

图4.1.2 加数2

图4.1.3 加法运算仿真结果

4.2 减法运算仿真结果

图4.2.1 被减数

图4.2.2 减数

图4.2.3 减法运算仿真结果

4.3 乘法运算仿真结果

图4.3.1 乘数1

图4.3.2 乘数2

图4.3.3 乘法运算仿真结果

4.4 除法运算仿真结果

图4.4.1 被除数

图4.4.2 除数

图4.4.3 除法运算仿真结果

4.5 负数乘法仿真结果

图4.5.1 乘数1

图4.5.2 乘数2

图4.5.3 负数乘法仿真结果

4.6 负数除法仿真结果

图4.6.1 被除数

图4.6.2 除数

图4.6.3 负数除法仿真结果

4.7 浮点加法仿真结果

图4.7.1 小数1

图4.7.2 小数2

图4.7.3 浮点加法仿真结果

标签:运算,浮点,函数,电子,数码管,3.3,计算器,实习,小数
From: https://www.cnblogs.com/Kelvin-Wu/p/16794953.html

相关文章

  • LeetCode224 基本计算器
     idea:刚开始是打算分类讨论,建立了数字栈和字符栈,按照传入字符当时两个栈的基本情况分类,结果讨论完之后分类太麻烦,导致分析完了之后漏洞不少。我觉得这道题难点在于括号......
  • java简易两数计算器
    publicclasscalculator{publicstaticvoidmain(String[]args){Scannerscanner=newScanner(System.in);intt=1;while(t=......
  • ALV 导出电子表格的文件格式固定的删除办法
    在ALV显示中,选择菜单“列表-导出-电子表格”后,会出现下面这样的选择窗口:如果选中了“始终使用选定的格式”,则以后都会使用当前选定的格式(经常是第一项MHTML,可实际上用户希......
  • 伯克利电子基础课EECS16A和EECS16B
    EECS16A:DesigningInformationDevicesandSystemsI,Summer2020(berkeley.edu)看EECS16A的教学计划觉得,他们的学业压力难怪那么大,一周四次课,每周两次作业,七周上完......
  • 浅谈电子装配mes管理系统功能 广东mes服务商 先达智控
    电子装配行业作为高科技制造产业之一,在新一轮技术革命的大潮下,运用信息化手段提高企业的生产效率、产品良品率,进一步塑造企业核心竞争力,已成为大势所趋。我国目前的电装企业......
  • 电子表格也能做购物车?简单三步就能实现
    在我们的项目当中,经常需要添加一些选择界面,让用户直观地进行交互,比如耗材、办公用品、设计稿或者其它可以选择的内容。在线商城的商品目录和购物车无疑是一种大家都很熟悉......
  • 【前端】【JavaScript】简单的加减乘除计算器
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title></head><body><inputtype="text"id="number1"><selectid="s......
  • 华大电子MCU-CIU32F011x3、CIU32F031x5特点和简介
    1.华大电子MCU产品特性•内核与系统–32位ARM®CortexTM-M0处理器内核–工作频率可达48MHz–32个指令周期32位硬件乘法器–32个中断源,可配置4层中......
  • 当今市场上 最佳假电子邮件生成器 临时邮箱
    如果您想发现世界上最好的假邮件生成器,那么您来对地方了。我们对它们进行了测试和审查,以便为您提供一些重要的选择建议。什么是假邮件生成器?假邮件生成器是一种工具,可让......
  • 【电子元器件检测设备】3D激光平面度检测设备适用范围及特点
    众所周知,产品生产出来之后都有一步关键性的操作:那就是产品品质检测,电子元器件也一样。今天,小编来给大家介绍一款秦泰盛自主研发生产专为电子加工行业精心设计的一种高精度测......