📄 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
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -