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

📄 ad5933.asm

📁 AD5933的读写和一些计算(汇编语言)
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;AD5933 IIC总线
Ctrl_H     EQU     80H         ;D15--D8     控制寄存器
Ctrl_L     EQU     81H         ;D7--D0

STA_F_H    EQU     82H         ;D23--D16    设定起始扫描频率
STA_F_M    EQU     83H         ;D15--D8
STA_F_L    EQU     84H         ;D7--D0

F_INC_H    EQU     85H         ;D23--D16    频率增加步长
F_INC_M    EQU     86H         ;D15--D8
F_INC_L    EQU     87H         ;D7--D0

INC_NUM_H  EQU     88H         ;D15--D8     它和上两个一起决定频率范围
INC_NUM_L  EQU     89H         ;D7--D0


T_CYC_H    EQU     8AH         ;D15--D8    设定周期
T_CYC_L    EQU     8BH         ;D7--D0

STATUS     EQU     8FH         ;D7--D0      状态

TEMP_H     EQU     92H         ;D15--D8      温度
TEMP_L     EQU     93H         ;D7--D0


REAL_H     EQU     94H         ;D15--D8      实部测量值
REAL_L     EQU     95H         ;D7--D0

IMAG_H     EQU     96H         ;D15--D8      虚部测量值 
IMAG_L     EQU     97H         ;D7--D0

VSDA       EQU     P1.6        ;I2C总线
VSCL       EQU     P1.7

MRD        EQU     30H         ;读内存
MWD        EQU     40H         ;写内存

NUMBYT     EQU     8           ;字节数
RSLA       EQU     55H         ;读地址
WSLA       EQU     66H         ;写地址

AD5933_W   EQU     1AH        ;AD5933地址+写命令
AD5933_R   EQU     1BH        ;AD5933地址+读命令


           ORG     0000H
           AJMP    START

           ORG     0040H
START:
        MOV     SP,    #60H
        LCALL   INI
        NOP
        NOP
        NOP
        LCALL   STA                 ;启动I2C
        MOV     A,     #AD5933_W     ;AD5933地址+写命令
        LCALL   WRBYT
        LCALL   MACK
        MOV     A,     #81H         ;80H寄存器
        LCALL   WRBYT
        LCALL   MACK
        MOV     A,     #10H        ;写入80H寄存器的内容   复位AD5933
        LCALL   WRBYT
        LCALL   MACK
        LCALL   STOP                ;停止I2C
        NOP
        NOP
        NOP
        LCALL   STA                 ;启动I2C
        MOV     A,     #AD5933_W     ;AD5933地址+写命令
        LCALL   WRBYT
        LCALL   MACK
        MOV     A,     #81H         ;80H寄存器
        LCALL   WRBYT
        LCALL   MACK
        MOV     A,     #00H        ;写入80H寄存器的内容
        LCALL   WRBYT
        LCALL   MACK
        LCALL   STOP                ;停止I2C
        NOP
        NOP
        NOP
        LCALL   STA                 ;启动I2C
        MOV     A,     #AD5933_W     ;AD5933地址+写命令
        LCALL   WRBYT
        LCALL   MACK
        MOV     A,     #80H         ;80H寄存器
        LCALL   WRBYT
        LCALL   MACK
        MOV     A,     #93H        ;写入80H寄存器的内容   启动温度测量
        LCALL   WRBYT
        LCALL   MACK
        LCALL   STOP                ;停止I2C
