汪老师分享 - AD0809 在 51 单片机中的应用

我们在做一个单片机系统时,常常会遇到这样那样的数据采集,在这些被采集的数据中, 大部分可以通过我们的 I/O  口扩展接口电路直接得到,由于 51 单片机大部分不带 AD 转换  器,所以模拟量的采集就必须靠 A/D V/F 实现 。下现我们就来了解一下 AD0809 51   片机的接口及其程序设计。

1 AD0809 的逻辑结构

ADC0809 8 位逐次逼近型 A/D 转换器。 它由一个 8 路模拟开关、  一个地址锁存译码  器、一个 A/D 转换器和一个三态输出锁存器组成(见图 1)。多路开关可选通 8 个模拟通道, 允许 8 路模拟量分时输入,共用 A/D 转换器进行转换。 三态输出锁器用于锁存 A/D 转换完  的数字量, OE 端为高电平时, 才可以从三态输出锁存器取走转换完的数据。

2 AD0809 的工作原理

IN0IN7 8 条模拟量输入通道

ADC0809 对输入模拟量要求:信号单极性,电压范围是 05V,若信号太小, 必须进行放 大;输入的模拟量在转换过程中应该保持不变,如若模拟量变化太快,则需在输入前增加采样保持电路。地址输入和控制线: 4 ALE 为地址锁存允许输入线,高电平有效 。当 ALE线为高电平时, 地址锁存与译码器将 A  B C 条地址线的地址信号进行锁存 ,经译码后被选中的通道的模拟量进转换器进行转换。 A B  C 为地址输入线 ,用于选通 IN0IN7  上的一路模拟量输入。通道选择表如下表所示。

数字量输出及控制线:   11 

ST 为转换启动信号 。当 ST 上跳沿时,所有内部寄存器清零; 下跳沿时, 始进行 A/D  换; 在转换期间, ST 应保持低电平 EOC 为转换结束信号 。当 EOC 为高电平时, 表明转 换结束;否则,表明正在进行 A/D 转换。 OE 为输出允许信号,用于控制三条输出锁存器向 单片机输出转换得到的数据。 OE 1 ,输出转换得到的数据;OE 0 ,输出数据线呈高阻状  D7D0 为数字量输出线。

CLK 为时钟输入信号线。因 ADC0809 的内部没有时钟电路,所需时钟信号必须由外界提供, 通常使用频率为 500KHZ

VREF(+),VREF(-)为参考电压输入。

3 ADC0809 应用说明

1).   ADC0809 内部带有输出锁存器,可以与 AT89S51 单片机直接相连。

2).   初始化时, 使 ST OE 信号全为低电平。

3).   送要转换的哪一通道的地址到 A B C 端口上。

4).   ST 端给出一个至少有 100ns 宽的正脉冲信号。

5).   是否转换完毕,我们根据 EOC 信号来判断。

6).   EOC 变为高电平时,这时给 OE 为高电平,转换的数据就输出给单片机了。

4 AD0809 的应用

了解完 A/D 转换芯片,下面我们以图 2 为例来完成它的程序设计。

电路说明:

电路见图(2),主要由 AD 转换器 AD0809 ,频率发生器 SUN7474 ,单片机 AT89S51 及显示用数码管组成。

AD0809 的启动方式为脉冲启动方式,启动信号 START 启动后开始转换, EOC 信号在  START 的下降沿 10us 后才变为无效的低电平。这要求查询程序待 EOC 无效后再开始查询, 转换完成后,EOC 输出高电平,再由 OE 变为高电平来输出转换数据 。我们在设计程序时  可以利用 EOC  信号来通知单片机(查询法或中断法)读入已转换的数据, 可以在启动  AD0809 后经适当的延时再读入已转换的数据。

AT89S51 的输出频为晶振频的 1/62MHZ),AT89S1 SUN7474 连接经与 7474 ST 脚提供 AD0809  的工作时钟 AD0809  的工作频范围为  10KHZ-1280KHZ,当频率范围为 500KHZ 时, 其转换速度为 128us

AD0809 的数据输出公式为: Dout=Vin*255/5=Vin*51,其中 Vin 为输入模拟电压,Vout 为输出数据。

当输入电压为 5V 时, 读得的数据为 255 再乘以 2,得 510我们用 510*98%499, 将百位数码管的小数点点亮,显示为4.99V ,显示值与输入值基本吻合。

件设计思路及程序流程

编程思路:

1   AD0809 写入通道号并启动转换

2)   延时 1ms 后等待 EOC 出现高电平(JNB    EOC,$)

3)   给 OE 置高并读入转换数据存入数据地址或数组中。

4   显示

#include <at89x51.h>

#define    uchar       unsigned char

#define    uint unsigned int

sbit  st=P3^2;

sbit  oe=P3^ 1;

sbit  eoc=P3^0;

uchar       code tab[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};//数码管显示段码

uchar       code td[]={0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70};// 通道先择数组 uint  ad_0809,ad_data1,ad_data2,ad_data3,ad_data0;

uchar       m,number;

uchar       x[8];//八通道数据待存数组

void delaynms(uint x);//nms 延时程序

void display();//显示程序

void ad0809();//芯片启动程序

void key();//键扫描程序

main()

{

number=1;

P1=0x00;

while(1)

{

ad0809();//AD0809 启动子程序

key();//调按键子程序

ad_0809=x[number];//把相关通道数据给 ad_0809

display();//调显示

}}

//nms 延时程序

void delaynms(uint x)

{

uchar       i;

while(x-->0)

{

for(i=0;i<125;i++)

{;}}}

void display()

{

uchar       a;

ad_data1=(ad_0809*49/25)/100;//读得的数据乘以 2 再乘以 98%除以 100 百位

ad_data2=((ad_0809*49/25)%100)/10;//读得的数据乘以 2 再乘以 98%再分出十位

ad_data3=(((ad_0809*49/25)%100)%10);// 读得的数据乘以 2 再乘以 98%再分出个位 for(a=0;a<10;a++)

{

P0=tab[ad_data3];//送小数点后第二位显示

P2=0x07;//选通第一个数码管

delaynms(3);

P0=tab[ad_data2];//送小数点后第一位显示

P2=0x0b;//选通第二个数码管

delaynms(3);

P0=tab[ad_data1];//送整数显示

P0_7=0;//点亮第三个数码管小数点

P2=0x0d;//              选通第三个数码管

delaynms(3);

P0=tab[number];//送通道号显示

P2=0x0e;

delaynms(3);

}}

void ad0809()

{

uchar       i,m=1;

for(i=0;i<8;i++)

{

P0=td[i];//选通通道

oe=0;//以下三条指令为起动 AD0809

st=0;

st=1;

st=0;

delaynms(1);

while(!eoc);//等待转换结束

oe= 1;//取出读得的数据

x[m]=P2;//送相关通道数组

oe=0;

m++;

}}

void key()

{

if(!P3_5)//P3.5 是否按下

{

delaynms(20);//延时判误

if(!P3_5)//再一次判断 P3 5 是否按下

{

while(!P3_5);//等待 P3 5 为高电平

number++;//通道号显示加一

如果学弟学妹们在毕设方面有任何问题,随时可以私信我咨询哦,有问必答!学长专注于单片机相关的知识,可以解决单片机设计、嵌入式系统、编程和硬件等方面的难题。
愿毕业生有力,陪迷茫着前行!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值