adc0809的多通道c程序设计?

2024年12月05日 02:34
有1个网友回答
网友(1):

可以参考这个题目:
对0809进行数据采集编程。要求对8路模拟量连续采集24h,每隔10min采集一次,数据存储在外部数据存储区中。
程序如下:
#include
#include
#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]}

}
}
}