上一篇 | 下一篇

第七章 MCS51程序设计(单片机应用教程之课次十六,电子圈原创)

发布: 2008-4-19 06:51 | 作者: feller | 来源: 本站原创 | 查看: 455次

        7.5.2 数制和码制转换程序

        实际应用中经常遇到数制和码制的转换问题,如十进制数(BCD码)与二进制数、ASCII码与二进制数之间的相互转换等。

        例:将内部RAM 30H中1字节压缩BCD表示的十进制数转换为二进制数,并存入内部RAM的20H中。

        1)题目分析

        1字节压缩BCD表示的十进制数的范围是0~99,用十六进制表示为00H~63H,转换后仍为单子节。可以采用以下两种算法实现。

        2)参考程序

        方法1:十位×10+个位

        MOV   A,30H       ;取压缩BCD

        SWAP  A

        ANL   A,#0FH      ;处理压缩BCD高4位

        MOV   B,#10

        MUL   AB          ;BCD高4位×10

        ANL   30H,#0FH    ;取压缩BCD低4位

        ADD   A,30H

        MOV   20H,A       ;存结果

        SJMP  $

        方法2:模仿十进制数转换二进制数的手算过程。采用除2取余法,二进制除2,只要右移一位,但BCD数转二进制数需要进行修正。当十位BCD数右移一位,若移入个位的数是0,则商一定是BCD数;若移入个位的数数1,则需要进行修正。因为十位除以2,到个位应为5,但在BCD数它却是8,两者相差3,因此需要进行减3调整。

        MOV   20H,#0      ;余数单元清0

        MOV   A,30H       ;取数

        MOV   R2,#8       ;8位余数

BCD1: CLR   C

        RRC   A           ;BCD数除以2

        XCH   A,20H       ;将余数移入20H单元

        RRC   A

        XCH   A,20H

        JNB   ACC.3.BCD2  ;判别高位除以2移入低位,为1则减3修正

        CLR   C

        SUBB  A,#3

BCD2: DJNZ  R2,BCD1     ;判断移位8位是否结束

        MOV   20H,A       ;存结果

        SJMP  $

        例:将ASCII码转换为二进制数

        1)题目分析

        从ASCII编码表可知,若4位二进制数小于10,则此二进制数加上30H即变为相应的ASCII码。若4位二进制数大于等于10,则应加上37H。

        2)硬件资源分配

        入口参数:R2:存转换前ASCII码

        出口参数:R2:存转换后的二进制数

        3)参考程序

        ORG   1000H

L1:   MOV   A,R2

        CLR   C

        SUBB  A,#30H      ;ASCII码减30H

        MOV   R2,A

        SUBB  A,#0AH

        JC    LOOP        ;该数小于10则返回主程序

        MOV   A,R2

        SUBB  A,#07H

        MOV   R2,A

LOOP: RET

        7.5.3 定点数运算程序

        定点数就是小数点固定的数,它包括整数、小数和混合小数等。另外,按数的正负可分为无符号数和带符号数,对于有符号数有原码、补码和反码等几种表示方法。

        1)双字节数取补子程序

        例:将(R4、R5)中的双字节数取补结果送R4、R5

        参考程序:

        CMPT: MOV  A,R5

        CPL  A

        ADD  A,#1

        MOV  R5,A

        MOV  A,R4

        CPL  A

        ADDC A,#0

        MOV  R4,A

        RET

        2)双字节无符号数加减程序

        补码表示的数可以直接相加,所以双字节无符号数加减程序也适用于补码的加减法。利用MCS51的加法和减法指令可以直接写出加减法的程序。

        例:将(R2)(R3)和(R6)(R7)两个双字节无符号数相加,结果送R4、R5。

        参考程序:

NADD:MOV  A,R3

        ADD  A,R7

        MOV  R5,A

        MOV  A,R2

        ADDC A,R6

        MOV  R4,A

        RET

        例:将(R2)(R3)和(R6)(R7)两个双字节数相减,结果送R4、R5。

        参考程序:

