12位A/D转换器ADS7804与51单片机的接口及程序设计

来源:互联网 发布:java 线程挂起 编辑:程序博客网 时间:2024/05/21 12:45
 摘要:ADS7804是美国BURR-BROWN公司推出的一种新型12位A/D转换器。文中介绍了它的特性与功能,
给出了一种简洁而新颖的与51单片机的接口方法,同时给出了用C语言编写的数据采集的应用程序。
关键词:模/数转换 单片机 接口 C语言 ADS7804
1 基本特点
在计算机控制系统及各类用单片机(或微处理器)构成的智能仪器仪表中,外部的各种模拟信号必须通过
A/D转换器变换为数字信号后才能送入计算机。与8位和16位的A/D转换器相比,12位A/D转换器以其较
高的性能价格比而在仪器仪表中得到广泛的应用。ADS7804芯片采用28脚0.3英寸PDIP(塑料双列直
插式)封装,两列管脚间距为0.3英寸,比一般DIP28封装窄一倍,所以俗称瘦型DIP;ADS7804采用
单5V电源供电;芯片内部含有采样保持、电压基准和时钟等电路,可极大简化用户的电路设计和硬件开锁
,并可提高系统的稳定性。ADS7804采用CMOS工艺制造,转换速度快、功耗低(最大功耗为100mW)
。该A/D转换器采用逐次逼近式工作原理,单通道输入,模拟输入电压的范围为±10V,采样速率为100kHz。
2 引脚及功能
ADS7804共有28个引脚,图1为基引脚图。这些引脚大体上可以划分为3类。
a.电源类
数字电源VDIG和模拟电源VANA通常一起接到5V电源上。数字地DGND和模拟地AGND1、AGND2通常共
地。REF为参考电压端,通常对地接2.2μF钽电容,芯片内部可产生2.5V基准电压。CAP为参考电压所需电
容,对地接2.2μF钽电容。
b.模数信号类
VIN为输入的模拟信号。D11~D0为数字量并行输出口,DZ(19~22脚)是为了使管脚与16位A/D转换
器ADS7805兼容而设的,可悬空。
c.控制信号类
CS(输入)为片选信号,R/C(输入)为读取结果/模数转换控制信号,BUSY(输出)用于指示转换是否
完成,BYTE(输入)信号用来控制从总线读出的数据是转换结果的高字节还是低字节。
3 启动A/D转换和读取转换结果
ADS7804启动转换和读取转换结果的时序比较特点,参见图2。首先将R/C脚电平变低;然后在CS脚输入
一个脉冲并在其下降沿启动A/D转换,此脉冲的宽度要求在40ns~6μs之间;这时BUSY脚电平拉低表示正
在进行转换;在经过大约8μs以后,转换完成,BUSY脚电平相应变高;再把R/C脚电平拉高,这样,CS脚
脉冲的下降沿即把转换结果输出到数据总线上。因为转换结果为12位,所以对8位单片机而言,必须分两次
读入,这个功能由BYTE脚实现。当BYTE脚为高电平时,数据总线上输出高字节,反之,输出低字节。ADS
7804转换得到的数字结果是以补码形式给出的,现给出几组有特定含义的值,表1所列即为ADS7804的模
拟电压与其补码形式的数字输出关系,-10V~9.99512V为量程,4.88mV为电压分辨率。
表1 模拟电压和数字输出的关系
模拟输入初码形式的数字输出
二进制十六进制
9.99512V0111 1111 11117FF
4.88mV0000 0000 0001001
0V0000 0000 0000000
-4.88mV1111 1111 1111FFF
-10V1000 0000 0000800
4 与51单片机的接口
因为ADS7804的CS信号脉冲宽度要求为40ns~6μs之间,而对于单片机而言,只要对外部设备进行读操作,
即会产生RD脉冲,其宽度为6个振荡周期,如采用12MHz的晶振,其脉冲宽度为500ns,所以将ADS7804
的CS脚接单片机的RD信号是再合适不过了。至于R/C、BUSY和BYTE信号,只需连接到普通的锁存功能的端
口即可,如单片机的PI口、并行口扩展芯片8155或8255等的端口。图3是一个ADS7804与51单片机的典型
接口电路。
5 C语言程序设计
Franklin C51交叉编译器是专为51系列单片机设计的一种高效的C语言编译器,使用它可以缩短开发周期,
降低开发成本,而且开发出的系统易于维护,可靠性高,可移植性好。下面介绍用C语言编写的单点和定长数
据采集子程序,假设所用的晶振频率为12MHz。单点采样子程序ADS7804()用来返回一个有符号整数形式
的转换结果。定长采样子程序DAQ()根据入口参数interval(单位为μs)给定的采样间隔采样N点,并采用
查询51单片机内置定时器的方式来控制采样时序,N点采样结果存储在定位于外部存储器的数组array中。需要
注意的是,赋给计数寄存器TH和TL的值是定时器从开始计数到溢出所用的时间,这个时间再加上清TF和装载计
数初值所需的时间(共5个机器周期,对于12MHz晶振即为5μs)才是所要的采样间隔,这一点在程序设计中
必须注意。
源程序如下:
# include<reg51.h>
# include<absacc.h>
# define N 128                      /*定采样长度,如128点*/
sbit BYTE=F1^0;
sbit RC=P1^1;
sbit BUSY=P1^2;                   /*定义特殊位*/
int XDATA array(N);                /*在外部存储器内定义长度为N的有符号整数数组*/
int ADS7804(void)
{
      uint ul,uh;int u;
      RC=0;                             /*R/C低电平,进入转换模式*/
      ul=XBYTE[0xffff];             /*产生读脉冲,启动A/D转换*/
      while (BUSY= =0);           /*等待转换完成*/
      RC=1;BYTE=0;               /*进入读模式,选择低字节*/
      ul=XBYTE[0xffff];             /*读转换结果低8位*/
      BYTE=1;                        /*选择高字节*/
      uh=XBYTE[0xffff]&0x0f;     /*读转换结果高4位*/
      u=uh*256+ul;                  /*得到12位转换结果*/
      if(u>=0x0800)
      u=u 0xf000;                    /*如果为负值,则符号扩展*/
      return(u);                        /*返回转换结果*/
}
uoid DAQ(uint interval)

      uchar th,tl;
       interval=interval-5;          /*减去TF0清零和装载计数初值的时间5μs*/
       th=255-(interval/256);
       tl=255-(interval%256);     /*计算计数初值*/
       TMOD=0x01;                   /*定时器0,方式1 */
       TH0=th; TL0=tl;             /*装载计数初值*/
       TR0=1;                         /*启动定时*/
       for(I=0;i<N;i++)
       { 
              do{}whilt(!TF0);        /*查询等待TF0复位*/
              TF0=0;                     /*清溢出标志*/
              TH0=th;TL0=tl;        /*装载计数初值*/
              Array[i]=ADS7804();   /*采样、存储*/
        }
        TR0=0;                           /*停止定时*/
}
6 结束语
ADS7804为12位的A/D转换器,它不仅分辨率高、转换速度快,而且接口方便,电路简单、应用灵活,因
而具有广泛的应用前景。笔者在DLRS-1型检波器低频接收灵敏度特性测量仪中使用了ADS7804,取得了
很好的效果。