找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2662|回复: 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 (1.22 MB, 下载次数: 75)

IMG_20210331_040834.jpg
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
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 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

5#
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后边相乘,两个结果是不一样的
回复

使用道具 举报

6#
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的缘故?
回复

使用道具 举报

7#
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 单片机教程网

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