stc12c5a60s2这款单片机的ad功能,测5v电压的话理论上十位ad可以达到1/1024精度,问一下如何编程实现呢?

for(i=0;i<5;i++)
{
tp=0;
ADC_RES=0; //高八位数据清零
ADC_RESL=0; //低两位清零
ADC_CONTR|=0x08; //启动AD转换
while(!tp) //判断AD转换是否完成
{
tp=0x10;
tp&=ADC_CONTR;
}
ADC_CONTR&=0xe1; //置ADC_FLAG和ADC_START 为零 p1.1 是输入端
ad_average_result=ADC_RES;
q=q+ad_average_result;
}
ad_average_result=q/5;
Vin=ad_average_result;

ad1=Vin*1.9804;

temp1=(int)ad1;
ge1=(temp1%1000)/100; //个位
n1=((temp1%1000)%100)/10; //小数点后一位
m1=(((temp1%1000)%100)%10) ; //小数点后二位
现在可以实现采样精度才到小数点后一位,第二位始终是零。八位ad的话精度应该是1/256应该可以精确到小数点后两位啊?哪位高人明白为什么啊?
变量我好像都是定义的整型的,如果定义成float,最后转换成十进制的时候怎么转换啊,是不是那个ad1=Vin*1.9804; 乘的系数也要改变啊。ad1=Vin*1.9804;
vin应该是二进制数吧,二进制跟十进制相乘结果是什么啊,temp1=(int)ad1;这个是不是强制把ad1变成十进制整型数啊?
adc_data=(ADC_RES&0x03)*256+ADC_RESL中的&0x03是什么意思啊

请贴出你全部程序,看看你的变量定义都是什么型
主要是你变量定义的问题,定义成float就有小数了,int型就不行了,自动省略了小数,那就误差大了
你先用float计算,然后最后结果取int型进行四舍五入会好些,不然误差太大,
adc_data=(ADC_RES&0x03)*256+ADC_RESL
0x03就是00000011将ADC_RES&0x03就是将ADC_RES与0x03 ,这样就是取ADC_RES低二位,作为10位ad的高两位,乘256转成10进制,然后加上低八位ADC_RESL,就是实际采集数据转化的10ad值
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-12-20
最好使用带AD的51系列,STC的单片机虽然带AD,但无基准源端,AD转换使用的是VCC作为基准源的,所以精度较差,或根本不能用。
第2个回答  2011-12-09
不太明白你的计算为什么那样来算,你看看我的计算方法:
adc_data=(ADC_RES&0x03)*256+ADC_RESL; //转换结果计算,取高位结果存储器的低2位+ 低位结果存储器
相似回答