ADC0809是帶有8位A/D轉(zhuǎn)換器、8路多路開關(guān)以及微處理機(jī)兼容的控制邏輯的CMOS組件。它是逐次逼近式A/D轉(zhuǎn)換器,可以和單片機(jī)直接接口。
(1)ADC0809的內(nèi)部邏輯結(jié)構(gòu)
由下圖可知,ADC0809由一個8路模擬開關(guān)、一個地址鎖存與譯碼器、一個A/D轉(zhuǎn)換器和一個三態(tài)輸出鎖存器組成。多路開關(guān)可選通8個模擬通道,允許8路模擬量分時輸入,共用A/D轉(zhuǎn)換器進(jìn)行轉(zhuǎn)換。三態(tài)輸出鎖器用于鎖存A/D轉(zhuǎn)換完的數(shù)字量,當(dāng)OE端為高電平時,才可以從三態(tài)輸出鎖存器取走轉(zhuǎn)換完的數(shù)據(jù)。
(2). ADC0809引腳結(jié)構(gòu)
ADC0809各腳功能如下:
D7-D0:8位數(shù)字量輸出引腳。
IN0-IN7:8位模擬量輸入引腳。
VCC:+5V工作電壓。
GND:地。
REF(+):參考電壓正端。
REF(-):參考電壓負(fù)端。
START:A/D轉(zhuǎn)換啟動信號輸入端。
ALE:地址鎖存允許信號輸入端。
(以上兩種信號用于啟動A/D轉(zhuǎn)換).
EOC:轉(zhuǎn)換結(jié)束信號輸出引腳,開始轉(zhuǎn)換時為低電平,當(dāng)轉(zhuǎn)換結(jié)束時為高電平。
OE:輸出允許控制端,用以打開三態(tài)數(shù)據(jù)輸出鎖存器。
CLK:時鐘信號輸入端(一般為500KHz)。
A、B、C:地址輸入線。
ADC0809對輸入模擬量要求:信號單極性,電壓范圍是0-5V,若信號太小,必須進(jìn)行放大;輸入的模擬量在轉(zhuǎn)換過程中應(yīng)該保持不變,如若模擬量變化太快,則需在輸入前增加采樣保持電路。
地址輸入和控制線:4條
ALE為地址鎖存允許輸入線,高電平有效。當(dāng)ALE線為高電平時,地址鎖存與譯碼器將A,B,C三條地址線的地址信號進(jìn)行鎖存,經(jīng)譯碼后被選中的通道的模擬量進(jìn)轉(zhuǎn)換器進(jìn)行轉(zhuǎn)換。A,B和C為地址輸入線,用于選通IN0-IN7上的一路模擬量輸入。通道選擇表如下表所示。
C |
B |
A |
選擇的通道 |
0 |
0 |
0 |
IN0 |
0 |
0 |
1 |
IN1 |
0 |
1 |
0 |
IN2 |
0 |
1 |
1 |
IN3 |
1 |
0 |
0 |
IN4 |
1 |
0 |
1 |
IN5 |
1 |
1 |
0 |
IN6 |
1 |
1 |
1 |
IN7 |
數(shù)字量輸出及控制線:11條
ST為轉(zhuǎn)換啟動信號。當(dāng)ST上跳沿時,所有內(nèi)部寄存器清零;下跳沿時,開始進(jìn)行A/D轉(zhuǎn)換;在轉(zhuǎn)換期間,ST應(yīng)保持低電平。EOC為轉(zhuǎn)換結(jié)束信號。當(dāng)EOC為高電平時,表明轉(zhuǎn)換結(jié)束;否則,表明正在進(jìn)行A/D轉(zhuǎn)換。OE為輸出允許信號,用于控制三條輸出鎖存器向單片機(jī)輸出轉(zhuǎn)換得到的數(shù)據(jù)。OE=1,輸出轉(zhuǎn)換得到的數(shù)據(jù);OE=0,輸出數(shù)據(jù)線呈高阻狀態(tài)。D7-D0為數(shù)字量輸出線。
CLK為時鐘輸入信號線。因ADC0809的內(nèi)部沒有時鐘電路,所需時鐘信號必須由外界提供,通常使用頻率為500KHZ,
VREF(+),VREF(-)為參考電壓輸入。
2. ADC0809應(yīng)用說明
(1). ADC0809內(nèi)部帶有輸出鎖存器,可以與AT89S51單片機(jī)直接相連。
(2). 初始化時,使ST和OE信號全為低電平。
(3). 送要轉(zhuǎn)換的哪一通道的地址到A,B,C端口上。
(4). 在ST端給出一個至少有100ns寬的正脈沖信號。
(5). 是否轉(zhuǎn)換完畢,我們根據(jù)EOC信號來判斷。
(6). 當(dāng)EOC變?yōu)楦唠娖綍r,這時給OE為高電平,轉(zhuǎn)換的數(shù)據(jù)就輸出給單片機(jī)了。
3. 實(shí)驗(yàn)任務(wù)
如下圖所示,從ADC0809的通道IN3輸入0-5V之間的模擬量,通過ADC0809轉(zhuǎn)換成數(shù)字量在數(shù)碼管上以十進(jìn)制形成顯示出來。ADC0809的VREF接+5V電壓。
6. 程序設(shè)計內(nèi)容
(1). 進(jìn)行A/D轉(zhuǎn)換時,采用查詢EOC的標(biāo)志信號來檢測A/D轉(zhuǎn)換是否完畢,若完畢則把數(shù)據(jù)通過P0端口讀入,經(jīng)過數(shù)據(jù)處理之后在數(shù)碼管上顯示。
(2). 進(jìn)行A/D轉(zhuǎn)換之前,要啟動轉(zhuǎn)換的方法:
ABC=110選擇第三通道
ST=0,ST=1,ST=0產(chǎn)生啟動轉(zhuǎn)換的正脈沖信號 .
C語言源程序
#include
unsigned char code dispbitcode[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x00};
unsigned char dispbuf[8]={10,10,10,10,10,0,0,0};
unsigned char dispcount;
sbit ST="P3"^0;
sbit OE="P3"^1;
sbit EOC="P3"^2;
unsigned char channel="0xbc";//IN3
unsigned char getdata;
void main(void)
{
TMOD=0x01;
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
TR0=1;
ET0=1;
EA=1;
P3=channel;
while(1)
{
ST=0;
ST=1;
ST=0;
while(EOC==0);
OE=1;
getdata=P0;
OE=0;
dispbuf[2]=getdata/100;
getdata=getdata%10;
dispbuf[1]=getdata/10;
dispbuf[0]=getdata%10;
}
}
void t0(void) interrupt 1 using 0
{
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
P1=dispcode[dispbuf[dispcount]];
P2=dispbitcode[dispcount];
dispcount++;
if(dispcount==8)
{
dispcount=0;
}