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

📄 power.asm

📁 8051中AD转换,数码显示,看别人做的
💻 ASM
字号:
Switch_display			BIT	0H
AD_MODE					BIT	1H
AD_replacement			BIT	2H
divdll 					equ 	28h        ;定义被除数单元
divdlh 					equ 	29h
divdhl  					equ 	2ah
divdhh  					equ 	2bh
divl    					equ 	2ch        ;定义除数单元
divh    					equ 	2dh
templ   					equ 	2eh        ;定义余数单元
temph   					equ 	2fh
display1					EQU	37H		;显示电压数码管最高位(电压最高为30V)
display2					EQU	33H		;显示电压数码管第二高位(要带小数点)
display3					EQU	35H		;显示电压数码管第三位
display4					EQU	31H		;显示电压数码管最低位
display5					EQU	36H		;显示电流数码管最高位(要带小数点)(最好电流4.5A)
display6					EQU	32H		;显示电流数码管第二位
display7					EQU	34H		;显示电流数码管第三位
display8					EQU	30H		;显示电流数码管最低位
P1M0				EQU	91H		;设置IO模式
P1M1				EQU	92H		;设置IO模式
ADC_CONTR			EQU	0C5H		;AD特殊功能转换寄存器
ADC_DATA			EQU	0C6H		;AD数据高8位
ADC_LOW2			EQU	0BEH		;AD数据低2位
ADC_H2				EQU	3CH		;存放ADC高2位数据
ADC_L8				EQU	3DH		;存放ADC低8位数据
YIWEI_H2			EQU	38H		;存放移位后的高2位
YIWEI_L8			EQU	39H		;存放移位后的低8位
AD_voltageH2			EQU	40H		;p1.7口AD输入的电压的高2位,作为手动调节输入的值
AD_voltageL8			EQU	41H		;p1.7口AD输入的电压的低8位,作为手动调节输入的值

div_settingH			EQU	43H		;存放设置被除数高位
div_settingL			EQU	44H		;存放设置被除数低位
temp_divdll			EQU	45H		;存放除法的商
temp_divdlh			EQU	46H



		ORG		0H
		LJMP	MAIN
		ORG		30H
		
MAIN:	CLR	P1.3
	MOV	display1, #10H
	MOV	display2, #10H
	MOV	display3, #10H
	MOV	display4, #10H
	MOV	display5, #10H
	MOV	display6, #10H
	MOV	display7, #10H
	MOV	display8, #10H
	ORL	ADC_CONTR,#80H
	MOV	A,#1
	;LCALL	Delay
	MOV	P1M0, 	#10000011B
	MOV	P1M1, 	#10000011B
			
			
MAIN2:	
	LCALL	AD_CONVER
	LCALL	display
	SJMP	MAIN2
			
AD_CONVER:	
	MOV	ADC_CONTR, 	#11100000B
	SETB	AD_MODE
	LCALL	GET_AD_Result
	LCALL	OUT_PUT_Display
	CLR	AD_MODE
	MOV	ADC_CONTR, 	#11100111B
	LCALL	GET_AD_Result
	MOV	AD_voltageH2,	ADC_H2
	MOV	AD_voltageL8,	ADC_L8
	MOV	ADC_CONTR,	#11100001B		;得出自己设置的电压最大值
	LCALL	GET_AD_Result
	LCALL	YIWEI						;使2.4V变成4.8v

AD_CR_RETURN:
	CLR	Switch_display
	LCALL	OUT_PUT_Display2
	RET
			
GET_AD_Result:
	PUSH	ACC
	MOV	ADC_DATA, #0
	MOV	ADC_LOW2, #0
	ORL	ADC_CONTR,#00001000B
Wait_AD_Finish:		
	MOV	A,	#00010000B
	ANL	A,	ADC_CONTR
	JZ	Wait_AD_Finish				;判断AD是否转换完成
	ANL	ADC_CONTR, 	#11100111B			;清楚转换结束标志
	MOV	ADC_H2,		ADC_DATA
	MOV	ADC_L8,		ADC_LOW2
	JB	AD_MODE,	RETURN
	ANL	ADC_L8,		#03H				;AD高八位数据中的低六位与AD低2位的数据合并,形成一个字节存入AD_L8
	MOV	A,		ADC_DATA
	RL	A
	RL	A
	ANL	A,		#11111100B
	ORL	A,		ADC_L8
	MOV	ADC_L8,		A
	MOV	A,		ADC_H2				;AD最高2位的数据单独成一个字节存入ADC_H2
	RLC	A
	RLC	A
	RLC	A
	ANL	A,		#03H
	MOV	ADC_H2,		A
RETURN:		
	POP	ACC
	RET
			
