请教AVR单片机片内10位ADC转换结果读取问题。

在网上看到AVR单片机片内10位ADC在设置时设置为右对齐,其转换结果可以读取的语句为resualt=int(ADCH)*256+ADCL;这句话怎么理解?还有就是设置为... 在网上看到AVR单片机片内10位ADC在设置时设置为右对齐,其转换结果可以
读取的语句为
resualt=int(ADCH)*256+ADCL;
这句话怎么理解?
还有就是设置为左对齐时,该怎样读取ADC的值?
展开
 我来答
ATF144X
2010-11-20 · TA获得超过1.2万个赞
知道大有可为答主
回答量:5344
采纳率:77%
帮助的人:4674万
展开全部
右对齐的时候,10位ADC的结果表示方式为ADCH:ADCL,ADCH是10bit结果的高2位,ADCL是10bit结果的低8位,如果要将ADC的结果存储到一个int型的变量中,那就需要先将ADCH的结果左移8位,再和ADCL的相加,左移8位等价于乘以256.

比如一次ADC转换的结果为0x0347,即ADCH=0x03,ADCL=0x47,现在要讲这个结果存储在result中,那就是result=ADCH*256+ADCL=0x03*256+0x47=0x300+0x47=0x0347,就这样的。

当结果为左对齐的时候,ADCH存储的是10bit结果的高8位,ADCL的最高两位存储的是10bit结果的最低两位,如果以上面的例子说,右对齐的数值是0x0347,变成左对齐的时候就是0xD1C0,这时ADCH=0xD1,ADCL=0xC0。

如果对转换结果的要求不高,只读取8位数据时,就是用左对齐方式读取ADCH的数值,因为0x0347÷4=0x00D1。

综合的结果就是:要计算10bit转换结果,就用右对齐方式最简单;要获得8bit转换结果,就用左对齐方式最简单。

当然,要想把左对齐的结果转换为整形数,就这么计算了:
result=(int)ADCH<<2+ADCL>>6,或者:
result=(int)ADCH*4+ADCL/64
63977197
2010-11-20 · TA获得超过865个赞
知道小有建树答主
回答量:75
采纳率:0%
帮助的人:172万
展开全部
这句话很简单,就是ADCH(高位寄存器)乘以256+低位。
那么为什么高位要乘以256,为什么不乘以128呢,那是因为ADCL是8位的,能表示256个数这就相当于256进制的两位数用位权表示的方法是ADCH*256^1+ADCL;
右对齐一般很少遇到这个,一般在计算机里面会遇到大端,小端,就是字节的存储顺序,大端的是高位字节放在低位地址,小段是高位字节放在高位地址。
因为AVR是8位,所以谈不上大端和小端(就一个字节)。但是10位二进制怎么表示呢,就把低8位放ADCL里面,L表示低位,高二位就放ADCH,H表示高。它说右对齐应该是帮你理解的,我们书写二进制的时候会从左向右写,左是高位,右是低位,它说的右对齐是ADCH中的8位中只用到了两位,把这两位放最右边,就是低位。所以resualt=int(ADCH)*256+ADCL;这个就很容易理解了,以为AVR是8位机,所以这种技巧要用到很多地方,比如说定时器里面就用到像下面的句子
RCAP2H = (65536-60000)/256;//@12M 10ms 16bit 自动重载
RCAP2L = (65536-60000)%256;
这两句是52里面的,表示计6000次时;
一般左对齐是没有的,如果有那是很难让人理解的,你可以想象一下,把那两位放左面,那多麻烦。如果你对这方面有兴趣,可以去看下大端模式和小端模式。
如果还有问题可以HI我
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式