关于STC8H1K08的ADC读取数据运算的疑问
本帖最后由 621 于 2024-1-10 20:09 编辑第二个图是我用ADC读取到的值乘2929,第三个图第一行是adc_read(ADC_P11)的值,第二行是V,也就是adc_read(ADC_P11)*2929出来的值,明显不正确,试了很多其他数,发现结果数值超过5位数就错,但是我V,和adc_read(ADC_P11)都是u16,不应该呀
..94*2929=275326 > 65535
去到溢出的位 结果就是你的13182
这你还知道是u16的变量.... _奶咖君_ 发表于 2024-1-11 09:01
去到溢出的位 结果就是你的13182
STM32我都学完了,但是这种直接加减乘除平时都没用过{:4_167:} _奶咖君_ 发表于 2024-1-11 09:01
去到溢出的位 结果就是你的13182
原来这是16位单片机,每次参与运算的数据最大不能超过65535{:4_167:}
在32位的编译系统中,int的范围如下
-2147483648~ 2147483647[-2的31次方- 2^31-1] ,,这个是8位机,也可以计算16位和32位数据。你自己定义的u16变量,你就要清除 你这个变量的范围是0-65535。
这不关这个单片机什么事情,,你把u16的变量改称u32的变量 也可以得到正确结果。
但是要注意的是 在数据类型的占用位数上 Keil MDK 与 Keil C51 是不同的。
STC8H1K08的单片机ADC的转换结果是10位,左移6位,也就相当于*64,你把结果*2929,你说溢出了没?这个*2929的结果,ADC结果是10位且让V不溢出的话,至少需要保证V是22位;即使ADC结果是12位则需要V至少是24位。所以你的V是16位显然是不够的。 621 发表于 2024-1-11 11:16
原来这是16位单片机,每次参与运算的数据最大不能超过65535
在32位的编译系统中,int的范围如下
1、你用C语言写,干嘛关心每次参与运算的数据大小呢?你定义好结果的变量和两个乘数的变量的大小,保证结果能够存到变量里而不溢出就得了。你又不是用汇编编写,需要考虑累加器的数据大小。你用8位的单片机照样能计算两个十六位的数,只要你的保存结果的变量大小足够大就行。几位的单片机是单片机每次计算的能力,关系到运行速度,不是你关心的结果溢出的问题。2、其次,你说的32位编译系统,int的范围,这是编译器规定的数据类型大小,不是和位数有关。
页:
[1]