OUT_PUT_Display:	
	MOV	R2,	#0		;R2R3*R6R7=R2R3R4R5
	MOV	R3,	ADC_H2
	MOV	R6,	#0BH		;R6R7=3000
	MOV	R7,	#0B8H
	LCALL	MULD
	MOV	divdhh,	R2
	MOV	divdhl,	R3
	MOV	divdlh,	R4
	MOV	divdll,	R5
	MOV	divl,	#0FFh
	MOV	divh,	#0
	LCALL	divd			;得出来的三位十六进制数存入divdlh,divdll	
	MOV	temp_divdlh,divdlh
	MOV	temp_divdll,divdll
	MOV	divdhh,	#0		;清楚高位被除数
	MOV	divdhl,	#0		;divdll,divdlh就是之前所除的数
	MOV	divl,	#0E8H		;得出十进制的千位
	MOV	divh,	#3
	LCALL	divd
	MOV	display1,divdll		
	MOV	R2,	#0
	MOV	R3,	display1
	MOV	R6,	#3H
	MOV	R7,	#0E8H
	LCALL	MULD
	MOV	A,	temp_divdll
	SUBB	A,	R5
	MOV	temp_divdll,A
	MOV	divdll,	A
	MOV	A,	temp_divdlh
	SUBB	A,	R4
	MOV	temp_divdlh,A
	MOV	divdlh,	A
	MOV	divl,	#100		;得出十进制的百位 
	MOV	divh,	#0
	LCALL	divd
	MOV	display2,divdll
	MOV	R3,	divdll		;*100
	MOV	R6,	#0
	MOV	R7,	#100
	LCALL	MULD
	MOV	A,	temp_divdll
	SUBB	A,	R5
	MOV	temp_divdll,A
	MOV	divdll,	A
	MOV	A,	temp_divdlh
	SUBB	A,	R4
	MOV	temp_divdlh,A
	MOV	divdlh,	A
	MOV	divl,	#10
	LCALL	divd
	MOV	display3,divdll
	MOV	A,	divdll
	MOV	B,	#10
	MUL	AB
	MOV	B,	A
	MOV	A,	temp_divdll
	SUBB	A,	B
	MOV	display4,A
	RET
			
YIWEI:
	CLR	C
	MOV	A,	ADC_L8
	RLC	A
	MOV	YIWEI_L8,A
	MOV	A,	ADC_H2
	RLC	A
	MOV	YIWEI_H2,A
	RET
						
OUT_PUT_Display2:
	MOV	A,	AD_voltageH2		;比对电流值是否超过设定值
	CJNE	A,	YIWEI_H2,O_P_D22
	SJMP	O_P_D23
O_P_D22:	
	JC	O_P_D24
	sjmp	O_P_D40
O_P_D23:
	MOV	A,	AD_voltageL8
	CJNE	A,	YIWEI_L8,	O_P_D25
	SJMP	O_P_D40
O_P_D25:
	JNC	O_P_D40
O_P_D24:
	MOV	display5,	#16
	MOV	display6,	#16
	MOV	display7,	#16
	MOV	display8,	#16
	LJMP	RETURN3
			
O_P_D40:	
	MOV	A,	#1					;比对电流值是否超过2.4V
	CJNE	A,	ADC_H2,	O_P_D42
	SJMP	O_P_D43
O_P_D42:	
	JC	O_P_D44
	sjmp	O_P_D1
O_P_D43:
	MOV	A,	#0EBH
	CJNE	A,	ADC_L8,O_P_D45
	SJMP	O_P_D1
O_P_D45:
	JNC	O_P_D1
O_P_D44:
	MOV	display5,	#17
	MOV	display6,	#17
	MOV	display7,	#17
	MOV	display8,	#17
	LJMP	RETURN3	
		
O_P_D1:		
	JB	Switch_display,	O_P_D11				;;0表示电流,1表示设置
	MOV	div_settingH,	#0H
	MOV	div_settingL,	#0A4H
	SJMP	O_P_D31
O_P_D11:	
	MOV	ADC_H2,		AD_voltageH2
	MOV	ADC_L8,		AD_voltageL8
	MOV	div_settingH,	#1
	MOV	div_settingL,	#55H			

O_P_D31:
	MOV	R2,	ADC_H2		;R2R3*R6R7=R2R3R4R5
	MOV	R3,	ADC_L8
	MOV	R6,	#3H			;R6R7=1000
	MOV	R7,	#0E8H
	LCALL	MULD
	MOV	divdhh,	R2
	MOV	divdhl,	R3
	MOV	divdlh,	R4
	MOV	divdll,	R5
	MOV	divl,	div_settingL
	MOV	divh,	div_settingH
	LCALL	divd			;得出来的三位十六进制数存入divdlh,divdll	
	MOV	temp_divdlh,divdlh
	MOV	temp_divdll,divdll
	MOV	divdhh,	#0		;清楚高位被除数
	MOV	divdhl,	#0		;divdll,divdlh就是之前所除的数
	MOV	divl,	#0E8H		;得出十进制的千位
	MOV	divh,	#3
	LCALL	divd
	MOV	display5,divdll		
	MOV	R2,	#0
	MOV	R3,	display5
	MOV	R6,	#3H
	MOV	R7,	#0E8H
	LCALL	MULD
	MOV	A,	temp_divdll
	SUBB	A,	R5
	MOV	temp_divdll,A
	MOV	divdll,	A
	MOV	A,	temp_divdlh
	SUBB	A,	R4
	MOV	temp_divdlh,A
	MOV	divdlh,	A
	MOV	divl,	#100		;得出十进制的百位 
	MOV	divh,	#0
	LCALL	divd
	MOV	display6,divdll
	MOV	R3,	divdll		;*100
	MOV	R6,	#0
	MOV	R7,	#100
	LCALL	MULD
	MOV	A,	temp_divdll
	SUBB	A,	R5
	MOV	temp_divdll,A
	MOV	divdll,A
	MOV	A,	temp_divdlh
	SUBB	A,	R4
	MOV	temp_divdlh,A
	MOV	divdlh,	A
	MOV	divl,	#10
	LCALL	divd
	MOV	display7,divdll
	MOV	A,	divdll
	MOV	B,	#10
	MUL	AB
	MOV	B,	A
	MOV	A,temp_divdll
	SUBB	A,B
	MOV	display8,A
