本帖最后由 hmg6681 于 2012-6-16 15:37 编辑
程序:
uint vAD_get()
{
uint ADval;
uint ADvalf;
asm("clrwdt");
C1ON=0;
TRISA2=1; //定义RA0、RA2为输入
ANS2=1; //定义RA0、RA2为模拟输入口
ADRESL=0;
ADRESH=0;
ADCON1=0x40; //选择AD采样频率Fosc/4
ADCON0=0x89; //右对齐、参考电压=VDD、模拟通道AN2、使能AD采样
delay(20,12); //延时210us
GO=1; //启动AD
while(GO); //等待ADGO位0,表示转换已经完成
/////////ADRESH=ADRESH;
//////////ADRESL=ADRESL;
ADval=ADRESH; //读出高两位
ADval=(ADval<<8)|ADRESL; //把高两位和低八位合成一个数据
ADvalf=(ADval/1023)*5*11; //转化为实际值
ADval=ADvalf*1000; //取三位小数,电压单位由V变为mV
return(ADval);
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
what do you think?
首先这里应该使用1024而不是1023。
其次,这里必然出现问题,因为两个整型数据做除法运算,结果依然是整型——你想想,这个除法会得到什么样的结果?
ADval*55/1024
=ADval*(64-8-1)/1024
所以可以使用如下的方法来避免16位的乘除法运算:
- ADvalf = 0;
- ADvalf += ADval<<6;
- ADvalf -= ADval<<3;
- ADvalf -= ADval;
- ADvalf += 512;
- ADvalf >>= 10;
复制代码一周热门 更多>