一、adc0809引脚结构功能说明图:
~28,in0~in7:8路模拟量输入端。
~21,d0~d7:8位数字量输出端。
23~25,adda、addb、addc:3位地址输入线,用于选通8路模拟输入中的一路。
22,ale:地址锁存允许信号,输入,高电平有效,对应ale上跳沿,a、b、c地址状态送入地址锁存器中。
6,start:a/d转换启动信号,输入高电平有效,start上升沿时,复位adc0809;start下降沿时启动芯片,开始进行a/d转换;在a/d转换期间,start应保持低电平。本信号有时简写为st.
7,eoc:a/d转换结束信号,输出,当a/d转换结束时,此端输出一个高电平**换期间一直为低电平)。
9,oe:数据输出允许信号,输入,高电平有效。当a/d转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量,用于控制三态输出锁存器向单片机输出转换得到的数据。
oe=0,输出数据线呈高阻;oe=1,输出转换得到的数据。
10,clk:时钟脉冲输入端。要求时钟频率不高于640khz,eoc=0,正在进行转换;eoc=1,转换结束。
使用中该状态信号即可作为查询的状态标志,又可作为中断请求信号使用。,ref(+)ref(-)基准电压。
11,vcc:电源,单一+5v。
13,gnd:地。
二、adc0809与51单片机的接口电路。
1、说明: d0~d7接51单片机的p2口(p2.0~p2.7)
adin1和adin2为通道in0和in1的电压模拟量输入(0~5v)
应用程序如下:
#include""
#define uchar unsigned char
sbit st=p1^0;
sbit eoc=p1^1;
sbit oe=p1^2;
sbit clk=p1^3;
sbit addcs=p1^4;
uchar ad_data[2];/保存in0和in1经ad转换后的数据。
***延时函数***
void delay(uchar i)
uchar j;
while(i--)
for(j=125;j>0;j--)
***系统初始化***
void init()
ea = 1;//开总中断。
tmod = 0x02;//设定定时器t0工作方式。
th0=216;//利用t0中断产生clk信号。
tl0=216;
tr0=1; /启动定时器t0
et0=1;
st=0;oe=0;
***t0中断服务程序***
void t0(void) interrupt 1 using 0
clk=~clk;
***ad转换函数***
void ad()
st=0;addcs=0;//选择通道in0
delay(10);
st=1;//启动ad转换。
delay(10);
st=0;while(0==eoc);
oe=1;ad_data[0]=p2;
oe=0;st=0;
addcs=1;//选择通道in1
delay(10);
st=1;//启动ad转换。
delay(10);
st=0;while(0==eoc);
oe=1;ad_data[1]=p2;
oe=0;***主函数***
void main()
init();
while(1)
ad();注: 由于adc0809内部不带时钟电路,因此用51单片机的定时器t0来产生时钟信号。
在通道选择时,由于b,c接地,当a(addcs)为低电平时选择in0,a为高电平时选择in1
2、利用单片机at89s51与adc0809设计一个数字电压表,实验任务利用单片机at89s51与adc0809设计一个数字电压表,能够测量0-5v之间的直流电压值,四位数码显示,但要求使用的元器件数目最少。
3. 系统板上硬件连线。
1).把“单片机系统”区域中的p1.0-p1.7与“动态数码显示”区域中的abcdefgh端口用8芯排线连接,数码管段码控制。
2).把“单片机系统”区域中的p2.0-p2.3与“动态数码显示”区域中的s1s2s3s4端口用8芯排线连接,数码管位码控制。
3).把“单片机系统”区域中的p3.0与“模数转换模块”区域中的st端子用导线相连接,转换启动控制。
4).把“单片机系统”区域中的p3.1与“模数转换模块”区域中的oe端子用导线相连接,数据输出控制。
5).把“单片机系统”区域中的p3.2与“模数转换模块”区域中的eoc端子用导线相连接,转换结束标志。
6).把“单片机系统”区域中的p3.3与“模数转换模块”区域中的clk端子用导线相连接,为转换器提供脉冲。
7).把“模数转换模块”区域中的a2a1a0端子用导线连接到“电源模块”区域中的gnd端子上,始终选择in0单通道。
8).把“模数转换模块”区域中的in0端子用导线连接到“三路可调电压模块”区域中的vr1端子上,调节电压变化。
9).把“单片机系统”区域中的p0.0-p0.7用8芯排线连接到“模数转换模块”区域中的d0d1d2d3d4d5d6d7端子上,数字结果输出。
4. 程序设计内容。
i.由于adc0809在进行a/d转换时需要有clk信号,而此时的adc0809的clk是接在at89s51单片机的p3.3端口上,也就是要求从p3.
3输出clk信号供adc0809使用。因此产生clk信号的方法就得用软件来产生了。
ii.由于adc0809的参考电压vref=vcc,所以转换之后的数据要经过数据处理,在数码管上显示出电压值。实际显示的电压值 (d/256*vref)
5. c语言源程序。
#include <>
unsigned char code dispbitcode=
unsigned char code dispcode=
unsigned char dispbuf[8]=;
unsigned char dispcount;
unsigned char getdata;
unsigned int temp;
unsigned char i;
sbit st=p3^0;
sbit oe=p3^1;
sbit eoc=p3^2;
sbit clk=p3^3;
void main(void)
st=0;oe=0;
et0=1;
et1=1;
ea=1;tmod=0x12;
th0=216;
tl0=216;
th1=(65536-4000)/256;
tl1=(65536-4000)%256;
tr1=1;
tr0=1;
st=1;st=0;
while(1)
dispbuf[i]=temp;
st=1;st=0;
void t0(void) interrupt 1 using 0
clk=~clk;
void t1(void) interrupt 3 using 0
th1=(65536-4000)/256;
tl1=(65536-4000)%256;
p1=dispcode[dispbuf[dispcount]];显示电压值。
p2=dispbitcode[dispcount];/位码控制。
if(dispcount==7)
dispcount++;
if(dispcount==8)
三、adc0809应用说明。
1、(1). adc0809内部带有输出锁存器,可以与at89s51单片机直接相连。
2). 初始化时,使st和oe信号全为低电平。
3). 送要转换的哪一通道的地址到a,b,c端口上。
4). 在st端给出一个至少有100ns宽的正脉冲信号。
5). 是否转换完毕,我们根据eoc信号来判断。