?? power.asm
字號(hào):
Switch_display BIT 0H
AD_MODE BIT 1H
AD_replacement BIT 2H
divdll equ 28h ;定義被除數(shù)單元
divdlh equ 29h
divdhl equ 2ah
divdhh equ 2bh
divl equ 2ch ;定義除數(shù)單元
divh equ 2dh
templ equ 2eh ;定義余數(shù)單元
temph equ 2fh
display1 EQU 37H ;顯示電壓數(shù)碼管最高位(電壓最高為30V)
display2 EQU 33H ;顯示電壓數(shù)碼管第二高位(要帶小數(shù)點(diǎn))
display3 EQU 35H ;顯示電壓數(shù)碼管第三位
display4 EQU 31H ;顯示電壓數(shù)碼管最低位
display5 EQU 36H ;顯示電流數(shù)碼管最高位(要帶小數(shù)點(diǎn))(最好電流4.5A)
display6 EQU 32H ;顯示電流數(shù)碼管第二位
display7 EQU 34H ;顯示電流數(shù)碼管第三位
display8 EQU 30H ;顯示電流數(shù)碼管最低位
P1M0 EQU 91H ;設(shè)置IO模式
P1M1 EQU 92H ;設(shè)置IO模式
ADC_CONTR EQU 0C5H ;AD特殊功能轉(zhuǎn)換寄存器
ADC_DATA EQU 0C6H ;AD數(shù)據(jù)高8位
ADC_LOW2 EQU 0BEH ;AD數(shù)據(jù)低2位
ADC_H2 EQU 3CH ;存放ADC高2位數(shù)據(jù)
ADC_L8 EQU 3DH ;存放ADC低8位數(shù)據(jù)
YIWEI_H2 EQU 38H ;存放移位后的高2位
YIWEI_L8 EQU 39H ;存放移位后的低8位
AD_voltageH2 EQU 40H ;p1.7口AD輸入的電壓的高2位,作為手動(dòng)調(diào)節(jié)輸入的值
AD_voltageL8 EQU 41H ;p1.7口AD輸入的電壓的低8位,作為手動(dòng)調(diào)節(jié)輸入的值
div_settingH EQU 43H ;存放設(shè)置被除數(shù)高位
div_settingL EQU 44H ;存放設(shè)置被除數(shù)低位
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 ;得出自己設(shè)置的電壓最大值
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是否轉(zhuǎn)換完成
ANL ADC_CONTR, #11100111B ;清楚轉(zhuǎn)換結(jié)束標(biāo)志
MOV ADC_H2, ADC_DATA
MOV ADC_L8, ADC_LOW2
JB AD_MODE, RETURN
ANL ADC_L8, #03H ;AD高八位數(shù)據(jù)中的低六位與AD低2位的數(shù)據(jù)合并,形成一個(gè)字節(jié)存入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位的數(shù)據(jù)單獨(dú)成一個(gè)字節(jié)存入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 ;得出來(lái)的三位十六進(jìn)制數(shù)存入divdlh,divdll
MOV temp_divdlh,divdlh
MOV temp_divdll,divdll
MOV divdhh, #0 ;清楚高位被除數(shù)
MOV divdhl, #0 ;divdll,divdlh就是之前所除的數(shù)
MOV divl, #0E8H ;得出十進(jìn)制的千位
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 ;得出十進(jìn)制的百位
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 ;比對(duì)電流值是否超過(guò)設(shè)定值
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 ;比對(duì)電流值是否超過(guò)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表示設(shè)置
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 ;得出來(lái)的三位十六進(jìn)制數(shù)存入divdlh,divdll
MOV temp_divdlh,divdlh
MOV temp_divdll,divdll
MOV divdhh, #0 ;清楚高位被除數(shù)
MOV divdhl, #0 ;divdll,divdlh就是之前所除的數(shù)
MOV divl, #0E8H ;得出十進(jìn)制的千位
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 ;得出十進(jìn)制的百位
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 ;計(jì)算R3乘R7
MOV B,R7
MUL AB
MOV R4,B ;暫存部分積
MOV R5,A
MOV A,R3 ;計(jì)算R3乘R6
MOV B,R6
MUL AB
ADD A,R4 ;累加部分積
MOV R4,A
CLR A
ADDC A,B
MOV R3,A
MOV A,R2 ;計(jì)算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 ;計(jì)算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 ;判除數(shù)是否為零
orl a,divl
jnz divd0
setb ov ;除數(shù)為零,置溢出標(biāo)志
pop b
pop acc
ret
divd0: mov templ,#00h ;除數(shù)不為零,進(jìn)行運(yùn)算
mov temph,#00h
mov b,#20h ;置循環(huán)次數(shù)
divd1: clr c ;進(jìn)位位、余數(shù)單元和
mov a,divdll ;被除數(shù)單元全體逐個(gè)
rlc a ;向左循環(huán)移位
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 ;保存進(jìn)位位
clr c
subb a,divl ;用余數(shù)減去除數(shù)
mov r7,a
mov a,temph
subb a,divh
anl c,/f0 ;判斷是否夠減
jc divd2 ;不夠減,移下一位
mov templ,r7 ;夠減,刷新余數(shù)單元
mov temph,a
inc divdll ;商上1
divd2: djnz b,divd1
clr ov
pop b
pop acc
ret
Delay: PUSH 02 ;;;延時(shí)子程序,但是不知道晶振大小,不能確定周期,假設(shè)晶振為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
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -