找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5039|回復(fù): 16
打印 上一主題 下一主題
收起左側(cè)

STC89C52單片機的除法運算問題

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:550952 發(fā)表于 2021-3-12 15:19 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
想請教各位大佬關(guān)于STC89C52除法的問題。
大概就是發(fā)現(xiàn)程序在沒有準(zhǔn)確算出這個式子的結(jié)果,調(diào)試出來的結(jié)果也很奇怪。
個人猜測是和STC89C52只有8位有關(guān),但是由于自己單片機原理方面不太懂,所以想請教一下大家。

2.png (3.19 KB, 下載次數(shù): 62)

調(diào)試結(jié)果

調(diào)試結(jié)果

1.png (4.31 KB, 下載次數(shù): 70)

算式

算式
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:390416 發(fā)表于 2021-3-12 16:35 | 只看該作者
這個叫 取模,也就是 除法運算 保留了商 丟棄了余數(shù)   ,取余用%
回復(fù)

使用道具 舉報

板凳
ID:367369 發(fā)表于 2021-3-12 16:55 | 只看該作者
不應(yīng)該吧,是不是其他地方把改變值了?
計算的時候應(yīng)該是有高位寄存器和低位寄存器啊,
像定時器初始化時就寫到過(65535 - 1000) /  256

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

地板
ID:550952 發(fā)表于 2021-3-12 17:03 | 只看該作者
game灬boy 發(fā)表于 2021-3-12 16:55
不應(yīng)該吧,是不是其他地方把改變值了?
計算的時候應(yīng)該是有高位寄存器和低位寄存器啊,
像定時器初始化時 ...

這是我特意新建的一個工程,整個代碼就下面幾句
#include <reg52.h>
void main(void)
{
        unsigned int temp;
       
        temp = 200*255/500;
}
回復(fù)

使用道具 舉報

5#
ID:451718 發(fā)表于 2021-3-12 17:13 | 只看該作者
確實碰到過這類問題,我的解決方案是:
unsigned int a , temp;
a = 200*255;
temp = a / 500;
這樣就不會有錯,估計是編譯器的問題。

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

6#
ID:213173 發(fā)表于 2021-3-12 21:41 | 只看該作者
本帖最后由 wulin 于 2021-3-12 21:48 編輯

強制轉(zhuǎn)換數(shù)據(jù)類型,200和255默認為unsigned char型,500默認為unsigned int型。類型統(tǒng)一就不會錯了。
tepm=(unsigned int)(200*255)/500;也可以分兩步計算也不會錯。
tepm=200*255;
tepm=tepm/500;

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

7#
ID:605142 發(fā)表于 2021-3-12 22:02 | 只看該作者
編譯器默認是按有符號16位運行,200*255溢出了
a=200u*255/500應(yīng)該可行

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

8#
ID:605142 發(fā)表于 2021-3-12 22:07 | 只看該作者


評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

9#
ID:879348 發(fā)表于 2021-3-13 08:18 | 只看該作者
也可能是temp沒有用,被優(yōu)化了,整個除法沒有執(zhí)行

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

10#
ID:783421 發(fā)表于 2021-3-13 14:30 來自手機 | 只看該作者
數(shù)字有沒有溢出?
回復(fù)

使用道具 舉報

11#
ID:487569 發(fā)表于 2021-3-14 17:47 | 只看該作者
void main(void) {         unsigned int temp,a;                  temp = 200*255/500;a=temp; }.試試這個,然后你再看運算結(jié)果。我懷疑你并沒有執(zhí)行運算,你定義temp的時候沒有賦初值,Value=0XFFE可能是temp運算之前的隨機值,按我給出的例子,當(dāng)你指針指到a=temp;的時候再看temp的值

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

12#
ID:287575 發(fā)表于 2021-3-14 23:50 | 只看該作者
        unsigned int temp;
        temp=100*155/500;

51hei瀏覽器截圖20210314234538.png (4.27 KB, 下載次數(shù): 58)

51hei瀏覽器截圖20210314234538.png
回復(fù)

使用道具 舉報

13#
ID:287575 發(fā)表于 2021-3-14 23:51 | 只看該作者
我測試正確的,結(jié)果是0x001F
回復(fù)

使用道具 舉報

14#
ID:550952 發(fā)表于 2021-3-15 12:09 | 只看該作者
感謝各位大佬的耐心解答,我參考了這篇帖子
https://blog.csdn.net/avideointerfaces/article/details/27512485
應(yīng)該是溢出了
回復(fù)

使用道具 舉報

15#
ID:232366 發(fā)表于 2021-3-15 21:53 來自手機 | 只看該作者
hefq 發(fā)表于 2021-3-12 22:07

大佬你的keil配色可以分享一下嗎?
回復(fù)

使用道具 舉報

16#
ID:304608 發(fā)表于 2021-3-18 11:28 | 只看該作者
王快活。 發(fā)表于 2021-3-15 12:09
感謝各位大佬的耐心解答,我參考了這篇帖子
https://blog.csdn.net/avideointerfaces/article/details/275 ...

我覺得樓上說的對,可能是被優(yōu)化了
回復(fù)

使用道具 舉報

17#
ID:304608 發(fā)表于 2021-3-18 11:30 | 只看該作者
王快活。 發(fā)表于 2021-3-15 12:09
感謝各位大佬的耐心解答,我參考了這篇帖子
https://blog.csdn.net/avideointerfaces/article/details/275 ...

你修改代碼再試一下, volatile unsigned int temp;  增加一個關(guān)鍵字試試
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表