数模转化 AD0809
AD转换就是模数转换,就是把模拟信号转换成数字信号。D/A转换是把数字量转变成模拟的器件。模拟信号只有通过A/D转化为数字信号后才能用软件进行处理,这一切都是通过A/D转换器(ADC)来实现的。与模数转换相对应的是数模转换,数模转换是模数转换的逆过程。
一、ad0809实例图
(1)ADC0809 的内部逻辑结构
由下图可知,ADC0809 由一个 8 路模拟开关、一个地址锁存与译码器、一个 A/D 转换器和一
个三态输出锁存器组成。多路开关可选通 8 个模拟通道,允许 8 路模拟量分时输入,共用
A/D 转换器进行转换。三态输出锁器用于锁存 A/D 转换完的数字量,当 OE 端为高电平时,才可以从三态输出锁存器取走转换完的数据。
AD性能指标:分辨率
分辨率是指输入数字量的最低有效位(LSB)发生变化时,所对应的输出模拟量(电压或电流)的变化量。它反映了输出模拟量的最小变化值。
分辨率与输入数字量的位数有确定的关系,可以表示成FS /(2^n)。FS表示满量程输入值,n为二进制位数。对于5V的满量程,采用8位的DAC时,分辨率为5V/256=19.5mV;当采用12位的DAC时,分辨率则为5V/4096=1.22mV。显然,位数越多分辨率就越高
二、AD各个引脚结构:
D7-D0:8 位数字量输出引脚。
IN0-IN7:8 位模拟量输入引脚。
VCC:+5V 工作电压。
GND:地。
REF(+):参考电压正端。
REF(-):参考电压负端。
START:A/D 转换启动信号输入端。
ALE:地址锁存允许信号输入端。
(以上两种信号用于启动 A/D 转换).
EOC:转换结束信号输出引脚,开始转换时为低电平,当转换结束时为高电平。
OE:输出允许控制端,用以打开三态数据输出锁存器。
CLK:时钟信号输入端(一般为 500KHz)。
ALE 为地址锁存允许输入线,高电平有效。当 ALE 线为高电平时,地址锁存与译码器将 A, B,C 三条地址线的地址信号进行锁存,经译码后被选中的通道的模拟量进转换器进行转换。
A,B 和 C 为地址输入线,用于选通 IN0-IN7 上的一路模拟量输入。
ST 为转换启动信号。当 ST 上跳沿时,所有内部寄存器清零;下跳沿时,开始进行 A/D 转换;在转换期间,ST 应保持低电平。EOC 为转换结束信号。当 EOC 为高电平时,表明转换结束;
否则,表明正在进行 A/D 转换。OE 为输出允许信号,用于控制三条输出锁存器向单片机输出
转换得到的数据。OE=1,输出转换得到的数据;OE=0,输出数据线呈高阻状态。D7-D0 为
数字量输出线。
CLK 为时钟输入信号线。因 ADC0809 的内部没有时钟电路,所需时钟信号必须由外界提供,通常
使用频率为 500KHZ,
VREF(+),VREF(-)为参考电压输入
ADC0809 应用说明:
(1). ADC0809 内部带有输出锁存器,可以与 AT89S51 单片机直接相连。
(2). 初始化时,使 ST 和 OE 信号全为低电平。
(3). 送要转换的哪一通道的地址到 A,B,C 端口上。
(4). 在 ST 端给出一个至少有 100ns 宽的正脉冲信号。
(5). 是否转换完毕,我们根据 EOC 信号来判断。
(6). 当 EOC 变为高电平时,这时给 OE 为高电平,转换的数据就输出给单片机了。
程序示例:
//ADC0809读取信息
uchar ADC0809()
{
uchar temp_=0x00;
//初始化高阻太
TMOD=0X01; //定时器中断0
CLK=0; //脉冲信号初始值为0
TH0=(65536-2)/256; //定时时间高八位初值
TL0=(65536-2)%256; //定时时间低八位初值
EA=1; //开CPU中断
ET0=1; //开T/C0中断
TR0=1;
OE=0;
//转化初始化
ST=0;
//开始转换
ST=1;
ST=0;
//外部中断等待AD转换结束
while(EOC==0)
{
//读取转换的AD值
OE=1;
}
temp_=Data_ADC0809; //将P1的数据读出到temp_
OE=0;
return temp_; //将数据返回
}
/*************************************************************************
CLK振荡信号
**************************************************************************/
void timer0( ) interrupt 1 //定时器0工作方式1
{
TH0=(65536-2)/256; //重装计数初值
TL0=(65536-2)%256; //重装计数初值
CLK=!CLK; //取反
}