LOOP:   NOP
        NOP
        NOP
        MOV     R5,     #8FH          ;R5存放寄存器POINTER
        LCALL   POINT
        NOP
        NOP
        NOP
        MOV     NUMBYT, #01H
        LCALL   B_READ
        JNB     ACC.0,  LOOP
        MOV     R5,     #92H          ;R5存放寄存器POINTER
        LCALL   POINT
        NOP
        NOP
        NOP
        MOV     NUMBYT, #06H
        LCALL   B_READ

        MOV     R3,     32H
        MOV     R2,     33H
        LCALL   MUL2              ;R2R3的平方

        MOV     A,      30H       ;屏蔽AD5933寄存器92H中的D15D14两位
        ANL     A,      #3FH
        MOV     30H,    A
        MOV     R4,     30H
        MOV     R5,     31H
        MOV     R7,     #20H      ;除数为32
        LCALL   D457              ;温度寄存器/32的实际的摄氏温度
        MOV     A,      R3        ;商放在R3中
        LCALL   H_BCD             ;转换单字节十六进制整数在累加器A中 百位在R3中
        MOV     R0,     #40H      ;存放温度百位到40H个十位到41H
        XCH     A,      B
        MOV     A,      R3
        MOV     @R0,    A
        INC     R0
        XCH     A,      B
        MOV     @R0,    A
        
        MOV     R0,     #35H
        MOV     A,      @R0
        MOV     R2,     A
        INC     R0
        MOV     A,      @R0
        MOV     R3,     A
        INC     R0
        MOV     A,      @R0
        MOV     R4,     A
        INC     R0
        MOV     A,      @R0
        MOV     R5,     A
        LCALL   SH4
        
        SJMP    $
        
;入口条件:被开方数在R2、R3、R4、R5中。
;出口信息:平方根在R2、R3中,整数部分的位数为原数的一半,其余为小数。
;影响资源:PSW、A、B、R2~R7    堆栈需求:  2字节

SH4:    MOV     A,      R2
        ORL     A,      R3
        ORL     A,      R4
        ORL     A,      R5
        JNZ     SH40
        RET                      ;被开方数为零,不必运算
SH40:   MOV     R7,     #0       ;左规次数初始化
        MOV     A,      R2
SH41:   ANL     A,      #0C0H    ;被开方数高字节小于40H否?
        JNZ     SQRH             ;不小于40H,左规格化完成
        MOV     R6,     #2       ;每左规一次,被开方数左移两位
SH42:   CLR     C                ;被开方数左移一位
        MOV     A,      R5
        RLC     A
        MOV     R5,     A
        MOV     A,      R4
        RLC     A
        MOV     R4,     A
        MOV     A,      R3
        RLC     A
        MOV     R3,     A
        MOV     A,      R2
        RLC     A
        MOV     R2,     A
        DJNZ    R6,     SH42     ;被开方数左移完两位
        INC     R7               ;左规次数加一
        SJMP    SH41             ;继续左规
SQRH:   MOV     A,      R2       ;规格化后高字节按折线法分为三个区间
        ADD     A,      #57H
        JC      SQR2
        ADD     A,      #45H
        JC      SQR1
        ADD     A,      #24H
        MOV     B,      #0E3H    ;第一区间的斜率
        MOV     R4,     #80H     ;第一区间的平方根基数
        SJMP    SQR3
SQR1:   MOV     B,      #0B2H    ;第二区间的斜率
        MOV     R4,     #0A0H    ;第二区间的平方根基数
        SJMP    SQR3
SQR2:   MOV     B,      #8DH     ;第三区间的斜率
        MOV     R4,     #0D0H    ;第三区间的平方根基数
SQR3:   MUL     AB               ;与区间基点的偏移量乘区间斜率
        MOV     A,      B
        ADD     A,      R4       ;累加到平方根的基数上
        MOV     R4,     A
        MOV     B,      A
        MUL     AB               ;求当前平方根的幂
        XCH     A,      R3       ;求偏移量(存放在R2R3中)
        CLR     C
        SUBB    A,      R3
        MOV     R3,     A
        MOV     A,      R2
        SUBB    A,      B
        MOV     R2,     A
SQR4:   SETB    C                ;用减奇数法校正一个字节的平方根
        MOV     A,      R4       ;当前平方根的两倍加一存入R5R6中
        RLC     A
        MOV     R6,     A
        CLR     A
        RLC     A
        MOV     R5,     A
        MOV     A,      R3       ;偏移量小于该奇数否?
        SUBB    A,      R6
        MOV     B,      A
        MOV     A,      R2
        SUBB    A,      R5
        JC      SQR5             ;小于,校正结束,已达到一个字节的精度
        INC     R4               ;不小于,平方根加一
        MOV     R2,     A        ;保存新的偏移量
        MOV     R3,     B
        SJMP    SQR4             ;继续校正
