MCS51浮点计算程序

发布者:EnchantedMagic最新更新时间:2016-12-14 来源: eefocus关键字:MCS51  浮点计算 手机看文章 扫描二维码
随时随地手机看文章

MSC-51 3字节和4字节浮点数计算程序,主要用于数据采集及上传,经过IEEE转换,在上位机直接显示.



;这是本人使用的MSC-51 3字节和4字节浮点数计算程序,主要用于数据采集及上传,经过IEEE转换,在上位机直接显示。

;本人还有热电阻和热电偶温度查表计算程序,有需要可EMAIL:majingsong1@2911.net


; FLOATING PROGRAM 

;

;##########################################

;##########################################

;-----------------------------------------------

; IEEE754 FLOAT CONVERT TO 4 BYTES FLOAT

; INPUT: ((R0))((R0)+1)((R0)+2)((R0)+3) IEEE-754 FLOAT

; OUTPUT: R4 R5R6R7    4 BYTES FLOAT

;-----------------------------------------------

IEE_F:MOV    A,@R0

    JNZ    CON_0

    INC    R0

    MOV    A,@R0

    JNZ    CON_1

    INC    R0

    MOV    A,@R0

    JNZ    CON_2

    INC    R0

    MOV    A,@R0

    JNZ    CON_3

    MOV    R4,#0

    MOV    R5,#0

    MOV    R6,#0

    MOV    R7,#0

    DEC    R0

    DEC    R0

    DEC    R0

    RET

CON_3:DEC    R0

CON_2:DEC    R0

CON_1:DEC    R0

CON_0:CLR    FLAG_0

    INC    R0

    MOV    A,@R0

    RLC    A

    MOV    R5,A

    DEC    R0

    MOV    A,@R0

    RLC    A

    MOV    R4,A

    JNC    SA_IE

    SETB    FLAG_0

SA_IE: CLR    C

    MOV    A,R4

    SUBB    A,#7FH

    CLR    C

    INC    A

    MOV    C,ACC.7

    MOV    ACC.6,C

    MOV    C,FLAG_0

    MOV    ACC.7,C

    MOV    R4,A

    MOV    A,R5

    SETB    C

    RRC    A

    MOV    R5,A

    INC    R0

    INC    R0

    MOV    A,@R0

    MOV    R6,A

    INC    R0

    MOV    A,@R0

    MOV    R7,A

    DEC    R0

    DEC    R0

    DEC    R0

    RET

;---------------------------------------------

; 4 BYTES FLOAT CONVERT TO IEEE754 FLOAT

; INPUT: ((R0)) R2R3R4 4 BYTES FLOAT

; OUTPUT: ((R1)) ((R1)+1) ((R1)+2) ((R1)+3)

; IEEE-754 FLOAT

;---------------------------------------------

F_IEE:

    INC    R0

    MOV    A, @R0

    MOV    R2, A

    INC    R0

    MOV    A, @R0

    MOV    R3, A

    INC    R0

    MOV    A, @R0

    MOV    R4, A

    DEC    R0

    DEC    R0

    DEC    R0


    MOV    A,R2

    JZ    ZERO_IEE

    MOV    A,@R0

    MOV    C,ACC.7

    MOV    FLAG_0,C

    CLR    ACC.7

    MOV    C,ACC.6

    JC    F_FF

    DEC    A

    CLR    C

    ADD    A,#7FH

    LJMP    F_TR

F_FF:    CLR    C

    SUBB    A,#02H

F_TR:    MOV    C,FLAG_0

    RRC    A

    MOV    @R1,A

    INC    R1

    MOV    A,R2

    MOV    ACC.7,C

    MOV    @R1,A

    INC    R1

    MOV    A,R3

    MOV    @R1,A

    INC    R1

    MOV    A,R4

    MOV    @R1,A

FIEE_OFF:DEC R1

    DEC    R1

    DEC    R1

    RET

ZERO_IEE:MOV @R1,A

    INC    R1

    MOV    @R1,A

    INC    R1

    MOV    @R1,A

    INC    R1

    MOV    @R1,A

    SJMP    FIEE_OFF

;==========================================

; 2 BYTE MUL

; 0.R2R3 * 0.R4R5→0.R2R3R7

;------------------------------------------

D2_MUL: MOV    A, R3

    MOV    B, R5

    MUL    AB

    MOV    R7, B

    MOV    A, R3

    MOV    B, R4

    MUL    AB

    ADD    A, R7

    MOV    R7, A

    CLR    A

    ADDC    A, B

    MOV    R3, A

    MOV    A, R2

    MOV    B, R5

    MUL    AB

    ADD    A, R7

    MOV    A, R3

    ADDC    A, B

    MOV    R3, A

    MOV    PSW.5, c

    MOV    A, R2

    MOV    B, R4

    MUL    AB

    ADD    A, R3

    MOV    R3, A

    CLR    A

    ADDC    A, B

    MOV    C, PSW.5

    ADDC    A, #0

    MOV    R2, A

    RET


;------------------------------

; 2 BYTE DIV

; 0.R2R3R7R6 / 0.R4R5→0.R2R3

; INPUT 0.R2R3  < 0.R4R5

;------------------------------

D2_DIV: MOV    A, R1

    PUSH    ACC

    MOV    B, #10H

A2O:    CLR    C

    MOV    A, R6

    RLC    A

    MOV    R6, A

    MOV    A, R7

    RLC    A

    MOV    R7, A

    MOV    A, R3

    RLC    A

    MOV    R3, A

    XCH    A, R2

    RLC    A

    XCH    A, R2

    MOV    PSW.5, C

    CLR    C

    SUBB    A, R5

    MOV    R1, A    

    MOV    A, R2

    SUBB    A, R4

    JB    PSW.5, A2S

    JC    A2R

