8051数据采集的C编程

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include <reg51.h> #define uchar unsigned char #define uint unsigned int #define A 10 //定时A*50ms=500ms sbit P1_0=p1^0; sbit P1_1=p1^1; uchar msn=A; bit idata tf=0; //定时标志。tf==1,定时结束 void timer0(void) interrupt 1 using 1 { TH0=(65536-50000)/256; TL0= =(65536-50000)%256; msn--; if (msn = =0) {msn=A; tf=1; } }
VN 模拟量输入比较器 VX 时钟 启动 时序与控制 逻辑电路
D/A转换器
N位寄存器 EOC
输 N位数 出 字量输出 缓 冲 器
OE
图8.1
逐次逼近A/D转换器原理图
转换过程: 模拟量VX送到比较器后,启动A/D转换,先设N位寄存器 的最高位(DN-1)为1,其余位为0,进行D/A转换,得到 的模拟量VN与输入VX比较, 若 VN ≤VX 若 VN >VX ,再设次高位(DN-2)为1,继续…… ,先清零DN-1 ,再设次高位(DN-2)为1,继续
#include<absacc.h> #include<reg51.h> #define uchar unsigned char #define uint unsigned int #define IN0 XBYTE[0x7ff8] sbit ad_busy=P3^3; void ad0809(uchar *x); void main() { uchar ad[8]; ad0809(ad); }
·
IN7
A B C
ALE
D0 · · D7
VR(+) VR(-)
OE
图8-13
ADC0809的结构框图
ADC0809是8位逐次逼近型A/D转换器。带8个模拟量 输入通道,芯片内带通道地址译码锁存器,输出带三态 数据锁存器,启动信号为脉冲启动方式,每一通道的转 换大约为100us。 ADC0809由两大部分组成,一部分为输入通道,包 括8位模拟开关,三条地址线的锁存器和译码器,可以 实现8路模拟输入通道的选择。另一部分为一个逐次逼 近型A/D转换器。 C、B、A输入的通道地址在ALE有效时被锁存。启 动信号START启动后开始转换,但是EOC信号是在 START的下降沿10us后才变无效的低电平,这要求查询 程序待EOC无效后再开始查询,转换结束后由OE产生 信号输出数据。
在测量频率法的最简单的接口电路中,可将频率 脉冲直接连接到8051的T1端,将8051的T0用做定时 器,T1用做计数器。在T0定时时间里,对频率脉冲进 行计数。T1的计数值便是单位定时时间里的脉冲个数。
第一个丢失的脉冲是由于开始检测时脉冲宽度已 小于机器周期T;第二个丢失的脉冲是由于脉冲的 负跳变在定时之外。定时时间内出现脉冲丢失, 将引起测量精度降低。脉冲频率越低,这种误差 越大。显然对于较低频率的脉冲测量不适合采用 测量频率法。
如此反复,经过N次比较后,最后一位D0得到确定,此时, N位寄存器的内容就是转换好的数字量,而EOC输出转换 结束信号,在输出允许OE(高电平)有效时,数字量经输 出缓冲器读出。
8.1.2 ADC0809芯片与单片机的接口
一、ADC0809的引脚及内部结构
0809引脚功能
IN7~IN0 VR
CLK OE EOC 八路模拟 量输入 IN3 IN4 IN5 IN6 IN7 START EOC D3 OE CLK VCC VR(+) GND D1
8.1.1 A/D转换原理--逐次逼近式A/D转换原理
一、逐次逼近A/D转换的基本原理
先假设一个数字量,并将其进行D/A转换,然后将得到 的模拟量与输入模拟量进行比较,若前者大于后者,说明 所设数字量偏大,将其减小后重复上述过程;若前者小于 后者,则说明所设数字量偏小,将其增大后重复上述过程。 如此反复调整所设数字量,使得其D/A转换后的值逐渐逼近 输入模拟量,此时所设数字量即为转换好的数字量。
void timer0(void) interrupt 0 using 1 //INT0中断服务 { EA=0; TR0=0; count =TL0+TH0*256; /*取计数器值*/ rflag=1; /*设标志位*/ EA=1; }
void main (void) { control(); while(rflag==0); //等待一个周期*/ period=count*2; //晶振频率为6M,2us计数增1,周期单位为us }
二、ADC0809与单片机的接口
①延时等待方式
P0
P0.0 P0.1 P0.2 ALE 8051 WR P2.7 RD ≥1
CP D Q Q
问题: 0809ALE有效,P0口送地址还是 数据? ADC0809的端口地址是什么?
D0~D7
A VR(+) B C VR(-) CLK 0809 START ALE OE +5V GND IN0 · · · · INT7
//读入转换好的数据,存入ad数组 //下一通道 //ad数组下一元素 //再次启动A/D转换
8.2 频率量的测量
频率量的用途
测量频率法
频率量的测量方法
测量周期法
测量频率法是在单位定时时间内,对被测信号脉 冲进行计数;测量周期法是在被测信号周期时间内, 对某一基准脉冲进行计数。
8.2.1 测量频率法 .
D触发器74LS74实现脉冲频率到周期的转换。其Q端 输出作8051的INT0端输入,控制启动T0开始定时,即 对机器周期的内部脉冲进行计数。
#include <reg51.h> #define uint unsigned int sbit P1_0=p1^0; bit rflag=0; /*周期标志*/ uint count, period; void control (void) { TMOD=0x09; /*定时器/计数器0为方式1*/ IT0=1; TH0=0;TL0=0; P1_0=0;P1_0=1; /*触发器清零*/ TR0=1; //启动定时器0 EX0=1;EA=1; /*开外部中断0*/ }
0809----8位A/D
IN2 IN1 IN0 A B C ALE D7 D6 D5 D4 D0 VR(-) D2
参考电源
时钟
输出允许
转换结束
0809
ALE
START D0~D7
地址锁存
启动转换 数字量 输出
图8-2 ADC0809引脚图
START
CLK
IN0 ·
8路 模拟量 开关 8位A/D 转换器 地址 锁存与 译码 三态 输出 锁存器 EOC
第八章 8051数据采集的C编程
单片机应用系统的数据采集体现了被检测对象与系 统的相互联系。数据采集的被检测信号如果是模拟量则 要靠A/D实现接收。 ----A/D转换即是将模拟量信号转换成数字量信号,常 用于数据采集系统,外界的模拟信号经A/D转换后, 读入单片机内部以便进行处理。 常见A/D转换电路有双积分式和逐次逼近式。 A/D转换的主要指标是—精度(位数)、转换时间。
//设置AD0809的通道0地址 //即EOC状态
//采样AD0809通道的值
void ad0809(uchar *x) //采样结果放指针中的A/D采集函数 { uchar i; uchar xdata *ad_adr; ad_adr=&IN0; for(i=0;i<8;i++) //处理8通道 { *ad_adr=0; //启动转换 delay_us(10); while(ad_busy==1); //查询等待EOC变高,转换结束 x[i]=*ad_adr; //存转换结果到ad数组中 ad_adr++; //指向下一通道 } }
//设置AD0809的通道0地址
问题:启动转换
main() { ad_adr=&IN0; IT1=1; EA=1; EX1=1; *ad_adr=0; while(1); //边沿触发
后,为什么不需要 延时10us等待EOC 无效?
//启动A/D转换
}
void int1() interrupt 2 { ad[i]=*ad_adr; ad_adr++; i++; if(i<8) *ad_adr=0; }
void counter1(void) interrupt 3 { } uint count (void) //带同步控制的频率测量法函数 { P1_0=0; P1_0=1; TMOD=0x59; //01011001b TH0= (65536-50000)/256;TL0= =(65536-50000)%256; TH1=0x00; TL1=0x00; TR0=1; TR1=1; PT0=1; ET0=1;ET1=1;EA=1; P1_0=0; P1_0=1; void main (void) While(tf!=1); { float rate; P1_0=0; P1_0=1; rate=(1000/(50*A))*count(); TR0=0;TR1=0; } return(TH1*256+TL1); }
≥1
#include<absacc.h> #include<reg51.h> #define uchar unsigned char #define ADC0809 XBYTE[0x7fff] //设置AD0809的片选译码地址 void ad0809() { ADC0809=0; //选中IN0,并启动A/D转换 delay_ms(1); //延时等待 AD_result=ADC0809; //读入转换好的数据 } main() 问题: { 函数ad0809 问题在哪? uchar AD_result; 如何改正。 ad0809(); }
为了解决第一个脉冲的丢失,可用门电路实现 计数开始与脉冲上升沿的同步控制。 例:带同步控制的频率测量
控制过程:
首先P1.0发一个清零负脉冲,使U1,U2两个D触发 器复位,其输出0封锁与门G1和G2。 接着由P1.1发一个启动正脉冲,其有效上升沿使U1的 输出Q=1,门G1被开放。 被测脉冲上升沿通过G2送T1计数;同时U2输出的高 电平使INT0=1,定时器0的门控GATE有效,启动T0 开始定时。 直到定时结束时,从P1.0发一负脉冲,清零U2,封锁 G2,停止T1计数,完成一次频率采样过程。
②查询与中断方式
P0.7 . . . P0.0
D7 . . . D0
VR(+) VR(-)
+5V GND
ALE
373 G
CP D Q Q
A B C
0809
8031
WR ≥1
CLK START
P2.7
RD P3.3 ≥1 1 INT 1
ALE
OE EOC
IN0 · · · · · · INT7
查询方式程序----8路模拟信号轮流采样一次,并将转换 结果分别存入内部RAM 以ad为起始地址的连续8个单元 中(即内部ram中的ad[8]数组中)。
P19
中断方式程序----问题同上,采取中断方式
#include<absacc.h> #include<reg51.h> #define uchar unsigned char #define uint unsigned int #define IN0 XBYTE[0x7ff8] uchar i, ad[8], uchar xdata *ad_adr;
8.2.1 测量周期法
测量周期法的基本原理是在被测信号周期T内, 对某一基准时间进行计数,基准时间与计数值的乘积 便是周期T。
为保证T0定时与频率脉冲的上升沿同步, 在用TR0启动T0之前,应先用P1.0将74LS74清 零,脉冲上升沿时INT0变为高电平,启动定时 器T0。 当INT0变为低电平时,INT0下降沿产生中 断请求。在INT0的中断服务程序中,关闭T0, 对计数结果进行处理。T0的定时计数值便是周 期时间的测量值。
ALE/PROG(30脚):当访问外部存贮器时,ALE
(允许地址锁存)的输出用于锁存地址的低位字节。即使
不访问外部存储器,ALE端仍以不变的频率周期性地出现 正脉冲信号,此频率为振荡器频率的1/6。因此,它可用 作对外输出的时钟,或用于定时目的。然而要注意的是, 每当访问外部数据存储器时,将跳过一个ALE脉冲。
相关文档
最新文档