ADC0809模数转换

  • 格式:docx
  • 大小:574.39 KB
  • 文档页数:8

ADC0809模数转换

1. 实验目的与成效:

模数转换在信号搜集中占有很重要的地位。本实验采纳经典8位AD――ADC080做一个0~5V的电压表,并用数码管显示出来。

(说明:本实验板上的读AD值端口跟数码管位选端口是分时复用的,呵呵,能够学习一下单片机端口分时复用)

ADC0809简介:

ADC0809是带有8位A/D转换器、8路多路开关和微处置机兼容的操纵逻辑的CMOS组件。它是逐次逼近式A/D转换器,能够和单片机直接接口。

(1). (1). ADC0809的内部逻辑结构

由上图可知,ADC0809由一个8路模拟开关、一个地址锁存与译码器、一个A/D转换器和一个三态输出锁存器组成。多路开关可选通8个模拟通道,许诺8路模拟量分时输入,共用A/D转换器进行转换。三态输出锁器用于锁存A/D转换完的数字量,当OE端为高电平常,才能够从三态输出锁存器取走转换完的数据。

(2). (2). 引脚结构

IN0-IN7:8条模拟量输入通道

ADC0809对输入模拟量要求:信号单极性,电压范围是0-5V,假设信号过小,必需进行放大;输入的模拟量在转换进程中应该维持不变,如假设模拟量转变太快,那么需在输入前增加采样维持电路。

地址输入和操纵线:4条

ALE为地址锁存许诺输入线,高电平有效。当ALE线为高电平常,地址锁存与译码器将A,B,C三条地址线的地址信号进行锁存,经译码后被 8路模拟量开关

8路A/D转换器

三态输出锁存器

地址锁存与译码器 IN0

IN1

IN2

IN3

IN4

IN5

IN6

IN7

A

B

C

ALE

VREF(+)

VREF(-)

OE

EOC

D0

D1

D2

D3

D4

D5

D6

D7

CLK

ST

选中的通道的模拟量进转换器进行转换。A,B和C为地址输入线,用于选通IN0-IN7上的一路模拟量输入。

通道选择表如下表所示。

C B A 选择的通道

0 0 0 IN0

0 0 1 IN1

0 1 0 IN2

0 1 1 IN3

1 0 0 IN4

1 0 1 IN5

1 1 0 IN6

1 1 1 IN7

数字量输出及操纵线:11条

START为转换启动信号。当START上跳沿时,所有内部寄放器清零;下跳沿时,开始进行A/D转换;在转换期间,ST应维持低电平。EOC为转换终止信号。当EOC为高电平常,说明转换终止;不然,说明正在进行A/D转换。OE为输出许诺信号,用于操纵三条输出锁存器向单片机输出转换取得的数据。OE=1,输出转换取得的数据;OE=0,输出数据线呈高阻状态。D7-D0为数字量输出线。

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

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

ADC0809读写时序图:

ADC0809读写时序图 (提示:更多ADC0809详细说明请查看文档)

2.电路原理图:

2. 实验板上操作:

1) 先将程序的HEX文件烧到单片机里

2) 用短路冒短接-START,

-OE,

-EOC ,

-AD_ALE

-d0 -d1

-d2

-d3

-d4

-d5

-d6

-d7

关于模拟输入通道的选择是如此的:

选择模拟输入通道 通道地址对应接法

CH0 C-GND B-GND A-GND

CH1 C-GND B-GND A-VCC

CH2 C-GND B-VCC A-GND

CH3 C-GND B-VCC A-VCC

CH4 C-VCC B-GND A-GND

CH5 C-VCC B-GND A-VCC

CH6 C-VCC B-VCC A-GND

CH7 C-VCC B-VCC A-VCC

2)通道地址选择好了以后,就要把0~5V模拟电压送到相应的通道上

比如说你此刻是选择CH0,请把CH0与模拟输入用短路冒短接。

3)把数码管位选拨码开关全拨到ON上 。务必把液晶那里的拨码开关拨到OFF。

4)看看数码管显示。用螺丝刀调剂“模拟电压输入周密电位器”,看看数码管上显示的电压值有无发生转变。能够用万用表测一下输入电压,然后与数码管上显示的是不是一样或很接近。(说明:若是用USB给实验板供电的话,实际测的电压与数码管显示不同专门大,但不是AD坏或程序不对,这是因为USB电源在实验板上产生压降,大约剩,而AD的基准源是用VCC的,也确实是基准源大约为。若是用5V稳压源给实验板供电的话,数码管上显示的电压与实际测量的电压值是很接近的。)

强调:本实验板不用USB供电而用其他稳压源供电,电压必然不能超过.

(▲友谊提示:数码管上显示的电压可能会有点波动,那个是由于电源有一些纹波,

会有些抖动,你能够用干电池当模拟电压输入,如此就很稳了)

★★专门提示★★:当把程序(确切的说是HEX文件)烧到单片机以后要把下载线拔下才能显示正常的电压值

5)若是想再烧一次程序到单片机了,请先将-d5,-d6,-d7短路冒摘下,

要不让将显现烧不进程序,插上下载线。烧完程序后再把适才摘下的短路冒从头弄上,并把下载线拔下,看看显示是不是正常。

6)做完本次实验,要把以上连接恢复,如此才可不能对其他实验产生阻碍。

(呵呵,数模转换有点折腾人吧!之因此如此是为了学习端口复用原理,端口分时复用是一种不错的技术)

■■■■■■■■■■■■注: 若是嫌上述的做法麻烦,你也能够如此来做:

不用短路冒短接

-d0 -d1

-d2

-d3

-d4

-d5

-d6

-d7

直接用一个八口排线将d0~d7引到单片机的P2端口,注意: d0对应,。。。。。。d7对应哦。然后在程序里改:“getdata=P1”改成“getdata=P2”就能够够了。(哈哈,如此就简单多了)。

4.实验板上实物连接图:

5.C语言程序:

//MCU:AT89S51

//晶振:12M

//采纳查询方式读AD转换后的值

#include ""

#include ""

#include ""

unsigned char code numcode[]={ 0xc0,0xf9,0xa4,0xb0,0x99,

0x92,0x82,0xf8,0x80,0x90,

0xC1,0XB7,0xFF

};//数字0~9及"U="”“共阳数码管代码

unsigned char code dot_numcode[]={0X40,0X79,0X24,0X30,0X19,

0X12,0X02,0X78,0X00,0X10

};//带数点的0~9共阳数码管代码

unsigned char code bitcode[]={0xfe,0xfd,0xfb,0xf7,

0xef,0xdf,0xbf,0x7f}; //数码管位选代码

unsigned char dispbuff[8]={0,0,0,11,10,12,12,12};

unsigned char disp_count;

unsigned char flag=1;

unsigned char flag_count;

unsigned long int getdata;

sbit START=P3^0;

sbit EOC=P3^2;

sbit OE=P3^1;

sbit AD_ALE=P3^3;

void main(void)

{

TMOD=0x01; //选择按时器T0,方式为1(16位按时器)

TH0=(65536-3000)/256; //按时3MS初值

TL0=(65536-3000)%256;

TR0=1;

ET0=1;

EA=1; AD_ALE=0;

START=0;

OE=0;

while(1)

{

if(flag==1) //每隔40ms启动一次AD采样

{

flag=0;

AD_ALE=1; //锁存输入通道

START=0; //驱动AD转换

START=1;

AD_ALE=0;

START=0; //维持低电平

while(EOC==0); //等待AD转换终止

TR0=0; //AD转换终止时先停止T0

P0=0XFF; //关闭数码管显示,呵呵,其实人眼是感觉不到数码管熄灭的

P1=0XFF; // 那个很重要

OE=1; //转换终止,许诺AD值输出

getdata=P1; //读出AD值,若是硬件连接上改成P2口来读AD值,这句就改成"getdata=P2;"

OE=0; //禁止输出

getdata=(unsigned long int)((unsigned long int)(getdata*500)/256);//转换成电压

dispbuff[2]=getdata/100;

dispbuff[1]=(getdata%100)/10;

dispbuff[0]=getdata%10;

TR0=1; //从头启动T0

}

}

}

void t0(void) interrupt 1

{

TH0=(65536-3000)/256;

TL0=(65536-3000)%256;

if(disp_count==2)

P0=dot_numcode[dispbuff[disp_count]];

else

P0=numcode[dispbuff[disp_count]];

P1=bitcode[disp_count];

disp_count++;