adc0809 c语言程序,ADC0809模数转换程序及详解

描述

模数转换器最重要的参数是转换的精度,通常用输出的数字信号的位数的多少表示。转换器能够准确输出的数字信号的位数越多,表示转换器能够分辨输入信号的能力越强,转换器的性能也就越好。

A/D 转换一般要经过采样、保持、量化及编有些过程是合并进码4 个过程。在实际电路中,如采样和保持,量化和编码在转换过程中行的,是同时实现的。 而ADC0809是采样频率为8位的、以逐次逼近原理进行模—数转换的器件。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。

ADC0809主要特性:

1)8路8位A/D转换器,即分辨率8位。

2)具有转换起停控制端。

3)转换时间为100μs

4)单个+5V电源供电

5)模拟输入电压范围0~+5V,不需零点和满刻度校准。

6)工作温度范围为-40~+85摄氏度

7)低功耗,约15mW。

ADC0809内部结构

747d0168fd64bc8eaadedfd881077a8c.png

ADC0809是CMOS单片型逐次逼近式A/D转换器,它由8路模拟开关、地址锁存与译码器、比较器、8位开关树型D/A转换器、逐次逼近

ADC0809外部特性(引脚功能)

d82b658d9d757673342e027fdf115c37.png

ADC0809芯片有28条引脚,采用双列直插式封装,下面说明各引脚功能。

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正常运行,有输出,并且发现当所给的时钟频率越低,最高精度的那位输出越稳定。

ADC0809模数转换完整的程序:

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

打开APP阅读更多精彩内容

点击阅读全文

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值