A2S:    MOV    R2, A

    MOV    A, R1

    MOV    R3, A

    INC    R6

A2R:    DJNZ    B, A2O

    POP    ACC

    MOV    R1, A

    MOV    A, R7

    MOV    R2, A

    MOV    A, R6

    MOV    R3, A

    RET


;--------------------------------------

; 3 BYTE FLOAT LOAD

; ((R0))→R6,((R0)+1)→R2,((R0)+2)→R3

; ((R1))→R7,((R1)+1)→R4,((R0)+2)→R5

;--------------------------------------

F3_MLD: MOV    A, @R0

    MOV    R6, A

    INC    R0

    MOV    A, @R0

    MOV    R2, A

    INC    R0

    MOV    A, @R0

    MOV    R3, A

    DEC    R0

    DEC    R0

    MOV    A, @R1

    MOV    R7, A

    INC    R1

    MOV    A, @R1

    MOV    R4, A

    INC    R1

    MOV    A, @R1

    MOV    R5, A

    DEC    R1

    DEC    R1

    RET


;--------------------------------------

; 3 BYTE FLOAT STANDED

;--------------------------------------

F3_SDT: JC    M3A

    MOV    C, FLAG39

    JB    PSW.5, M3B

    MOV    A, R2

    RRC    A

    MOV    R2, A

    MOV    A, R3

    RRC    A

    MOV    R3, A

    INC    R6

    RET

M3B:    MOV    A, R4

    RRC    A

    MOV    R4, A

    MOV    A, R5

    RRC    A

    MOV    R5, A

    INC    R7

    RET

M3A:    MOV    A, R2

    JNZ    M3C

    CJNE    R3, #0, M3D

    MOV    R6, #41H

M3E:    RET

M3C:    JB    ACC.7, M3E

M3D:    MOV    C, PSW.5

    MOV    A, R3

    RLC    A

    MOV    R3, A

    MOV    A, R2

    RLC    A

    MOV    R2, A

    CLR    PSW.5

    DEC    R6

    SJMP    M3A

    RET


;--------------------------------------

; 3 BYTE FLOAT ADD OR SUB 

; R6R2R3 + R7R4R5→R4R2R3

; R6R2R3 - R7R4R5→R4R2R3

; FLAG3A = 0 ADD FLAG3A = 1 SUB

;--------------------------------------

F3_ABP: MOV    A, R6

    MOV    C, ACC.7

    MOV    FLAG38, C

    XRL    A, R7

    JNB    ACC.7, SQ

    CPL    FLAG3A

    MOV    A, R6

    MOV    C, ACC.6

    MOV    ACC.7, C

    MOV    R6, A

    MOV    A, R7

    MOV    C, ACC.6

    MOV    ACC.7, C

    MOV    R7, A

SQ:    CLR    C

    MOV    A, R6

    SUBB    A, R7

    JZ    ST

    CLR    PSW.5

    CLR    FLAG39

    JB    ACC.7, SW

    CJNE    R4, #00H, SE

    CJNE    R5, #00H, SE

ST:    JB    FLAG3A, SY

    MOV    A, R3

    ADD    A, R5

    MOV    R3, A

    MOV    A, R2

    ADDC    A, R4

    MOV    R2, A

    JNC    SD

    SETB    FLAG39

    CLR    C

SF:    CLR    PSW.5

    LCALL    F3_SDT

SD:    MOV    A, R6

    MOV    C, FLAG38

    MOV    ACC.7, C

    XCH    A, R4

    MOV    R6, A

    RET

SW:    CJNE    R2, #00H, SF

    CJNE    R3, #00H, SF

    MOV    A, R7

    MOV    R6, A

    SJMP    ST

SE:    CPL    PSW.5

    CLR    C

    LCALL    F3_SDT

    SJMP    SQ

SY:    MOV    A, R3

    CLR    C

    SUBB    A, R5

    MOV    R3, A

    MOV    A, R2

    SUBB    A, R4

    MOV    R2, A

    JNC    SL

    CLR    A

    CLR    C

    SUBB    A, R3

    MOV    R3, A

    CLR    A

    SUBB    A, R2

    MOV    R2, A

    CPL    FLAG38

SL:    SETB    C

    SJMP    SF


;--------------------------------------

;3 BYTE FLOAT ADD

; ((R0))((R0)+1)((R0)+2) + ((R1))((R1)+1)

;     ((R1)+2)→R4R2R3

; FLAG3A = 0  

;--------------------------------------

F3_ADD: CLR    FLAG3A

    LCALL    F3_MLD

    LCALL    F3_ABP

    RET


;--------------------------------------

; 3 BYTE SUB

; ((R0))((R0)+1)((R0)+2) - 

; ((R1))((R1)+1)((R1)+2)→R4R2R3

; FLAG3A =  1

;--------------------------------------

F3_SUB: SETB    FLAG3A

    LCALL    F3_MLD

    LCALL    F3_ABP

    RET


;--------------------------------------

; 3 BYTE FLOAT MUL

; ((R0))((R0)+1)((R0)+2) * 

; ((R1))((R1)+1)((R1)+2)→R4R2R3

;--------------------------------------

F3_MUL: LCALL  F3_MLD

    MOV    A, R6

    XRL    A, R7

    MOV    C, ACC.7

    MOV    FLAG38, C

    LCALL    D2_MUL

    MOV    A, R7

    MOV    C, ACC.7

    MOV    PSW.5, C

    MOV    A, @R0

    ADD    A, @R1

    MOV    R6, A

    SETB    C

    LCALL    F3_SDT

    MOV    A, R6

    MOV    C, FLAG38

    MOV    ACC.7, C

    MOV    R4, A

    RET


