一、设计要求
采用AD0809对输入的模拟量进行转化,转化完成后将数字量通过LED进行二进制显示。电路图如下。
二、AD0809芯片介绍
AD0809是8位并行A/D转换芯片。该芯片应用时,IN0~IN7共八路模拟输入引脚,通过地址A、B、C选择其中一路将模拟信号送入芯片中,当转换结束后,数字量从D7~D0以8位二进制形式输出,同时E0C引脚输出高电平,表示转换结束。如图为AD0809内部逻辑结构。
由上图可以看到,AD0809由一个8路模拟量开关、一个地址锁存与译码器、一个A/D转换器和一个三态输出锁存器组成。多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D转换器进行转换。三态输出锁存器用于锁存A/D转换完的数字量,当OE为高电平时,才可以从三态输出锁存器取走转换完的数据。
AD0809对输入模拟量要求:信号单极性,电压范围0~5V,若信号太小,必须进行放大;输入的模拟量在转换过程中应该保持不变,若模拟量变化太快,则需要在输入前添加一个采样保持电路。
ALE1为地址锁存允许输入线,高电平有效。当ALE线为高电平时,地址锁存与译码器将A,B,C三条地址线的地址信号进行锁存,经过译码后被选中的通道的模拟量进转换器进行转换。A,B,C为地址输入线,用于选通IN0~IN7上的一路模拟量输入。
ST为转换启动信号。当ST为上升沿时,所有内部寄存器清零。当ST为下降沿时,开始A/D转换。在转换期间,ST保持为低电平。
EOC为转换结束信号。当EOC为高电平时,标明转换结束;否则,表示正在进行A/D转换。
OE为输入允许信号,用于控制三条输出锁存器想单片机输出转换得到的数据。OE = 1时,输出转换得到的信号;OE = 0时,输出数据线呈高阻态状态。D7~D0为数字量输出线。
clk时钟输入信号线。AD0809内部没有时钟电路,所需时钟信号必须由外部提供。
VREF(+),VREF(-)为参考电压输入。
三、AD08009应用说明
1.AD0809内部带有输出锁存器,可以直接和单片机相连。
2.初始化时,将ST和OE置为低电平。
3.将要转换的通道信息传给A,B,C端口。注意,C为高位,A为低位。
4.在ST端给出一个至少有100ns宽的正脉冲。
5.根据EOC的信号状态判断是否转换完毕。若EOC = 1,表示转换完毕。
6.当EOC为高电平,这时给OE一个高电平,转换数据输出给单片机。
四、输出数字量计算
N = (Ui *255)/5,Ui为输入模拟量。
五、程序
#include <reg52.h>
#define uchar unsigned char
sbit clk = P1^3;
sbit start = P1^2; //start和ALE都连接在P1.2
sbit EOC = P1^1;
sbit OE = P1^0;
sbit a = P1^4;
sbit b = P1^5;
sbit c = P1^6;
void delay(unsigned char xms)
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
}
while (--i);
xms--;
}
}
void ADC_init()
{
P2 = 0xff;
//产生clock信号
EA = 1;
TMOD = 0x02; //定时器0,方式2,8位自动重装载
ET0 = 1; //允许定时器0中断
TR0 = 1;
TH0 = 216;
TL0 = 216;
start = 0;
OE = 0;
a = 1; //通道3
b = 1;
c = 0;
}
void ad_3()
{
OE = 0;
EOC = 1;
start = 0;
a = 1; //通道3
b = 1;
c = 0;
delay(10);
start = 1; //上升沿
delay(10);
start = 0; //下降沿
while(!EOC);//等待转换完成
delay(10);
OE = 1;
delay(5);
P0 = P2;
OE = 0;
}
void main()
{
ADC_init();
while(1)
{
ad_3();
}
}
void t0(void) interrupt 1
{
TH0 = 216;
TL0 = 216;
clk = ~clk;
}