SQR5:   MOV     A,      R4       ;将一个字节精度的根存入R2
        XCH     A,      R2
        RRC     A
        MOV     F0,     C        ;保存最终偏移量的最高位
        MOV     A,      R3
        MOV     R5,     A        ;将最终偏移量的低八位存入R5中
        MOV     R4,     #8       ;通过(R5R6/R2)求根的低字节
SQR6:   CLR     C
        MOV     A,      R3
        RLC     A
        MOV     R3,     A
        CLR     C
        MOV     A,      R5
        SUBB    A,      R2
        JB      F0,     SQR7
        JC      SQR8
SQR7:   MOV     R5,     A
        INC     R3
SQR8:   CLR     C
        MOV     A,      R5
        RLC     A
        MOV     R5,     A
        MOV     F0,     C
        DJNZ    R4,     SQR6     ;根的第二字节计算完,在R3中
        MOV     A,      R7       ;取原被开方数的左规次数
        JZ      SQRE             ;未左规,开方结束
SQR9:   CLR     C                ;按左规次数右移平方根,得到实际根
        MOV     A,      R2
        RRC     A
        MOV     R2,     A
        MOV     A,      R3
        RRC     A
        MOV     R3,     A
        DJNZ    R7,     SQR9
SQRE:   RET


;入口条件:待转换的单字节十六进制整数在累加器A中。
;出口信息:转换后的BCD码整数(十位和个位)仍在累加器A中,百位在R3中。
;影响资源:PSW、A、B、R3    堆栈需求:  2字节


H_BCD:  MOV     B,     #100;分离出百位,存放在R3中
        DIV     AB
        MOV     R3,     A
        MOV     A,      #10;余数继续分离十位和个位
        XCH     A,      B
        DIV     AB
        SWAP    A
        ORL     A,      B ;将十位和个位拼装成BCD码
        RET


;入口条件:待平方数在R2、R3中。
;出口信息:结果在R2、R3、R4、R5中。
;影响资源:PSW、A、B、R2~R5    堆栈需求:  2字节

MUL2:  MOV     A,      R3 ;计算R3平方
       MOV     B,      A
       MUL     AB
       MOV     R4,      B ;暂存部分积
       MOV     R5,      A
       MOV     A,       R2 ;计算R2平方
       MOV     B,       A
       MUL     AB
       XCH     A,       R3 ;暂存部分积,并换出R2和R3
       XCH     A,       B
       XCH     A,       R2
       MUL     AB         ;计算2×R2×R3
       CLR     C
       RLC     A
       XCH     A,       B
       RLC     A
       JNC     MU20
       INC     R2 ;累加溢出量
MU20:  XCH     A,       B ;累加部分积
       ADD     A,       R4
       MOV     R4,      A
       MOV     A,       R3
       ADDC    A,       B
       MOV     R3,      A
       CLR     A
       ADDC    A,       R2
       MOV     R2,      A
       RET

;入口条件:被除数在R4、R5中,除数在R7中。
;出口信息:OV=0 时,单字节商在R3中,OV=1 时溢出。
;影响资源:PSW、A、R3~R7    堆栈需求:  2字节

D457:  CLR     C
       MOV     A,       R4
       SUBB    A,       R7
       JC      DV50
       SETB    OV          ;商溢出
       RET
DV50:  MOV     R6,      #8 ;求平均值(R4R5/R7-→R3)
DV51:  MOV     A,       R5
       RLC     A
       MOV     R5,      A
       MOV     A,       R4
       RLC     A
       MOV     R4,      A
       MOV     F0,      C
       CLR     C
       SUBB    A,       R7
       ANL     C,       /F0
       JC      DV52
       MOV R4,A
DV52:  CPL     C
       MOV     A,       R3
       RLC     A
       MOV     R3,      A
       DJNZ    R6,      DV51
       MOV     A,       R4  ;四舍五入
       ADD     A,       R4
       JC      DV53
       SUBB    A,       R7
       JC DV54
DV53:  INC R3
DV54:  CLR OV
       RET

;IIC总线启动程序
STA:    SETB    VSDA
        SETB    VSCL
        NOP
        NOP
        NOP

⌨️ 快捷键说明

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