ADC0809是美國(guó)國(guó)家半導(dǎo)體公司生產(chǎn)的CMOS工藝8通道,8位逐次逼近式A/D模數(shù)轉(zhuǎn)換器。其內(nèi)部有一個(gè)8通道多路開關(guān),它可以根據(jù)地址碼鎖存譯碼后的信號(hào),只選通8路模擬輸入信號(hào)中的一個(gè)進(jìn)行A/D轉(zhuǎn)換。目前僅在單片機(jī)初學(xué)應(yīng)用設(shè)計(jì)中較為常見(jiàn)。
我們?cè)谧鲆粋€(gè)單片機(jī)系統(tǒng)時(shí),常常會(huì)遇到這樣那樣的數(shù)據(jù)采集,在這些被采集的數(shù)據(jù)中,大部分可以通過(guò)我們的I/O口擴(kuò)展接口電路直接得到,由于51單片機(jī)大部分不帶AD轉(zhuǎn)換器,所以模擬量的采集就必須靠A/D或V/F實(shí)現(xiàn)。下現(xiàn)我們就來(lái)了解一下AD0809與51單片機(jī)的接口及其程序設(shè)計(jì)。
1、ADc0809的邏輯結(jié)構(gòu) ADC0809是8位逐次逼近型A/D轉(zhuǎn)換器。它由一個(gè)8路模擬開關(guān)、一個(gè)地址鎖存譯碼器、一個(gè)A/D轉(zhuǎn)換器和一個(gè)三態(tài)輸出鎖存器組成(見(jiàn)圖1)。多路開關(guān)可選通8個(gè)模擬通道,允許8路模擬量分時(shí)輸入,共用A/D轉(zhuǎn)換器進(jìn)行轉(zhuǎn)換。三態(tài)輸出鎖器用于鎖存A/D轉(zhuǎn)換完的數(shù)字量,當(dāng)OE端為高電平時(shí),才可以從三態(tài)輸出鎖存器取走轉(zhuǎn)換完的數(shù)據(jù)。
2、AD0809的工作原理 IN0-IN7:8條模擬量輸入通道 ADC0809對(duì)輸入模擬量要求:信號(hào)單極性,電壓范圍是0-5V,若信號(hào)太小,必須進(jìn)行放大;輸入的模擬量在轉(zhuǎn)換過(guò)程中應(yīng)該保持不變,如若模擬量變化太快,則需在輸入前增加采樣保持電路。 地址輸入和控制線:4條 ALE為地址鎖存允許輸入線,高電平有效。當(dāng)ALE線為高電平時(shí),地址鎖存與譯碼器將A,B,C三條地址線的地址信號(hào)進(jìn)行鎖存,經(jīng)譯碼后被選中的通道的模擬量進(jìn)轉(zhuǎn)換器進(jìn)行轉(zhuǎn)換。A,B和C為地址輸入線,用于選通IN0-IN7上的一路模擬量輸入。通道選擇表如下表所示
數(shù)字量輸出及控制線:11條 ST為轉(zhuǎn)換啟動(dòng)信號(hào)。當(dāng)ST上跳沿時(shí),所有內(nèi)部寄存器清零;下跳沿時(shí),開始進(jìn)行A/D轉(zhuǎn)換;在轉(zhuǎn)換期間,ST應(yīng)保持低電平。EOC為轉(zhuǎn)換結(jié)束信號(hào)。當(dāng)EOC為高電平時(shí),表明轉(zhuǎn)換結(jié)束;否則,表明正在進(jìn)行A/D轉(zhuǎn)換。OE為輸出允許信號(hào),用于控制三條輸出鎖存器向單片機(jī)輸出轉(zhuǎn)換得到的數(shù)據(jù)。OE=1,輸出轉(zhuǎn)換得到的數(shù)據(jù);OE=0,輸出數(shù)據(jù)線呈高阻狀態(tài)。D7-D0為數(shù)字量輸出線。 CLK為時(shí)鐘輸入信號(hào)線。因ADC0809的內(nèi)部沒(méi)有時(shí)鐘電路,所需時(shí)鐘信號(hào)必須由外界提供,通常使用頻率為500KHZ, VREF(+),VREF(-)為參考電壓輸入。 3、ADC0809應(yīng)用說(shuō)明 (1). ADC0809內(nèi)部帶有輸出鎖存器,可以與AT89S51單片機(jī)直接相連。 (2). 初始化時(shí),使ST和OE信號(hào)全為低電平。 (3). 送要轉(zhuǎn)換的哪一通道的地址到A,B,C端口上。 (4). 在ST端給出一個(gè)至少有100ns寬的正脈沖信號(hào)。 (5). 是否轉(zhuǎn)換完畢,我們根據(jù)EOC信號(hào)來(lái)判斷。 (6). 當(dāng)EOC變?yōu)楦唠娖綍r(shí),這時(shí)給OE為高電平,轉(zhuǎn)換的數(shù)據(jù)就輸出給單片機(jī)了。
4、AD0809的應(yīng)用 了解完A/D轉(zhuǎn)換芯片,下面我們以圖2為例來(lái)完成它的程序設(shè)計(jì)。 電路說(shuō)明: 電路見(jiàn)圖(2),主要由AD轉(zhuǎn)換器AD0809,頻率發(fā)生器SUN7474,單片機(jī)AT89S51及顯示用數(shù)碼管組成。 AD0809的啟動(dòng)方式為脈沖啟動(dòng)方式,啟動(dòng)信號(hào)START啟動(dòng)后開始轉(zhuǎn)換,EOC信號(hào)在START的下降沿10us后才變?yōu)闊o(wú)效的低電平。這要求查詢程序待EOC無(wú)效后再開始查詢,轉(zhuǎn)換完成后,EOC輸出高電平,再由OE變?yōu)楦唠娖絹?lái)輸出轉(zhuǎn)換數(shù)據(jù)。我們?cè)谠O(shè)計(jì)程序時(shí)可以利用EOC信號(hào)來(lái)通知單片機(jī)(查詢法或中斷法)讀入已轉(zhuǎn)換的數(shù)據(jù),也可以在啟動(dòng)AD0809后經(jīng)適當(dāng)?shù)难訒r(shí)再讀入已轉(zhuǎn)換的數(shù)據(jù)。 AT89S51的輸出頻為晶振頻的1/6(2MHZ),AT89S1與SUN7474連接經(jīng)與7474的ST腳提供AD0809的工作時(shí)鐘。AD0809的工作頻范圍為10KHZ-1280KHZ,當(dāng)頻率范圍為500KHZ時(shí),其轉(zhuǎn)換速度為128us。 AD0809的數(shù)據(jù)輸出公式為:Dout=Vin*255/5=Vin*51,其中Vin為輸入模擬電壓,Vout 為輸出數(shù)據(jù)。 當(dāng)輸入電壓為5V時(shí),讀得的數(shù)據(jù)為255再乘以2,得510。我們用510*98%得499,再將百位數(shù)碼管的小數(shù)點(diǎn)點(diǎn)亮,顯示為4.99V,顯示值與輸入值基本吻合。
軟件設(shè)計(jì)思路及程序流程 編程思路: (1) 向AD0809寫入通道號(hào)并啟動(dòng)轉(zhuǎn)換 (2) 延時(shí)1ms后等待EOC出現(xiàn)高電平(JNB EOC,$) (3) 給OE置高并讀入轉(zhuǎn)換數(shù)據(jù)存入數(shù)據(jù)地址或數(shù)組中。 (4) 顯示
(5)
- #include <at89x51.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit st=P3^2;
- sbit oe=P3^1;
- sbit eoc=P3^0;
- uchar code tab[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};//數(shù)碼管顯示段碼
- uchar code td[]={0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70};//通道先擇數(shù)組
- uint ad_0809,ad_data1,ad_data2,ad_data3,ad_data0;
- uchar m,number;
- uchar x[8];//八通道數(shù)據(jù)待存數(shù)組
- void delaynms(uint x);//nms延時(shí)程序
- void display();//顯示程序
- void ad0809();//芯片啟動(dòng)程序
- void key();//鍵掃描程序
- main()
- {
- number=1;
- P1=0x00;
- while(1)
- {
- ad0809();//調(diào)AD0809啟動(dòng)子程序
- key();//調(diào)按鍵子程序
- ad_0809=x[number];//把相關(guān)通道數(shù)據(jù)給ad_0809
- display();//調(diào)顯示
- }}
- //nms延時(shí)程序
- void delaynms(uint x)
- {
- uchar i;
- while(x-->0)
- {
- for(i=0;i<125;i++)
- {;}}}
- void display()
- {
- uchar a;
- ad_data1=(ad_0809*49/25)/100;//讀得的數(shù)據(jù)乘以2再乘以98%除以100得百位
- ad_data2=((ad_0809*49/25)%100)/10;//讀得的數(shù)據(jù)乘以2再乘以98%再分出十位
- ad_data3=(((ad_0809*49/25)%100)%10);//讀得的數(shù)據(jù)乘以2再乘以98%再分出個(gè)位
- for(a=0;a<10;a++)
- {
- P0=tab[ad_data3];//送小數(shù)點(diǎn)后第二位顯示
- P2=0x07;//選通第一個(gè)數(shù)碼管
- delaynms(3);
- P0=tab[ad_data2];//送小數(shù)點(diǎn)后第一位顯示
- P2=0x0b;//選通第二個(gè)數(shù)碼管
- delaynms(3);
- P0=tab[ad_data1];//送整數(shù)顯示
- P0_7=0;//點(diǎn)亮第三個(gè)數(shù)碼管小數(shù)點(diǎn)
- P2=0x0d;// 選通第三個(gè)數(shù)碼管
- delaynms(3);
- P0=tab[number];//送通道號(hào)顯示
- P2=0x0e;
- delaynms(3);
- }}
- void ad0809()
- {
- uchar i,m=1;
- for(i=0;i<8;i++)
- {
- P0=td[i];//選通通道
- oe=0;//以下三條指令為起動(dòng)AD0809
- st=0;
- st=1;
- st=0;
- delaynms(1);
- while(!eoc);//等待轉(zhuǎn)換結(jié)束
- oe=1;//取出讀得的數(shù)據(jù)
- x[m]=P2;//送相關(guān)通道數(shù)組
- oe=0;
- m++;
- }}
- void key()
- {
- if(!P3_5)//P3.5是否按下
- {
- delaynms(20);//延時(shí)判誤
- if(!P3_5)//再一次判斷P3。5是否按下
- {
- while(!P3_5);//等待P3。5為高電平
- number++;//通道號(hào)顯示加一
- if(number>8)number=1;//八通道
- }}}
復(fù)制代碼
----------下面介紹adc0809的proteus仿真---------------------------------
0809的單片機(jī)程序很簡(jiǎn)單
- #include
- #define uchar unsigned char
- #define uint unsigned int
- uchar code duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0xff,0x6f};
- uchar code wei[]={0xfe,0xfd,0xfb};
- uchar s[]={0,0,0};
- void delay1ms(uint i)
- {
- uchar j;
- for(;i>0;i--)
- for(j=0;j<125;j++)
- {;}
- }void main()
- { while(1){
- P0=0XF0;
- P1=duan[0];
- P0=0XF0;
- P1=duan[1];
- P0=0XF0;
- P1=duan[2]; }
- }
復(fù)制代碼
全部資料下載:
0809.rar
(75.68 KB, 下載次數(shù): 72)
2016-5-11 23:34 上傳
點(diǎn)擊文件名下載附件
|