基于51单片机——AD转换电路设计(采用AD0809芯片)

 一、设计要求

采用AD0809对输入的模拟量进行转化,转化完成后将数字量通过LED进行二进制显示。电路图如下。

基于51单片机——AD转换电路设计(采用AD0809芯片)_第1张图片

二、AD0809芯片介绍

AD0809是8位并行A/D转换芯片。该芯片应用时,IN0~IN7共八路模拟输入引脚,通过地址A、B、C选择其中一路将模拟信号送入芯片中,当转换结束后,数字量从D7~D0以8位二进制形式输出,同时E0C引脚输出高电平,表示转换结束。如图为AD0809内部逻辑结构。

基于51单片机——AD转换电路设计(采用AD0809芯片)_第2张图片

 由上图可以看到,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 

#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;
}

你可能感兴趣的:(单片机简单设计,51单片机,嵌入式硬件,单片机)