ADC0804芯片的介紹
1、A/D轉換概念
即模數轉換,輸入模擬量(比如電壓信號),輸出一個與模擬量對應的數字。例如參考電壓VREF為5V,采用8位的模數轉換器時,當輸入電壓為0V時,輸出的數字量為0000 0000,當輸入的電壓為5V時,輸出的數字量為1111 1111.當輸入的電壓從0V到5V變化時,輸出量從0000 0000到1111 1111變化。這樣每一個輸入電壓值對應一個輸出數字量,即實現模數轉換。
2、分辨率概念
分辨率是指使輸出數字量變化1時的輸入模擬量,也就是使輸出數字量變化一個相鄰數碼所需輸入模擬量的變化值。
分辨率與A/D轉換器的位數有確定的關系,可以表示成FS/2^n。FS表示滿量程輸入值,n為A/D轉換器的位數。例如對于5V的滿量程,采用4位的ADC時,5V/16=0.3125V(也就是說當輸入的電壓值每增加0.3125V,輸出的數字量增加1);采用8位的ADC時,分辨率為5V/256=19.5mV(也就是說當輸入的電壓每增加19.5mV,則輸出的數字量增加1);當采用12位的ADC時,分辨率則為5V/4096=1.22mv(也就是說當輸入的電壓每增加1.22mV,則輸出的數字量增加1)。顯然位數越多,分辨率越高
/*********************
數字電壓表與模數轉器
adc0804 輸出腳DB0-DB7-->P1口
Vin+ 輸入測量電壓
VREF/2輸入參考電平
程序把ADC0804送來的數字電壓信號進行量化后顯示在七段數碼管上。
P0口連接到三位一體的數碼管上,p2^0控制第1位數碼管
P2^1控制第2位數碼管
P2^2控制第3位數碼管
*****************************************************************************
#include <reg52.h>
sbit intr=P3^0; //轉換結束信號 adc0804 5腳
sbit write=P3^1; //轉換使能端 adc0804 3腳
sbit read=P3^2; //輸出使能端 adc0804 2腳
sbit dot=P0^7; //小數點
//直接控制七段數碼管顯示數字0-9的碼表
code unsigned char tab[]={0x40, 0x79, 0x24, 0x30,
0x19, 0x12, 0x02, 0x78,
0x00, 0x10};
unsigned int ad=0, ads; //保存數字信號的變量
unsigned char StrTab[3]; //保存顯示數
void delay(unsigned int cnt)//延時函數
{
while(--cnt);
}
main()
{
while(1)
{
write=1; //write端出現下降沿,啟動轉換
write=0;
write=1;
while(intr==1); //循環等待INTR的低電平,轉換完成
read=1; //在READ出現下降沿,輸出數字信號
read=0;
ad=P1; //轉換好的數字信號保存到變量ad中
ad=ad*156; //與分辨率0.0156V相乘
ads=ad/10000; //獲得電壓數值的最高位
StrTab[2]=tab[ads]; //最高位數值的顯示碼存入StrTab[2]
ad=ad%10000;
ads=ad/1000;
StrTab[1]=tab[ads];//中間位數值的顯示碼存入StrTab[1]
ad=ad%1000;
ads=ad/100;
StrTab[0]=tab[ads];//最低位數值的顯示碼存入StrTab[0]
P2=0x01; //使能最高位的七段數碼管
P0=StrTab[2]; //輸出顯示碼
delay(1000);
P2=0x00; //熄滅該位七段數碼管
P2=0x02; //使能中間位的七段數碼管
P0=StrTab[1]; //輸出顯示碼
dot=1; //關閉小數點
delay(1000);
P2=0x00; //熄滅該位七段數碼管
P2=0x04; //使能最低位的七段數碼管
P0=StrTab[0]; //輸出顯示碼
dot=1; //關閉小數點
delay(1000);
P2=0x00; //熄滅該位七段數碼管
}
}
|