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

📄 luchag11.asm

📁 这是利用AT89C2051中的比较器和软件实现的8位AD转换器。
💻 ASM
字号:
; I8051数据校正转换模块, Y:= Yn + K*(X-Xn)
; 输入:(R0)==> 转换结果存储地址首址(两字节), (R1):= A/D转换值高字节,
; (R2):= A/D转换值低字节,, (A):= 当前处理的模拟量的序号{0,1,2,3}
; 电压数据表定义:共分为10段11个点{-36V,-38V,... ...,-56V}
; 电流数据表定义:共分为10段11个点{0A,100A,... ...,2000A}
; 每个点三字节,按{ADC值高字节,ADC值低字节,斜率}
; 顺序存放,计算结果按一字节两位BCD码格式,高字节在前存放
; 即:[电压的十位数--个位数],[电压的十分位数--百分位]
; [电流的千位数--百位数],[电流的十位数--个位数]
POINTNUM	EQU	11
DATA_NUM	EQU	POINTNUM*3
MAX_CUR	EQU	20H
MAX_VAL	EQU	56H
MINI_VAL	EQU	36H
V_SEGVAL	EQU	200	; 每段的压差2V,以0.01V为单位
I_SEGVAL	EQU	100	; 电流分段的差值100A,以1A为单位
REGIST55	EQU	5

CHANGADC:	PUSH	B
		PUSH	DPL
		PUSH	DPH
		XCH	A,R3
		PUSH	ACC
		MOV	A,R4
		PUSH	ACC
		MOV	A,R5
		PUSH	ACC
		CLR	A
		MOV	R5,A
		MOV	R4,A
		MOV	A,R3
		RRC	A
		JNC	$+4
		MOV	R5,#DATA_NUM	; 11点*3字节
CHGADC00:	MOV	A,#1
		ACALL	GET_PARA
		CLR	C
		SUBB	A,R1		; (R1):= A/D转换值高字节
		JZ	CHGADC22	; Xn:= X
		JNC	CHGADC33	; X < Xn
CHGADC11:	INC	R4
		CJNE	R4,#POINTNUM,CHGADC00
		MOV	A,#MAX_VAL	; X >= ADC(56V)
		CJNE	R5,#0,CHGADCOV
		MOV	A,#MAX_CUR	; X >= ADC(2000A)
CHGADCOV:	MOV	@R0,A
		INC	R0
		CLR	A
		MOV	@R0,A
		DEC	R0
		SJMP	CHGADCEND
CHGADC22:	MOV	A,#2
		ACALL	GET_PARA
		SUBB	A,R2		; (R2):= A/D转换值低字节
		JC	CHGADC33	; Xn < X
		JNZ	CHGADC11	; Xn > X
		ACALL	CHGADCYN	; Yn ==> (R4):(R5)
		SJMP	CHGADC44
CHGADC33:	MOV	A,R4
		JZ	CHGADCOV	; X =< ADC(36V)
		DEC	R4
		MOV	A,#1
		ACALL	GET_PARA
		MOV	DPH,A		; Xn高字节 ==>(DPH)
		MOV	A,#2
		ACALL	GET_PARA
		MOV	DPL,A		; Xn低字节==>(DPL)
		CLR	C
		MOV	A,R2
		SUBB	A,DPL
		MOV	DPL,A		; Lo(X - Xn) ==> DPL
		MOV	A,R1
		SUBB	A,DPH
		MOV	DPH,A		; Hi(X - Xn) ==> DPH
		MOV	A,#3
		ACALL	GET_PARA
		MOV	R1,A		; (R1):= 斜率K
		ACALL	CHGADCYN	; Yn ==> (R4):(R5)
		MOV	A,DPH
		MOV	B,R1
		MUL	AB		; H*K
		ADD	A,R5
		MOV	R5,A
		MOV	A,B
		ADDC	A,R4
		MOV	R4,A
		MOV	A,DPL
		MOV	B,R1
		MUL	AB		; L*K
		RLC	A		; bit7 ==> C
		MOV	A,B
		ADDC	A,R5
		MOV	R5,A
		JNC	CHGADC44
		INC	R4
CHGADC44:	ACALL	BINTOBCD
		MOV	A,R3
		JNB	ACC.0,CHGADCEND
		MOV	A,@R0
		ADD	A,#MINI_VAL
		DA	A
		MOV	@R0,A
CHGADCEND:	POP	ACC
		MOV	R5,A
		POP	ACC
		MOV	R4,A
		POP	ACC
		MOV	R3,A
		POP	DPH
		POP	DPL
		POP	B
		RET
; 根据(R4):=n 计算 Yn ==> (R4):(R5)
CHGADCYN:	MOV	A,R3
		RRC	A
		MOV	A,#I_SEGVAL
		JNC	$+4 
		MOV	A,#V_SEGVAL		; 1 or 3
		MOV	B,R4
		MUL	AB
		MOV	R5,A
		MOV	R4,B
		RET
; 两字节BIN数据(R4):(R5)转换成两字节四位BCD码数据 ==>((R0))
BINTOBCD:	CLR	A
		MOV	@R0,A
		INC	R0
		MOV	@R0,A
		MOV	A,R4
		ACALL	BINBCD00
		MOV	A,R5
		INC	R0                                                       
BINBCD00:	MOV	R2,#8
		RLC	A
		MOV	R1,A
		MOV	A,@R0
		ADDC	A,@R0
		DA	A
		MOV	@R0,A
		DEC	R0
		MOV	A,@R0
		ADDC	A,@R0
		DA	A
		MOV	@R0,A
		INC	R0
		MOV	A,R1
		DJNZ	R2,BINBCD00+2
		DEC	R0
		RET
; 
GET_PARA:	ADD	A,R5
		ADD	A,R4
		ADD	A,R4
		ADD	A,R4		; (A)+3*(R4) ==> A
		MOVC	A,@A+PC
		RET

ADC_DBAS:	DB	000H,0C3H,0C5H
		DB	001H,045H,04FH
		DB	002H,08AH,062H
		DB	003H,08EH,062H
		DB	004H,092H,04FH
		DB	005H,0D7H,062H
		DB	006H,0DBH,04FH
		DB	008H,020H,062H
		DB	009H,024H,062H
		DB	00AH,028H,04FH
		DB	00BH,06DH,04FH

		DB	006H,0FDH,034H
		DB	007H,05EH,035H
		DB	007H,0BEH,033H
		DB	008H,022H,033H
		DB	008H,086H,036H
		DB	008H,0E5H,036H
		DB	009H,045H,033H
		DB	009H,0AAH,031H
		DB	00AH,013H,036H
		DB	00AH,071H,037H
		DB	00AH,0CEH,04FH

		

⌨️ 快捷键说明

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