;--------------------------------------

; 3 BYTE FLOAT DIV

; ((R0))((R0)+1)((R0)+2) / 

; ((R1))((R1)+1)((R1)+2)→R4(阶)R2R3

; C = 0 NORMAL ,C = 1 DIV BY 0

;--------------------------------------

F3_DIV: LCALL    F3_MLD

    MOV    A, R6

    XRL    A, R7

    MOV    C, ACC.7

    MOV    FLAG38, C

    CLR    A

    MOV    R6, A

    MOV    R7, A

    CJNE    R4, #00H, TY

    CJNE    R5, #00H, TY

    SETB    C

    RET

TY:    MOV    A, R3

    SUBB    A, R5

    MOV    A, R2

    SUBB    A, R4

    JC    TU

    CLR    PSW.5

    CLR    FLAG39

    LCALL    F3_SDT

    MOV    A, R7

    RRC    A

    MOV    R7, A

    CLR    C

    SJMP    TY

TU:    CLR    A

    XCH    A, R6

    PUSH    ACC

    LCALL    D2_DIV

    POP    ACC

    ADD    A, @R0

    CLR    C

    SUBB    A, @R1

    MOV    C, FLAG38

    MOV    ACC.7, C

    MOV    R4, A

    CLR    C

    RET


;-------------------------------

; 3BYTE FLOAT STORE

; R4R2R3 TO (R1)(R1+1)(R1+2)

;-------------------------------

F3_STR: MOV    A, R4

    MOV    @R1, A

    INC    R1

    MOV    A, R2

    MOV    @R1, A

    INC    R1

    MOV    A, R3

    MOV    @R1, A

    DEC    R1

    DEC    R1

    RET


;--------------------------------

; 3 BYTE FLOAT SQRT

; F0 = 0 NORMAL ,F0 = 1 ERROR

;--------------------------------

F3_SQRT:MOV    A, @R0

    JB    ACC.7, BV

    MOV    @R1, A

    INC    R0

    INC    R1

    MOV    A, @R0

    MOV    @R1, A

    INC    R0

    INC    R1

    MOV    A, @R0

    MOV    @R1, A

    DEC    R0

    DEC    R0

    DEC    R1

    DEC    R1

BM:    LCALL    F3_DIV

    MOV    R6, A

    MOV    A, @R1

    MOV    R7, A

    INC    R1

    MOV    A, @R1

    MOV    R4, A

    INC    R1

    MOV    A, @R1

    MOV    R5, A

    DEC    R1

    DEC    R1

    CLR    FLAG3A

    LCALL    F3_ABP

    DEC    R4

    CLR    PSW.5

    MOV    A, R4

    MOV    B, R7

    CJNE    A, B, BN

    MOV    A, R5

    SUBB    A, R3

    ANL    A, #0FCH

    MOV    R7, A

    MOV    A, R6

    SUBB    A, R2

    JNZ    BN

    CJNE    R7, #00H, BN

    SETB    PSW.5

BN:    LCALL    F3_STR

    JNB    PSW.5, BM

    RET

BV:    CLR    PSW.5

    RET


;------------------------------------

; 3 BYTE BIN TO 4 BYTE FLOAT 

; INPUT ADDRESS (R0),OUTPUT ADDRESS (R1)

;------------------------------------

F3_BTF:MOV    A, #10H

    MOV    R2, A

    MOV    A, @R0

    MOV    R3, A

    INC    R0

    MOV    A, @R0

    MOV    R4, A

    DEC    R0

    MOV    A, R3

    ORL    A, R4

    JNZ    FRLN1

    MOV    R2, A

    MOV    R3, A

    MOV    R4, A

    JMP    FRLN2

FRLN1:    MOV    A, R3

    JB    ACC.7, FRLN2

    LCALL    FRL1

    SJMP    FRLN1

FRLN2:    INC    R1

    INC    R1

    MOV    A, R4

    MOV    @R1, A

    DEC    R1

    MOV    A, R3

    MOV    @R1, A

    DEC    R1

    MOV    A, R2

    CLR    ACC.7

    CLR    ACC.6

    MOV    @R1, A

    RET


FRL1:    CLR    C

    MOV    A, R4

    RLC    A

    MOV    R4, A

    MOV    A, R3

    RLC    A

    MOV    R3, A

    DEC    R2

    MOV    A, R2

    XRL    A, #0C0H

    JNZ    FRL1E

    MOV    R2, A

    MOV    R3, A

    MOV    R4, A

FRL1E:    RET


;------------------------------------

; 3 BYTE FLOAT BIN TO DEC

; INPUT DATA: FLAG3E = 0 1 <= DATA < 10

; FLAG3E = 1 FLAG3F = 0 0.2 <= DATA < 2

; FLAG3E = 1 FLAG3F = 1 0.4 <= DATA < 4

;------------------------------------

F3_BTD: MOV    A, @R0

    MOV    C, ACC.7

    MOV    FLAG3C, C

    MOV    C, ACC.6

    MOV    ACC.7, C

    MOV    R6, A

    INC    R0

    MOV    A, @R0

    MOV    R2, A

    INC    R0

    MOV    A, @R0

    MOV    R3, A

    DEC    R0

    DEC    R0

    CJNE    R2, #00H, PA

    CJNE    R3, #00H, PA

    CLR    A

    MOV    @R1, A

    INC    R1

    MOV    @R1, A

    INC    R1

    MOV    @R1, A

    INC    R1

    MOV    @R1, A

    INC    R1

    MOV    @R1, A

    INC    R1

    MOV    @R1, A

PL:    DEC    R1

    DEC    R1

    DEC    R1

    DEC    R1

    DEC    R1

    RET

PA:    MOV    @R1, #00H

    JB    FLAG3E, PB

    DEC    @R1

PB:    INC    R1

    MOV    @R1, #01H

    JNB    FLAG3E, PD

    INC    @R1

    JNB    FLAG3F, PD

    INC    @R1

PD:    MOV    A, R6

    CLR    C

    SUBB    A, @R1

    JZ    PX

    JNB    ACC.6, PE

PM:    DEC    @R1

    DEC    @R1

    DEC    @R1

    DEC    @R1

PZ:    MOV    A, R6

    CLR    C

    SUBB    A, @R1

    JZ    PY

    JB    ACC.6, PF

PQ:    JNB    FLAG3E, PG

    DEC    R6

    JNB    FLAG3F, PG

    DEC    R6

PG:    CJNE    R6, #00H, PH

    MOV    R6, #05H

    JNB    FLAG3E, PI

    MOV    R7, #01H

    JNB    FLAG3F, PJ

    INC    R7

PJ:    CLR    A

    CLR    C

PK:    XCH    A, R3

    RLC    A

    XCH    A, R3

    XCH    A, R2

    RLC    A

    XCH    A, R2

    RLC    A

    DJNZ    R7, PK

    DEC    R6

    MOV    @R1, A

    INC    R1

PI:    MOV    A, R3

    MOV    B, #0AH

    MUL    AB

    MOV    R3, A

    MOV    R7,B

    MOV    A, R2

    MOV    B, #0AH

    MUL    AB

    ADD    A, R7

    MOV    R2, A

    CLR    A

    ADDC    A, B

    MOV    @R1, A

    INC    R1

    DJNZ    R6, PI

    SJMP    PL

PX:    MOV    A, R2

    SUBB    A, #80H

    JC    PM

PE:    MOV    R5, #0CDH

    MOV    R4, #0CCH

    LCALL    D2_MUL

    MOV    A, R2

    JB    ACC.7, PN

    MOV    A, R7

    MOV    C, ACC.7

    ORL    C, ACC.6

    MOV    A, R3

    RLC    A

    MOV    R3, A

    MOV    A, R2

    RLC    A

    MOV    R2, A

    DEC    R6

PT:    MOV    A, R6

    ADD    A, #0FDH

    MOV    R6, A

    DEC    R1

    INC    @R1

    INC    R1

    SJMP    PD

TPS:    SJMP    PZ

PH:    MOV    A, R2

    RRC    A

    MOV    R2, A

    MOV    A, R3

    RRC    A

    MOV    R3, A

    INC    R6

    SJMP    PG

PY:    MOV    A, #0CBH

    CLR    C

    SUBB    A, R3

    MOV    A, #0CCH

    SUBB    A, R2

    JC    PQ

PF:    MOV    R4, #0A0H

    MOV    R5, #00H

    LCALL    D2_MUL

    MOV    A, R2

    JB    ACC.7, PR

    MOV    A, R7

    MOV    C, ACC.7

    ORL    C, ACC.6

    MOV    A, R3

    RLC    A

    MOV    R3, A

    MOV    A, R2

    RLC    A

    MOV    R2, A

    DEC    R6

PU:    MOV    A, R6

    ADD    A, #04H

    MOV    R6, A

    DEC    R1

    DEC    @R1

    INC    R1

    SJMP    TPS

PN:    MOV    A, R7

    JNB    ACC.7, PT

    MOV    A, R3

    ORL    A, #01H

    MOV    R3, A

    SJMP    PT

PR:    MOV    A, R7

    JNB    ACC.7, PU

    MOV    A, R3

    ORL    A, #01H

    MOV    R3, A

    SJMP    PU


;-----------------------------------

; 4 BITE FLOAT MUL

;((R0))((R0)+1)((R0)+2)((R0)+3)*

; ((R1))((R1)+1)((R1)+2)((R1)+3)

; TO R4R5R6R7

;-----------------------------------

F4_MUL: LCALL F4_LD

    INC    R1

    MOV    A, R0

    PUSH    ACC

    LCALL    D3_MUL

    POP    ACC

    MOV    R0, A

    DEC    R1

    MOV    A, R2

    MOV    C, ACC.7

    MOV    PSW.5, C

    MOV    A, @R0

    XRL    A, @R1

    MOV    C, ACC.7

    MOV    FLAG38, C

    MOV    A, @R0

    ADD    A, @R1

    XCH    A, R0

    PUSH    ACC

    SETB    C

    LCALL    F4_STD

    POP    ACC

    XCH    A, R0

    MOV    C, FLAG38

    MOV    ACC.7, C

    MOV    R4, A

    RET


;-----------------------------------

; 4 BITE FLOAT DIV

;((R0))((R0)+1)((R0)+2)((R0)+3)/

; ((R1))((R1)+1)((R1)+2)((R1)+3)

; TO R4R5R6R7,

; C=0 NORMAL, C=1 DIV BY 0

;-----------------------------------

F4_DIV: LCALL  F4_LD

    MOV    A, @R0

    XRL    A, @R1

    MOV    C, ACC.7

    MOV    FLAG38, C

    CLR    A

    MOV    R5, A

    MOV    R6, A

    MOV    R7, A

    INC    R1

    CJNE    @R1, #00H, L4A

    INC    R1

    CJNE    @R1, #00H, L4B

    INC    R1

    CJNE    @R1, #00H, L4C

    DEC    R1

    DEC    R1

    DEC    R1

    SETB    C

    RET

L4C:    DEC    R1

L4B:    DEC    R1

L4A:    DEC    R1

    MOV    A, @R0

    XCH    A, R0

    INC    R1

    PUSH    ACC

