📄 power.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 + -