专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

ADC0809模数转换器的使用详解与程序

作者:佚名   来源:本站原创   点击数:  更新时间:2010年06月12日   【字体:

 带我们的王老师刚评上硕导了,下学期开始带研究生了。
  从他那里了解到每做一次实验或者实践,应该把它用规范的格式记录下来,一来自己可以日后查看,二来同学间可以相互交流,共通过进步,甚为必要。现将本次实验记录如下。
  实验
名称:根据光强控制外围器件的通断。
  实验原理;使用AD芯片将太阳能电池产生的光生伏打电压转化为数字信号,再通过单片机处理后,在数码管上显示电压,同时根据设定电压伐值,控制外围器件的通断。
  实验所需的设备:51单片机烧写器一个,电脑一台,数字式示波器一个,数字式万用表一个
  实验所需的元件:太阳能电池一片,单片机一片,1k排阻一个,四位连体的数码管一个,排针若干排,导线,万用版一块,焊锡。
  实验前的理论准备;能熟练使用51单片机,示波器,keil软件,isp下载软件,看懂AD0809的英文pdf说明
  实验的难点:难点一就是AD0809芯片的使用。
难点二就是将AD0809产生的0~256的数字换算成0~5.000的精确度,而又不至于溢出出错。
难点三就是以上的理论准备全部系自学,呵呵
下面着重说明AD0809的使用难点。

  ADC0809是采样频率为8位的、以逐次逼近原理进行模—数转换的器件。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。
  1.主要特性
  1)8路8位A/D转换器,即分辨率8位。
  2)具有转换起停控制端。
  3)转换时间为100μs
  4)单个+5V电源供电
  5)模拟输入电压范围0~+5V,不需零点和满刻度校准。
  6)工作温度范围为-40~+85摄氏度
  7)低功耗,约15mW。
  2.内部结构
  ADC0809是CMOS单片型逐次逼近式A/D转换器,内部结构如图13.22所示,它由8路模拟开关、地址锁存与译码器、比较器、8位开关树型D/A转换器、逐次逼近
  3.外部特性(引脚功能)
  ADC0809芯片有28条引脚,采用双列直插式封装,如图13.23所示。下面说明各引脚功能。
  IN0~IN7:8路模拟量输入端。
  2-1~2-8:8位数字量输出端。
  ADDA、ADDB、ADDC:3位地址输入线,用于选通8路模拟输入中的一路
  ALE:地址锁存允许信号,输入,高电平有效。
  START: A/D转换启动信号,输入,高电平有效。
  EOC: A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。
  OE:数据输出允许信号,输入,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。
  CLK:时钟脉冲输入端。要求时钟频率不高于640KHZ。
  REF(+)、REF(-):基准电压。
  Vcc:电源,单一+5V。
  GND:地。
  ADC0809的工作过程是:首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。此 地址经译码选通8路模拟输入之一到比较器。START上升沿将逐次逼近寄存器复位。下降沿启动 A/D转换,之后EOC输出信号变低,指示转换正在进行。直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可 用作中断申请。当OE输入高电平 时,输出三态门打开,转换结果的数字量输出到数据总线上。
 

  值得一提的是,我按照上面电路,把AD的ABC三脚共同接接地时,AD0809088始终输出高电平,最后当我把BC共同接地,在程序中给A一个0,则AD0809正常运行,有输出,并且发现当所给的时钟频率越低,最高精度的那位输出越稳定,具体参数范围从芯片资料里有详细介绍,不过十全英文,专业词汇哦。哈哈
  现将程序记录如下:
 完整的程序从这里下载: http://www.51hei.com/ziliao/file/0809c51x.rar

 
#include< reg52.h> 
#define uint unsigned int 
#define uchar unsigned char 
uchar aa,qian,bai,shi,ge; 
uint temp; 
sbit clock=P2^0; 
sbit start=P2^1; 
sbit eoc=P2^2; 
sbit oe=P2^3; 
sbit ale=P2^4; 
sbit adda=P2^5; 
uchar code table[]={ 

0x3f,0x06,0x5b,0x4f, 
0x66,0x6d,0x7d,0x07, 
0x7f,0x6f,0x77,0x7c, 
0x39,0x5e,0x79,0x71 
}; 
//void display(uchar bai,uchar shi,uchar ge); 
void delay(uint z); 
void main() 
{ 
    TMOD=0x20;  //设置定时器1为工作方式2 
    TH1=0x216;    //216 
    TL1=0x216;    //216 
    EA=1;       //开总中断 
    ET1=1;        //开t1中断 
    TR1=1;         
    start=0;    //复位 
    oe=0;         //输出 
    adda=0; 
    //eoc=0; 
    ale=0;           //关闭地址选择 
    while(1) 
    { 
         
        start=0; 
        ///delay(10); 
        start=1;     //        复位 
        ale=1;           //     打开地址选择 
        adda=0; 
        ///delay(10); 
     
        start=0;         //     开始转换 
        ale=0;             //      关地址 
        //delay(1);     
        while(eoc==0);         //       等待eoc变为1 
        //delay(1); 
        oe=1;             //       打开输出 
        //delay(1); 
        //P1=0xff; 
         
        temp=P1;             //      取p1到p3 
        oe=0;             //      关输出 
         

  temp=temp*50; 
  temp=temp/256; 
   
  qian=temp/1000; 
  bai=temp%1000/100; 
  shi=temp%100/10; 
  ge=temp%10; 
   
  P3=0x00; 
  P0=0xfe; 
  P3=table[qian]; 
  delay(50); 
  P3=0x00; 
  P0=0xfd; 
  P3=table[bai]; 
  delay(50); 
  P3=0x00; 
  P0=0xfb; 
  P3=table[shi]; 
  delay(50); 
  P3=0x00; 
  P0=0xf7; 
  P3=table[ge]; 
  } 
} 
void delay(uint z) 
{ 
    uint x,y; 
    for(x=z;x>0;x--) 
        for(y=1;y>0;y--); 
} 
void cl() interrupt 3 
{ 
    clock=!clock; 
}  
  
关闭窗口

相关文章