L4E:    MOV    A, R4

    INC    R1

    INC    R1

    SUBB    A, @R1

    MOV    A, R3

    DEC    R1

    SUBB    A, @R1

    MOV    A, R2

    DEC    R1

    SUBB    A, @R1

    JC    L4D

    CLR    PSW.5

    CLR    FLAG39

    LCALL    F4_STD

    MOV    A, R5

    RRC    A

    MOV    R5, A

    CLR    C

    SJMP    L4E

L4D:    MOV    A, R0

    PUSH    ACC

    LCALL    D3_DIV

    POP    ACC

    DEC    R1

    XCH    A, R0

    POP    ACC

    XCH    A, R0

    CLR    C

    SUBB    A, @R1

    MOV    C, FLAG38

    MOV    ACC.7, C

    MOV    R4, A

    CLR    C

    RET


;-----------------------------------------

; 4 BITE FLOAT  LOAD 

; ((R0)+1)((R0)+2)((R0)+3) TO R2R3R4

;-----------------------------------------

F4_LD:    INC    R0

    MOV    A, @R0

    MOV    R2, A

    INC    R0

    MOV    A, @R0

    MOV    R3, A

    INC    R0

    MOV    A, @R0

    MOV    R4, A

    DEC    R0

    DEC    R0

    DEC    R0

    RET


;-----------------------------------------

; 4 BITE FLOAT  ADD OR SUB

; ((R0))(R2)(R3)(R4) + ((R1))((R1)+1)((R1)+2)

;      ((R1)+3) TO R4R5R6R7

; ((R0))(R2)(R3)(R4) - ((R1))((R1)+1)((R1)+2)

;      ((R1)+3) TO R4R5R6R7

; FLAG3A=0 ADD, FLAG3A=1 SUB

;-----------------------------------------

F4_AB:    INC    R1

    MOV    A, @R1

    MOV    R5, A

    INC    R1

    MOV    A, @R1

    MOV    R6, A

    INC    R1

    MOV    A, @R1

    MOV    R7, A

    DEC    R1

    DEC    R1

    DEC    R1

    MOV    A, @R0

    MOV    C, ACC.7

    MOV    FLAG38, C

    XRL    A, @R1

    JNB    ACC.7, F4_ABT

    CPL    FLAG3A

F4_ABT:MOV    A, R0

    PUSH    ACC

    MOV    A, @R0

    MOV    C, ACC.6

    MOV    ACC.7, C

    MOV    R0, A

    MOV    A, R1

    PUSH    ACC

    MOV    A, @R1

    MOV    C, ACC.6

    MOV    ACC.7, C

    MOV    R1, A

F4_SDT1:CLR    C

    MOV    A, R0

    SUBB    A, R1

    JZ    F4_ABTI

    CLR    PSW.5

    CLR    FLAG39

    JB    ACC.7, F4_ABX

    CJNE    R5, #00H, F4_ABG

    CJNE    R6, #00H, F4_ABG

    CJNE    R7, #00H, F4_ABG

    MOV    A, R0

    MOV    R1, A

F4_ABTI:JB    FLAG3A, F4_ABS

    MOV    A, R4

    ADD    A, R7

    MOV    R7, A

    MOV    A, R3

    ADDC    A, R6

    MOV    R6, A

    MOV    A, R2

    ADDC    A, R5

    MOV    R5, A

    JNC    F4_ABA

    SETB    FLAG39

    CLR    C

    SETB    PSW.5

F4_ABL: LCALL F4_STD

    MOV    A, R1

    MOV    R0, A

F4_ABA: POP    ACC

    MOV    R1, A

    POP    ACC

    XCH    A, R0

    MOV    C, FLAG38

    MOV    ACC.7, C

    XCH    A, R4

    RET

F4_ABX: CJNE    R2, #00H, F4_ABG1

    CJNE    R3, #00H, F4_ABG1

    CJNE    R4, #00H, F4_ABG1

    MOV    A, R1

    MOV    R0, A

    SJMP    F4_ABTI

F4_ABG: CPL    PSW.5

F4_ABG1:CLR    C

    LCALL    F4_STD

    SJMP    F4_SDT1

F4_ABS: CLR    C

    MOV    A, R4

    SUBB    A, R7

    MOV    R7, A

    MOV    A, R3

    SUBB    A, R6

    MOV    R6, A

    MOV    A, R2

    SUBB    A, R5

    MOV    R5, A

    JNC    F4_ABS1

    CLR    A

    CLR    C

    SUBB    A, R7

    MOV    R7, A

    CLR    A

    SUBB    A, R6

    MOV    R6, A

    CLR    A

    SUBB    A, R5

    MOV    R5, A

    CPL    FLAG38

F4_ABS1:SETB    C

    CLR    PSW.5

    LCALL    F4_STD

    SJMP    F4_ABA


;-----------------------------------------

; 4 BITE FLOAT  ADD 

; ((R0))(R2)(R3)(R4) + ((R1))((R1)+1)((R1)+2)

;      ((R1)+3) TO R4R5R6R7

; FLAG3A=0 ADD

;-----------------------------------------

F4_ADD: CLR    FLAG3A

    LCALL    F4_LD

    LCALL    F4_AB

    RET


;-----------------------------------------

; 4 BITE FLOAT   SUB

; ((R0))(R2)(R3)(R4) - ((R1))((R1)+1)((R1)+2)

;      ((R1)+3) TO R4R5R6R7

; FLAG3A=1 SUB

;-----------------------------------------

F4_SUB: SETB    FLAG3A

    LCALL    F4_LD

    LCALL    F4_AB

    RET


;-----------------------------------------

; 4 BITE FLOAT  STANDED

; F0=0 R0R2R3R4

; F0=1 R1R5R6R7

;-----------------------------------------

