/**********定时器0中断服务程序***************/
void
timer0(void) interrupt 1
{
uint j;
TI=1;
TH0=(65536-9174)/256;//定时10ms
TL0=(65536-9174)%256;
SBUF='a';while(!TI);TI=0;
LED=1;
Delay280us();//延时0.28ms
abc=Read_AD_Data(0xe4); //开启ADC采集
FlagStar=1;
for(j=0;j<5;j++);
TR0=0;
EA=0;
LED=0; //关闭传感器LED
}
/**************************************************************
中值滤波 算法:先进行排序,然后将数组的中间值作为当前值返回。
**************************************************************/
uchar Error_Correct(uchar *str,uchar num)
{
uchar i=0;
uchar j=0;
uchar Temp=0;
//排序
for(i=0;i<num-1;i++)
{
for(j=i+1;j<num;j++)
{
if(str[i]<str[j])
{
Temp=str[i];
str[i]=str[j];
str[j]=Temp;
}
}
}
//去除误差,取中间值
return str[num/2];
}
void pm() //加入主循环
{
uint Temp;
if(FlagStar==1)
{
num++;
ADC_Get[num]=abc;
SBUF=ADC_Get[num];while(!TI);TI=0;
if(num>9)
{
num=0;
DUST=Error_Correct(ADC_Get,10);//求取10次AD采样的值
DUST_Value=(DUST/256.0)*5000; //转化成电压值mv
DUST_Value=DUST_Value*0.17-0.1; //固体悬浮颗粒浓度计算 Y=0.17*X-0.1 X--采样电压
// if(DUST_Value<0) DUST_Value=0;
// if(DUST_Value>19600) DUST_Value=760; //限位
DUST=(uint)DUST_Value;
Temp=Data%10000;
TxBuf[0]=Temp/1000+0x30;//千位
SBUF=TxBuf[0];while(!TI);TI=0;
Temp%=1000;
TxBuf[1]='.';SBUF=TxBuf[1];while(!TI);TI=0;
TxBuf[2]=Temp/100+0x30;//百位
SBUF=TxBuf[2];while(!TI);TI=0;
Temp%=100;
TxBuf[3]=Temp/10+0x30;//十位
SBUF=TxBuf[3];while(!TI);TI=0;
TxBuf[4]=Temp%10+0x30;//龌
SBUF=TxBuf[4];while(!TI);TI=0;
}
TH0=(65536-9174)/256;//定时10ms
TL0=(65536-9174)%256;
TR0=1; //开启定时器0
EA=1;
FlagStar=0;
}
}
一周热门 更多>