NSUB1:MOV  A,R3

        CLR  C

        SUBB A,R7

        MOV  R5,A

        MOV  A,R2

        SUBB A,R6

        MOV  R4,A

        RET

        3)原码加减运算程序

        对于原码表示的数(有符号数),不能直接执行加减运算,必须先按操作数的符号决定运算种类,然后再对数值部分执行操作。

        对原码表示的数进行加法运算,首先应判断两个数的符号位是否相同:

        ◆若相同,则执行加法(注意:这时运算只对数值部分进行,不包括符号位),加法结果有溢出时,则最终结果溢出;加法结果无溢出时,则最终结果无溢出;并以被加数或加数符号作为结果的符号位。

        ◆如果两个数的符号位不相同,则执行减法(注意:这时运算只对数值部分进行,不包括符号位)。如果相减的差数为正,则该差数即为最后结果,并以被加数的符号位作为结果的符号位;如果相减的差数为负,则应对差数取补,而把加数的符号位作为结果的符号位。

        对原码表示的数减法运算,只需先把减数的符号位取反,然后执行加法运算。设被加数(或被减数)为A,它的符号位为A0,数值为A*,加数(或减数)为B,它的符号位为B0,数值位为B*。A、B均为原码表示的数,则按上述的算法可得出图7-7的原码加减运算框图。


图7-7 原码加减运算程序流程图

        4)无符号二进制数乘法程序

        模拟手算乘法的方法,可以用重复的加法来实现乘法。当被乘数和乘数有相同的字长时,它们的积为双字长,乘法的运算过程如下:

        ◆清“0”部分积。

        ◆从最低位开始检查各个乘数位。

        ◆如乘数位为1,加被乘数至部分积;否则不加。

        ◆左移1位被乘数。

        ◆步骤(2)~(4)重复n次(n为字长)。

        实际用程序实现这一算法时,把结果单元与乘数联合组成一个双倍位字,左移被乘数改用右移结果与乘数,这样一方面可以简化加法;另一方面可用右移来完成乘数最低位的检查,得到的乘积为双倍位字。

        例:将(R2R3)和(R6R7)两个双字节无符号数相乘,结果送R4R5R6R7。根据图7-8(a)的算法,可以得到如图7-8(b)所示的双字节乘法程序框图。

              (a)                                (b)


图7-8 无符号双字节二进制数乘法程序框图

        5)原码有符号乘法程序

        对原码表示的带符号的二进制数乘法,只需要在乘法之前,先按同符号为正、异号得负的原则,得出积的符号,然后清“0”符号位;执行无符号乘法,最后送积的符号。

        6)无符号二进制数除法程序

        除法也可以采用类似于人工手算除法的方法。首先对被除数高位和除数进行比较,如果被除数高位大于除数,则商位为1,并从被除数减去除数,形成一个部分余数;如果被除数高位小于除数,商位为0不执行减法。接着把部分余数左移1位,并与除数再次进行比较。如此循环直至被除数的所有位都处理完为止。一般商如果为n位,则需循环n次。这种除法先比较被除数和除数的大小,根据比较结果确定上商1或0,并且上商1时才执行减法,我们称之为比较除法。

        一般情况下,如果除数和商均为双字节,则被除数为4个字节。如果被除数的高两个字节大于或等于除数,则发生溢出,即商不能用双字节表示。所以,在除法之前先检验是否会发生溢出,如果溢出则置溢出标志不执行除法。

        例:将(R2、R3、R4、R5)和(R6、R7)中两个无符号数相除,结果商送R4、R5,余数送R2、R3。

              (a)                                                                                     (b)


