⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 浮点数开方程序.txt

📁 实用子程序.rar本子程序库对《单片机应用程序设计技术》一书附录中的子程序库作了重大修订
💻 TXT
字号:
;***浮点加子程序F_add详细的程序语句请参考前面章节***
;***浮点数除法子程序FDIV详细的程序语句请参考前面章节***
;【校验举例】  被开方数55AAH,02H  (浮点数)
;    求得平方根:68B6H,01H  (浮点数)


; 7  浮点数开方程序
 ;   如果被开方数是浮点数格式,代入的迭代初值也是浮点数格式,并且用浮点
;除法(浮点数的除以2操作可以由阶码减1得到)和浮点加法进行迭代运算,
;就是浮点数开方的基本思路。
;以下为浮点数开方的程序清单(其中包含校验程序部分)。该程序中包含浮点数
;加法程序和浮点数除法程序,这些程序与前面章节列出的程序完全相同,
;不再列出。

        LIST            P=16f877
        INCLUDE        p16f877.inc
;****************************************
;此子程序是16尾数,8位阶码开方程序
;入口条件:浮点数存放在ACCBHI和ACCBLO     EXPB单元中.
;出口条件:结果放在ACCBHI和ACCBLO EXPB单元中.
;迭代次数由LUPCNT的地址值决定
;用CALL  SQRTF指令调用,
;内含浮点除程序,浮点加减程序
;****************************************
ACCALO         EQU         20H
ACCAHI         EQU         21H
EXPA         EQU         22H
ACCBLO         EQU         23H
ACCBHI        EQU         24H
EXPB         EQU         25H
ACCCLO         EQU         26H
ACCCHI         EQU         27H
ACCDLO         EQU         28H
ACCDHI         EQU         29H
TEMP         EQU         2AH
TEMP1         EQU         2BH
TIMES         EQU         2CH
SIGN         EQU         2DH
COUNT         EQU         2EH
C_MUL         EQU         2FH
C_DIV         EQU         30H
FPOL         EQU         31H        ;符号放置位
NUMLO        EQU        32H
NUMHI        EQU        33H
NUMM        EQU        34H
FULL        EQU        35H
LUPCNT        EQU       36H
        CONSTANT     C=0
        CONSTANT     Z=2
        CONSTANT     MODEL16=1
        CONSTANT     FALSE=0
;****************************************
        ORG            0X0000
        NOP
        GOTO        MAIN
        ORG            0X0010
;****************************************
INIT1    DECF        EXPB            ;假设迭代根的初始值为其原值的一半
    MOVF        ACCBHI,W
    MOVWF        ACCAHI
    MOVF        ACCBLO,W
    MOVWF        ACCALO
    MOVF        EXPB,W
    MOVWF        EXPA 
    RETLW        0
SQRTF    MOVLW        LUPCNT
    MOVWF        COUNT
    MOVF        ACCBHI,W
    MOVWF        NUMHI
    MOVF        ACCBLO,W
    MOVWF        NUMLO
    MOVF        EXPB,W
    MOVWF        NUMM            ;存储被开方的数
    BTFSC        ACCBHI,7
    GOTO        TIQIAN            ;如果被开方数是个负数,则返回一极小数
    CALL        INIT1
SLOOP1    MOVF        NUMLO,0
        MOVWF        ACCBLO
        MOVF        NUMHI,0
    MOVWF        ACCBHI
    MOVF        NUMM,0
    MOVWF        EXPB
    CALL        FDIV
    CALL        F_add
    CALL        INIT1
    DECFSZ        COUNT,1
    GOTO        SLOOP1
    RETURN
;***********浮点加法子程序**************
F_add    CALL        SUBADJ        ;调子程序判断EXPB和EXPA的大小
    BTFSC         STATUS,Z    ;参与运算的两个数阶码相等?
    GOTO         PADD        ;是,求尾数的和
    BTFSC         STATUS,C    ;EXPB>EXPA?
    CALL         F_swap        ;是,ACCB与ACCA互换
    MOVF         EXPA,0        ;否,求取两者的差值
    SUBWF         EXPB
SCLOOP    CALL         SHFTSR        ;ACCB右移规格化
    INCFSZ         EXPB        ;EXPB=EXPA?        
    GOTO         SCLOOP        ;否,继续右移
    MOVF         EXPA,0        ;是,存和(差)的阶码
    MOVWF        EXPB
PADD    MOVF         ACCAHI,0    ;ACCAHI或ACCBHI
    IORWF         ACCBHI,0
    MOVWF         SIGN            ;存于SIGN寄存器
    MOVF        ACCBHI,0    ;暂存ACCBHI    
    MOVWF        EXPA
    CALL         D_add        ;尾数相加
    BTFSS         SIGN,7        ;ACCA和ACCB有负数?
               BTFSC         ACCBHI,7    ;否,把和的最高位和次高位同时进位?
    GOTO         ADD2        ;否,转ADD2
    BTFSS        ACCAHI,7    ;ACCA为负吗?
    GOTO        ADD3        ;ACCA和ACCB不同时为负,转ADD3
    BTFSS        EXPA,7        ;是,ACCB为负吗?
    GOTO        ADD3        
    BSF            STATUS,C    ;ACCA和ACCB同为负,带负号右移
    RRF            ACCBHI
    RRF            ACCBLO
    INCF            EXPB
