找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

STC89C52單片機的除法運算問題

查看數(shù): 5066 | 評論數(shù): 16 | 收藏 0
關燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發(fā)布時間: 2021-3-12 15:19

正文摘要:

想請教各位大佬關于STC89C52除法的問題。 大概就是發(fā)現(xiàn)程序在沒有準確算出這個式子的結果,調試出來的結果也很奇怪。 個人猜測是和STC89C52只有8位有關,但是由于自己單片機原理方面不太懂,所以想請教一下大家。 ...

回復

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;  增加一個關鍵字試試
ID:304608 發(fā)表于 2021-3-18 11:28
王快活。 發(fā)表于 2021-3-15 12:09
感謝各位大佬的耐心解答,我參考了這篇帖子
https://blog.csdn.net/avideointerfaces/article/details/275 ...

我覺得樓上說的對,可能是被優(yōu)化了
ID:232366 發(fā)表于 2021-3-15 21:53
hefq 發(fā)表于 2021-3-12 22:07

大佬你的keil配色可以分享一下嗎?
ID:550952 發(fā)表于 2021-3-15 12:09
感謝各位大佬的耐心解答,我參考了這篇帖子
https://blog.csdn.net/avideointerfaces/article/details/27512485
應該是溢出了
ID:287575 發(fā)表于 2021-3-14 23:51
我測試正確的,結果是0x001F
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
ID:487569 發(fā)表于 2021-3-14 17:47
void main(void) {         unsigned int temp,a;                  temp = 200*255/500;a=temp; }.試試這個,然后你再看運算結果。我懷疑你并沒有執(zhí)行運算,你定義temp的時候沒有賦初值,Value=0XFFE可能是temp運算之前的隨機值,按我給出的例子,當你指針指到a=temp;的時候再看temp的值

評分

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

查看全部評分

ID:783421 發(fā)表于 2021-3-13 14:30
數(shù)字有沒有溢出?
ID:879348 發(fā)表于 2021-3-13 08:18
也可能是temp沒有用,被優(yōu)化了,整個除法沒有執(zhí)行

評分

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

查看全部評分

ID:605142 發(fā)表于 2021-3-12 22:07


評分

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

查看全部評分

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

評分

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

查看全部評分

ID:213173 發(fā)表于 2021-3-12 21:41
本帖最后由 wulin 于 2021-3-12 21:48 編輯

強制轉換數(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 回帖助人的獎勵!

查看全部評分

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

評分

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

查看全部評分

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

這是我特意新建的一個工程,整個代碼就下面幾句
#include <reg52.h>
void main(void)
{
        unsigned int temp;
       
        temp = 200*255/500;
}
ID:367369 發(fā)表于 2021-3-12 16:55
不應該吧,是不是其他地方把改變值了?
計算的時候應該是有高位寄存器和低位寄存器啊,
像定時器初始化時就寫到過(65535 - 1000) /  256

評分

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

查看全部評分

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

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

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

快速回復 返回頂部 返回列表