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

for(i=0;i<5;i++){tp=0;ADC_RES=0;//高八位数据清零ADC_RESL=0;//低两位清零ADC_CONTR|=0x08;//启动AD转换wh... 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是什么意思啊
展开
 我来答
duyin2011
推荐于2016-10-10 · TA获得超过2398个赞
知道大有可为答主
回答量:1723
采纳率:100%
帮助的人:664万
展开全部
请贴出你全部程序,看看你的变量定义都是什么型
主要是你变量定义的问题,定义成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值
jguoli
2011-12-20 · TA获得超过1345个赞
知道小有建树答主
回答量:147
采纳率:0%
帮助的人:39.1万
展开全部
最好使用带AD的51系列,STC的单片机虽然带AD,但无基准源端,AD转换使用的是VCC作为基准源的,所以精度较差,或根本不能用。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
生活如歌_
2011-12-09 · TA获得超过1.5万个赞
知道大有可为答主
回答量:7398
采纳率:78%
帮助的人:2174万
展开全部
不太明白你的计算为什么那样来算,你看看我的计算方法:
adc_data=(ADC_RES&0x03)*256+ADC_RESL; //转换结果计算,取高位结果存储器的低2位+ 低位结果存储器
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式