?? 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 + -