中易网

MSP430中16进制转10进制的函数,看不懂

答案:2  悬赏:0  
解决时间 2021-01-13 21:18
  • 提问者网友:谁的错
  • 2021-01-13 03:59
MSP430中16进制转10进制的函数,看不懂
最佳答案
  • 二级知识专家网友:话散在刀尖上
  • 2021-01-13 05:19
AD采样得到的N值和电压之间的关系我相信你清楚,V=N*Vref(参考电压)/2的12次方。这里你只是部分函数,但是MSP430的供电电压是3.3V,我想你的参考电压就应该是3.3V。所以V=N*3.3V*100/((2的12次方)*100)。这里为什么上下都乘了100,主要就是因为下面16进制转10进制方便处理。
caltmp = Hex_Val;
caltmp = (caltmp << 5) + Hex_Val; //caltmp = Hex_Val * 33
caltmp = (caltmp << 3) + (caltmp << 1); //caltmp = caltmp * 10
Curr_Volt = caltmp >> 12; //Curr_Volt = caltmp / 2^n
上面的这段函数主要就是完成N*3.3V*100/(2的12次方),我相信你知道往左移几位位就相当于乘以2的几次方。比方说第二句,左移5位,就相当于乘以2的5次方,也就是乘以32,加上本身,就是乘以33,下面类推。往右移几位就相当于除以(2的几次方)。这段没为题了吧。接下来
ptr[0] = Curr_Volt/100; //Hex->Dec变换
t1 = Curr_Volt-(ptr[0] * 100);
ptr[2] = t1 / 10;
ptr[3] = t1 - (ptr[2] * 10);
ptr[1] = 10;//shuzi表中第10位对应符号"."
这段函数主要就是将各个位区分开来,也就是你说的16进制转10 进制。16进制和10进制在计算机里面的存储形式是一样的,只是10进制没有ABCDEF,那么来说这几句函数的意思。(不明白没关系,我在最后举个例子)
第一句,除以100,上面不是多乘了100嘛,现在除掉,取百位,也就是你采样电压的整数部分。/在C里面是取整的意思,应该知道吧。ptr[0]里面就是电压的整数部分。
第二句,第三句,去掉百位,取10位的数据,也就是采样电压的小数点的后一位。 ptr[2]存储的这一位。
第四句ptr[3] 存储小数点的后两位。
最后ptr[1]存小数点。
例如你采样电压是2.72V,那么经过第一步后 Curr_Volt应等于272V,除以100,整数部分是2.,存到ptr[0]里,然后是小数点,对应ptr[1],然后272减去百位的数就等于72,72除10取整是7,对应ptr[2],小数点后一位,最后一位就是72-70=2。
为什么说16进制转换成10进制,就是除100、除10取整的,我想这个都知道,1000以内的数除以100会大于10么,答案当然是不会,那么取整就是百位,得到的就不会出现ABCDEF,就是10进制的,100以内的数除以10会大于10么,也不会,所以取整,取得就是10位的数,减剩下的就是个位。
追问:我豁然开朗,前后段程序我都明白了,谢谢。就是让CPU通过左移右移来完成N值的二进制放大与缩小,可问题又来了,我是初学者,还是不懂为什么非要乘100?
公式我能理解(为本函数的核心思想,若编程者早给出公式,我也不会看的这么辛苦了)。
ADC12MEM的值从0x0000变至0x0fff,对应0~3.3V,屏显两位小数。
公式中乘100是不是进行“放大”,屏显时再缩小100倍?必须要“放大”吗?能否改乘1000呢?是否也改变了屏显小数位数?
追答:乘以多少除以多少不是相当于没处理嘛,给他乘以100,是想让他显示的三位都变成整数以便处理,原来的精度应该小于0.01V(3.3/2的12次方=0.00024V),所以通过乘以一百来实现取小数点后两位。乘以100,也就是把百分位化成整数以便处理。如果乘以1000,就可以取到0.001,当然如果你只是去除前三位显示也可以,这就是赶巧的事,一般小数点都显示后面两位嘛,就乘以100咯,没什么必须的要求或者什么核心思想在里面。如果你还不明白,我就没辙了

可能我没说清楚,caltmp如果不乘以100的话,它的整数部分只有一位,你是没办法取出分位和百分位的。
全部回答
  • 1楼网友:三千妖杀
  • 2021-01-13 06:05
这个函数的功能不是将16进制转换成10进制,而是讲ADC的值转换成对应的电压值,并显示出来。从函数参数来看,uint Hex_Val即为转换的数值,你这是12位我猜应该是ADC_H*256+ADC_L,这里ADC_H,ADC_L是ADC寄存器的高位和低位(看你具体的单片机的命名了)。
caltmp = Hex_Val;
caltmp = (caltmp << 5) + Hex_Val; //caltmp = Hex_Val * 33
caltmp = (caltmp << 3) + (caltmp << 1); //caltmp = caltmp * 10
Curr_Volt = caltmp >> 12; //Curr_Volt = caltmp / 2^n
这四句的功能就是把转换数值转换成电压值,为了方便显示乘以了100.你ADC参考电压是3.3V吧。所以显示电压Curr_Volt=(Hex_Val*330)/2^12.
后面的程序就是分成百十个来显示了分别存于ptr[0]ptr[2]ptr[3],ptr[1]=10为了显示一个小数点吧
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息