ADC0809是采樣頻率為8位的、以逐次逼近原理進(jìn)行?!獢?shù)轉(zhuǎn)換的器件。其內(nèi)部有一個(gè)8通道多路開關(guān),它可以根據(jù)地址碼鎖存譯碼后的信號(hào),只選通8路模擬輸入信號(hào)中的一個(gè)進(jìn)行A/D轉(zhuǎn)換。
1.主要特性
1)8路8位A/D轉(zhuǎn)換器,即分辨率8位。
2)具有轉(zhuǎn)換起??刂贫?。
3)轉(zhuǎn)換時(shí)間為100μs
5)模擬輸入電壓范圍0~+5V,不需零點(diǎn)和滿刻度校準(zhǔn)。
6)工作溫度范圍為-40~+85攝氏度
7)低功耗,約15mW。
一、ADC0809用法詳解—引腳圖及功能
1、ADC0809引腳圖
2、ADC0809引腳功能
IN0~IN7:8路模擬量輸入端。
D0~D7:8位數(shù)字量輸出端。
ADDA、ADDB、ADDC:3位地址輸入線,用于選擇8路模擬通道中的一路,選擇情況見表。
ALE:地址鎖存允許信號(hào),輸入,高電平有效。
START:A/D轉(zhuǎn)換啟動(dòng)信號(hào),輸入,高電平有效。
EOC:A/D轉(zhuǎn)換結(jié)束信號(hào),輸出。當(dāng)啟動(dòng)轉(zhuǎn)換時(shí),該引腳為低電平,當(dāng)A/D轉(zhuǎn)換結(jié)束時(shí),該線腳輸出高電平。
OE:數(shù)據(jù)輸出允許信號(hào),輸入,高電平有效。當(dāng)轉(zhuǎn)換結(jié)束后,如果從該引腳輸入高電平,則打開輸出三態(tài)門,輸出鎖存器的數(shù)據(jù)從D0~D7送出。
CLK:時(shí)鐘脈沖輸入端。要求時(shí)鐘頻率不高于640KHZ.REF+、REF-:基準(zhǔn)電壓輸入端。
Vcc:電源,接+5V電源。
GND:地。
二、ADC0809用法詳解—工作原理
ADC0809是采用CMOS工藝制造的雙列直插式單片8位A/D轉(zhuǎn)換器。(分辨率)分辨率8位,精度7位,帶8個(gè)模擬量輸入通道,有通道地址譯碼鎖存器,輸出帶三態(tài)數(shù)據(jù)鎖存器。啟動(dòng)信號(hào)為脈沖啟動(dòng)方式,最大可調(diào)節(jié)誤差為±1LSB。(轉(zhuǎn)換精度)
ADC0809內(nèi)部沒有時(shí)鐘電路,故CLK時(shí)鐘需由外部輸入,fclk允許范圍為500kHz~1MHz,典型值為640kHz。每通道的轉(zhuǎn)換需66~73個(gè)時(shí)鐘脈沖,大約100~110μs。(轉(zhuǎn)換時(shí)間)工作溫度范圍為-40℃~+85℃。功耗為15mW,輸入電壓范圍為0~5V,單一+5V電源供電。(量程)
1、ADC0809時(shí)序圖
2、ADC0809的工作流程如圖所示:
1)輸入3位地址,并使ALE=1,將地址存入地址鎖存器中,經(jīng)地址譯碼器譯碼從8路模擬通道中選通一路模擬量送到比較器。
2)送START一高脈沖,START的上升沿使逐次逼近寄存器復(fù)位,下降沿啟動(dòng)A/D轉(zhuǎn)換,并使EOC信號(hào)為低電平。
3)當(dāng)轉(zhuǎn)換結(jié)束時(shí),轉(zhuǎn)換的結(jié)果送入到輸出三態(tài)鎖存器,并使EOC信號(hào)回到高電平,通知CPU已轉(zhuǎn)換結(jié)束。
4)當(dāng)CPU執(zhí)行一讀數(shù)據(jù)指令,使OE為高電平,則從輸出端D0~D1讀出數(shù)據(jù)。
3、轉(zhuǎn)換數(shù)據(jù)的傳送
A/D轉(zhuǎn)換后得到的數(shù)據(jù)應(yīng)及時(shí)傳送給單片機(jī)進(jìn)行處理。數(shù)據(jù)傳送的關(guān)鍵問題是如何確認(rèn)A/D轉(zhuǎn)換的完成,因?yàn)橹挥写_認(rèn)完成后,才能進(jìn)行傳送。為此可采用下述三種方式。
?。?)定時(shí)傳送方式
對(duì)于一種A/D轉(zhuǎn)換器來說,轉(zhuǎn)換時(shí)間作為一項(xiàng)技術(shù)指標(biāo)是已知的和固定的。例如ADC0809轉(zhuǎn)換時(shí)間為128μs,相當(dāng)于6MHz的MCS-51單片機(jī)共64個(gè)機(jī)器周期??蓳?jù)此設(shè)計(jì)一個(gè)延時(shí)子程序,A/D轉(zhuǎn)換啟動(dòng)后即調(diào)用此子程序,延遲時(shí)間一到,轉(zhuǎn)換肯定已經(jīng)完成了,接著就可進(jìn)行數(shù)據(jù)傳送。
?。?strong>2)查詢方式
A/D轉(zhuǎn)換芯片有表明轉(zhuǎn)換完成的狀態(tài)信號(hào),例如ADC0809的EOC端。因此可以用查詢方式,測(cè)試EOC的狀態(tài),即可確認(rèn)轉(zhuǎn)換是否完成,并接著進(jìn)行數(shù)據(jù)傳送。
(3)中斷方式
把表明轉(zhuǎn)換完成的狀態(tài)信號(hào)(EOC)作為中斷請(qǐng)求信號(hào),以中斷方式進(jìn)行數(shù)據(jù)傳送。不管使用上述哪種方式,只要一旦確定轉(zhuǎn)換完成,即可通過指令進(jìn)行數(shù)據(jù)傳送。首先送出口地址并以信號(hào)有效時(shí),OE信號(hào)即有效,把轉(zhuǎn)換數(shù)據(jù)送上數(shù)據(jù)總線,供單片機(jī)接受。
三、ADC0809用法詳解—內(nèi)部結(jié)構(gòu)
1.ADC0809的內(nèi)部結(jié)構(gòu)
ADC0809的內(nèi)部邏輯結(jié)構(gòu)圖如圖所示
圖中多路開關(guān)可選通8個(gè)模擬通道,允許8路模擬量分時(shí)輸入,共用一個(gè)A/D轉(zhuǎn)換器進(jìn)行轉(zhuǎn)換,這是一種經(jīng)濟(jì)的多路數(shù)據(jù)采集方法地址鎖存與譯碼電路完成對(duì)ABC3個(gè)地址位進(jìn)行鎖存和譯碼,其譯碼輸出用于通道選擇,其轉(zhuǎn)換結(jié)果通過三態(tài)輸出鎖存器存放輸出,因此可以直接與系統(tǒng)數(shù)據(jù)總線相連,表1為通道選擇表。
表1通道選擇表
2、ADC0809信號(hào)引腳
對(duì)ADC0809主要信號(hào)引腳的功能說明如下:
START轉(zhuǎn)換啟動(dòng)信號(hào)START上升沿時(shí),復(fù)位ADC0809;START下降沿時(shí)啟動(dòng)芯片,開始進(jìn)行A/D轉(zhuǎn)換;在A/D轉(zhuǎn)換期間,START應(yīng)保持低電平本信號(hào)有時(shí)簡寫為ST.
ABC地址線通道端口選擇線,A為低地址,C為高地址,引腳圖中為ADDA,ADDB和ADDC其地址狀態(tài)與通道對(duì)應(yīng)關(guān)系見表1。
CLK時(shí)鐘信號(hào)ADC0809的內(nèi)部沒有時(shí)鐘電路,所需時(shí)鐘信號(hào)由外界提供,因此有時(shí)鐘信號(hào)引腳通常使用頻率為500KHz的時(shí)鐘信號(hào)
EOC轉(zhuǎn)換結(jié)束信號(hào)EOC=0,正在進(jìn)行轉(zhuǎn)換;EOC=1,轉(zhuǎn)換結(jié)束使用中該狀態(tài)信號(hào)即可作為查詢的狀態(tài)標(biāo)志,又可作為中斷請(qǐng)求信號(hào)使用
OE輸出允許信號(hào)用于控制三態(tài)輸出鎖存器向單片機(jī)輸出轉(zhuǎn)換得到的數(shù)據(jù)OE=0,輸出數(shù)據(jù)線呈高阻;OE=1,輸出轉(zhuǎn)換得到的數(shù)據(jù)
Vcc+5V電源
Vref參考電源參考電壓用來與輸入的模擬信號(hào)進(jìn)行比較,作為逐次逼近的基準(zhǔn)其典型值為+5V(Vref(+)=+5V,Vref(-)=-5V)。
四、ADC0809用法詳解—應(yīng)用電路
1、ADC0809與單片機(jī)連接電路分析
ADC0809與MCS-51單片機(jī)的連接如圖所示:
電路連接主要涉及兩個(gè)問題一是8路模擬信號(hào)通道的選擇,二是A/D轉(zhuǎn)換完成后轉(zhuǎn)換數(shù)據(jù)的傳送。
8路模擬通道選擇
圖ADC0809與MCS-51的連接
如圖9.11所示模擬通道選擇信號(hào)ABC分別接最低三位地址A0A1A2即(P0.0P0.1P0.2),而地址鎖存允許信號(hào)ALE由P2.0控制,則8路模擬通道的地址為0FEF8H~0FEFFH.此外,通道地址選擇以作寫選通信號(hào),這一部分電路連接如圖9.12所示
圖ADC0809的部分信號(hào)連接
圖 ?信號(hào)的時(shí)間配合
從圖中可以看到,把ALE信號(hào)與START信號(hào)接在一起了,這樣連接使得在信號(hào)的前沿寫入(鎖存)通道地址,緊接著在其后沿就啟動(dòng)轉(zhuǎn)換圖是有關(guān)信號(hào)的時(shí)間配合示意圖
啟動(dòng)A/D轉(zhuǎn)換只需要一條MOVX指令在此之前,要將P2.0清零并將最低三位與所選擇的通道好像對(duì)應(yīng)的口地址送入數(shù)據(jù)指針DPTR中例如要選擇IN0通道時(shí),可采用如下兩條指令,即可啟動(dòng)A/D轉(zhuǎn)換:
MOVDPTR,#FE00H;送入0809的口地址
MOVX@DPTR,A;啟動(dòng)A/D轉(zhuǎn)換(IN0)
注意:此處的A與A/D轉(zhuǎn)換無關(guān),可為任意值。
2、應(yīng)用電路二
1、原理圖從ADC0809的通道IN3輸入0-5V之間的模擬量,通過ADC0809轉(zhuǎn)換成數(shù)字量在數(shù)碼管上以十進(jìn)制形成顯示出來。ADC0809的VREF接+5V電壓。
圖 ? ? 電路原理圖
2、系統(tǒng)板上硬件連線
?。?).把“單片機(jī)系統(tǒng)板”區(qū)域中的P1端口的P1.0-P1.7用8芯排線連接到“動(dòng)態(tài)數(shù)碼顯示”區(qū)域中的ABCDEFGH端口上,作為數(shù)碼管的筆段驅(qū)動(dòng)。
?。?).把“單片機(jī)系統(tǒng)板”區(qū)域中的P2端口的P2.0-P2.7用8芯排線連接到“動(dòng)態(tài)數(shù)碼顯示”區(qū)域中的S1S2S3S4S5S6S7S8端口上,作為數(shù)碼管的位段選擇。
(3).把“單片機(jī)系統(tǒng)板”區(qū)域中的P0端口的P0.0-P0.7用8芯排線連接到“模數(shù)轉(zhuǎn)換模塊”區(qū)域中的D0D1D2D3D4D5D6D7端口上,A/D轉(zhuǎn)換完畢的數(shù)據(jù)輸入到單片機(jī)的P0端口
(4).把“模數(shù)轉(zhuǎn)換模塊”區(qū)域中的VREF端子用導(dǎo)線連接到“電源模塊”區(qū)域中的VCC端子上;
?。?).把“模數(shù)轉(zhuǎn)換模塊”區(qū)域中的A2A1A0端子用導(dǎo)線連接到“單片機(jī)系統(tǒng)”區(qū)域中的P3.4P3.5P3.6端子上;
?。?).把“模數(shù)轉(zhuǎn)換模塊”區(qū)域中的ST端子用導(dǎo)線連接到“單片機(jī)系統(tǒng)”區(qū)域中的P3.0端子上;
?。?).把“模數(shù)轉(zhuǎn)換模塊”區(qū)域中的OE端子用導(dǎo)線連接到“單片機(jī)系統(tǒng)”區(qū)域中的P3.1端子上;
?。?).把“模數(shù)轉(zhuǎn)換模塊”區(qū)域中的EOC端子用導(dǎo)線連接到“單片機(jī)系統(tǒng)”區(qū)域中的P3.2端子上;
?。?).把“模數(shù)轉(zhuǎn)換模塊”區(qū)域中的CLK端子用導(dǎo)線連接到“分頻模塊”區(qū)域中的/4端子上;
?。?0).把“分頻模塊”區(qū)域中的CKIN端子用導(dǎo)線連接到“單片機(jī)系統(tǒng)”區(qū)域中的ALE端子上;
?。?1).把“模數(shù)轉(zhuǎn)換模塊”區(qū)域中的IN3端子用導(dǎo)線連接到“三路可調(diào)壓模塊”區(qū)域中的VR1端子上;
3、程序設(shè)計(jì)
?。?).進(jìn)行A/D轉(zhuǎn)換時(shí),采用查詢EOC的標(biāo)志信號(hào)來檢測(cè)A/D轉(zhuǎn)換是否完畢,若完畢則把數(shù)據(jù)通過P0端口讀入,經(jīng)過數(shù)據(jù)處理之后在數(shù)碼管上顯示。
(2).進(jìn)行A/D轉(zhuǎn)換之前,要啟動(dòng)轉(zhuǎn)換的方法:
ABC=110選擇第三通道
ST=0,ST=1,ST=0產(chǎn)生啟動(dòng)轉(zhuǎn)換的正脈沖信號(hào)
程序:
#include《AT89X52.H》
unsignedcharcodedispbitcode[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};
unsignedcharcodedispcode[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x00};
unsignedchardispbuf[8]={10,10,10,10,10,0,0,0};
unsignedchardispcount;
sbitST=P3^0;
sbitOE=P3^1;
sbitEOC=P3^2;
unsignedcharchannel=0xbc;//IN3
unsignedchargetdata;
voidmain(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;
}
}
voidt0(void)interrupt1using0
{
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
P1=dispcode[dispbuf[dispcount]];
P2=dispbitcode[dispcount];
dispcount++;
if(dispcount==8)
{
dispcount=0;
}
}
評(píng)論