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