ADC轉換器由前置濾波器、調制器、數字濾波器和梳狀濾波器組成,22?ADC的結構如圖1所示。它將輸入信號通過22?調制器量化成1bit的高速數據流,經過數字濾波和采樣後得到最終結果。d轉換,其原理和結構大相徑庭,以下是壹階22?調制器為例來說明22?ADC原理。
圖1 2-?ADC的結構
2.常用方法
ADC0809是壹款CMOS器件,內置8位模數轉換器、8路多路復用器和微處理器兼容型控制邏輯。它是壹種逐次逼近型A/D轉換器,可以直接與單片機接口。?
(1)ADC0809的內部邏輯結構
從下圖可以看出,ADC0809由壹個8通道模擬開關、壹個數據鎖存器和解碼器、壹個模數轉換器和壹個三態輸出鎖存器組成。多路開關可通過8路模擬通道,允許8路模擬分時輸入,* * *由A/D轉換器轉換。三態輸出鎖存器用於鎖存A/D轉換後的數字量,只有當OE端為高電平時,才能從三態輸出鎖存器中取出轉換後的數據。
(2).ADC 0809引腳結構
ADC0809各引腳的功能如下:
?D7-D0: 8位數字輸出引腳。
?In0-in7: 8位模擬輸入引腳。
?Vcc:+5v工作電壓。
?GND:地面。
?REF(+):參考電壓的正端。
?REF(-):參考電壓的負端。
?Start: a/d轉換開始信號輸入端子。
?ALE:數據鎖存允許信號輸入端子。
?上述兩個信號用於啟動A/D轉換。
?EOC:轉換結束信號的輸出引腳,轉換開始時為低電平,轉換結束時為高電平。
?OE:輸出使能控制端子用於打開三態數據輸出鎖存器。
?CLK:時鐘信號輸入(壹般500KHz)。
?a、b和c:地址輸入線。
ADC0809要求輸入模擬量:信號單極性,電壓範圍0-5V。如果信號太小,就必須放大;在轉換過程中,輸入模擬量應保持不變。如果模擬量變化太快,應在輸入前增加壹個采樣保持電路。?
?地址輸入和控制線:4。
ALE是數據鎖存使能輸入線,在高電平時有效。當ALE線為高電平時,數據鎖存和解碼器鎖存A、B、C三條地址線的地址信號,所選通道的模擬信號經解碼後轉換成轉換器。a、B和C是地址輸入線,用於選通IN0-IN7上的所有模擬輸入。頻道選擇表如下表所示。
數字輸出和控制線:11。
ST是轉換開始信號。當ST在邊沿跳變時,所有內部寄存器清零;邊沿跳變時,開始A/D轉換;轉換期間,ST應保持低電平。EOC是轉換信號的結束。當EOC為高電平時,表示轉換結束;否則,表示A/D轉換正在進行中。OE為輸出使能信號,用於控制三個輸出鎖存器將轉換後的數據輸出到單片機。OE = 1,輸出轉換後的數據;OE = 0,輸出數據線處於高阻態。D7-D0是數字輸出線。?
CLK是時鐘輸入信號線。由於ADC0809中沒有時鐘電路,所需的時鐘信號必須由外界提供,通常頻率為500KHZ。
Vref (+)和Vref (-)是基準電壓輸入。
2.ADC 0809應用說明?
(1).ADC 0809有壹個輸出鎖存器,可以直接與AT89S51單片機連接。
(2)初始化時,使ST和OE信號都為低電平。
(3)將待轉換通道的地址發送到端口A、B和C..?
(4)在st端給出壹個寬度至少為100ns的正脈沖信號。
(5)根據EOC信號判斷轉換是否完成。?
(6).當EOC變為高電平時,此時OE為高電平,轉換後的數據輸出到單片機。
3.實驗任務
如下圖所示,從ADC0809的通道IN3輸入0 ~ 0-5V之間的模擬量,通過ADC0809轉換成數字量,以十進制形式顯示在數碼管上。ADC0809的VREF連接到+5v。?
4.程序設計內容
(1).在A/D轉換過程中,通過查詢EOC的標誌信號來檢查A/D轉換是否完成。如果完成,通過P0口讀取數據,經過數據處理後顯示在數碼管上。
(2).A/D轉換前,如何開始轉換?
ABC = 110選擇第三個頻道。
ST = 0,ST = 1,ST = 0產生壹個正脈沖信號來啟動轉換。
c語言源程序
?#包括
?無符號字符代碼dispbitcode[]={0xfe,0xfd,0xfb,0xf7,
?0xef,0xdf,0xbf,0x7f };
?無符號字符代碼dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,
?0x6d、0x7d、0x07、0x7f、0x6f、0x 00 };
?無符號char dispbuf[8]={10,10,10,10,10,0,0,0 };
?無符號字符顯示計數;
sbit st="p3"^0;
?sbit oe="p3"^1;
?sbit eoc="p3"^2;
?unsigned char channel = " 0xbc//IN3
?無符號字符getdata
無效總管(無效)
?{
?TMOD = 0x 01;
?TH0 =(65536-4000)/256;
?TL0 =(65536-4000)% 256;
?TR0 = 1;
?ET0 = 1;
?EA = 1;
P3 =頻道;
while(1)
?{
?ST = 0;
?ST = 1;
?ST = 0;
?while(EOC = = 0);
?OE = 1;
?getdata = P0
?OE = 0;
?disp buf[2]= get data/100;
?get data = get data % 10;
?disp buf[1]= get data/10;
?disp buf[0]= get data % 10;
?}
?}
void t0(void)使用0中斷1
?{
?TH0 =(65536-4000)/256;
?TL0 =(65536-4000)% 256;
?p 1 = disp code[disp buf[disp count]];
?P2 = dispbitcode[disp count];
?disp count++;
?if(dispcount==8)
?{
?dispcount = 0;
?}
?