1. 基本知识
ADC0809是带有8位A/D转换器、8路多路开关和微处理器兼容的控制逻辑CMOS组件。它是一个逐渐接近的类型。A/D可与单片机直接接口的转换器。
(1). ADC0809内部逻辑结构
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
从上图可以看出,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-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条
ST转换启动信号。当ST上跳沿时,所有内部寄存器清零;下跳沿时,开始进行A/D在转换期间,ST保持低电平。EOC为转换结束信号。当EOC在高电平时,表示转换结束;否则,表示正在进行中A/D转换。OE用于控制三个输出锁存器向单片机输出转换获得的数据,以输出允许信号。OE=1.输出转换获得的数据;OE=输出数据线处于高阻状态。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). 在模数转换模块区域中IN三端用导线连接到三路可调模块区域 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,PCNT
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,0DFH,0BFH,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)%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;
}
}
void t0(void) interrupt 1 using 0
{
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
P1=dispcode[dispbuf[dispcount]];
P2=dispbitcode[dispcount];
dispcount++;
if(dispcount==8)
{
dispcount=0;
}
}
end