模數(shù)轉(zhuǎn)換ADC0804的應(yīng)用實(shí)例(含源程序及電路)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
模數(shù)轉(zhuǎn)換ADC0804的應(yīng)用(含源程序及電路) [實(shí)驗(yàn)要求] 從ADC0804 的模擬量通道輸入0-5V 之間的模擬量,通過ADC0804 轉(zhuǎn)換成數(shù)字量送給單片機(jī),經(jīng)單片機(jī)處理后在數(shù)碼管上以十進(jìn)制形成顯示出來。 [實(shí)驗(yàn)?zāi)康腯 學(xué)習(xí)如果用單片機(jī)控制ADC0804芯片進(jìn)行數(shù)模轉(zhuǎn)換,掌握數(shù)碼管動(dòng)態(tài)掃描顯示的原理。 動(dòng)態(tài)掃描:就六位數(shù)碼管顯示123456舉例說明如下:先讓第一個(gè)數(shù)碼管顯示1,其余的全部不亮,1大約亮幾毫秒,然后熄滅,緊接著立即讓第二個(gè)數(shù)碼管顯示2,其余的全部不亮,2同樣亮幾毫秒,依次這樣亮到第六個(gè)數(shù)碼管,然后再回來顯示1,如此這樣以很快的速度不斷循環(huán)下去,由于人眼的視覺暫留時(shí)間大約為20毫秒左右,所以是感覺不出有不亮的數(shù)碼管存在的,看見的是六個(gè)數(shù)碼管同時(shí)在顯示,數(shù)值是123456,如果我們把這個(gè)過程一點(diǎn)點(diǎn)放慢,看見的是從第一個(gè)數(shù)碼管顯1,然后移到第二個(gè)再顯2,。。。也就是說在任一時(shí)刻只有一位數(shù)碼管是亮的。這就是數(shù)碼管動(dòng)態(tài)掃描顯示的原理 ADC0804: ADC0804是8位全MOS中速A/D 轉(zhuǎn)換器、它是逐次逼近式A/D 轉(zhuǎn)換器,片內(nèi)有三態(tài)數(shù)據(jù)輸出鎖存器,可以和單片機(jī)直接接口。單通道輸入,轉(zhuǎn)換時(shí)間大約為100us。ADC0804 轉(zhuǎn)換時(shí)序是:當(dāng)CS=0 許可進(jìn)行A/D 轉(zhuǎn)換。WR由低到高時(shí),A/D開始轉(zhuǎn)換,一次轉(zhuǎn)換一共需要66-73 個(gè)時(shí)鐘周期。CS與WR同時(shí)有效時(shí)啟動(dòng)A/D轉(zhuǎn)換,轉(zhuǎn)換結(jié)束產(chǎn)生INTR 信號(hào)(低電平有效),可供查詢或者中斷信號(hào)。在CS和RD 的控制下可以讀取數(shù)據(jù)結(jié)果。本實(shí)驗(yàn)沒有使用INTR信號(hào)。 [硬件電路] [源代碼] //擰動(dòng)AD旁邊的電位器,會(huì)在數(shù)碼管的前三位顯示0-255之間的數(shù)//值。這就是把模擬信號(hào)轉(zhuǎn)換成數(shù)字信號(hào),即模數(shù)轉(zhuǎn)換。 #include<reg51.h> #include <intrins.h> #define uint unsigned int #define uchar unsigned char sbit adrd=P3^7; //IO口定義 sbit adwr=P3^6; sbit diola=P2^5; sbit dula=P2^6; sbit wela=P2^7; unsigned char j,k,adval; void delay(unsigned char i) //延時(shí)程序 { for(j=i;j>0;j--) for(k=125;k>0;k--); } uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, //數(shù)碼管編碼 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; void display(uchar bai_c,uchar sh_c,uchar g_c) //顯示程序 { P0=table[bai_c]; //顯示百位 dula=1; dula=0; P0=0xfe; wela=1; wela=0; delay(5); dula=0; P0=table[sh_c]; //顯示十位 dula=1;
dula=0;
wela=0;
P0=0xfd;
wela=1;
wela=0;
delay(5);
P0=table[g_c]; //顯示個(gè)位
dula=1;
dula=0;
P0=0xfb;
wela=1;
wela=0;
delay(5);
}
void main() // 主程序
{
uchar a,A1,A2,A2t,A3;
while(1)
{
wela=1;
P0=0; //選通ADCS
adwr=0; //AD寫入(隨便寫個(gè)什么都行,主要是為了啟動(dòng)AD轉(zhuǎn)換)
_nop_();
adwr=1;
P0=0xff; //關(guān)閉ADCS
delay(10);
wela=0; //關(guān)閉有AD片選信號(hào)鎖存器的鎖存端以防止在操作數(shù)碼管時(shí)使AD的片選發(fā)生變化
for(a=20;a>0;a--) //需要注意的是ADC0804在寫和讀之間的時(shí)間間隔要足夠長(zhǎng)否則無法讀出數(shù)據(jù)
{ //這里把顯示部分放這里的原因也是為了增加寫讀之間的時(shí)間隔
display(A1,A2,A3);
} //送去顯示各位。
wela=1; //重新打開有AD片選信號(hào)鎖存器的鎖存端
P1=0xff; //讀取P1口之前先給其寫全
P0=0; //選通ADCS
adrd=0; //AD讀使能
adval=P1; //AD數(shù)據(jù)讀取賦給P1口
adrd=1;
P0=0xff; //關(guān)閉ADCS
adwr=0;
P1=adval; //同時(shí)把AD的值送八個(gè)發(fā)光二極顯示
A1=adval/100; //分出百,十,和個(gè)位
A2t=adval%100;
A2=A2t/10;
A3=A2t%10;
};
}