图7-9 无符号双字节除法程序框图

        7)原码表示的有符号双字节除法程序

        原码除法与原码乘法一样,只要在除法之前,先计算商的符号(同号为正,异号为负),然后清“0”符号位,执行不带符号的除法,最后送商的符号。

        7.5.4 浮点数运算程序

        (1)浮点数的表示

        1)二进制浮点数操作

        用三个字节表示,第一个字节的最高位为数符,其余七位为阶码(补码形式),第二字节为尾数的高字节,第三字节为尾数的低字节,尾数用双字节纯小数(原码)来表示。当尾数的最高位为1时,便称为规格化浮点数,简称操作数

        2)十进制浮点数操作

        用三个字节表示,第一个字节的最高位为数符,用来表示正负数(0表示正数,1表示负数)其余七位为阶码(二进制补码形式),第二字节为尾数的高字节,第三字节为尾数的低字节,尾数用双字节BCD码纯小数(原码)来表示。当十进制数的绝对值大于1时,阶码就等于整数部分的位数。

        例如:156.6  的阶码是03H,-156.6 的阶码是  83H ;

        当十进制数的绝对值小于 1 时,阶码就等于  80H  减去小数点后面零的个数。

        例如 :0.00362的阶码是 7EH ,-0.00362 的阶码是  0FEH 。

        例如:有一个十进制浮点操作数存放在30H、31H、32H中,数值是-0.07315,即-0.7315 乘以10 的-1 次方,则阶码为7FH,若加上数符(30H)=0FFH,31H=73H,(32H)=15H 。

        3)运算精度

        单次定点运算精度为结果最低位的当量值;单次二进制浮点算术运算的精度优于十万分之三;单次二进制浮点超越函数运算的精度优于万分之一;BCD码浮点数本身的精度比较低(万分之一到千分之一),不宜作为运算的操作数,仅用于输入或输出时的数制转换。不管那种数据格式,随着连续运算的次数增加,精度都会下降。

        (2)浮点数加减法子程序

        执行加减法前,必须先对准小数点,然后才能按定点小数加减法操作。当两个浮点数阶码相等时,它们的尾数可以相加。如果阶码不相等,首先要对阶,使小数点对齐,才能进行加减操作。由于结果不一定为规格化的数,因此必须在运算结束后进行规格化操作。

        如果运算结果的尾数m>1,则应将尾数右移一位,阶码加1,称为右规格化;当尾数<1/2,应将尾数左移一位,阶码减1,称为左规格化。

        例:3字节浮点数通用规格化子程序

        1)题目分析  子程序功能为:

        CY=0 执行右规格化

        CY=1 执行左规格化

        F0=0  对浮点数1:R3(阶)R7、R6(尾)进行右移一位

        F0=1  对浮点数2:R2(阶)R5、R4(尾)进行右移一位

        2)硬件资源分配

        R7、R6:浮点数1的尾数,R3:浮点数1的阶

        R5、R4:浮点数2的尾数,R2:浮点数2的阶

        39H:右移输入位

        3)程序流程图如图7-10所示


图7-10 浮点数规格化子程序流程图

 

        例:将R3、R7、R6和R2、R5、R4中的两个三字节数相加或相减,结果送R5、R7、R6。如果入口时位地址3AH=0,则执行加法;如果3AH=1,则执行减法。执行加减运算时要先对阶,采用小阶向大阶靠的方法。

        1)题目分析

        两个异号数相加,相当于两个同号数相减;两个异号数相减,相当于两个同号数相加。

        2)硬件资源分配

        R7、R6:浮点数1的尾数,R3:浮点数1的阶

        R5、R4:浮点数2的尾数,R2:浮点数2的阶

        38H:存被加数符号,39H:运算溢出标志,3AH:加减标志位

        3)程序流程图如图7-11所示


图7-11 浮点数加减运算子程序流程图

        (3)浮点数乘法子程序

        执行浮点数乘法比加减法方便,不需要对准小数点,只要将阶码相加,尾数相乘即可。设浮点数1的尾数为m1,浮点数2的尾数为m2,对于两个规格化浮点数,尾数相乘,0.25≤m1m2<1,不会产生溢出,但可能需进行左规格化。

        例:浮点数乘法子程序

        1)题目分析

        3字节浮点数N1、N2相乘。N1×N2->R3(阶)R7、R6(尾数);2字节尾数相乘,结果为4字节。调用2字节无符号数乘法子程序。用规格化3字节浮点数表示乘积,要舍去2字节。结果4舍5入处理。

        2)硬件资源分配

        R7、R6:浮点数1的尾数,R3浮点数1的阶

        R5、R4:浮点数2的尾数,R2浮点数2的阶

        38H:存积符号

        3)程序流程图如图7-12所示


图7-12 浮点数乘法子程序流程图

        (4)浮点数除法子程序

        执行浮点数除法与浮点数乘法不同,不能对尾数直接调用双字节定点小数除法子程序。因为浮点数除法在入口时,应满足被除数小于除数的条件,否则商将大于1,无法用小数表示。所以执行浮点除法时,要先调整小数点的位置(即调整阶码),使被除数的尾数m1小于除数的尾数m2。

        执行浮点数除法应先调整被除数的尾数,使m1<m2,然后阶码相减,尾数相除。结果不需要进行规格化。

        例:浮点除法子程序

        1)题目分析

        已知3字节浮点数N1和N2。N1/N2->R3(阶)R7、R6(尾数)。先判断是否满足m1<m2的条件。如满足条件,则直接调用2字节除法子程序,如不满足条件,则浮点数N1先执行右规格化,然后再调用2字节除法子程序。

        2)硬件资源分配

        R7、R6:浮点数1的尾数,R3浮点数1的阶

        R5、R4:浮点数2的尾数,R2浮点数2的阶

        38H:存积符号

        3)程序流程图如图7-13所示。


图7-13 浮点数除法运算子程序流程图

TAG: BCD 程序设计 单片机 二进制数 教程

字号: | 推荐给好友

 

评分:0

我来说两句