模數(shù)轉(zhuǎn)換IC ADC0809的使用制做之一……基礎(chǔ)知識(shí)
太羅嗦的內(nèi)容我就不說(shuō)了,只講些跟制做有關(guān)的最精煉的知識(shí)。
ADC0809是可以將我們要測(cè)量的模擬電壓信號(hào)量轉(zhuǎn)換為數(shù)字量從而可以進(jìn)行存儲(chǔ)或顯示的一種轉(zhuǎn)換IC。
下面是它的管腳圖和邏輯圖:
管腳功能說(shuō)明:
IN0-IN7:模擬量輸入通道。就是說(shuō)它可以分時(shí)地分別對(duì)八個(gè)模擬量進(jìn)行測(cè)量轉(zhuǎn)換。
ADDA-C:地址線。也就是通過(guò)這三根地址線的不同編碼來(lái)選擇對(duì)哪個(gè)模擬量進(jìn)行測(cè)量轉(zhuǎn)換。
ALE:地址鎖存允許信號(hào)。在低電平時(shí)向ADDA-C寫(xiě)地址,當(dāng)ALE跳至高電平后ADDA-C上的數(shù)據(jù)被鎖存
START:?jiǎn)?dòng)轉(zhuǎn)換信號(hào)。當(dāng)它為上升沿后,將內(nèi)部寄存器清0。當(dāng)它為下降沿后,開(kāi)始A/D轉(zhuǎn)換。
D0-D7:數(shù)據(jù)輸出口。轉(zhuǎn)換后的數(shù)字?jǐn)?shù)據(jù)量就是從這輸出給S52的。
OE:輸出允許信號(hào),是對(duì)D0-D7的輸出控制端,OE=0,輸出端呈高阻態(tài),OE=1,輸出轉(zhuǎn)換得到的數(shù)據(jù)。
CLOCK:時(shí)種信號(hào)。ADC0809內(nèi)部沒(méi)有時(shí)鐘電路,需由外部提供時(shí)鐘脈沖信號(hào)。一般為500KHz
EOC:轉(zhuǎn)換結(jié)束狀態(tài)信號(hào)。EOC=0,正在進(jìn)行轉(zhuǎn)換。EOC=1,轉(zhuǎn)換結(jié)束,可以進(jìn)行下一步輸出操作
REF(+)、REF(-):參考電壓。參考電壓用來(lái)與輸入的模擬量進(jìn)行比較,作為測(cè)量的基準(zhǔn)。一般REF(=)=5vREF(-)=0V。
下面我先給出ADC0809的時(shí)序圖再說(shuō)說(shuō)它的工作過(guò)程:
它的工作過(guò)程是這樣的,
①在IN0-IN7上可分別接上要測(cè)量轉(zhuǎn)換的8路模擬量信號(hào)。有人問(wèn)了,可不可以只接一路?我就只想測(cè)一個(gè)模擬信號(hào)。當(dāng)然可了,能挑一百斤的擔(dān)子,讓你只挑十斤那還不小菜。廢話太多。。STOP。
②將ADDA-ADDC端給上代表選擇測(cè)量通道的代碼。如000(B)則代表通道0;001(B)代表通道1;111則代表通道7。
③將ALE由低電平置為高電平,從而將ADDA-ADDC送進(jìn)的通道代碼鎖存,經(jīng)譯碼后被選中的通道的模擬量送給內(nèi)部轉(zhuǎn)換單元。
④給START一個(gè)正脈沖。當(dāng)上升沿時(shí),所有內(nèi)部寄存器清零。下降沿時(shí),開(kāi)始進(jìn)行A/D轉(zhuǎn)換;在轉(zhuǎn)換期間,START保持低電平。
⑤EOC為轉(zhuǎn)換結(jié)束信號(hào)。在上述的A/D轉(zhuǎn)換期間,可以對(duì)EOC進(jìn)行不斷測(cè)量,當(dāng)EOC為高電平時(shí),表明轉(zhuǎn)換工作結(jié)束。否則,表明正在進(jìn)行A/D轉(zhuǎn)換。
⑥當(dāng)A/D轉(zhuǎn)換結(jié)束后,將OE設(shè)置為1,這時(shí)D0-D7的數(shù)據(jù)便可以讀取了。OE=0,D0-D7輸出端為高阻態(tài),OE=1,D0-D7端輸出轉(zhuǎn)換的數(shù)據(jù)。
說(shuō)明:ADC0809的轉(zhuǎn)換工作是在時(shí)鐘脈沖的條件下完成的,因此首先要在CLOCK端給它一個(gè)時(shí)鐘信號(hào),說(shuō)明書(shū)上給出了可以接入的脈沖信號(hào)頻率是在10KHz-1280KHz,典型值是640KHz。
時(shí)序圖上的teoc時(shí)長(zhǎng)為,從START上升沿開(kāi)始后的8個(gè)時(shí)鐘同期再加2微秒。這一點(diǎn)得注意,因?yàn)楫?dāng)START脈沖剛結(jié)束進(jìn)入轉(zhuǎn)換工作時(shí),EOC還沒(méi)有立即變?yōu)榈碗娖蕉沁^(guò)了8個(gè)時(shí)鐘周期后才進(jìn)入低電平的,所以再給出START脈沖后最好延時(shí)一會(huì)再進(jìn)行EOC的檢測(cè)。
一個(gè)通道的轉(zhuǎn)換時(shí)間一般為64個(gè)時(shí)鐘周期,如時(shí)鐘頻率為640KHz時(shí),時(shí)鐘周期為1.5625微秒,一個(gè)通道的轉(zhuǎn)換時(shí)間則為1.5625×64=100微秒,那么1秒種就可以轉(zhuǎn)換1000000÷100=10000次。
下面我們給出一個(gè)教材上經(jīng)典的接線圖再說(shuō)明它的利弊:
網(wǎng)上查了一下,補(bǔ)救的辦法基本上是用T0時(shí)鐘來(lái)模擬出個(gè)10KHz的脈沖信號(hào)。這是ADC0809時(shí)鐘脈沖允許的最小值。也的確,一般我們用不著那么快的轉(zhuǎn)換速度,所以給個(gè)10KHz也夠了,還省掉了一個(gè)分頻器。不過(guò)這也基本上是用T0能模擬出的最高頻率了,
sbitCLK=P3^3;
voidmain(void)
{
ET0=1;
EA=1;
TMOD=0X12;
TH0=216;
TL0=216;
TR0=1;
...
}
voidt0(void)interrupt1
{
CLK=~CLK;
}
從上面的程序可以看出,每40個(gè)時(shí)鐘脈沖就發(fā)生一次中斷。S51基本上也就一直忙著中斷處理了。中斷太頻繁,占資源。
我們來(lái)看看D0-D7輸出口,它是只能輸出不能寫(xiě)入的,而ADDA-ADDC又是只能寫(xiě)入而不能輸出的,因此我們可以將74HC373也省掉。同樣74LS02也自然可以不用了。
這樣我們省去了所有的其它門(mén)電路IC,也包括那個(gè)HC373。
簡(jiǎn)化電路為的是使ADC0809在用最少的其它門(mén)電路而使它工作,讓我們能專(zhuān)注學(xué)習(xí)ADC0809是如何工作過(guò)程的?,F(xiàn)在我來(lái)說(shuō)說(shuō)如何更好的模擬出這個(gè)時(shí)鐘。我們現(xiàn)在用的都是S52芯片了,不知道大家用過(guò)里面的T2時(shí)鐘嗎?它有個(gè)時(shí)鐘輸出功能,如下圖:
我試驗(yàn)了一下T2時(shí)鐘,很好用:
/*這個(gè)程序讓AT89S52的T2時(shí)鐘從P1.0口輸出45HZ方波脈沖,P1.0口接到P3.4口作為
T0的外部計(jì)數(shù),通過(guò)T0的時(shí)鐘中斷在P2口輸出。T0每45個(gè)脈沖就中斷一次,也就是剛好一秒一次*/
#include
voidmain()
{
/*T2設(shè)置*/
TR2=0x0;
T2MOD=0x02;//0010(B)設(shè)置T2為P1.0口輸出方波模式
C_T2=0;//用內(nèi)部時(shí)鐘計(jì)數(shù)
TL2=0x0;
TH2=0x0;
RCAP2L=0x0;
RCAP2H=0x0;
/*T0設(shè)置*/
TMOD=0x6;//0110(B),T0為外部計(jì)數(shù)模式,方式為2(8位自動(dòng)裝載)
EA=1;//總中斷允許
ET0=1;//T0中斷允許
TH0=256-45;
TL0=256-45;
/*starttimer*/
TR0=1;//啟動(dòng)T0時(shí)鐘
TR2=1;//啟動(dòng)T2時(shí)鐘
do
{
}while(1);
}
voidt0(void)interrupt1//T0中斷服務(wù)程序
{
P2=~P2;
}
其結(jié)果P1.0輸出45Hz的脈沖,T0的中斷是以P1.0的45個(gè)脈沖發(fā)生一次的。P2口的數(shù)碼管以一秒的時(shí)間亮,一秒時(shí)間熄滅的在閃爍,T2定時(shí)器看來(lái)很好用。達(dá)到要求。
好!上面的程序只是試試S52的T2定時(shí)器是否可正常使用。言歸正傳我們還是來(lái)談ADC0809的電路:見(jiàn)下圖: