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