RETURN3:RET			
						
			
display:	MOV		R0,#30H
			MOV		A,P1
			ANL		A,#10001111B
			MOV		B,A		
DP_1:		MOV		DPTR,#segtab
			MOV		A,@R0
			MOVC	A,@A+DPTR
			MOV		P1,B
			
			
			MOV		R7,A
			MOV		A,P1
			ANL		A,#01110000B
			CJNE	A,#00110000B,DP_4
			SJMP	DP_3
DP_4:		CJNE	A,#01100000B,DP_5
DP_3:		MOV		A,R7
			ANL		A,#7FH
			MOV		R7,A			
DP_5:		MOV		P2,R7			
			
			MOV		A,#1
			LCALL	Delay
			INC		R0
			MOV		A,B
			ANL		A,#01110000B
			CJNE	A,#01110000B,DP_2
			SJMP	DP_RETURN
DP_2:		ADD		A,#00010000B
			MOV		R7,A
			MOV		A,B
			ANL		A,#10001111B
			ORL		A,R7
			MOV		B,A
			SJMP	DP_1			
DP_RETURN:	RET



			

		
		


MULD: 	MOV A,R3 	;计算R3乘R7
 	MOV B,R7
 	MUL AB
 	MOV R4,B		;暂存部分积
 	MOV R5,A
 	MOV A,R3		;计算R3乘R6
 	MOV B,R6
 	MUL AB
 	ADD A,R4		;累加部分积
 	MOV R4,A
 	CLR A
 	ADDC A,B
 	MOV R3,A
 	MOV A,R2		;计算R2乘R7
 	MOV B,R7
 	MUL AB
 	ADD A,R4		;累加部分积
 	MOV R4,A
 	MOV A,R3
 	ADDC A,B
 	MOV R3,A
 	CLR A
 	RLC A
 	XCH A,R2		;计算R2乘R6
 	MOV B,R6
 	MUL AB
 	ADD A,R3		;累加部分积
 	MOV R3,A
 	MOV A,R2
 	ADDC A,B
 	MOV R2,A
 	RET
 
 divd:   push        acc
        push        b
    	mov    a,divh    ;判除数是否为零
   	orl    a,divl
   	jnz    divd0
   	setb    ov        ;除数为零,置溢出标志
   	pop    b
    	pop    acc
    	ret
divd0:  mov    templ,#00h    ;除数不为零,进行运算
    	mov    temph,#00h
    	mov    b,#20h        ;置循环次数
divd1:	clr    c            ;进位位、余数单元和
    	mov    a,divdll        ;被除数单元全体逐个
    	rlc    a            ;向左循环移位
    	mov    divdll,a
    	mov    a,divdlh
    	rlc    a
    	mov    divdlh,a
    	mov    a,divdhl
    	rlc    a
    	mov    divdhl,a
    	mov    a,divdhh
    	rlc    a
	mov    	divdhh,a
	mov    	a,templ
	rlc    	a
	mov    	templ,a
	xch    	a,temph
	rlc    	a
	xch    	a,temph
	mov    	f0,c            ;保存进位位
	clr    	c
	subb    a,divl        ;用余数减去除数
	mov    	r7,a
	mov    	a,temph
	subb    a,divh
	anl    	c,/f0            ;判断是否够减
	jc    	divd2        ;不够减,移下一位
	mov    	templ,r7        ;够减,刷新余数单元
	mov    	temph,a
	inc    	divdll        ;商上1
divd2:  djnz    b,divd1
    	clr    ov
    	
    	pop    b
    	pop    acc
    	ret

			
Delay:			PUSH	02				;;;延时子程序,但是不知道晶振大小,不能确定周期,假设晶振为18.432M
			PUSH	03
			PUSh	04
			MOV	R4,A
Delay_Loop0:		MOV	R3,	#12
Delay_Loop1:		MOV	R2,	#250			;T=2MS
Delay_Loop:		DJNZ	R2,	Delay_Loop
			DJNZ	R3,	Delay_Loop1
			DJNZ	R4,	Delay_Loop0
  			POP	04
			POP	03
			POP	02
			RET			
			
;                    0    1    2    3    4   5   6   7
segtab:         db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h
;                    8   9   a   b   c    d    e   f     _
                db 80h,90h,88h,83h,0c6h,0a1h,86h,8eh,11110111b,11111110b

end

⌨️ 快捷键说明

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