?? 定點數開方子程序.txt
字號:
;****************************************
;【校驗舉例】 被開方數2910H(十六進制)
; 10512(十進制)
; 求得平方根:66H(十六進制)
; 102(十進制)
; 6 定點數開方子程序
; 從數值計算方法可知,方程G(X)=0可以由牛頓迭代法來求解。牛頓迭代法的
;一個重要應用就是開平方,就是通過對以下方程求解得到M的平方根:
;函數G(X)在X0點用一階泰勒級數展開可得:
;如果Y是方程G(X)=0的根,那么G(Y)=0,即:
;忽略高階項,而只取前兩項,就可以得到根Y的近似值,即
;把此方程寫成離散形式的迭代方程為:
;又因為: ,所以 ,代入迭代方程可得:
;這里M的平方根初值取M/2。如果在此之前知道M的平方根的范圍,則可以取一個
;比M/2更好的初值開始迭代,可以減少迭代的次數。
;如果被開方數是定點數格式,代入的迭代初值也是定點數格式,并且用定點除法
;(定點數的除2操作可以由右移一位得到)和定點加法進行迭代運算,則就是
;定點數開方。
;定點數開方只能得到結果的整數部分,如代入FFFFH和FF10H的開方結果都是一樣
;的,為FFH。如果想要得到比較精確的結果,可以先對被開方數乘以一個系數,
;待得到結果后,再除以相應的系數。如果被開方數太大,則不能使用此法,
;若想得到比較精確的結果,可以采用后面介紹的“浮點數開方”。
;以下為定點數開方的程序清單(其中包含校驗程序部分)。該程序中包含定點數
;加法程序和定點數除法程序。
LIST p=16f877
INCLUDE p16f877.inc
;****************************************
;此子程序是求16位二進制數平方根的子程序,需要調用16/16位除法子程序和
;加法子程序,雖然前面有了,但標號有些不同,為了易于閱讀和理解,也把它列在后面。
;入口條件:16位二進制數存放在NUMHI和NUMLO單元中。
;出口條件:8位二進制數存放在SQRTLO單元中。
;迭代次數由LUPCNT的地址值決定。
;用指令CALL SQRT實現定點數開方程序調用
;****************************************
ACCALO EQU 0X20
ACCAHI EQU ACCALO+1
EXPA EQU ACCALO+2
ACCBLO EQU ACCALO+3
ACCBHI EQU ACCALO+4
EXPB EQU ACCALO+5
ACCCLO EQU ACCALO+6
ACCCHI EQU ACCALO+7
ACCDLO EQU ACCALO+8
ACCDHI EQU ACCALO+9
TEMP EQU ACCDHI+1
SIGN EQU ACCDHI+2
SQRTLO EQU ACCALO
SQRTHI EQU ACCAHI
NUMLO EQU ACCDHI+4
NUMHI EQU ACCDHI+5
COUNT EQU ACCDHI+6
;此方法定義的數據塊為連續層斷,只要
;將第一行改變,就可以將數據整塊搬動到
;新的地方,為調試帶來方便,是比較推
;崇的一種寄存器定義方法
LUPCNT EQU .10
;****************************************
ORG 0X00
GOTO MAIN
ORG 0X10
;****************************************
INIT MOVLW LUPCNT
MOVWF COUNT
MOVF NUMHI,0
MOVWF SQRTHI
MOVF NUMLO,0
MOVWF SQRTLO
BCF STATUS,C
RRF SQRTHI,1
RRF SQRTLO,1
RETLW 0
;***************16×16位定點數右移子程序***************
DIV2 BCF STATUS,C
RRF ACCBHI,0
MOVWF SQRTHI
RRF ACCBLO,0
MOVWF SQRTLO
RETLW 0
;*********16×16位定點數開方子程序**********
SQRT CALL INIT
SLOOP MOVF NUMLO,0
MOVWF ACCBLO
MOVF NUMHI,0
MOVWF ACCBHI
CALL D_DIVS
CALL D_ADD
CALL DIV2
DECFSZ COUNT,1
GOTO SLOOP
RETURN
;***********16×16位定點整數除法子程序*********
D_DIVS CALL SETUP
CLRF ACCCHI
CLRF ACCCLO
DLOOP BCF STATUS,C
RLF ACCDLO
RLF ACCDHI
RLF ACCCLO
RLF ACCCHI
MOVF ACCAHI,0
SUBWF ACCCHI,0
BTFSS STATUS,Z
GOTO NOCHK
MOVF ACCALO,0
SUBWF ACCCLO,0
NOCHK BTFSS STATUS,C
GOTO NOGO
MOVF ACCALO,0
SUBWF ACCCLO,1
BTFSS STATUS,C
DECF ACCCHI,1
MOVF ACCAHI,0
SUBWF ACCCHI,1
BSF STATUS,C
NOGO RLF ACCBLO
RLF ACCBHI
DECFSZ TEMP
GOTO DLOOP
RETLW 0
;****************************************
SETUP MOVLW .16
MOVWF TEMP
MOVF ACCBHI,0
MOVWF ACCDHI
MOVF ACCBLO,0
MOVWF ACCDLO
CLRF ACCBHI
CLRF ACCBLO
RETLW 0
;**********16×16位定點數取補子程序**************
NEG_A COMF ACCALO,1
INCF ACCALO,1
BTFSC STATUS,Z
DECF ACCAHI,1
COMF ACCAHI,1
RETLW 0
;*************16×16位定點數加法子程序**************
D_ADD MOVF ACCALO,0
ADDWF ACCBLO,1
BTFSC STATUS,C
INCF ACCBHI,1
MOVF ACCAHI,0
ADDWF ACCBHI,1
RETLW 0
MAIN NOP
MOVLW 0X0af
MOVWF NUMHI
MOVLW 0X58
MOVWF NUMLO ;被開方數賦值
CALL SQRT ;調用開方子程序
goto $ ;開方完畢
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -