找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3531|回复: 16
收起左侧

STC89C52单片机的除法运算问题

  [复制链接]
ID:550952 发表于 2021-3-12 15:19 | 显示全部楼层 |阅读模式
想请教各位大佬关于STC89C52除法的问题。
大概就是发现程序在没有准确算出这个式子的结果,调试出来的结果也很奇怪。
个人猜测是和STC89C52只有8位有关,但是由于自己单片机原理方面不太懂,所以想请教一下大家。

调试结果

调试结果

算式

算式
回复

使用道具 举报

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;
}
回复

使用道具 举报

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

评分

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

查看全部评分

回复

使用道具 举报

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

查看全部评分

回复

使用道具 举报

ID:605142 发表于 2021-3-12 22:02 | 显示全部楼层
编译器默认是按有符号16位运行,200*255溢出了
a=200u*255/500应该可行

评分

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

查看全部评分

回复

使用道具 举报

ID:605142 发表于 2021-3-12 22:07 | 显示全部楼层
51hei图片20210312220625.png

评分

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

查看全部评分

回复

使用道具 举报

ID:879348 发表于 2021-3-13 08:18 | 显示全部楼层
也可能是temp没有用,被优化了,整个除法没有执行

评分

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

查看全部评分

回复

使用道具 举报

ID:783421 发表于 2021-3-13 14:30 来自手机 | 显示全部楼层
数字有没有溢出?
回复

使用道具 举报

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

查看全部评分

回复

使用道具 举报

ID:287575 发表于 2021-3-14 23:50 | 显示全部楼层
        unsigned int temp;
        temp=100*155/500;

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

使用道具 举报

ID:287575 发表于 2021-3-14 23:51 | 显示全部楼层
我测试正确的,结果是0x001F
回复

使用道具 举报

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

使用道具 举报

ID:232366 发表于 2021-3-15 21:53 来自手机 | 显示全部楼层
hefq 发表于 2021-3-12 22:07

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

使用道具 举报

ID:304608 发表于 2021-3-18 11:28 | 显示全部楼层
王快活。 发表于 2021-3-15 12:09
感谢各位大佬的耐心解答,我参考了这篇帖子
https://blog.csdn.net/avideointerfaces/article/details/275 ...

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

使用道具 举报

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

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