標(biāo)題: 有段單片機(jī)延時(shí)代碼,請(qǐng)大神指導(dǎo)是如何計(jì)算時(shí)間的? [打印本頁(yè)]

作者: szbadd    時(shí)間: 2021-8-31 16:41
標(biāo)題: 有段單片機(jī)延時(shí)代碼,請(qǐng)大神指導(dǎo)是如何計(jì)算時(shí)間的?
各位大神:小弟初接觸單片機(jī),以下一段代碼,其中的i:及j: 及K:是怎么算出來(lái)的?求計(jì)算方法,或求專門的計(jì)算軟件,謝謝。


void Delay100ms()                //@11.0592MHz
{
        unsigned char i, j, k;

        i = 5;
        j = 52;
        k = 195;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}




作者: lkc8210    時(shí)間: 2021-8-31 16:50
可用STC_ISP自動(dòng)生成代碼



作者: 188610329    時(shí)間: 2021-8-31 19:04
沒(méi)有計(jì)算方法,C語(yǔ)言你就不要考慮了,除非你懂匯編。
然后查詢?cè)搯纹瑱C(jī)的手冊(cè),查到DJNZ的機(jī)器周期,MOV的機(jī)器周期,然后根據(jù)晶振速率,算出需要多少個(gè)機(jī)器周期,然后算出用多少個(gè)DJNZ, 要精準(zhǔn)的話,還要算上 MOV時(shí)間, RET時(shí)間, 和 CALL的時(shí)間。
作者: 188610329    時(shí)間: 2021-8-31 19:08
STC的單片機(jī),你可以用他的下載器自帶的工具生成,其他的單片機(jī),你能你把在KEIL上,加載該MCU的信息后,寫一個(gè)大概的延時(shí),然后DEBUG跑一下看看多少時(shí)間,在調(diào)整調(diào)整到你需要的時(shí)間。
作者: Hephaestus    時(shí)間: 2021-8-31 20:08
這個(gè)不是算出來(lái)的,而是測(cè)出來(lái)的。
作者: Y_G_G    時(shí)間: 2021-8-31 20:49
不同的單片機(jī)環(huán)境有不同的辦法
如果是8051,在STC下載器那有現(xiàn)成的,選擇好單片機(jī)型號(hào)和晶振,復(fù)制就可以了
PIC就有專門的uS,mS延時(shí)函數(shù),程序開(kāi)始的時(shí)候設(shè)定好晶振頻率,直接調(diào)用函數(shù)就行,這比較省事

作者: 188610329    時(shí)間: 2021-8-31 20:53
Hephaestus 發(fā)表于 2021-8-31 20:08
這個(gè)不是算出來(lái)的,而是測(cè)出來(lái)的。

你還真說(shuō)錯(cuò)了,這個(gè)就是算出來(lái)的。根據(jù)不同型號(hào)的芯片,while 語(yǔ)句所對(duì)應(yīng)的匯編代碼 DJNZ的周期數(shù),然后計(jì)算出來(lái)的數(shù)值。
作者: jjwangxu2008    時(shí)間: 2021-8-31 21:19
一般我是測(cè)出來(lái)
作者: szbadd    時(shí)間: 2021-8-31 21:32
lkc8210 發(fā)表于 2021-8-31 16:50
可用STC_ISP自動(dòng)生成代碼

大神,我明白,原來(lái)是這樣算出來(lái)的,太感謝了,
作者: szbadd    時(shí)間: 2021-8-31 21:33
188610329 發(fā)表于 2021-8-31 19:04
沒(méi)有計(jì)算方法,C語(yǔ)言你就不要考慮了,除非你懂匯編。
然后查詢?cè)搯纹瑱C(jī)的手冊(cè),查到DJNZ的機(jī)器周期,MOV的 ...

謝謝你的回復(fù),論壇有你更精采
作者: szbadd    時(shí)間: 2021-8-31 21:34
188610329 發(fā)表于 2021-8-31 19:08
STC的單片機(jī),你可以用他的下載器自帶的工具生成,其他的單片機(jī),你能你把在KEIL上,加載該MCU的信息后,寫 ...

是的,謝謝你的回復(fù),論壇有你更精采
作者: szbadd    時(shí)間: 2021-8-31 21:34
Hephaestus 發(fā)表于 2021-8-31 20:08
這個(gè)不是算出來(lái)的,而是測(cè)出來(lái)的。

謝謝你,已解決
作者: szbadd    時(shí)間: 2021-8-31 21:35
Y_G_G 發(fā)表于 2021-8-31 20:49
不同的單片機(jī)環(huán)境有不同的辦法
如果是8051,在STC下載器那有現(xiàn)成的,選擇好單片機(jī)型號(hào)和晶振,復(fù)制就可以了
...

嗯,你這個(gè)計(jì)算出來(lái)沒(méi)有K值,謝謝你
作者: szbadd    時(shí)間: 2021-8-31 21:36
188610329 發(fā)表于 2021-8-31 20:53
你還真說(shuō)錯(cuò)了,這個(gè)就是算出來(lái)的。根據(jù)不同型號(hào)的芯片,while 語(yǔ)句所對(duì)應(yīng)的匯編代碼 DJNZ的周期數(shù),然后 ...

謝謝你的參與
作者: szbadd    時(shí)間: 2021-8-31 21:39
已解決,謝謝各位
作者: 人人學(xué)會(huì)單片機(jī)    時(shí)間: 2021-9-1 08:19
真正搞工程項(xiàng)目設(shè)計(jì)的,壓根就不去計(jì)算這種參數(shù)的。理由如下:
1、假設(shè)在同一個(gè)硬件上做測(cè)試,單片機(jī)CPU指令周期是一致的。那么 變量i、K,存放在data跟存放在XDATA,讀寫速度能一樣?精確計(jì)算有意義嗎?
2、假設(shè)都存放在data,延遲1ms只需要char類型的變量即可完成,但是,延遲100ms必須16位變量,那么執(zhí)行時(shí)間還能照著公式去套算?
3、假設(shè)上述條件都一樣,計(jì)算好的延遲時(shí)間是1ms并且誤差1%,打開(kāi)中斷之后,延遲時(shí)間變成了5毫秒了。誤差500%了,精確計(jì)算有意義嗎?
4、假設(shè)上述條件不影響延遲時(shí)間,那么,編譯器呢?誰(shuí)敢說(shuō)編譯器不同的優(yōu)化等級(jí)不影響delay的延遲時(shí)間?
5、還有硬件不同的情況,就需要重新計(jì)算了。比如晶振頻率不同,CPU內(nèi)核速度不同,STC8H單片機(jī)就比STC15快了很多了比89系列快了十幾倍了。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1