[實驗任務]
從ADC0804的通道IN+輸入0-5V之間的模擬量,通過ADC0804轉換成數字量在數碼管上以十進位形成顯示出來。
[實驗原理]
ADC0804是8位全MOS 中速A/D轉換器、它是逐次逼近式A/D轉換器,片內有三態數據輸出鎖存器,可以和單片機直接介面。單通道輸入,轉換時間大約為100us。ADC0804轉換時序是:當CS=0許可進行A/D轉換。WR由低到高時,A/D開始轉換,一次轉換一共需要66-73個時鐘周期。CS與WR同時有效時啟動A/D轉換,轉換結束產生INTR信號(低電平有效),可供查詢或者中斷信號。在CS和RD的控制下可以讀取數據結果。
[C語言源程序]
/*注意:程序下載到DPY-1實驗板單片機后一定要使SW DIP1的開關脫離ON檔。或者直接將下載線從實驗板上拔下。因為下載線接在I/O口P1.5,P1.6,P1.7上,下載線的電平將會影響測量結果*/
#include
code unsigned char seg7code[10]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f}; //顯示段碼
sbit int1=P3^3; //定義管腳功能
sbit cs=P3^2;
sbit wr=P3^6;
sbit rd=P3^7;
void Delay(unsigned int tc) //顯示延時程序
{while( tc != 0 )
{unsigned int i;
for(i=0; i<100; i++);
tc--;}
}
unsigned char adc0804( void ) //讀AD0804子程序
{ unsigned char addata,i;
rd=1;wr=1;int1=1; //讀ADC0804前準備
P1=0xff; //P1全部置一準備
cs=0;wr=0;wr=1; //啟動ADC0804開始測電壓
while(int1==1); //查詢等待A/D轉換完畢產生的INT(低電平有效)信號
rd=0; //開始讀轉換后數據
i=i; i=i; //無意義語句,用於延時等待ADC0804讀數完畢
addata=P1;//讀出的數據賦與addate
rd=1;cs=1;//讀數完畢
return(addata);//返回最後讀出的數據
}
unsigned int datpro(void)//ADC0804讀出的數據處理
{ unsigned char x;
unsigned int dianyah,dianyal; //用於存儲讀出數據的高位元組和低位元組
unsigned int dianya=0; //存儲最後處理完的結果 注意數據類型
for(x=0;x<10;x++) //將10次測得的結果存儲在dianya中
{dianya=adc0804()+dianya; }
dianya=dianya/10; //求平均值
dianyah=dianya&0xf0; //屏蔽低四位
dianyah=dianyah>>4; //右移四位 取出高四位
dianyal=dianya&0x0f; //屏蔽高四位 取出低四位
dianya=dianyal*20+dianyah*320; //最後的結果是一個四位數,便於顯示
return(dianya);//返回最後處理結果
}
void Led()
{ unsigned int date;
date=datpro(); //調用數據處理最後結果
P2=P2&0xef;
P0=seg7code[date/1000]|0x80; //輸出個位數和小數點
Delay(8); P2=P2|0xf0; P2=P2&0xdf;
P0=seg7code[date%1000/100]; //輸出小數點后第一位
Delay(8); P2=P2|0xf0; P2=P2&0xbf;
P0=seg7code[date%100/10]; //輸出小數點后第二位
Delay(8); P2=P2|0xf0; P2=P2&0x7f;
P0=seg7code[date%10]; //輸出小數點后第三位
Delay(8); P2=P2|0xf0;
}
main()
{
while(1)
{
Led( ); //只需調用顯示函數
}
}
[硬體電路圖]
[admin via 研發互助社區 ] 數模轉換ADC0804的應用實驗已經有5240次圍觀
http://cocdig.com/docs/show-post-42066.html