c51单片机浮点数及其汇编程序设计

发布者:画意人生最新更新时间:2016-03-09 来源: eefocus关键字:c51  单片机  浮点数  汇编程序 手机看文章 扫描二维码
随时随地手机看文章
单片机应用系统的数据处理过程中,经常会遇到小数的运算问题,如求解BCD的增量算式、线性化处理等。因此,需要用二进制数来表示小数。表示小数的方法一般有两种,定点数和浮点数。定点数结构简单,与整数的运算过程相同,运算速度快。但随着所表示数的范围的扩大,其位数成倍增加,给运算和存储带来不便,而且也不能保证相对精度不变。浮点数的结构相对复杂,但它能够以固定的字节长度保持相对精度不变,用较少的字节表示很大的数的范围,便于存储和运算,在处理的数据范围较大和要求精度较高时,采用浮点数。

浮点数的概念

常用的科学计数法来表示一个十进制数如

l234.75=1.23475E3=1.23475×103

在数据很大或很小时,采用科学计数避免了在有效数字前加0来确定小数点的位置,突出了数据的有效数字的位数,简化了数据的表示。可以认为,科学计数法就是十进制数的浮点数表示方法。

在二进制效中,也可以用类似的方法来表示一个数,如

1234.75=10011010010.11(二进制)=0.1001101001011×211

一般表达式为

N=S×2p

在这种表示方法中,数值由四个部分组成,即尾数S及符号,阶码P及符号。

在二进制中,通过定义相应字节或位来表示这四部分,就形成了二进制浮点数。二进制浮点数可以有多种不同的表示方法,下面是一种常见的三字节浮点数的格式:

其中尾数占16位,阶码占6位,阶符占1位,数符占1位。阶码通常用补码来表示。

在这种表示方法中,小数点的实际位置要由阶码来确定,而阶码又是可变的,因此称为浮点数。

1234.75用这种格式的浮点数表示就是:

0000 1011 1001 1010 0101 1000

用十六进制表示为

1234.75=0B9A58H

-1234.75=4B9A58H

0.171875=043B00H

-0.171875=443B00H

三字节浮点数所能表示的最大值为

1×263=9.22×1018

能表示的最小数的绝对值为

0.5×2-63=5.42×10-20

其所表示的数的绝对值范围=(5.42×10-20~9.22×1018),由此可以看到,比三字节定点数表示的数的范围大得多。

按同样方法可以定义一个四字节的浮点数,以满足更高精度的需要。

规格化浮点数

同一个数用浮点数表示可以是不同的,如

1234.75=0B9A58H=0C4D2CH=0D2696H

虽然这几种表示其数值是相同的,但其尾数的有效数字的位数不同,分别为16位、15位和14位。在运算过程中,为了最大限度地保持运算精度,应尽量增加尾数的有效位数。这就需要对浮点数进行规格化处理。

在只考虑用二进制原码表示尾数时,尾数的最高位为l,则该浮点数为规格化浮点数。在规格化浮点数中,用尾数为0和最小阶码表示0,三字节规格化浮点数的0表示为410000H。

浮点数在运算之前和运算之后都要进行规格化,规格化过程包括以下步骤:

(1)首先判断尾是否为0,如果为0,规格化结果为410000H;

(2)如果尾数不为0,判断层数的最高位是否为1,如果不为1,尾数左移,阶码减1;

(3)再判断层数的最高位是否为1,如果不为1,继续进行规格化操作,如果为1,则规格化结束。

浮点数运算

浮点数运算包括加、减、乘、除四则运算,比较运算,开方运算,多项式运算和函数运算。其它运算都可用这些基本运算的组合来完成。本节主要介绍浮点数四则运算及其子程序。

1.浮点数的加、减运算

浮点数的运算就是求结果的尾数、数符、阶码包括阶符的过程。在加、减运算中,参加运算的浮点数的阶码可能是不同的,其尾数所代表的值也是不同的。在这种情况下,尾数不能直接相加或相减,必须首先使两个数的阶相同,这一过程称为对阶。一般是让小阶向大阶对齐,尾数相应右移。对阶相当于算术中的小数点对齐或代数中的通分。尾数相加或相减得到了结果的尾数。数符由尾数的运算结果的符号确定。阶码就是两个数中较大的阶码。

例1 计算132.25+69.75

