本帖最后由 51黑黑黑 于 2016-3-3 00:53 編輯
(一)、測量原理
下面我們要利用淘汰的數字電度表芯,制作一個具有測量電功率和電度數的插排。早期的電子式電度表采用AD7755系列芯片,或類似的國產芯片。 下圖是AD7755的功能框圖,AD7755是一種高精度的電功率測量芯片,其內部的乘法器是數字型乘法器。它的工作原理是由分壓器完成電壓取樣,電流通過錳銅片分流完成電流取樣,取樣后的電壓、電流信號由乘法器轉換為功率信號,經數字--頻率變換后,它輸出的脈沖信號可以直接驅動計數器的步進電機來顯示電度數。V1P、V1N為電流傳感器的模擬輸入端,V2P、V2N為電壓傳感器的模擬輸入端。ADE7755引腳F1和F2以較低頻率形式輸出有功功率平均值,能直接驅動機電式計度器或MCU接口。引腳CF以較高頻率形式輸出有功功率瞬時值,用于校驗或與MCU接口。我們制作的插排就是利用CF經光電耦合器輸出的電度脈沖進行計數來獲得負載的功率和電度數。單片機的INT0接光耦輸出端,每個電度脈沖來到時產生中斷,中斷程序中對電度脈沖數計數,夠160個脈沖35h單元加1,35單元存電度數1/10位,36單元存電度數個位。中斷程序中還要對2個脈沖之間進行定時,第1個脈沖來到,啟動定時器,第二個脈沖再來時關閉定時器,這樣就獲得了一個脈沖周期所用的時間t存放到41H和42H單元。DDS67型單相電子式電能表1度電是1600個脈沖。那么1瓦*2250秒=1個脈沖,定時器0的定時時長為50毫秒,每50毫秒41H加1,42H是50ms計數高位,(42H,41H)*50是一個脈沖周期的時長(ms),2250/0.05=45000,所以用45000除以(42H,41H)的計數值就等于功率數(瓦)。最小量程45000除以65535=0.68瓦,需1.82小時完成,最大量程是45000/1=45kw,50毫秒鐘完成。一般家用電器的功率都在幾瓦到上千瓦,所以測量時間在幾分鐘內完成。開始測量時,每個脈沖到來時顯示用電器的功率數,當脈沖達到160個以后就顯示0.1度開始的電度數。 (二)單片機電路及電度表電路
插排顯示的0070是我正在使用的微機實際消耗功率是70瓦。
(三)、電度表插排程序
ORG0000h ;
AJMPL1
ORG 0003h
AcallZD
ORG 000BH
AJMP CT
ORG 0023H
RETI
ORG 0030H
L1: MOVSP,#60H ;設堆棧指針
MOV A,#21H ;定時器1\0工作方式2,8位可重裝,
MOVTMOD,A ;
MOV 8BH,#0F3H ;給定時器1賦值6M=FF,1200波特率
MOV8DH,#0F3H ;給定時器0賦值6M=FF,1200波特率
MOV TH0, #9EH ;定時50毫秒
MOV TL0, #58H
SETB 0BCH ;通信中斷優先,IP中PS置1
MOVA,#93H ;允許串口和定時器0及INTO中斷及總中斷,禁止定時器1中斷
MOVIE,A ;A8H
SETBIT0 ;INT0下降沿觸發
MOV A,#50H;;設串行口模式1,允許接收。
MOVSCON,A ;送串行控制SCON
CLR REN
MOVA,#00H
MOVR2,#50D ;清數據區
MOV R0,#20H
QRAM: MOV @R0, A
INC R0
DJNZ R2, QRAM
DIS:MOV DPTR,#0700H
MOV A,35H
JZ DIS1
MOV R1, #35H ;夠160個脈沖顯示電度數
AJMP DIS2
DIS1: MOV R1,#30H
DIS2: MOV A,@R1
MOVC A, @A+DPTR
MOV P1,A
CLR P3.3
ACALL DELAY1
SETB p3.3
INC R1
MOV A, @R1
MOVC A,@A+DPTR
MOV P1,A
CLR P3.4
MOVA,R1
CJNEA,#36H,DIS4
CLR P1.0
DIS4: ACALLDELAY1
SETB p3.4
INCR1
MOVA, @R1
MOVC A,@A+DPTR
MOV P1,A
CLR P3.5
ACALL DELAY1
SETB p3.5
INCR1
MOVA, @R1
MOVC A,@A+DPTR
MOV P1,A
CLR P3.7
ACALL DELAY1
SETB p3.7
J6: AJMP DIS
ORG 0100h;定時器中斷子程序
CT: MOV 8CH, #9EH
MOV 8AH, #58H ;BEH
PUSH 0D0H
PUSH 0E0H
PUSH 82H
PUSH 83H
INC41H ;50毫秒計數低2位41H,42H是50ms計數高位
MOV A,41H
CJNE A, #0FFH, DONE2
INC 42H
DONE2: MOV A, 2FH
INC A
MOV 2FH, A
CJNE A, #14H, DONE
MOV 2FH, #00H
MOV A,30H
INC A
MOV 30H,A
; MOV 41H,A
CJNE A, #0AH, DONE
MOV 30H, #00H
MOV A, 31H
INC A
MOV 31H, A
CJNE A, #0AH, DONE
MOV 31H, #00H
MOV A, 32H
INC A
MOV 32H, A
CJNE A, #0AH, DONE
MOV 32H,#00H
MOV A, 33H
INC A
MOV 33H, A
CJNE A, #0AH,DONE
MOV 33H, #00H
DONE: POP 83H
POP 82H
POP 0E0H
POP 0D0H
RETI
ORG 0200H
; INT0中斷程序
ZD: MOV A,34H
INCA ;電度脈沖數加1
MOV 34H ,A
CJNE A,#0A0H,ZD1 ;夠160個脈沖35h單元加1,35單元存電度數1/10位
MOV 34H, #00H
MOV A,35H
INC A
MOV 35H,A
CJNEA,#0AH,ZD1 ;夠160個脈沖35h單元加1,36單元存電度數個位
MOV 35H,#00H
INC 36H
ZD1: MOVA,40H ;是第二個脈沖嗎
XRL A,#00H
JZ DIS3
CLRTR0 ;第二個脈沖到,關閉定時器
MOV40H,#00H ;置標志
ACALL DIVD ;調用除法程序
ACALLIBTD ;調用二進制數轉壓縮的十進制數子程序
MOVA,r6 ;把壓縮的十進制數送顯示區
ANL A,#0FH
MOV 30H,A
MOV A,r6
ANL A,#0F0H
SWAP A
MOV 31H,A
MOV A,r5
ANL A,#0FH
MOV32H,A
MOV A,r5
ANL A,#0F0H
SWAP A
MOV 33H,A
AJMP FH
DIS3: MOV40H,#01H ;置標志
MOV 2FH,#00
MOV 30H,#00
MOV 31H,#00
MOV 32H,#00
MOV 33H,#00
MOV41H,#00 ;秒存儲單元低位FF
MOV42H,#00 ;秒存儲單元高位FF
SETBTR0 ;第一脈沖啟動定時器計秒數
FH: RETI
org 0500h
;入口條件:被除數在R2、R3、R4、R5中,除數在R6、R7中。
;出口信息:OV=0時,雙字節商在R4、R5中,OV=1 時溢出。
;影響資源:PSW、A、B、R1~R7 堆棧需求: 2字節
DIVD: MOV R2,#00H
MOV R3,#00H
MOV R4,#57H
MOV R5,#0E4H
MOV R4,#0AFH ;45000
MOV R5,#0C8H
MOV R6,42H;50毫秒存儲單元高位FF
MOV R7,41H;50毫秒存儲單元低位FF
CLR C ;比較被除數和除數
MOV A,R3
SUBB A,R7
MOV A,R2
SUBB A,R6
JC DVD1
SETB OV ;溢出
RET
DVD1: MOV B,#10H ;計算雙字節商
DVD2: CLR C ;部分商和余數同時左移一位
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOVR3,A
XCH A,R2
RLC A
XCH A,R2
MOV F0,C ;保存溢出位
CLR C
SUBB A,R7 ;計算(R2R3-R6R7)
MOV R1,A
MOV A,R2
SUBB A,R6
JB F0,DDIV2;ANL C,/F0 ;結果判斷
JC DVD3
DDIV2: MOV R2,A;夠減,存放新的余數
MOV A,R1
MOV R3,A
INC R5 ;商的低位置一
DVD3: DJNZ B,DVD2 ;計算完十六位商(R4R5)
MOV A,R4 ;將商移到R2R3中
MOV R2,A
MOV A,R5
MOV R3,A
CLR OV ;設立成功標志
RET
IBTD: CLRA ;雙字節二翻十子程序(R2R3)---(R4R5R6),結果為壓縮BCD碼
MOV R4,A
MOV R5,A
MOV R6,A
MOV R7,#10H
LOOP: CLR C
MOV A,R3
RLC A
MOV R3,A
MOVA,R2
RLC A
MOV R2,A
MOV A,R6
ADDC A,R6
DA A
MOV R6,A
MOV A,R5
ADDC A,R5
DA A
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
DJNZ R7,LOOP
RET
ORG 0700H
DB03H,9FH,25H,0DH,99H,49H,41H,1FH,01H,09H,11H,0C1H,63H ;89ABCDEFP熄滅
DB85H,61H,71H,31H,0FFH,0FCH;"-"
DELAY: MOV R5, #0FFH
DEL: NOP
DJNZ R5,DEL
RET
DELAY1: MOV R6, #4H
DELA: ACALL DELAY
DJNZ R6,DELA
RET
DELAY2: MOV R6, #0FFH
DE: ACALLDELAY
DJNZ R6,DE
RET
END
|