采用了中断定时扫描,但问题还是没有得到解决,偶尔还是有闪烁,比之前稍微好一点。以下是我采用中断定时扫描程序。还请各位高手帮忙看下,到底是不是软件问题。
/T0中断处理程序
void T0ISR(void) interrupt 1
{
TH0=0xf6;
TL0=0x3c;
bai=1;
shi=1;
ge=1; //关闭数码管
i_i++;
j_j++;
if(j_j>3)j_j=1;
switch(j_j)
{
case 1:
p0=0x00; //消隐
_nop_();
le=1;//573的LE锁存使能置高
bai=0;
shi=1;
ge=1;
p0=codetab[a_data1]; //点亮百位
le=0;
break;
case 2:
p0=0x00;
_nop_();
le=1;
bai=1;
shi=0;
ge=1;
p0=codetab[a_data2];//点亮十位
p0_7=1;//小数点
le=0;
break;
case 3:
p0=0x00;
_nop_();
le=1;
bai=1;
shi=1;
ge=0;
p0=codetab[a_data3];//点亮个位
le=0;
break;
default:
return;
}
}
while(1)
{
if(i_i==4) //4*5ms=20ms
{
i_i=0;//清数次
adcst_0809();
if(adc_count==4) //4*20ms=80ms
{
adc_count=0;
DataProcess();
}
}
}
}
//adc启动程序
void adcst_0809()
{
p3_0=0;
p3_1=0;
p3_2=0; //选择第一通道
oe=0;
_nop_();
st=0;
_nop_();
st=1;
_nop_();
st=0;
_nop_();
while(!eoc);
oe=1;
_nop_();
getdata[adc_count]=p1;
adc_count++;
oe=0;
}
//数据处理
void DataProcess()
{
uchar count;
uint sum=0;
//TR0=0;//数据处理时,关闭定时器
for (count=0;count<N;count++)
{
sum = sum + getdata[count];
_nop_();
_nop_();
}
if(sum>1)
{
sum1=(char)(sum/N);
}
else
sum1=0;
temp=sum1*151;
temp=temp/128;
a_data1=temp/100;
a_data2=temp%100/10; //数据处理
a_data3=temp%10;
//TR0=1;//数据处理完毕,重新开启定时器
}
数码管定时2MS刷新,4个2MS就是20MS,每20MS启动一次采样,共采样4个20MS,也就是80MS进行数据处理一次(采样值滤波,计算等), |