F4_STD: JC    F4A

    MOV    C, FLAG39

    JB    PSW.5, F4B

    MOV    A, R2

    RRC    A

    MOV    R2, A

    MOV    A, R3

    RRC    A

    MOV    R3, A

    MOV    A, R4

    RRC    A

    MOV    R4, A

    INC    R0

    RET

F4B:    MOV    A, R5

    RRC    A

    MOV    R5, A

    MOV    A, R6

    RRC    A

    MOV    R6, A

    MOV    A, R7

    RRC    A

    MOV    R7, A

    INC    R1

    RET

F4A:    MOV    A, R5

    JNZ    F4C

    CJNE    R6, #00H, F4D

    CJNE    R7, #00H, F4D

F4E:    RET

F4C:    JB    ACC.7, F4E    ; 0E7H

F4D:    MOV    C, PSW.5

    MOV    A, R7

    RLC    A

    MOV    R7, A

    MOV    A, R6

    RLC    A

    MOV    R6, A

    MOV    A, R5

    RLC    A

    MOV    R5, A

    CLR    PSW.5

    DEC    R0

    SJMP    F4A


;-----------------------------------

; 4 BYTE FLOAT STORE

; R4R5R6R7 TO (R0)(R0+1)(R0+2)(R0+3)

;-----------------------------------

F4_STR: MOV    A, R4

    MOV    @R0, A

    INC    R0

    MOV    A, R5

    MOV    @R0, A

    INC    R0

    MOV    A, R6

    MOV    @R0, A

    INC    R0

    MOV    A, R7

    MOV    @R0, A

    DEC    R0

    DEC    R0

    DEC    R0

    RET


;-------------------------------------------

; 3 BYTE DIV

; 0.R2R3R4R5R6R7 / ((R1))((R1)+1)((R1)+2)

;    TO (R0)(R0+1)(R0+2)(R0+3)

;-------------------------------------------

D3_DIV: MOV    R0, #18H

    INC    R1

    INC    R1

S3D:    CLR    C

    MOV    A, R7

    RLC    A

    MOV    R7, A

    MOV    A, R6

    RLC    A

    MOV    R6, A

    MOV    A, R5

    RLC    A

    MOV    R5, A

    MOV    A, R4

    RLC    A

    MOV    R4, A

    XCH    A, R3

    RLC    A

    XCH    A, R3

    XCH    A, R2

    RLC    A

    XCH    A, R2

    MOV    PSW.5, C

    CLR    C

    SUBB    A, @R1

    DEC    R1

    MOV    A, R3

    SUBB    A, @R1

    DEC    R1

    MOV    B, A

    MOV    A, R2

    SUBB    A, @R1

    INC    R1

    INC    R1

    JB    PSW.5, S3A

    JC    S3B

S3A:    CLR    C

    MOV    R2, A

    MOV    A, R4

    SUBB    A, @R1

    MOV    R4, A

    MOV    R3, B

    INC    R7

S3B:    DJNZ    R0, S3D

    DEC    R1

    DEC    R1

    RET


;---------------------------------------

; 3 BYTE MUL

; 0.R2R3R4 * 0.((R1))((R1)+1)((R1)+2)

; TO R5R6R2R3R4

;---------------------------------------

D3_MUL: MOV    R0, #19H

    CLR    C

    CLR    A

    MOV    R5, A

    MOV    R6, A

    MOV    R7, A

K3B:    MOV    A, R5

    RRC    A

    MOV    R5, A

    MOV    A, R6

    RRC    A

    MOV    R6, A

    MOV    A, R7

    RRC    A

    MOV    R7, A

    XCH    A, R2

    RRC    A

    XCH    A, R2

    XCH    A, R3

    RRC    A

    XCH    A, R3

    XCH    A, R4

    RRC    A

    XCH    A, R4

    DJNZ    R0, K3A

    RET

K3A:    JNC    K3B

    INC    R1

    INC    R1

    ADD    A, @R1

    MOV    R7, A

    MOV    A, R6

    DEC    R1

    ADDC    A, @R1

    MOV    R6, A

    MOV    A, R5

    DEC    R1

    ADDC    A, @R1

    MOV    R5, A

    SJMP    K3B


;-------------------------------------------

; 功能:以e为底的浮点指数函数

;入口条件:操作数在TMP0中。使用TMP0,TMP1,TMP2

;出口信息:OV=0时,结果仍在TMP0中,OV=1时,溢出。

;影响资源:DPTR、PSW、A、B、R2~R7、位1EH、1FH  堆栈需求:6字节

;-------------------------------------------

F4_EXP:    

    MOV    R1, #TMP1

    MOV    A, #01H        ; e(x) = 2(1.442695 * x)

    MOV    @R1, A

    INC    R1

    MOV    A, #0B8H

    MOV    @R1, A

    INC    R1

    MOV    A, #0AAH

    MOV    @R1, A

    INC    R1

    MOV    A, #3BH

    MOV    @R1, A


    MOV    R0, #TMP0

    MOV    R1, #TMP1

    LCALL    F4_MUL        ;进行加权运算

    MOV    R0, #TMP0

    LCALL    F4_STR


E20:

    MOV    R0, #TMP0

    MOV    A, @R0

    MOV    R4, A

    INC    R0

    MOV    A, @R0

    MOV    R5, A

    INC    R0

    MOV    A, @R0

    MOV    R6, A

    INC    R0

    MOV    A, @R0

    MOV    R7, A

    MOV    A, R5

    ORL    A, R6

    ORL    A, R7

    JNZ    EXP2

EXP1:

    MOV    R4, #01H        ;尾数为零,幂为1.000000

    MOV    R5, #80H

    MOV    R6, #00H

    MOV    R7, #00H

    CLR    OV

    RET

