1 / 31

第十一章 8051 数据采集的 C 编程

第十一章 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 位数字量输出端

tamah
Download Presentation

第十一章 8051 数据采集的 C 编程

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第十一章 8051数据采集的C编程

  2. 11.1 8位A/D芯片ADC0809 11.2 12位A/D芯片ADC574 11.3 V/F变换芯片AD650 11.4 频率量的测量

  3. 11.1 8位A/D芯片ADC0809 11.1.1 ADC0809的结构和引脚 一个8位逐次逼近式A/D转换器、8路模拟转换开关、3-8地址锁存译码器和三态输出数据锁存器。

  4. 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

  5. 3、ADC0809 工作时序

  6. 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

  7. #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通道的值*/ }

  8. 11.2 12位A/D芯片ADC574 11.2.1 ADC574的结构和引脚 AD574是一种快速的12位逐次比较式A/D转换芯片,片内有两片双极型电路组成的28脚双插直列式芯片,无需外接元器件就可独立完成A/D转换功能。内部设有三态数据输出锁存器。一次转换时间为25μs。芯片引脚如图所示。

  9. 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返回到低电平时,表示转换完毕。

  10. 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成为输出数据格式控制。

  11. 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控制信号状态表

  12. AD574启动转换时序图

  13. 读AD574转换数据时序图 读周期时序

  14. 11.2.2 ADC574与8051的接口

  15. # 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 ;

  16. 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进行一次转换,得转换结果 */ }

  17. 11.3 V/F变换芯片AD650 压频变换型(Voltage-Frequency Converter)是通过间接转换方式实现模数转换的。其原理是首先将输入的模拟信号转换成频率,然后用计数器将频率转换成数字量。 采用V/F变换的数据采集的特点: (1) 接口简单,容易实现信号的隔离。 (2)性价比较高。 (3)频率信号抗干扰能力强。 (4)容易实现远程传输。

  18. 11.3.1 AD650的结构和引脚

  19. 11.4 频率量的测量 定时 输入脉冲 < T 11.4.1 测量频率法 测量频率法的最简单的接口电路,可将频率脉冲直接连接到MCS-51的T1端,将8031的T/C0用作定时器,T/C1用作计数器。在T/C0定时时间里,对频率脉冲进行计数。T/C1的计数值便是单位定时时间里的脉冲个数。

  20. 带同步控制的频率测量。

  21. 测量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定时时间到标志。程序如下:

  22. #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时间到标志*/

  23. 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) ; / 返回计数值*/ }

  24. 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( ) ; /* 得每秒的计数率 */ }

  25. 11.4.2 频率脉冲的测量周期法

  26. 测量周期的程序举例。 设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开中断*/ • }

  27. 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 */ }

More Related