对0809进行数据采集编程。要求对8路模拟量连续采集24h,每隔10min采集一次,数据存储在外部数据存储区中。
程序如下:
#include<absacc.h>
#include<reg51.h>
#define
uchar
unsigned
char
#define
uint
unsigned
int
#define
IN0
XBYTE[0x7ff8]
/*设置ADC0809的通道0地址*/
sbit
ad_busy=P3^3
/*即EOC状态*/
uint
overflow_count
=
0
/*T1中断次数初值*/
void
ad0809(uchar
xdata
*
x)
/*采样函数,结果x[]放外部数据存储器*/
{
uchar
i
uchar
idata
*
ad_adr
ad_adr=&IN0
for(i=0i<8i++)
/*处理8通道*/
{
*ad_adr=0
/*启动转换*/
i=i
/*延时等待EOC变低*/
i=i
while(ad_busy==0)
/*查询等待转换结束*/
x[i]=*ad_adr
/*存转换结果*/
*(*(p+j)+i)=x[i]
ad_adr++
/*下一通道*/
}
}
/*
定时器1中断服务程序每100ms执行一次,fosc=6MHz*/
void
timer1_ISR(void)
interrupt
3
{
TH1
=
(65536
–
50000)/256
//定时器1赋初值
TL1
=
(65536
–
50000)%256
//
100ms/1us=50000次计数
overflow_count++
}
void
main(void)
{
static
char
xdata
ad[10]
char
(*p)[8]
TMOD
=
0X10
//设置定时器1工作方式1,
TH1
=
(65536
–
50000)/256
//定时器1赋初值
TL1
=
(65536
–
50000)%256
EA
=
1
//开定时器1中断
ET1
=
1
TR1
=
1
//启动定时器1
uchar
j
for(j=0j<144j++){
/
*采样24h*/
if
(
overflow_count
==
6000){
/*10分钟到,采样ADC0809通道的值*/
uchar
i,(*p)[8]
uchar
idata
*
ad_adr
ad_adr=&IN0
for(i=0i<8i++)
/*处理8通道*/
{
*ad_adr=0
/*启动转换*/
i=i
/*延时等待EOC变低*/
i=i
while(ad_busy==0)
/*查询等待转换结束*/
x[i]=*ad_adr
/*存转换结果*/
ad_adr++}
for(i=0i<8i++)
{
*(*(p+j)+i)=x[i]}
}
}
}
首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。此地址经译码选通8路模拟输入之一到比较器。START上升沿将逐次逼近寄存器复位。下降沿启动 A/D转换,之后EOC输出信号变低,指示转换正在进行。直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。当OE输入高电平 时,输出三态门打开,转换结果的数字量输出到数据总线上。
转换数据的传送 A/D转换后得到的数据应及时传送给单片机进行处理。数据传送的关键问题是如何确认A/D转换的完成,因为只有确认完成后,才能进行传送。为此可采用下述三种方式。
(1)定时传送方式
对于一种A/D转换器来说,转换时间作为一项技术指标是已知的和固定的。例如ADC0809转换时间为128μs,相当于6MHz的MCS-51单片机共64个机器周期。可据此设计一个延时子程序,A/D转换启动后即调用此子程序,延迟时间一到,转换肯定已经完成了,接着就可进行数据传送。
(2)查询方式
A/D转换芯片有表明转换完成的状态信号,例如ADC0809的EOC端。因此可以用查询方式,测试EOC的状态,即可确认转换是否完成,并接着进行数据传送。
(3)中断方式
把表明转换完成的状态信号(EOC)作为中断请求信号,以中断方式进行数据传送。
不管使用上述哪种方式,只要一旦确定转换完成,即可通过指令进行数据传送。首先送出口地址并以信号有效时,OE信号即有效,把转换数据送上数据总线,供单片机接受。
常见用途
ADC0809与MCS-51单片机的连接主要涉及两个问题。一是8路模拟信号通道的选择,二是A/D转换完成后转换数据的传送。转换数据的传送有定时传送方式、查询方式、中断方式这三种方式。A、B、C的值与被选择的通道之间的关系
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)