621 发表于 2024-1-10 20:04:47

关于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,不应该呀

_奶咖君_ 发表于 2024-1-11 09:00:09

..94*2929=275326 > 65535

_奶咖君_ 发表于 2024-1-11 09:01:22

去到溢出的位 结果就是你的13182


这你还知道是u16的变量....

621 发表于 2024-1-11 11:01:15

_奶咖君_ 发表于 2024-1-11 09:01
去到溢出的位 结果就是你的13182




STM32我都学完了,但是这种直接加减乘除平时都没用过{:4_167:}

621 发表于 2024-1-11 11:16:20

_奶咖君_ 发表于 2024-1-11 09:01
去到溢出的位 结果就是你的13182




原来这是16位单片机,每次参与运算的数据最大不能超过65535{:4_167:}

在32位的编译系统中,int的范围如下
-2147483648~ 2147483647[-2的31次方- 2^31-1]

_奶咖君_ 发表于 2024-1-11 11:26:41

,,这个是8位机,也可以计算16位和32位数据。你自己定义的u16变量,你就要清除 你这个变量的范围是0-65535。
这不关这个单片机什么事情,,你把u16的变量改称u32的变量 也可以得到正确结果。

但是要注意的是 在数据类型的占用位数上 Keil MDK 与 Keil C51 是不同的。

rengran 发表于 2024-1-11 11:35:47

STC8H1K08的单片机ADC的转换结果是10位,左移6位,也就相当于*64,你把结果*2929,你说溢出了没?这个*2929的结果,ADC结果是10位且让V不溢出的话,至少需要保证V是22位;即使ADC结果是12位则需要V至少是24位。所以你的V是16位显然是不够的。

rengran 发表于 2024-1-11 11:46:52

621 发表于 2024-1-11 11:16
原来这是16位单片机,每次参与运算的数据最大不能超过65535

在32位的编译系统中,int的范围如下


1、你用C语言写,干嘛关心每次参与运算的数据大小呢?你定义好结果的变量和两个乘数的变量的大小,保证结果能够存到变量里而不溢出就得了。你又不是用汇编编写,需要考虑累加器的数据大小。你用8位的单片机照样能计算两个十六位的数,只要你的保存结果的变量大小足够大就行。几位的单片机是单片机每次计算的能力,关系到运行速度,不是你关心的结果溢出的问题。2、其次,你说的32位编译系统,int的范围,这是编译器规定的数据类型大小,不是和位数有关。
页: [1]
查看完整版本: 关于STC8H1K08的ADC读取数据运算的疑问