logo资料库

ADC0809由一个8路模拟开关、一个地址锁存与译码器、一个A/D转换器和一个三态输出锁存器组成。多路开关可选通8个模拟通道,允....docx

第1页 / 共6页
第2页 / 共6页
第3页 / 共6页
第4页 / 共6页
第5页 / 共6页
第6页 / 共6页
资料共6页,全文预览结束
AD0809 应用原理 2006 年 12 月 12 日 星期二 22:13 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-IN7 上 的一路模拟量输入。通道选择表如下表所示。 C 0 0 0 0 1 1 1 1 B 0 0 1 1 0 0 1 1 A 0 1 0 1 0 1 0 1 选择的 通道 IN0 IN1 IN2 IN3 IN4 IN5 IN6 IN7 数字量输出及控制线: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 端给出一个至少有 100ns 宽的正脉冲信号。 (5). 是否转换完毕,我们根据 EOC 信号来判断。 (6). 当 EOC 变为高电平时,这时给 OE 为高电平,转换的数据就输出给单片 机了。 3. 实验任务 如下图所示,从 ADC0809 的通道 IN3 输入 0-5V 之间的模拟量,通过 ADC0809 转换成数字量在数码管上以十进制形成显示出来。ADC0809 的 VREF 接+5V 电压。 4. 电路原理图 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,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; } }
分享到:
收藏