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; //熄灭该位七段数码管
}
}
|