ADC0804模数转换器的应用实例

描述

实验要求: 应用A/D转换器将滑动电阻输出的模拟电压量转换为数字电压量,将数字电压量输出到四位数码管,并通过电压表给出模拟电压量的读数。下图是实验截图。

模数转换器

实验方案: 应用proteus设计实验用模拟电路,A/D转换器采用ADC0804模拟器件,滑动电阻采用proteus支持的POT-HG,四位数码管采用7SEG-MPX4CA。

ADC0804模数转换器

有20个引脚,分辨率为8位,转换时间为100μs,输入电压范围为0~5V。

分辨率:A/D转换器对输入模拟信号的分辨能力,ADC0804分辨率为8位,即输出位数为8个二进制位,可以区分2^8(256)不同等级的输入模拟电压,能区分输入的电压最小值为满量程输入的1/2^8(1/256),若需要区分更小的输入电压。就需要增加输出位数,提高A/D转换器的分辨率。

转换时间:A/D转换器从接收到模拟电压到输出数字电压需要的时间,不同类型的转换器转换时间不同,并行比较的A/D转换器转换时间可达50ns以内,逐次比较的A/D转换器转换时间一般在10~100μs之间,双积分A/D转换器转换时间一般在几十毫秒到几百毫秒之间。

模数转换器

CS引脚:芯片的片选信号,低电平有效。若该引脚为低电平,芯片开始工作,若该引脚为高电平,芯片停止工作。当外接多个ADC0804芯片时,该引脚可作为芯片的选择地址,通过不同的地址信号使用不同的ADC0804芯片,从而可以实现多个ADC通道的分时复用。

WR引脚:采样触发信号,低电平有效。若该引脚由高电平变为低电平时,芯片对模拟信号进行一次采样,并进行AD转换。

RD引脚:转换数据完成信号,低电平有效。若检测到该引脚为低电平,说明一次转换完成,转换完成的数据从DB0~DB7引脚读取。

VIN+和VIN-引脚:模拟电压输入端,用以接收单极性、双极性和差模输入信号。双极性输入信号有正负电压、零电压,单极性输入信号仅有正电压。若为单极性输入信号,VIN+接模拟电压的输入,VIN-接地;若为双极性输入信号,VIN+和VIN-分别接模拟输入电压的正极和负极。

VREF/2引脚:参考电压接入引脚。该引脚可外接电压,也可悬空。

CLKIN引脚:引入外部时钟脉冲,用于芯片的时钟信号。

CLKR引脚:内部时钟发生器外接电阻端,与CLKIN端配合可由芯片自身产生时钟脉冲,时钟脉冲频率范围一般为100KHz~1460KHz。

INTR引脚:转换结束输出信号,低电平有效,当一次A/D转换完成后,该引脚被设置为0。在实际应用中,该引脚可与外部中断输入引脚相连(如51单片机的INT0,INT1脚),触发中断请求,中断发生后,还需等待RD=0才能正确读出A/D转换结果。若不使用中断,该引脚可以悬空。

AGAND和DGAND引脚:模拟接地和数字接地,两个引脚可以直接接地。

VCC引脚:接+5V电源。

DB0~DB7引脚:输出A/D转换后的8位二进制结果。

四位数码管7SEG-MPX4CA

实验用显示器件采用四位数码管7SEG-MPX4CA,该器件共有12个引脚。其中1、2、3、4引脚为位选信号,用于控制几个数码管亮,A~G引脚为显示数字的段选信号,DP引脚为小数点。

模数转换器

实验电路设计

ADC0804中的VCC接入5V电源,REF/2引脚悬空(悬空则相当于与VCC共接5V电源),因此ADC转换的参考电压为VCC的值,即5V。DB0DB7引脚连接单片机的P1.0P1.7,RD和WR引脚连接单片机的P3.6和P3.7,VIN+引脚接滑动变阻器的可调节端,VIN-引脚接地,在VIN+和VIN-引脚之间接入电压表,CLKIN引脚和CLKR引脚连接的电容和电阻构成外部时钟脉冲。单片机P0.0~P0.7接四位数码管的段选线。

模数转换器

单片机内运行的完整C程序如下:

#include
#include
#define uint unsigned int
#define uchar unsigned char
sbit wr=P3^6;
sbit rd=P3^7;
uchar code dis[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void delay(uint x) 
{
   uchar i;
   while(x--)
     for(i=0;i< 120;i++);       
}
void display(uchar db)
{
    uchar bw,sw,gw;
         float value;
         int voltage;
         value = (float)db * 5 / 256 * 100;
         voltage = (int)value;
         bw=voltage/100;
         sw=voltage%100/10;
         gw=voltage%10;
      P2=0x01;
         P0=dis[bw]&0x7f;
         delay(5);
         P2=0x02; 
         P0=dis[sw];
         delay(5);
         P2=0x04;
         P0=dis[gw];
         delay(5);  
         P2=0x08;
         P0=dis[0];
         delay(5);
}  
void main()
{
       uchar i;
       while(1)
       {
              wr=0;
              _nop_();
              wr=1;
              delay(1);       
              P1=0xff;
              rd=0;
              _nop_();
              for(i=0;i< 10;i++)
                      display(P1); 
       } 
}

位变量wr和rd用于操作P3.6和P3.7,P3.6和P3.7连接到了ADC0804的WR和RD引脚,用于控制信号采样和读取采样信号。数组变量dis[]定义了数码管显示的数字编码。

delay(uint x)是延迟函数,参数x为延时的毫秒数。

display(uchar db)是数码管显示函数,参数db为P1口,P1口存储了采集到的电压数字量。ADC0804的分辨率为8位,可以区分2^8(256)不同等级的输入模拟电压,且输入电压量程为0 ~ 5V,ADC0804输出的数值范围为0~256,转换为电压(单位V)的公式为:

输出的数值*输入最大量程 / 256

下面的代码将输出的数值转换为电压的数字量(单位V),并分别计算出数字量的各个位数。

value = (float)db * 5 / 256 * 100;  
// 输出数值转换为电压,乘以1000方便计算出数值的各个位数
voltage = (int)value;  
bw=voltage/100;     // 计算出百位数
sw=voltage%100/10;  // 计算出十位数
gw=voltage%10;      // 计算出个位数

语句P2=0x01选择数码管的第1位显示数字,语句P0=dis[bw]&0x7f用于显示数字和小数点,dis[bw]指定的数字的编码,再和0x7f做与操作,显示小数点。

main()函数是主控函数,应用while结构循环采集和转换可变电阻输出的电压,并将采集的电压输出到数码管显示。语句wr=0将ADC0804的wr引脚设为低电平,通知ADC0804进行采样,语句_nop_()执行_nop_()函数, nop ()函数不是C语言标准库的函数,它是51单片机提供的指令,它执行一个机器周期的空操作,让ADC0804完成数据采样和模数转换,其后执行语句wr=1,将ADC0804的wr引脚设为高电平。语句P1=0xff将P1各端口都设置为高电平,准备接收采集的数据,语句rd=0将ADC0804的rd引脚设为低电平,从DB0~DB7引脚读取数据到P1口。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分