找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2026|回复: 6
收起左侧

MCU将8位AD采集到的值转换成实际值遇到的坑求解

[复制链接]
ID:886945 发表于 2021-3-31 04:19 来自手机 | 显示全部楼层 |阅读模式
MCU AD采集到的值dat从二进制转换成10进制实际电压值输出中遇到了一些问题
采集到电压值dat区间在0-255之间,实际参考位5V,讲采集到的值做运算,输出实际电压值
1.unsigned char型的变量转换成int型,为什么需要乘一个1.0.
2.为什么我将*1.0的位置放在变量dat后边相乘和放在前边相乘得到的值是不一样的,放在前边相乘呢值才是正确的,放后边就一堆乱码.
IMG_20210331_040834.jpg
回复

使用道具 举报

ID:886945 发表于 2021-3-31 04:26 来自手机 | 显示全部楼层
我看别人的程序,这个1.0放在变量后边都没问题,编译器问题?看视屏里用的keil4,我用的keil5
回复

使用道具 举报

ID:814525 发表于 2021-3-31 09:11 | 显示全部楼层
dat为0-255,那么500*dat最大值为127500。这里存在C语言运算类型转换原则,,500*1.0就转换为float运算,其类型是32位,500*1.0*dat其值不会溢出;而500*dat*1.0,就先以int类型运算再以浮点运算,而int运算时,有可能已经溢出了,结果就出错。所以运算的类型及前后顺序很重要,这就是稍不注意就出错的原因

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:712560 发表于 2021-3-31 13:21 | 显示全部楼层
如果dat值为255,则temp11为500,远远大于255,8位无法表示,所以乱码

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:886945 发表于 2021-4-1 00:49 | 显示全部楼层
liujunping11 发表于 2021-3-31 13:21
如果dat值为255,则temp11为500,远远大于255,8位无法表示,所以乱码

temp是int型,而且你这里理解是错了,不管怎么算 temp都是要大于255的,我现在有问题的是这个运算顺序,1.0放在变量dat前边还是放在dat后边相乘,两个结果是不一样的
回复

使用道具 举报

ID:886945 发表于 2021-4-1 00:51 | 显示全部楼层
张天师 发表于 2021-3-31 09:11
dat为0-255,那么500*dat最大值为127500。这里存在C语言运算类型转换原则,,500*1.0就转换为float运算,其 ...

为什么uchar型的dat和500先运算,是以int型输出而不是以char型吗,是因为前边变量temp的缘故?
回复

使用道具 举报

ID:250416 发表于 2021-4-1 08:23 | 显示全部楼层
sdarling 发表于 2021-4-1 00:51
为什么uchar型的dat和500先运算,是以int型输出而不是以char型吗,是因为前边变量temp的缘故?

uchar型dat和500运算是int型,因为500是int型常量
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表