310 likes | 605 Views
第十一章 8051 数据采集的 C 编程. 11.1 8 位 A/D 芯片 ADC0809 11.2 12 位 A/D 芯片 ADC574 11.3 V/F 变换芯片 AD650 11.4 频率量的测量. 11.1 8 位 A/D 芯片 ADC0809. 11.1.1 ADC0809 的结构和引脚. 一个 8 位逐次逼近式 A/D 转换器、 8 路模拟转换开关、 3-8 地址锁存译码器和三态输出数据锁存器。. 2 、引脚功能. IN0—IN7 : 8 通道模拟量输入端 D0—D7 : 8 位数字量输出端
E N D
11.1 8位A/D芯片ADC0809 11.2 12位A/D芯片ADC574 11.3 V/F变换芯片AD650 11.4 频率量的测量
11.1 8位A/D芯片ADC0809 11.1.1 ADC0809的结构和引脚 一个8位逐次逼近式A/D转换器、8路模拟转换开关、3-8地址锁存译码器和三态输出数据锁存器。
2、引脚功能 IN0—IN7:8通道模拟量输入端 D0—D7: 8位数字量输出端 ADDC、ADDB、ADDA: 接地址锁存器的低三位地址 ALE: 地址锁存允许控制信号 START:清0内寄存器,启动转换 OE: 允许读A/D结果,高有效 CLK:时钟输入端,应≤640KHz EOC:转换结束时为高 Vcc:+5V Vref+:参考电压,+5V Vref-:0V IN3 IN2 IN4 IN1 IN5 IN0 ADC0809 IN6 ADDA IN7 ADDB EOC ALE D3 D7 OE D6 CLK D5 VCC D4 Vref+ D0 GND Vref- D1 D2
11.1.2 ADC0809与8051的接口 锁存器74LS373 89C51单片机 ADC 0809 口地址可以为:0FE00~0FE07H 也可为:0FEF0~ 0FEF7H D0-D7 ADDA P0.0-P0.7 8D Q0 Q1 ADDB ALE G +5V Q2 ADDC EA 2 OE 30Px2 CLK WR START ≥1 ALE P2.0 6MHz EOC ≥1 OE INT1 RD CK Q 图中的2分频电路可用D触发器实现 D /Q
#include<absacc.h> #include<reg51.h> #define uchar unsigned char #define IN0 XBYTE[0xFEF8] /*设置ADC0809的通道0地址*/ sbit ad_busy=P3^3; /*即EOC状态*/ void ad0809(uchar idata * x) /*采样结果放指针中的A/D采集函数*/ { uchar i; uchar xdata * ad_adr; ad_adr=&IN0; for(i=0;i<8;i++) /*处理8通道*/ { *ad_adr=0; /*启动转换*/ i=i; /*延时等待EOC变低*/ i=i; while(ad_busy==0); /*查询等待转换结束*/ x[i]=*ad_adr; /*存转换结果*/ ad_adr++; /*下一通道*/ } } void main(void) { static uchar idata ad[10]; ad0809(ad); /*采样ADC0809通道的值*/ }
11.2 12位A/D芯片ADC574 11.2.1 ADC574的结构和引脚 AD574是一种快速的12位逐次比较式A/D转换芯片,片内有两片双极型电路组成的28脚双插直列式芯片,无需外接元器件就可独立完成A/D转换功能。内部设有三态数据输出锁存器。一次转换时间为25μs。芯片引脚如图所示。
2、AD574的引脚定义 REOUT:内部参考电源输出(+10 V); REFIN:参考电压输入; BIP:偏置电压输入; 10VIN:±5 V或0~10 V模拟输入; 20VIN:±10 V或0~20 V模拟输入; DB0~DB11:数字量输出 STS:工作状态指示端。 STS=1时表示转换器正处于转换状态, STS返回到低电平时,表示转换完毕。
12/-8:变换输出字长选择控制端,在输入为高电平时,变换字长输出为12位,在低电平时,按8位输出;12/-8:变换输出字长选择控制端,在输入为高电平时,变换字长输出为12位,在低电平时,按8位输出; CS、CE:片选信号。当CS=0、CE=1同时满足时,AD574才能处于工作状态。 R/C:数据读出和数据转换启动控制; A0:字节地址控制。它有两个作用: 在启动AD574(R/-C=0)时,用来控制转换长度。A=0时,按完整的12位A/D转换方式工作,A=1时,则按8位A/D 转换方式工作。 在AD574处于数据读出工作状态(R/-C=1)时,A0和12/8成为输出数据格式控制。
CE CS R/ C 12/ 8 A0 功能说明 1 0 0 × 0 启动12位转换 1 0 0 × 1 启动8位转换 1 0 1 +5V × 12位输出 1 0 1 地 0 高8位输出 1 0 1 地 1 低4位输出 表11-1 AD574控制信号状态表
读AD574转换数据时序图 读周期时序
# include < absacc.h > # inlucde < reg51.h > # define uint unsigned int # define ADCOM XBYTE[ 0xff7c ] /* 使A0=0 ,R/C=0, CS=0 */ # define ADLO XBYTE [ 0xff7f ] /* 使 R/C =1,A0=1, CS=0 */ # define ADHI XBYTE [ 0xff7d ] /* 使R/C=1,A0=0,CS =0 */ sbit r = P3 ^ 7 ; sbit w = P3 ^ 6 ; sbit adbusy = P1 ^ 0 ;
uint ad574 ( void ) /* AD574转换器 */ { r = 0 ; /* 产生CE=1 */ w = 0 ; ADCOM = 0 ; /* 启动转换 */ while ( adbusy = =1 ) ; /* 等待转换 */ return ( ( uint )(ADHI<<4 )+( ADLO &0x0f ) ); /* 返回12位采样值 */ } main ( ) { uint idata result ; result =ad574 ( ) ; /* 启动AD574进行一次转换,得转换结果 */ }
11.3 V/F变换芯片AD650 压频变换型(Voltage-Frequency Converter)是通过间接转换方式实现模数转换的。其原理是首先将输入的模拟信号转换成频率,然后用计数器将频率转换成数字量。 采用V/F变换的数据采集的特点: (1) 接口简单,容易实现信号的隔离。 (2)性价比较高。 (3)频率信号抗干扰能力强。 (4)容易实现远程传输。
11.4 频率量的测量 定时 输入脉冲 < T 11.4.1 测量频率法 测量频率法的最简单的接口电路,可将频率脉冲直接连接到MCS-51的T1端,将8031的T/C0用作定时器,T/C1用作计数器。在T/C0定时时间里,对频率脉冲进行计数。T/C1的计数值便是单位定时时间里的脉冲个数。
测量T/C定时时间为500 ms,这样长的时间定时,先由T/C0定时100 ms,之后软件5次中断后的时间即为5×100 ms=500 ms。中断次数的计数值在msn中。 T/C0定时100 ms的计数初值:3CB0H。计数器1采用16位计数。设T/C0为高优先级,允许计数中断过程定时中断,即定时时间到就中止计数。tf为500 ms定时时间到标志。程序如下:
#include <reg51.h> #define uchar unsigned char #define uint unsigned int #define A 5 /*500 ms 的中断次数*/ sbit P1_0=P1^0; sbit P1_1=P1^1; uchar msn=A; bit idata tf=0; /*500 ms时间到标志*/
uint count(void) { P1_0=0 ; P1_0=1; /*产生清零用负脉冲*/ TMOD=0x59 ; TH1=0x00; TL1=0x00; /* T/C1计数器 */ TH0=0x3c ;TL0=0xb0; /* T/C0定时器100 ms */ TR0=1;TR1=1;PT0=1;ET0=1;ET1=1;EA=1; /*启动T/C,开中断*/ P1_1=0 ; P1_1=1 ; /* 产生启动正脉冲 */ while (tf!=1 ) ; /* 等待500 ms定时到 */ P1_0=0 ; P1_0=1 ; /* 产生负脉冲,封锁G2 */ TR0=0 ; TR1=0 ; /* 关T/C */ return (TH1*256+TL1) ; / 返回计数值*/ }
void timer0( void ) interrupt 1 using 1 /* 100 ms定时中断服务 */ { TH0=0x3c ; /* 重置初值 */ TL0=0xb0 ; msn - - ; if ( msn = = 0) { msn=A ; tf=1 ; } /* 500 ms定时时间到设标志 */ } void timer 1 (void ) interrupt 3 { } void main ( void ) { float rate ; rate=( 10/A )* count( ) ; /* 得每秒的计数率 */ }
测量周期的程序举例。 设fosc = 6 MHz,机器周期为2 μs,测周期的测量值为计数值乘以2。用C语言编写的程序如下: • #include<reg51.h> • #define uint unsigned int • sbit P1_0=P1^0; • uint count ,period; • bit rflag=0; / * 周期标志 */ • void control (void) • { • TMOD=0x09; /*定时器/计数器0为方式1*/ • IT0=1;TR0=1; • TH0=0;TL0=0; • P1_0=0;P1_0=1; /*触发器清零*/ • TR0=1;ET0=1;EA=1; /*启动T/C0开中断*/ • }
void int_0(void)interrupt 0 using 1 /* INT0 中断服务*/ { EA=0;TR0=0; count=TL0+TH0*256; /* 取计数值 */ rflag=1; /* 设标志 */ EA=1; } void main(void) { contro1( ); while(rflag==0); /* 等待一周期 */ period=count*2; /* fosc=6 MHz,2 μs计数增1,周期值单位μs */ }