解: 132.25+69.75=088444H+078B80H=088444H+0845C0H=08CA00H=202

由于两个浮点数的阶码分别为8和7,先将加数的阶码变为8,其尾数右移1位。两个数的阶码相同后,尾数直接相加即为和的尾数,和的尾数的最高位为1,为规格化浮点数。

例2 计算12.39-93.1

解: 12.39-93.1=04C651H-07BA33H=87A169H=-80.71

本例中被减数小于减数,差为负数,结果的数符为1。差的阶码为两个数中较大的阶码。

2.浮点数乘法运算

如果设参加运算的两个操作数分别表示为

Na=(-1)SSa×Sa×2Pa

Nb=(-1)SSb ×Sb×2Pb

它们的积为

N=Na×Nb=(-1)SSa+SSb×(Sa×Sb)×2Pa+Pb

式中SSa和SSb为两个数的数符。

乘法运算可总结为:

(1)积的数符为乘数的符号位和被乘数的符号位按模2求和,即异或;

(2)积的阶为乘数和被乘数的阶的和;

(3)积的尾数为被乘数和乘数的尾数的积。

参加运算的浮点数一般都是规格化的浮点数,尾数的积小于1,不需进行右规格化处理。但有可能小于0.5,所以需进行左规格化处理,使积为规格化浮点数。如果乘数或被乘数的尾为0、则积为410000H。由于在尾数相乘时,积的低16位不能反映在结果中,因此,积可能会产生一定的误差。

例3 算22.4l×4.23。

解: 22.41×4.23=05B349H×03875EH=07BD9AH=94.8

积的阶为乘数和被乘数的和,即8。尾数相乘时,积小于0.5,进行左规格化处理,阶码变为7。

例4 计算2586.5×(-6.91)。

解: 2586.5×(-6.91)=0CA1BOH×83DD13H=8F8BA0H=-17872

被乘数为正数,数符为0,乘数为负数,数符为1,积的数符为0⊕1=1,积为负数。

3.浮点数的除法运算

除法运算可以表示为

N=Na/Nb=[(-1)SSa×Sa×2Pa]/[(-1)SSb×Sb×2Pb ]

=(-1)SSa-SSb×(Sa/Sb) ×2Pa-Pb

浮点数的除法运算可以总结为:

(1) 商的数符为被除数与除数的符号位的差;

(2) 商的阶码为被除数和除数的阶码的差;

(3) 商的尾数为被除数和除数的尾数的商。

规格化的浮点数进行除法运算时,尾数相除,商不会小于0.5,不需进行左规格化处理。但有可能大于1,有时需进行右规格化处理。

例5 计算390.67÷14.3l。

解: 390.67÷14.31=09C357H÷04E511H=05DA4EH=27.3

商的阶码为被除数与除数的阶码的差。尾数相除时,结果的最高位为1,商为规格化浮点数。

例6 计算 -6.02÷16.157。

解: -6.02÷16.157=83C0AAH÷058143H=FFBEC8H= -0.373

异号相除时,商为负数。由于被除数的尾数大于除数的尾数,所以被除数先进行右规格化,阶码变为4,商的阶码为 -1,用补码来表示。

浮点数运算子程序

通过前面的分析可以看到,浮点运算比较复杂,有其特有的方法和规律。这里介绍几种常用的三字节浮点数运算子程序,通过分析、设计这些程序,可以进一步了解浮点数的运算过程和特点,熟悉复杂程序的设计方法。

1.浮点数通用规格化子程序

在浮点数运算过程中,有时需要左规格化,有时需要右规格化。通过规格化子程序既可实现左规格化,又可实现右规格化,其具体功能如下:

当Cy=0时,进行右规格化:F0=0时.对R6(阶)R2R3(尾数)右规格化1位;F0=1时,对R7(阶)R4R5(尾数)右规格化1位。

当Cy=1时,对R6(阶)R3R3(尾数)执行左规格化。

程序开始时,判断是执行左规格化还是右规格化。如果是右规格化,还要判断是对R6(阶)R2R3(尾数)还是对R7(阶)R4R5(尾数)进行规格化。如果是左规格化,直至把操作数变为规格化浮点数。其程序框图如图4-13所示。程序为:

FSDT: JC LNORMS

MOV C, 39H ;进行右规格化

JB F0, NR7