ADD3    CLRF         ACCCHI        ;和(差)规格化
    CLRF         ACCCLO
    CALL         F_norm
    RETURN                    ;子程序返回
ADD2    BCF             STATUS,C    ;最高位次高位不同时进位,ACCB右移
    INCF         EXPB
    GOTO         SHFTR
SHFTSR     BCF             STATUS,C    ;ACCB带符号右移子程序
    BTFSC         ACCBHI,7
    BSF             STATUS,C
SHFTR      RRF             ACCBHI
    RRF             ACCBLO
    RETURN                    ;子程序返回


;*************比较EXPB、EXPA大小子程序*************
SUBADJ        MOVF        EXPA,0        ;EXPA异或EXPB,结果送C_DIV
    XORWF        EXPB,0
    MOVWF        C_DIV
    MOVF        EXPA,0        ;EXPB-EXPA
    SUBWF        EXPB,0
    BTFSS        C_DIV,7        ;EXPA和EXPB同号?
    RETURN                    ;是,进位位的值真确反映两者的大小,返回
    BTFSS        STATUS,C    ;否,进位位的值取反
    GOTO        CHANGEC
    BCF            STATUS,C
    RETURN
CHANGEC    BSF            STATUS,C
    RETURN


;********* ACCB、ACCA互换子程序************
F_swap    MOVF         ACCAHI,0    ;ACCAHI、ACCBHI互换
    MOVWF         TEMP
    MOVF         ACCBHI,0
    MOVWF         ACCAHI
    MOVF         TEMP,0
    MOVWF         ACCBHI
    MOVF         ACCALO,0    ;ACCALO、ACCBLO互换
    MOVWF         TEMP
    MOVF         ACCBLO,0
    MOVWF         ACCALO
    MOVF         TEMP,0
    MOVWF         ACCBLO
    MOVF         EXPA,0        ;EXPA、EXPB互换
    MOVWF         TEMP
    MOVF         EXPB,0
    MOVWF         EXPA
    MOVF         TEMP,0
    MOVWF         EXPB    
    RETURN



;***********浮点数规格化子程序****************
F_norm     MOVF         ACCBHI        ;ACCB=0?
    BTFSS         STATUS,Z
    GOTO         C_norm
    MOVF         ACCBLO
    BTFSC         STATUS,Z
    RETURN                    ;是,不需规格化,返回
C_norm    BTFSC        ACCBHI,7    ;否。ACCB为负?
     GOTO        C_norm2    
C_norm1    BTFSC         ACCBHI,6    ;为正。规格化完毕?
    RETURN                    ;ACCBHI.6=1,规格化结束
    CALL         SHFTSL        ;否。ACCB左移
    DECF         EXPB        ;EXPB减1
    GOTO         C_norm1        ;重新判断规格化完毕否?
C_norm2    BTFSS        ACCBHI,6    ;ACCB为负。规格化完毕否?
    RETURN                    ;ACCBHI.6=0,规格化结束
    BCF            STATUS,C    
    CALL        SHFTSL        ;否,ACCB左移
    BSF            ACCBHI,7    ;加符号
    DECF        EXPB        ;EXPB减1
    GOTO        C_norm2        ;重新判断规格化完毕否?
SHFTSL      BCF             STATUS ,C    ;ACCB左移子程序    
    RLF             ACCCLO        
    RLF             ACCCHI
    RLF             ACCBLO
    RLF             ACCBHI
    RETURN





;***双字节加法子程序,入口地址ACCB+ACCA,出口地址ACCB***
D_add      MOVF     ACCALO,0    ;ACCB和ACCA低半字节相加
    ADDWF     ACCBLO
    BTFSC     STATUS,C    ;有进位否?
    goto      $+6         ;有,
    MOVF      ACCAHI,0    ;ACCA、ACCB高半字节相加
    ADDWF     ACCBHI
    BTFSC     STATUS,C
    BSF       FULL,0
    RETURN    ;子程序返回
    MOVFW     ACCBHI      ;ACCB高字节加1,再加ACCAHI
    ADDLW     1h
    BTFSC     STATUS,C     ;有进位否?
    BSF       FULL,0
    MOVWF     ACCBHI
    GOTO      $-D'10'






TIQIAN    MOVLW        0X40
    MOVWF        ACCBHI
    CLRF        ACCBLO
    MOVLW        0X80
    MOVWF        EXPB        ;如果被开方数是一个负数,返回一个极小的浮点数
    RETURN      


MAIN    NOP
    MOVLW        0X55
    MOVWF        ACCBHI                
    MOVLW        0XAA
    MOVWF        ACCBLO        ;被开方数的尾数55AAH赋值
    MOVLW        0X02
    MOVWF        EXPB        ;被开方数的阶码02H赋值
    CALL        SQRTF        ;调用浮点开方子程序
    NOP                        ;开方完毕,结果在ACCBHI、ACCBLO、EXPB
        END   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -