电子常识
ADC0809是采样频率为8位的、以逐次逼近原理进行模—数转换的器件。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。
1)8路8位A/D转换器,即分辨率8位。
2)具有转换起停控制端。
3)转换时间为100μs
4)单个+5V电源供电
5)模拟输入电压范围0~+5V,不需零点和满刻度校准。
6)工作温度范围为-40~+85摄氏度
7)低功耗,约15mW。
1、ADC0809引脚图
2、ADC0809引脚功能
IN0~IN7:8路模拟量输入端。
D0~D7:8位数字量输出端。
ADDA、ADDB、ADDC:3位地址输入线,用于选择8路模拟通道中的一路,选择情况见表。
ALE:地址锁存允许信号,输入,高电平有效。
START:A/D转换启动信号,输入,高电平有效。
EOC:A/D转换结束信号,输出。当启动转换时,该引脚为低电平,当A/D转换结束时,该线脚输出高电平。
OE:数据输出允许信号,输入,高电平有效。当转换结束后,如果从该引脚输入高电平,则打开输出三态门,输出锁存器的数据从D0~D7送出。
CLK:时钟脉冲输入端。要求时钟频率不高于640KHZ.REF+、REF-:基准电压输入端。
Vcc:电源,接+5V电源。
GND:地。
ADC0809是采用CMOS工艺制造的双列直插式单片8位A/D转换器。(分辨率)分辨率8位,精度7位,带8个模拟量输入通道,有通道地址译码锁存器,输出带三态数据锁存器。启动信号为脉冲启动方式,最大可调节误差为±1LSB。(转换精度)
ADC0809内部没有时钟电路,故CLK时钟需由外部输入,fclk允许范围为500kHz~1MHz,典型值为640kHz。每通道的转换需66~73个时钟脉冲,大约100~110μs。(转换时间)工作温度范围为-40℃~+85℃。功耗为15mW,输入电压范围为0~5V,单一+5V电源供电。(量程)
1、ADC0809时序图
2、ADC0809的工作流程如图所示:
1)输入3位地址,并使ALE=1,将地址存入地址锁存器中,经地址译码器译码从8路模拟通道中选通一路模拟量送到比较器。
2)送START一高脉冲,START的上升沿使逐次逼近寄存器复位,下降沿启动A/D转换,并使EOC信号为低电平。
3)当转换结束时,转换的结果送入到输出三态锁存器,并使EOC信号回到高电平,通知CPU已转换结束。
4)当CPU执行一读数据指令,使OE为高电平,则从输出端D0~D1读出数据。
3、转换数据的传送
A/D转换后得到的数据应及时传送给单片机进行处理。数据传送的关键问题是如何确认A/D转换的完成,因为只有确认完成后,才能进行传送。为此可采用下述三种方式。
(1)定时传送方式
对于一种A/D转换器来说,转换时间作为一项技术指标是已知的和固定的。例如ADC0809转换时间为128μs,相当于6MHz的MCS-51单片机共64个机器周期。可据此设计一个延时子程序,A/D转换启动后即调用此子程序,延迟时间一到,转换肯定已经完成了,接着就可进行数据传送。
(2)查询方式
A/D转换芯片有表明转换完成的状态信号,例如ADC0809的EOC端。因此可以用查询方式,测试EOC的状态,即可确认转换是否完成,并接着进行数据传送。
(3)中断方式
把表明转换完成的状态信号(EOC)作为中断请求信号,以中断方式进行数据传送。不管使用上述哪种方式,只要一旦确定转换完成,即可通过指令进行数据传送。首先送出口地址并以信号有效时,OE信号即有效,把转换数据送上数据总线,供单片机接受。
ADC0809的内部逻辑结构图如图所示
图中多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用一个A/D转换器进行转换,这是一种经济的多路数据采集方法地址锁存与译码电路完成对ABC3个地址位进行锁存和译码,其译码输出用于通道选择,其转换结果通过三态输出锁存器存放输出,因此可以直接与系统数据总线相连,表1为通道选择表。
表1通道选择表
对ADC0809主要信号引脚的功能说明如下:
START转换启动信号START上升沿时,复位ADC0809;START下降沿时启动芯片,开始进行A/D转换;在A/D转换期间,START应保持低电平本信号有时简写为ST.
ABC地址线通道端口选择线,A为低地址,C为高地址,引脚图中为ADDA,ADDB和ADDC其地址状态与通道对应关系见表1。
CLK时钟信号ADC0809的内部没有时钟电路,所需时钟信号由外界提供,因此有时钟信号引脚通常使用频率为500KHz的时钟信号
EOC转换结束信号EOC=0,正在进行转换;EOC=1,转换结束使用中该状态信号即可作为查询的状态标志,又可作为中断请求信号使用
OE输出允许信号用于控制三态输出锁存器向单片机输出转换得到的数据OE=0,输出数据线呈高阻;OE=1,输出转换得到的数据
Vcc+5V电源
Vref参考电源参考电压用来与输入的模拟信号进行比较,作为逐次逼近的基准其典型值为+5V(Vref(+)=+5V,Vref(-)=-5V)。
ADC0809与MCS-51单片机的连接如图所示:
电路连接主要涉及两个问题一是8路模拟信号通道的选择,二是A/D转换完成后转换数据的传送。
8路模拟通道选择
图ADC0809与MCS-51的连接
如图9.11所示模拟通道选择信号ABC分别接最低三位地址A0A1A2即(P0.0P0.1P0.2),而地址锁存允许信号ALE由P2.0控制,则8路模拟通道的地址为0FEF8H~0FEFFH.此外,通道地址选择以作写选通信号,这一部分电路连接如图9.12所示
图ADC0809的部分信号连接
图 信号的时间配合
从图中可以看到,把ALE信号与START信号接在一起了,这样连接使得在信号的前沿写入(锁存)通道地址,紧接着在其后沿就启动转换图是有关信号的时间配合示意图
启动A/D转换只需要一条MOVX指令在此之前,要将P2.0清零并将最低三位与所选择的通道好像对应的口地址送入数据指针DPTR中例如要选择IN0通道时,可采用如下两条指令,即可启动A/D转换:
MOVDPTR,#FE00H;送入0809的口地址
MOVX@DPTR,A;启动A/D转换(IN0)
注意:此处的A与A/D转换无关,可为任意值。
从ADC0809的通道IN3输入0-5V之间的模拟量,通过ADC0809转换成数字量在数码管上以十进制形成显示出来。ADC0809的VREF接+5V电压。
图 电路原理图
2、系统板上硬件连线
(1).把“单片机系统板”区域中的P1端口的P1.0-P1.7用8芯排线连接到“动态数码显示”区域中的ABCDEFGH端口上,作为数码管的笔段驱动。
(2).把“单片机系统板”区域中的P2端口的P2.0-P2.7用8芯排线连接到“动态数码显示”区域中的S1S2S3S4S5S6S7S8端口上,作为数码管的位段选择。
(3).把“单片机系统板”区域中的P0端口的P0.0-P0.7用8芯排线连接到“模数转换模块”区域中的D0D1D2D3D4D5D6D7端口上,A/D转换完毕的数据输入到单片机的P0端口
(4).把“模数转换模块”区域中的VREF端子用导线连接到“电源模块”区域中的VCC端子上;
(5).把“模数转换模块”区域中的A2A1A0端子用导线连接到“单片机系统”区域中的P3.4P3.5P3.6端子上;
(6).把“模数转换模块”区域中的ST端子用导线连接到“单片机系统”区域中的P3.0端子上;
(7).把“模数转换模块”区域中的OE端子用导线连接到“单片机系统”区域中的P3.1端子上;
(8).把“模数转换模块”区域中的EOC端子用导线连接到“单片机系统”区域中的P3.2端子上;
(9).把“模数转换模块”区域中的CLK端子用导线连接到“分频模块”区域中的/4端子上;
(10).把“分频模块”区域中的CKIN端子用导线连接到“单片机系统”区域中的ALE端子上;
(11).把“模数转换模块”区域中的IN3端子用导线连接到“三路可调压模块”区域中的VR1端子上;
3、程序设计
(1).进行A/D转换时,采用查询EOC的标志信号来检测A/D转换是否完毕,若完毕则把数据通过P0端口读入,经过数据处理之后在数码管上显示。
(2).进行A/D转换之前,要启动转换的方法:
ABC=110选择第三通道
ST=0,ST=1,ST=0产生启动转换的正脉冲信号
程序:
#include《AT89X52.H》
unsignedcharcodedispbitcode[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};
unsignedcharcodedispcode[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x00};
unsignedchardispbuf[8]={10,10,10,10,10,0,0,0};
unsignedchardispcount;
sbitST=P3^0;
sbitOE=P3^1;
sbitEOC=P3^2;
unsignedcharchannel=0xbc;//IN3
unsignedchargetdata;
voidmain(void)
{
TMOD=0x01;
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
TR0=1;
ET0=1;
EA=1;
P3=channel;
while(1)
{
ST=0;
ST=1;
ST=0;
while(EOC==0);
OE=1;
getdata=P0;
OE=0;
dispbuf[2]=getdata/100;
getdata=getdata%10;
dispbuf[1]=getdata/10;
dispbuf[0]=getdata%10;
}
}
voidt0(void)interrupt1using0
{
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
P1=dispcode[dispbuf[dispcount]];
P2=dispbitcode[dispcount];
dispcount++;
if(dispcount==8)
{
dispcount=0;
}
}
全部0条评论
快来发表一下你的评论吧 !