STC12C5A60S2单片机,ad转换一直进行200ms,每次转换的结果都相加,200ms后求这么多次采样的平均值,平均值与某个值进行比较,然后再一次转换200ms,再求平均,再比较......这样一直循环下去。
我用定时器定时50ms,4次中断后就是200ms,但是定时器开始工作后,ad转换能同时进行吗?还是定时器先工作,直到定时完50ms后才进行ad转换呢?
新手求助,拜托各位大佬了!
void main()
{
while(1)
{
n=0;
sum=0;
TMOD=0x01;
TH0=0x4C; //11.0592MHZ晶振,定时50ms
TL0=0;
EA=1;
ET0=1;
TR0=1; //定时器开始工作
while(n<=4) //没到200ms就一直ad转换
{
InitADC(); //ad初始化
ADC_CONTR=ADC_POWER|ADC_SPEEDLL|P1ASF|ADC_START;
_nop_();
_nop_();
_nop_();
_nop_();
while(!(ADC_CONTR&ADC_FLAG));
ADC_CONTR&=~ADC_FLAG; //一次ad转换结束
x=ADC_RES*256+ADC_RESL;
sum+=x;
}
//n=0;
y=sum/2457; //求平均
if(y>=31) //比较
{
D1=0;
Bee=0;
}
}
}
void InitADC()
{
P1ASF=0X04;
ADC_RES=0;
AUXR1=0x04;
ADC_CONTR=ADC_POWER|ADC_SPEEDLL;
Delay(2);
}
void Delay(unsigned int n)
{
unsigned int x;
while(n--)
{
x=5000;
while(x--);
}
}
void exter() interrupt 1
{
TH0=0x4C;
TL0=0;
n++;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
unsigned char adc_times;
void main()
{
n=0;
sum=0; adc_times = 0;
TMOD=0x01;
TH0=0x4C; //11.0592MHZ晶振,定时50ms
TL0=0; InitADC(); //ad初始化
EA=1;
ET0=1;
TR0=1; //定时器开始工作
while(1)
{
while(n<=4) //没到200ms就一直ad转换
{
ADC_CONTR=ADC_POWER|ADC_SPEEDLL|P1ASF|ADC_START;
_nop_();
_nop_();
_nop_();
_nop_();
while(!(ADC_CONTR&ADC_FLAG));
ADC_CONTR&=~ADC_FLAG; //一次ad转换结束
x=ADC_RES*256+ADC_RESL;
sum+=x;
adc_times ++;
}
n=0;
y=sum/adc_times; //求平均
if(y>=31) //比较
{
D1=0;
Bee=0;
}
sum = 0;
adc_times = 0;
}
}
一周热门 更多>