adc0809的多通道c程序设计?
发布网友
发布时间:2022-04-19 11:18
我来回答
共1个回答
热心网友
时间:2023-06-26 11:22
可以参考这个题目:
对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=0;i<8;i++)
/*处理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=0;j<144;j++){
/
*采样24h*/
if
(
overflow_count
==
6000){
/*10分钟到,采样ADC0809通道的值*/
uchar
i,(*p)[8];
uchar
idata
*
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++;}
for(i=0;i<8;i++)
{
*(*(p+j)+i)=x[i]}
}
}
}