找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3723|回复: 16
打印 上一主题 下一主题
收起左侧

STC89C52单片机的除法运算问题

  [复制链接]
跳转到指定楼层
楼主
想请教各位大佬关于STC89C52除法的问题。
大概就是发现程序在没有准确算出这个式子的结果,调试出来的结果也很奇怪。
个人猜测是和STC89C52只有8位有关,但是由于自己单片机原理方面不太懂,所以想请教一下大家。

2.png (3.19 KB, 下载次数: 41)

调试结果

调试结果

1.png (4.31 KB, 下载次数: 45)

算式

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

使用道具 举报

沙发
ID:390416 发表于 2021-3-12 16:35 | 只看该作者
这个叫 取模,也就是 除法运算 保留了商 丢弃了余数   ,取余用%
回复

使用道具 举报

板凳
ID:367369 发表于 2021-3-12 16:55 | 只看该作者
不应该吧,是不是其他地方把改变值了?
计算的时候应该是有高位寄存器和低位寄存器啊,
像定时器初始化时就写到过(65535 - 1000) /  256

评分

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

查看全部评分

回复

使用道具 举报

地板
ID:550952 发表于 2021-3-12 17:03 | 只看该作者
game灬boy 发表于 2021-3-12 16:55
不应该吧,是不是其他地方把改变值了?
计算的时候应该是有高位寄存器和低位寄存器啊,
像定时器初始化时 ...

这是我特意新建的一个工程,整个代码就下面几句
#include <reg52.h>
void main(void)
{
        unsigned int temp;
       
        temp = 200*255/500;
}
回复

使用道具 举报

5#
ID:451718 发表于 2021-3-12 17:13 | 只看该作者
确实碰到过这类问题,我的解决方案是:
unsigned int a , temp;
a = 200*255;
temp = a / 500;
这样就不会有错,估计是编译器的问题。

评分

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

查看全部评分

回复

使用道具 举报

6#
ID:213173 发表于 2021-3-12 21:41 | 只看该作者
本帖最后由 wulin 于 2021-3-12 21:48 编辑

强制转换数据类型,200和255默认为unsigned char型,500默认为unsigned int型。类型统一就不会错了。
tepm=(unsigned int)(200*255)/500;也可以分两步计算也不会错。
tepm=200*255;
tepm=tepm/500;

评分

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

查看全部评分

回复

使用道具 举报

7#
ID:605142 发表于 2021-3-12 22:02 | 只看该作者
编译器默认是按有符号16位运行,200*255溢出了
a=200u*255/500应该可行

评分

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

查看全部评分

回复

使用道具 举报

8#
ID:605142 发表于 2021-3-12 22:07 | 只看该作者


评分

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

查看全部评分

回复

使用道具 举报

9#
ID:879348 发表于 2021-3-13 08:18 | 只看该作者
也可能是temp没有用,被优化了,整个除法没有执行

评分

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

查看全部评分

回复

使用道具 举报

10#
ID:783421 发表于 2021-3-13 14:30 来自手机 | 只看该作者
数字有没有溢出?
回复

使用道具 举报

11#
ID:487569 发表于 2021-3-14 17:47 | 只看该作者
void main(void) {         unsigned int temp,a;                  temp = 200*255/500;a=temp; }.试试这个,然后你再看运算结果。我怀疑你并没有执行运算,你定义temp的时候没有赋初值,Value=0XFFE可能是temp运算之前的随机值,按我给出的例子,当你指针指到a=temp;的时候再看temp的值

评分

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

查看全部评分

回复

使用道具 举报

12#
ID:287575 发表于 2021-3-14 23:50 | 只看该作者
        unsigned int temp;
        temp=100*155/500;

51hei浏览器截图20210314234538.png (4.27 KB, 下载次数: 33)

51hei浏览器截图20210314234538.png
回复

使用道具 举报

13#
ID:287575 发表于 2021-3-14 23:51 | 只看该作者
我测试正确的,结果是0x001F
回复

使用道具 举报

14#
ID:550952 发表于 2021-3-15 12:09 | 只看该作者
感谢各位大佬的耐心解答,我参考了这篇帖子
https://blog.csdn.net/avideointerfaces/article/details/27512485
应该是溢出了
回复

使用道具 举报

15#
ID:232366 发表于 2021-3-15 21:53 来自手机 | 只看该作者
hefq 发表于 2021-3-12 22:07

大佬你的keil配色可以分享一下吗?
回复

使用道具 举报

16#
ID:304608 发表于 2021-3-18 11:28 | 只看该作者
王快活。 发表于 2021-3-15 12:09
感谢各位大佬的耐心解答,我参考了这篇帖子
https://blog.csdn.net/avideointerfaces/article/details/275 ...

我觉得楼上说的对,可能是被优化了
回复

使用道具 举报

17#
ID:304608 发表于 2021-3-18 11:30 | 只看该作者
王快活。 发表于 2021-3-15 12:09
感谢各位大佬的耐心解答,我参考了这篇帖子
https://blog.csdn.net/avideointerfaces/article/details/275 ...

你修改代码再试一下, volatile unsigned int temp;  增加一个关键字试试
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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