AD转换N次采样去最大最小求平均算法
<p>#include "STC15.H"</p><p>#include "delay.h"</p><p>#include "STCAD.H"</p><p>#include "IO.C"</p><p>
</p><p>void AD_Init() //AD初始化</p><p>{</p><p> P1M1=0xF0; //设置相应的I/O口为高阻 P1.4-P1.5-P1.6-P1.7</p><p> P1M0=0x00;</p><p> ADC_RES=0;</p><p> ADC_RESL=0; //ADC转换结果寄存器清0</p><p> P1ASF=0xF0; //设置相应的I/O口为ADC模拟通道 P1.4-P1.5-P1.6-P1.7</p><p> ADC_CONTR |= ADC_POWER; //打开AD转换电源</p><p> ADC_CONTR |= ADC_SPEEDH; //设置AD转换速度</p><p> delay(1);</p><p>}</p><p>
</p><p>uint ADC_result(uchar x) //AD转换结果</p><p>{</p><p> uint result;</p><p> ADC_CONTR &= 0xF8; //清通道</p><p> ADC_CONTR |= x; //切换通道,x为通道,如x=5,就是P1.5</p><p> delay_us(30); //切换通道延时</p><p> ADC_CONTR |= ADC_START; //开启AD转换</p><p> delay_us(4); </p><p> while(!(ADC_CONTR & ADC_FLAG)); //等待AD转换结束</p><p> ADC_CONTR &= ~ADC_FLAG; //清除AD转换结束标志位</p><p> result = ADC_RES << 2; //ADC高8位结果左移2位</p><p> result = result | ADC_RESL; //合成10位转换结果</p><p> return result; //返回转换结果</p><p>}</p><p>
</p><p>uint U(uchar x) //测量电压40次去除最大最小求平均</p><p>{</p><p> uint U[40],min,max,S;</p><p> uchar i;</p><p> </p><p> for(i=0;i<40;i++)</p><p> {</p><p> U[i]=ADC_result(x); //获取x通道ADC结果</p><p> }</p><p> </p><p> for(i=1,min=U[0];i<40;i++)</p><p> {</p><p> if(U[i]小于min) min=U[i];</p><p> }//求最小值</p><p> </p><p> for(i=1,max=U[0];i<40;i++)</p><p> {</p><p> if(U[i]>max) max=U[i];</p><p> }//求最大值</p><p> </p><p> for(i=0,S=0;i<40;i++) S+=U[i];</p><p> S=S-min-max;</p><p> S /= 38 ; //减去最大最小求平均</p><p> return S; //返回计算结果</p><p>}</p>
|