用 ADC0804 造一個電壓表
作者:金田日 VR2UKT
ADC0804 是一枚 8 Bit A/D 變換集成電路,採用了逐次迫近的轉換方法。在振蕩頻率 f 為 640KHz 時,取樣時間僅有 100uS。變換出來的數字量以 8 Bit 二進制數碼在 DB7~DB0 接腳輸出。
本電路採用了一枚 CPU (89C51) 負責收取其變換數碼,並以 P2.1 及 P2.0 去控制 ADC0804 的 INTR,WR 接腳。CPU 經處理後,由 LCD 模組顯示出相應的電壓值,這樣,就成了一個數字式電壓表。當然,CPU 還可以隨 Vin 輸入不同的電壓值時發出不同的控制訊號。
A/D 變換
8 bit A/D 變換 IC 需要一組振蕩電路,以產生一系列的頻率去 SU 動 A/D 變換。振蕩器的頻率由 R3﹝10K﹞及 C5﹝150P﹞決定,約 640KHz 左右。基準電壓 Vref/2 輸入電壓值愈小,Vin 在低電壓輸入時仍然有足夠的數字量,本例中,輸入電壓範圍由 0 ~ 25.6V,經 R4﹝9.1K﹞與 R5﹝1K﹞分壓後,變成了 0~ 2.56V。當 Vref/2 為 1.28V 時,數字量 D 與 Vin 變換成了直讀關係,並根據下式計算出數字量 D。

當 Vref/2=1.28V,輸入電壓為 10.5V,經 R4 和 R5 分壓後為 1.05V 數字量 D 計出:


為了達到這樣的效果,電路上我們在 R2 串接了一枚半可調電阻 VR2,並調節 Vref/2 至 1.28V。 ﹝實際上,要借助精密數字電壓表進行調校。﹞
ADC0804 數碼變換過程是這樣的:當 CS 和 WR 輸入同時為 0,中斷 INTR 接腳輸出為 1,ADC0804
的變換就完成了準備工作。經過 100nS 後,待 WR 由 0→1,ADC 進入數碼變換狀態,變換出來的數碼保存在寄存器內。同時,INTR=0,表示變換已經完成。
程式分析: ﹝完整的 .asm
和 .hex 可在
http://www.vr2rc.org 之網上下載﹞
由於篇幅所限,未能將程式詳加剖析,只能將部份講解。
ADC_WR BIT P2.1
ADC_INTR BIT P2.0
LCD_EN BIT P2.7
LCD_RW BIT P2.6
LCD_RS BIT P2.5
;
START EQU 100H
;
ORG 0H
AJMP START
ORG START
ACALL CLR_RAM
ACALL LCD_INTIAL
ACALL PRINT_LOGO
;
STATUS:
CLR ADC_WR
NOP
SETB ADC_WR
;
MOV R7,#150
WAIT:
JNB ADC_INTR,READ
DJNZ R7,WAIT
;
READ:
MOV A,P3
MOV 30H,A
AJMP AGAIN
READ1:
ACALL EXCHANGE
;Print Voltage High Byte
MOV A,#11000100B
ACALL WRINS
MOV A,32H
MOV B,A
ANL A,#11110000B
JNZ P_V1
MOV A,#" "
ACALL WRDATA
AJMP P_V2
P_V1:
SWAP A
ANL A,#00001111B
ADD A,#30H
ACALL WRDATA
;
P_V2:
MOV A,B
ANL A,#00001111B
JNZ P_V3
MOV A,#" "
ACALL WRDATA
AJMP P_V4
P_V3:
ADD A,#30H
ACALL WRDATA
P_V4:
;Print Voltage Low Byte
MOV A,33H
MOV B,A
SWAP A
ANL A,#00001111B
ADD A,#30H
ACALL WRDATA
MOV A,#"."
ACALL WRDATA
MOV A,B
ANL A,#00001111B
ADD A,#30H
ACALL WRDATA
MOV A,#"V"
ACALL WRDATA
AJMP STATUS
;*******************************
AGAIN:
MOV 60H,#0FFH
MOV 61H,#20
US03A:
ACALL DOUBLE
MOV A,60H
;DOUBLE CHECK
CJNE A,30H,US03B
DJNZ 61H,US03A
AJMP US03C
US03B:
;Restart Counter
MOV 61H,#20
MOV 60H,30H
AJMP US03A
US03C:
AJMP READ1
;---------------------------------------------------
DOUBLE:
CLR ADC_WR
NOP
SETB ADC_WR
;
MOV R7,#150
D_WAIT:
JNB ADC_INTR,D_READ
DJNZ R7,D_WAIT
;
D_READ:
MOV A,P3
MOV 30H,A
RET
;********************************
EXCHANGE:
;(16bit BIN>>DEC)
MOV A,30H
MOV B,#064H
DIV AB
MOV 32H,A
MOV A,#0AH
XCH A,B
DIV AB
SWAP A
ADD A,B
MOV 33H,A
RET
;********************************
PRINT_LOGO:
MOV A,#10000010B
ACALL WRINS
MOV DPTR,#LOGO1
ACALL PRINT
RET
PRINT:
MOV R3,#0
PRT1:
MOV A,R3
MOVC A,@A+DPTR
CJNE A,#10H,DSP1
RET
DSP1:
ACALL WRDATA
INC R3
AJMP PRT1
LCD_INTIAL:;Power On
ACALL DELAY20
MOV A,#33H
ACALL WRINS
ACALL DELAY20
MOV A,#32H
ACALL WRINS
ACALL DELAY5
MOV A,#32H
ACALL WRINS
ACALL DELAY1
;LCD Intial
MOV A,#38H ;Function
ACALL WRINS
MOV A,#08H ;Display
ACALL WRINS
MOV A,#01H ;Clean Screen
ACALL WRINS
MOV A,#06H ;Input Mode
ACALL WRINS
MOV A,#0CH ;Dsply Mode
ACALL WRINS
RET
WRINS: ;RS=0,R/W=0,E=0
CLR LCD_RS
CLR LCD_RW
CLR LCD_EN
NOP
WRINS0:
SETB LCD_EN
MOV P1,A
CLR LCD_EN
ACALL DELAY5
CLR LCD_RS
CLR LCD_RW
RET
WRDATA: ;RS=1,R/W=0,E=0
SETB LCD_RS
CLR LCD_RW
CLR LCD_EN
NOP
WRDATA1A:
SETB LCD_EN
MOV P1,A
ACALL DELAY300
CLR LCD_EN
CLR LCD_RS
CLR LCD_RW
RET
|