EXP2:    

    MOV    R0, #TMP0

    MOV    A, @R0

    MOV    R4, A        ;将指数复制到工作区

    INC    R0

    MOV    A, @R0

    MOV    R5, A

    INC    R0

    MOV    A, @R0

    MOV    R6, A

    INC    R0

    MOV    A, @R0

    MOV    R7, A

    LCALL    INT

EXP4:

    MOV    A, R4

    JB    ACC.6, EXP5

    CLR    ACC.7

    MOV    R0, A

    CLR    C

    MOV    R1, #00H

    MOV    A, R5

    PUSH    ACC

EXPJ1:    MOV    A, R5

    RLC    A

    MOV    R5, A

    MOV    A, R1

    RLC    A

    MOV    R1, A

    DJNZ    R0, EXPJ1

    POP    ACC

    MOV    R5, A

    MOV    A, R4

    JB    ACC.7, EXPJ2

    MOV    A, R1

    SJMP    EXP6

EXPJ2:    MOV    A, R1

    CPL    A

    INC    A

    SJMP    EXP6    

EXP5:    MOV    A, #00H    

EXP6:    PUSH    ACC    ;暂时保存之

    MOV    R0, #TMP1

    LCALL    F4_STR

    MOV    R0, #TMP0

    MOV    R1, #TMP1

    LCALL    F4_SUB    ;求指数的小数部分

    MOV    R0, #TMP0

    LCALL    F4_STR


    PUSH    DPH

    PUSH    DPL

    MOV    DPTR, #EXP_TABL

    MOV    TMP2, #41H

    MOV    TMP2+1, #00H

    MOV    TMP2+2, #00H

    MOV    TMP2+3, #00H

PLN1:    CLR    A        ;计算指数的小数部分的幂

    MOV    R0, #TMP1

    MOVC    A, @A+DPTR

    MOV    @R0, A

    INC    DPTR

    INC    R0

    CLR    A

    MOVC    A, @A+DPTR

    MOV    @R0, A

    INC    DPTR

    INC    R0

    CLR    A

    MOVC    A, @A+DPTR

    MOV    @R0, A

    INC    DPTR

    INC    R0

    CLR    A

    MOVC    A, @A+DPTR

    MOV    @R0, A

    INC    DPTR    ;指向下一个系数

    MOV    R0, #TMP2

    MOV    R1, #TMP1

    LCALL    F4_ADD    ;进行代数加法运算

    MOV    R0, #TMP2

    LCALL    F4_STR

    CLR    A    ;读取下一个系数的第一个字节

    MOVC    A, @A+DPTR

    CJNE    A, #40H, PLN2;是结束标志吗?

    POP    DPL

    POP    DPH

    POP    ACC        ;取出指数的整数部分

    ADD    A, R4        ;按补码加到幂的阶码上

    MOV    R4, A

    MOV    A, R4

    CLR    ACC.7    ;幂的符号为正

    MOV    R4, A

    RET


PLN2:    

    MOV    R0, #TMP0

    MOV    R1, #TMP2

    LCALL    F4_MUL    ;进行乘法运算

    MOV    R0, #TMP2

    LCALL    F4_STR

    LJMP    PLN1    ;继续下一项运算


EXP_TABL:

    DB    77H, 0B1H, 0C9H, 00H    ; 1.3564 * 10(-3)

    DB    7AH, 0A1H,  68H, 00H    ; 9.8514 * 10(-3)

    DB    7CH, 0E3H,  4FH, 00H    ; 0.055495

    DB    7EH, 0F5H, 0E7H, 00H    ; 0.24014

    DB    00H, 0B1H,  72H, 00H    ; 0.69315

    DB    01H,  80H,  00H, 00H    ; 1.000000

    DB    40H,  40H,  40H, 40H    ;结束

;-------------------------------------------

; (R4)R5R6R7

;-------------------------------------------

RLN:    MOV    A, R5        ;浮点数规格化

    ORL    A, R6        ;尾数为零否?

    ORL    A, R7

    JNZ    RLN1

    MOV    R4, #0C1H    ;阶码取最小值

    RET         

RLN1:    MOV    A, R5

    JB    ACC.7, RLN2    ;尾数最高位为一否?

    CLR    C        ;不为一,左规一次

    LCALL    RL1

    SJMP    RLN        ;继续判断

RLN2:    CLR    OV        ;规格化结束

    RET

RL1:    MOV    A, R7        ;第一操作数左规一次

    RLC    A        ;尾数扩大一倍

    MOV    R7, A

    MOV    A, R6

    RLC    A

    MOV    R6, A

    MOV    A, R5

    RLC    A

    MOV    R5, A

    DEC    R4        ;阶码减一

    CJNE    R4, #0C0H, RL1E    ;阶码下溢否?

    CLR    A

    MOV    R5, A        ;阶码下溢,操作数以零计

    MOV    R6, A

    MOV    R7, A

    MOV    R4, #0C1H

RL1E:    CLR    OV

    RET

RR1:    MOV    A, R5    ;第一操作数右规一次

    RRC    A    ;尾数缩小一半

    MOV    R5, A

    MOV    A, R6

    RRC    A

    MOV    R6, A

    MOV    A, R7

    RRC    A

    MOV    R7, A

    INC    R4    ;阶码加一

    CLR    OV    ;清溢出标志

    CJNE    R4, #40H, RR1E    ;阶码上溢否?

    MOV    R4, #3FH    ;阶码溢出

    SETB    OV

RR1E:    RET


;-------------------------------------------

; 功能:浮点取整函数

;入口条件:操作数在[R0]中。

;出口信息:R4R5R6R7

;-------------------------------------------

FINT:

    MOV    A, @R0

    MOV    R4, A    ;阶存放在R4中

    INC    R0

    MOV    A, @R0    ;将尾数高字节存放在R5中

    MOV    R5, A

    INC    R0

    MOV    A, @R0    ;将尾数第二字节存放在R6中

    MOV    R4, A

    INC    R0

    MOV    A, @R0    ;将尾数第三字节存放在R7中

    MOV    R7, A

    DEC    R0    ;恢复数据指针

    DEC    R0

    DEC    R0

    LCALL    INT    ;在工作寄存器中完成取整运算

    RET


INT:    MOV    A, R5

    ORL    A, R6

    ORL    A, R7

    JNZ    INTA

    MOV    R4, #41H    ;尾数为零,阶码也清零,结束取整

    RET


INTA:    MOV    A, R4

    CLR    ACC.7

    JZ    INTB    ;阶码为零否?

    JB    ACC.6, INTB;阶符为负否?

    CLR    ACC.6

    CLR    C

    SUBB    A, #18H    ;阶码小于24否?

    JC    INTD

    RET        ;阶码大于24,已经是整数

INTB:    CLR    A      ;绝对值小于一,取整后正数为零,负数为负一

    MOV    R7, A

    MOV    R6, A

    MOV    R5, A

    MOV    R4, #41H

INTC:    RET


INTD:    CLR    F0    ;舍尾标志初始化

    MOV    A, R4

    CLR    ACC.7

    MOV    R0, A

    CLR    A

    MOV    R1, A

    MOV    R2, A

    MOV    R3, A

    CLR    C

INTE:    

    MOV    A, R7

    RLC    A

    MOV    R7, A

    MOV    A, R6

    RLC    A

    MOV    R6, A

    MOV    A, R5

    RLC    A

    MOV    R5, A

    MOV    A, R3

    RLC    A

    MOV    R3, A

    MOV    A, R2

    RLC    A

    MOV    R2, A

    MOV    A, R1

    RLC    A

    MOV    R1, A

    DJNZ    R0, INTE    ;阶码

    MOV    A, R4

    CLR    ACC.7

    MOV    R0, A

    MOV    A, #18H

    CLR    C

    SUBB    A, R0

    MOV    R0, A

INTF:    CLR    C

    MOV    A, R3

    RLC    A

    MOV    R3, A

    MOV    A, R2

    RLC    A

    MOV    R2, A

    MOV    A, R1

    RLC    A

    MOV    R1, A

    DJNZ    R0, INTF

    MOV    A, R3

    MOV    R7, A

    MOV    A, R2

    MOV    R6, A

    MOV    A, R1

    MOV    R5, A

    RET


 


关键字:MCS51  浮点计算 引用地址:MCS51浮点计算程序

上一篇:51高精度除法程序及使用
下一篇:关于C51的中断函数要注意的几个问题

推荐阅读最新更新时间:2024-03-16 15:25

一种基于 MCS51 的低成本LabVIEW实验教学系统
NI 公司于20 世纪70 年代提出了虚拟仪器的概念。虚拟仪器是在以计算机为核心的平台上,由用户设计,具有虚拟面板,由软件实现测试功能的计算机仪器系统,是计算机与测试仪器相结合的产物。虚拟仪器最常用的编程语言为LabVIEW,是NI公司的基于图形化编程语言的虚拟仪器开发工具,利用它可以轻松组建一个测试系统而无需进行繁琐的代码编写。因此虚拟仪器大大突破了传统仪器在灵活性,以及数据处理、显示、存储等方面的不足,其主要优势在于:用户能够根据需求灵活的进行功能修改和扩展;人机界面为视窗界面,形象直观;网络连接简单易行,便于组建测控网络。 目前虚拟仪器在通信、汽车、测控等行业得到了广泛的应用。相应的各大高校也在NI公司的支持下,陆续开设了虚
[电源管理]
一种基于 <font color='red'>MCS51</font> 的低成本LabVIEW实验教学系统
MCS51单片机专用功能寄存器
MCS-51单片机内的锁存器、定时器、串行口数据缓冲器以及各种控制寄存器和状态寄存器都是以专用功能寄存器(或称特殊功能寄存器)的形式出现的,它们分散地分布在内部RAM地址空间范围(80H~FFH)内,表 2-5列出了这些专用功能寄存器(SFR)的助记标识符、名称及地址。 其中,凡字节地址可以被8整除的专用功能寄存器都可以位寻址。其位地址见表2-6。 大部分寄存器的应用将在后面有关章节中评述,这里仅作简单介绍。 ·累加器ACC 累加器是一个最常用的专用寄存器。大部分单操作数指令的操作取自累加器。很多双操作数指令的一个操作数取自累加器。加、减、乘、除算术运算指令的运算结果都存放在累加器A或AB寄存器对中。指令系
[单片机]
MCS51单片机边沿触发中断响应时刻的测量
MCS51单片机系列属于8位单片机,它是Intel公司继MCS48系列的成功设计之后,于1980年推出的产品。由于MCS51系列具有很强的片内功能和指令系统,因而使单片机的应用发生了一个飞跃,这个系列的产品也很快成为世界上第二代的标准控制器。51系列单片机有5个中断源,其中有2个是外部输入中断源INT0和INT1。可由中断控制寄存器TCON的IT1(TCON.2)和IT0(TCON.1)分别控制外部输入中断1和中断0的中断触发方式。若为0,则外部输入中断控制为电平触发方式;若为1,则控制为边沿触发方式。这里是下降沿触发中断。    1 问题的引出    几乎国内所有的单片机资料对单片机边沿触发中断的响应时刻方面的定义都是不明确的或
[单片机]
<font color='red'>MCS51</font>单片机边沿触发中断响应时刻的测量
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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