MOV A, R2 ;R2R3右移一位

RRC A ;(Cy)移入尾数最高位

MOV R2, A

MOV A, R3

RRC A

MOV R3, A

INC R6 ;阶码加1

RET

NR7: MOV A, R4

RRC A

MOV R4, A

MOV A, R5

RRC A

MOV R5, A

INC R7

RET

LNORMS: MOV A, R7

JNZ LSHIFT

CJNE R3, #00H, LSBIT8 ;尾数为0,阶码41H

MOV R6, #41H

LSEND : RET

LSHIFT: JB ACC.7, LSEND

LSBIT8: MOV C, F0

MOV A, R3

RLC A

MOV R3, A

MOV A, R2

RLC A

MOV R2, A

CLR F0

DEC R6

SJMP LNORMS

2.浮点数加减运算子程序

参加运算的浮点数可能是正数,也可能是负数。对于加法运算.当加数和被加数的数符相同时,尾数相加,不同时尾数相减;对于减法运算,当减数和被减数的数符相同时,尾数相减、不同时尾数相加。当两个浮点数的阶码不同时,要进行对阶,使小阶与大阶相等,因此,结果的阶码与其较大的阶码相同。

在执行加法运算时,尾数有可能大于1,因此要进行右规格化处理;执行减法运算时,尾数有可能小于0.5,因此,要进行左规格化处理。

下面是三字节浮点数加、减法处理于程序,具体功能为:

R6(阶)R2R3(尾)±R7(阶)R4R5(尾)→R4(阶)R2R3(尾);

当位3AH=0时,执行加法;

当位3AH=1时,执行减法。

程序框图如图4—14所示。程序如下:

FABP: MOV A, R6

MOV C, ACC.7

MOV 38H, C ;存被加数数符

XRL A, R7

JNB ACC.7, FAB1 ;数符相同则转

CPL 3AH ;数符不等,求反运算标志

图4-14

FAB1: MOV A, R6

MOV C, ACC.6 ;扩展阶码符号位

MOV ACC.7, C

MOV R6, A

MOV A, R7

CLR C

MOV A, R6

SUBB A, R7

JZ FAB2 ;阶码相同则转

CLR F0

JB ACC.7, FAB6

CJNE R4, #00H, FAB7

CJNE R5, #00H, FAB7

FAB2: JB 3AH, FAB9 ;转向尾数减法

MOV A, R3 ;执行尾数加法

ADD A, R5

MOV R3, A

ADD A, R2

ADDC A, R4

MOV R2, A

JNC FAB4

SETB 39H

CLR C

FAB3: CLR F0

LCALL FSDT

FAB4: CJNE R2, #00H, FAB5

CJNE R3, #00H, FAB5

MOV R4, #41 ;结果为0,规格化

RET

FAB5: MOV A, R6

MOV C, 38H

MOV ACC.7, C

XCH A, R4

MOV R6, A

RET

FAB6: CJNE R2, #00H, FAB8

CJNE R3, #00H, FAB8

MOV A, R7

MOV R6, A

SJMP FAB2

FAB7: CPL F0

FAB8: CLR C

LCALL FSDT

SJMP FAB1

FAB9: MOV A, R3 ;尾数相减

CLR C

SUBB A, R5

MOV R3, A

MOV A, R2

SUBB A, R4

MOV R2, A

JNC FAB10

CLR A

CLR C

SUBB A, R3

MOV R3, A

CLR A

SUBB A, R2

MOV R2, A

CPL 38H

FAB10: SETB C

SJMP FAB3

3. 浮点数乘法运算子程序

浮点数相乘时,阶码直接相加即获得积的阶码,尾数相乘时,结果可能小于0.5,需进行左规格化处理。下面是三字节浮点数乘法运算子程序,具体功能为:

(Ro)指向的三字节浮点数×(R1)指向的三字节浮点数→R4(阶)R2R3(尾数)。

图4-15三字节浮点数乘法的程序框图。程序为:

FMUL: LCALL FMLD ;传送浮点数

MOV A, R6 ;求积的数符

XRL A, R7

MOV C, ACC.7

MOV 38H, C

LCALL DMUL ;调用双字节无符号数乘法子程序

MOV A, R7

MOV C, ACC.7

MOV F0, C

MOV A, @R0

ADD A, @R1

MOV R6, A

SETB C

