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

📄 power.asm

📁 使用STC12C5410AD芯片
💻 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

⌨️ 快捷键说明

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