📄 ad5933.asm
字号:
;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 + -