|
10黑币
/**********************************************************************
*函 数 名: read_adc()
*函数功能: 读8位ADC结果
*其 它:
**********************************************************************/
unsigned char read_adc(){ //AD转换函数,返回8位结果
unsigned char ad_flg = 0; //存储AD转换标志
WDT_CONTR = 0X3C; //喂狗
ADC_CONTR = adc_chan; //开ADC电源并置转换通道
Delay1ms(1);
ADC_CONTR = ADC_CONTR | 0x08; //开启ADC转换
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
while(ad_flg == 0){ //等待AD转换结束
WDT_CONTR = 0X3C; //喂狗
ad_flg = (ADC_CONTR & 0X10);
}
ADC_CONTR &= 0xe7; //停ADC转换,清ADC_FLAG
return (ADC_RES);
}
/**********************************************************************
*函 数 名: vol_conver()
*函数功能: 检测电压AD值并转为电压显示数字
*其 它:
**********************************************************************/
void vol_conver(){ //将测得的电压四次平均按分压比换算成十进制的电压数
unsigned char i, j, temp;
unsigned char buf[AD_TIMES];
WDT_CONTR = 0X3C; //喂狗
adc_chan = ADC_V; //电压通道
for(i=0;i<AD_TIMES;i++){ //采样AD_TIMES次
buf[i]=read_adc();
}
for(i=0;i<AD_TIMES-1; i++){
for(j=i+1;j<AD_TIMES;j++){
if(buf[i]>buf[j]){ //升序排列
temp=buf[i];
buf[i]=buf[j];
buf[j]=temp;
}
}
}
value_v=0;
for(i=2;i<AD_TIMES-2;i++)value_v+=buf[i];
value_v >>= 3;
value_v *= 13; //data*3.3/256*1000 单位mV
value_v <<=4; //乘16倍电阻分压比
dis_done = 0;
v_10=value_v/10000; //10V
v_1=(value_v-v_10*10000)/1000; //1V
v_01=(value_v-v_10*10000-v_1*1000)/100; //0.1V
dis_done = 1;
}
|
|