LCALL FSDT ;进行规格化操作

图4-15 三字节浮点数乘法子程序

MOV A, R6

MOV C, 38H

MOV ACC.7, C ;置积的数符

MOV R4, A

RET

注:(1)FMLD为浮点数取数子程序,功能为:将(R0)指向的三字节浮点数送入R6(阶)R2R3(尾数)中,将(R1)指向的三字节浮点数送入R7(阶)R4R5(尾数)中。

(2)DMUL为双字节无符号数乘法子程序。

4.浮点数除法运算子程序

在进行除法运算时,被除数的尾数可能比除数的尾数大很多,使结果大于1。为避免这种情况,如果被除数尾数大于除数的尾数,先将被除数的尾数右移,使其小于除数的尾数。阶码也相应增加,保持其数值不变。下面是三字节浮点数除法运算程序,其功能为:(R0)指向的三字节浮点数除以(R1)指向的三字节浮点数→R4(阶)R2R3(尾数)中。

程序框图如图4-16所示。程序为:

FDIV: LCALL FMLD

MOV A, R6

XRL A, R7 ;求商的数符

MOV C, ACC.7

MOV 38H, C

CLR A

MOV R6, A

MOV R7, A

CJNE R4, #00H, FDIV1

CJNE R5, #00H, FDIV1

SETB C

RET ;除数为0返回

FDIV1: MOV A, R3 ;比较被除数与

SUBB A, R5 ;除数的尾数

MOV A, R2

SUBB A, R4

JC FDIV2

CLR F0

CLR 39H

LCALL FDST

RRC A

MOV R7, A

CLR C

SJMP FDIV1

FDIV2: CLR A

XCH A, R6

PUSH ACC

LCALL DDIV ;调用双字节除法程序

POP ACC

ADD A, @R0

CLR C

SUBB A, @R1

MOV C, 38H

MOV ACC.7, C

MOV R4, A

CLR C

RET

关键字:c51  单片机  浮点数  汇编程序 引用地址:c51单片机浮点数及其汇编程序设计

上一篇:单片机IO引脚驱动能力提升篇
下一篇:学习51单片机的基本调试经验

推荐阅读最新更新时间:2024-03-16 14:46

