基本知识
ADC0809是带有8位A/D转换器、8路多路开关和微处理器兼容的控制逻辑CMOS组件。它是一个逐渐接近的类型。A/D可与单片机直接接口的转换器。
(1).ADC0809内部逻辑结构
从上图可以看出,ADC0809由8路模拟开关、地址锁定和译码器组成A/D转换器由三态输出锁组成。多路开关可选8个模拟通道,允许8个模拟量分时输入,共用A/D转换器进行转换。三态输出锁用于锁定A/D转换后的数量,当OE端为高电平时,可从三态输出锁存器取走转换数据。
(2).引脚结构
IN0-IN7:8模拟量输入通道
ADC0809对输入模拟量的要求号单极性,电压范围为0-5V,如果信号太小,则必须放大;在转换过程中,应保持输入的模拟量不变。如果模拟量变化过快,则应在输入前添加采样以保持电路。
地址输入控制线:4条
ALE允许地址锁定输入线,高电平有效。ALE当线路为高电时,地址锁定和译码器将A,B,C锁定三条地址线的地址信号,翻译后选定通道的模拟量进入转换器。A,B地址输入线和C用于选择IN0-IN一路模拟输入7上。通道选择表如下表所示。
数字输出及控制线:11条
ST转换启动信号。当ST上跳边时,所有内部寄存器清零;下跳边时,开始A/D转换;在转换期间,ST保持低电平。EOC转换结束信号。当EOC在高电平时,表示转换结束;否则,表示正在进行中A/D转换。OE用于控制三个输出锁存器向单片机输出转换获得的数据,以输出允许信号。OE=1,输出转换获得的数据;OE=0,输出数据线处于高阻状态。D7-D0是数字输出线。
CLK为时钟输入信号线。ADC0809内部没有时钟电路,所需的时钟信号必须由外界提供,通常使用频率为500KHz,
VREF(+),VREF(-)参考电压输入。
2.ADC0809应用说明
(1).ADC0809内部有输出锁,可与AT89S51单片机直接连接。
(2)初始化时,使ST和OE所有信号均为低电平。
(3)将要转换的通道的地址发送到A,B,C端口上。
(4).在ST至少给出一个1000端ns宽正脉冲信号。
(5)我们根据转换是否完成。EOC判断信号。
(6).当EOC变成高电平时,此时给予OE对于高电平,转换数据输出到单片机。
3.实验任务如下图所示ADC0809的通道IN3输入0-5V通过ADC0809在数码管上以十进制形成数字量显示。ADC0809的VREF接+5V电压。
4.电路原理图
图1.27.1
5.系统板上的硬件连接(1)。单片机系统板区域P1端口的P1.0-P1.7用8芯线连接到动态数字显示区域A B C D E F G H作为数码管笔段驱动的端口。
(2)单片机系统板区域P2端口的P2.0-P2.7用8芯线连接到动态数字显示区域S1 S2 S3 S4 S5 S6 S7 S8端口,作为数码管的位置选择。
(3)单片机系统板区域P0端口的P0.0-P0.7将8芯线连接到模数转换模块区域D0D1D2D3D4D5D6D7端口上,A/D转换后的数据输入到单片机P0端口
(4)模数转换模块区域VREF端子用导线连接到电源模块区域VCC端子上;
(5)模数转换模块区域A2A1A0端子用导线连接到单片机系统区域P3.4 P3.5 P3.6端子上;
(6)模数转换模块区域ST端子用导线连接到单片机系统区域P3.0端子上;
(7)模数转换模块区域OE端子用导线连接到单片机系统区域P3.1端子上;
(8)模数转换模块区域EOC端子用导线连接到单片机系统区域P3.2端子上;
(9)模数转换模块区域CLK端子用导线连接到“分频模块”区域中的 /4 端子上;
(10)分频模块区域CK IN端子用导线连接到单片机系统区域 ALE 端子上;
(11)模数转换模块区域IN3端子用导线连接到“三路可调压模块”区域中的 VR1 端子上;
6.程序设计内容
(1).进行A/D转换时,使用查询EOC检测标志信号A/D转换是否完成,数据是否通过P0端口读入,数据处理后显示在数字管上。
(2).进行A/D转换前,应启动转换方法:
ABC=110选择第三通道
ST=0,ST=1,ST=0产生启动转换的正脉冲信号
7.汇编源程序
CH EQU 30H
DPCNT EQU 31H
DPBUF EQU 33H
GDATA EQU 32H
ST BIT P3.0
OE BIT P3.1
EOC BIT P3.2
ORG 00H
LJMP START
ORG 0BH
LJMP T0X
ORG 30H
START: MOV CH,#0BCH
MOV DPCNT,#00H
MOV R1,#DPCNT
MOV R7,#5
MOV A,#10
MOV R0,#DPBUF
LOP: MOV @R0,A
INC R0
DJNZ R7,LOP
MOV @R0,#00H
INC R0
MOV @R0,#00H
INC R0
MOV @R0,#00H
MOV TMOD,#01H
MOV TH0,#(65536-4000)/256
MOV TL0,#(65536-4000) MOD 256
SETB TR0
SETB ET0
SETB EA
WT: CLR ST
SETB ST
CLR ST
WAIT: JNB EOC,WAIT
SETB OE
MOV GDATA,P0
CLR OE
MOV A,GDATA
MOV B,#100
DIV AB
MOV 33H,A
MOV A,B
MOV B,#10
DIV AB
MOV 34H,A
MOV 35H,B
SJMP WT
T0X: NOP
MOV TH0,#(65536-4000)/256
MOV TL0,#(65536-4000) MOD 256
MOV DPTR,#DPCD
MOV A,DPCNT
ADD A,#DPBUF
MOV R0,A
MOV A,@R0
MOVC A,@A DPTR
MOV P1,A
MOV DPTR,#DPBT
MOV A,DPCNT
MOVC A,@A DPTR
MOV P2,A
INC DPCNT
MOV A,DPCNT
CJNE A,#8,NEXT
MOV DPCNT,#00H
NEXT: RETI
DPCD: DB 3FH,06H,5BH,4FH,66H
DB 6DH,7DH,07H,7FH,6FH,00H
DPBT: DB 0FEH,0FDH,0FBH,0F7H
DB 0EFH,0DFH0BFH,07FH
END
8.C语言源程序
#include
unsigned char code dispbitcode[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x00};
unsigned char dispbuf[8]={10,10,10,10,10,0,0,0};
unsigned char dispcount;
sbit ST=P3^0;
sbit OE=P3^1;
sbit EOC=P3^2;
unsigned char channel=0xbc;//IN3
unsigned char getdata;
void main(void)
{
TMOD=0x01;
TH0=(65536-4000)/256;
TL0=(65536-4000)%6;
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;
dispbuf[1]=getdata/10;
dispbuf[0]=getdata;
}
}
void t0(void) interrupt 1 using 0
{
TH0=(65536-4000)/256;
TL0=(65536-4000)%6;
P1=dispcode[dispbuf[dispcount]];
P2=dispbitcode[dispcount];
dispcount++;
if(dispcount==8)
{
dispcount=0;
}
}