[C51代码]MAX7219驱动
/***************max7219.h****************/ #ifndef _max7219_h_ #define _max7219_h_ #include Atmel/AT89X51.h #include link.h /***************控制引脚定义****************/ sbit _7219_DIN = P2^0; sbit _7219_CS = P2^1; sbit _7219_CLK = P2^2; /***************控制字定义****************/ #define _7219_NO_OP 0x00 //Digit0~Digit7位于
[单片机]
Keil C51里关于堆栈指针的处理
Keil C是非常优秀的C51编译器,可能是最好的C51编译器,提供各种优化模式,对变量的优化和地址安排做得非常好。这是用C语言写代码的好处之一,如果用汇编写,得费一大番功夫给各个变量安排内存物理地址,还得时刻记住哪些地址的内存单元是已经分配了,新增加的变量就不能占用那些已经分配了的单元,以免产生内存交叠冲突和溢出。我一直非常信赖Keil C51的编译结果,在我的印象里,它对内存的分配是完美的,只要代码用它编译时没有报告任何warning和error,代码运行时不可能内存冲突或溢出的现象。 但,今天发生的事情证明我错了。 手头上有个产品的代码,代码量很大。程序跑起来的效果不大好,因此打算把代码优化一下。代码量越大,通常可优化的地方也
[单片机]
瑞萨推业界首款采用90 nm工艺MCU,速度可达200 MHz
业界第一个采用90 nm工艺带有片上闪存的微控制器,实现200 MHz业界最高运行速度 利用高性能SH-2A CPU内核,性能较以前产品提升约4倍,有助实现高精度、实时引擎和传输控制 日前,瑞萨科技(Renesas Technology Corp.)宣布开发出了业界第一个采用90 nm(纳米)工艺并带有片上闪存的,可用于汽车引擎、传输等控制程序开发的微控制器——32位SuperH(注1) 系列SH72546RFCC。据悉,该样品将从2007年10月开始在日本交付。 SH72546RFCC微控制器最大的突破是可在汽车应用所需的125℃高温工作环境下,实现200 MHz的业界最高运行速度。此外,它还采用了业界最大的片上闪存容量,可
[单片机]
基于PIC16F877A单片机的HT1621液晶显示控制器
0引 言   HT1621液晶显示控制器是多功能全自动智能开关的显示部件,能实时、准确、在线监控供电线路的运行情况。一旦线路出现漏电、过载、短路、过压、欠压和缺相时,智能安全用电开关能立刻启动保护程序,并显示在HT1621液晶显示控制器上。在智能化楼宇、中高档家庭住宅、电力系统、工矿企业、国家重点消防单位以及石油化工、文教卫生、金融、电信等领域。基于单片机的HT1621液晶显示控制器应用广泛,其原理框图如图1所示。 美国MICROCHIP公司的PIC系列单片机主要有以下特点:(1)哈佛总线结构;(2)指令单字节化;(3)精简指令集;(4)寻址方式简单;(5)代码压缩率高;(6)运行速度高;(7)功耗低;(8)驱动能力强,
[单片机]
基于PIC16F877A<font color='red'>单片机</font>的HT1621液晶显示控制器
符合ASIL-D的看门狗应用设计
当下,一边汽车自动化驾驶的发展势头节节攀高,一边频频出现各类痛心的质量事故。需求促进变革,需求促进功能安全在汽车电子的快速落地,本文就带你领略高安全等级设计中的 看门狗 。 在汽车安全性要求越来越高的电子系统中,为保证系统程序按照预期流程运行,看门狗对程序的监控措施已成为功能安全需求不可或缺的部分。比如实现程序运行逻辑的监控,实现程序运行时间的监控等,这样的看门狗应用需求,一般的看门狗是无法满足的, ZLG 为用户推荐使用 FS45/65 电源管理芯片,其看门狗基于“question/answer”原理实现,可以很好的支持相关功能安全设计。 一、看门狗介绍 图 1 Challenger WD FS45/65
[汽车电子]
符合ASIL-D的看门狗应用设计
华虹半导体力推95纳米eNVM工艺平台 制胜8位MCU市场
电子网消息,全球领先的200mm纯晶圆代工厂——华虹半导体有限公司今天宣布,公司针对8位微控制器(Microcontroller Unit, MCU)市场,最新推出95纳米单绝缘栅非易失性嵌入式存储器(95纳米5V SG eNVM)工艺平台。在保证产品稳定性能的同时,95纳米5V SG eNVM工艺平台以其低功耗、低成本的优势,广受客户青睐。该平台现已成功量产,产品性能优异。 万物互联时代,8位MCU不断推陈出新,出货量也逐步攀升,在工业控制、物联网、汽车电子、消费类电子等诸多领域均有广泛应用。根据市调机构IHS预测,8位MCU市场持续增长,到2020年,全球8位MCU的市场规模将达61亿美元,需求量将达到近170亿颗,市场需
[半导体设计/制造]
基于51单片机的室内多功能检测仪的研究
0 引言:   随着人们生活水平的提高,全装修住宅的日益扩展,其室内环境质量控制越来越引起社会各界的广泛关注。同时人们也需要安全、舒适的家居。现市场也有对室内环境的检测仪器,但存在有体积大、价格贵、功能少等原因,根据市场调查非常需要家居用室内安全、温湿度和室内甲醛的检测。本文设计的是家用集环境污染(甲醛)、安全、温度和湿度为一体的多功能便携式测试仪。   城市居民的气体燃料主要是液化石油、煤气和天然气。液化石油气的主要成分是丙烷、煤气的主要成分是CO和H2,天燃气主要成分是甲烷。   该设计主要包含两大部分功能,第一,空气质量包括温度、湿度、甲醛的检测。第二,室内安全测量包括CO、甲烷。 1 总体结构设计   总体结构图
[单片机]
基于51<font color='red'>单片机</font>的室内多功能检测仪的研究
单片机修改底层函数putchar()实现printf()在LCD上输出
单片机源程序如下: #include reg51.h #include intrins.h #include stdio.h #include LCD.h /*********************** 主函数函数 *************************/ void main(void){ LcdInitiate(); WriteAddress(0x00); printf( Hello Everybodyn ); printf( Pai= %.4f ,3.1415); while(1); } /*********************** 修改底层输出函数 *
[单片机]
<font color='red'>单片机</font>修改底层函数putchar()实现printf()在LCD上输出
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved