找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4418|回復(fù): 15
收起左側(cè)

有段單片機(jī)延時(shí)代碼,請(qǐng)大神指導(dǎo)是如何計(jì)算時(shí)間的?

[復(fù)制鏈接]
ID:824397 發(fā)表于 2021-8-31 16:41 | 顯示全部樓層 |閱讀模式
20黑幣
各位大神:小弟初接觸單片機(jī),以下一段代碼,其中的i:及j: 及K:是怎么算出來的?求計(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);
}



回復(fù)

使用道具 舉報(bào)

ID:161164 發(fā)表于 2021-8-31 16:50 | 顯示全部樓層
可用STC_ISP自動(dòng)生成代碼
2021-08-31_164928.png

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
szbadd + 20

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:624769 發(fā)表于 2021-8-31 19:04 | 顯示全部樓層
沒有計(jì)算方法,C語言你就不要考慮了,除非你懂匯編。
然后查詢?cè)搯纹瑱C(jī)的手冊(cè),查到DJNZ的機(jī)器周期,MOV的機(jī)器周期,然后根據(jù)晶振速率,算出需要多少個(gè)機(jī)器周期,然后算出用多少個(gè)DJNZ, 要精準(zhǔn)的話,還要算上 MOV時(shí)間, RET時(shí)間, 和 CALL的時(shí)間。
回復(fù)

使用道具 舉報(bào)

ID:624769 發(fā)表于 2021-8-31 19:08 | 顯示全部樓層
STC的單片機(jī),你可以用他的下載器自帶的工具生成,其他的單片機(jī),你能你把在KEIL上,加載該MCU的信息后,寫一個(gè)大概的延時(shí),然后DEBUG跑一下看看多少時(shí)間,在調(diào)整調(diào)整到你需要的時(shí)間。
回復(fù)

使用道具 舉報(bào)

ID:883242 發(fā)表于 2021-8-31 20:08 | 顯示全部樓層
這個(gè)不是算出來的,而是測(cè)出來的。
回復(fù)

使用道具 舉報(bào)

ID:401564 發(fā)表于 2021-8-31 20:49 | 顯示全部樓層
不同的單片機(jī)環(huán)境有不同的辦法
如果是8051,在STC下載器那有現(xiàn)成的,選擇好單片機(jī)型號(hào)和晶振,復(fù)制就可以了
PIC就有專門的uS,mS延時(shí)函數(shù),程序開始的時(shí)候設(shè)定好晶振頻率,直接調(diào)用函數(shù)就行,這比較省事 51hei截圖20210831204559.png
回復(fù)

使用道具 舉報(bào)

ID:624769 發(fā)表于 2021-8-31 20:53 | 顯示全部樓層
Hephaestus 發(fā)表于 2021-8-31 20:08
這個(gè)不是算出來的,而是測(cè)出來的。

你還真說錯(cuò)了,這個(gè)就是算出來的。根據(jù)不同型號(hào)的芯片,while 語句所對(duì)應(yīng)的匯編代碼 DJNZ的周期數(shù),然后計(jì)算出來的數(shù)值。
回復(fù)

使用道具 舉報(bào)

ID:86450 發(fā)表于 2021-8-31 21:19 | 顯示全部樓層
一般我是測(cè)出來
回復(fù)

使用道具 舉報(bào)

ID:824397 發(fā)表于 2021-8-31 21:32 | 顯示全部樓層
lkc8210 發(fā)表于 2021-8-31 16:50
可用STC_ISP自動(dòng)生成代碼

大神,我明白,原來是這樣算出來的,太感謝了,
回復(fù)

使用道具 舉報(bào)

ID:824397 發(fā)表于 2021-8-31 21:33 | 顯示全部樓層
188610329 發(fā)表于 2021-8-31 19:04
沒有計(jì)算方法,C語言你就不要考慮了,除非你懂匯編。
然后查詢?cè)搯纹瑱C(jī)的手冊(cè),查到DJNZ的機(jī)器周期,MOV的 ...

謝謝你的回復(fù),論壇有你更精采
回復(fù)

使用道具 舉報(bào)

ID:824397 發(fā)表于 2021-8-31 21:34 | 顯示全部樓層
188610329 發(fā)表于 2021-8-31 19:08
STC的單片機(jī),你可以用他的下載器自帶的工具生成,其他的單片機(jī),你能你把在KEIL上,加載該MCU的信息后,寫 ...

是的,謝謝你的回復(fù),論壇有你更精采
回復(fù)

使用道具 舉報(bào)

ID:824397 發(fā)表于 2021-8-31 21:34 | 顯示全部樓層
Hephaestus 發(fā)表于 2021-8-31 20:08
這個(gè)不是算出來的,而是測(cè)出來的。

謝謝你,已解決
回復(fù)

使用道具 舉報(bào)

ID:824397 發(fā)表于 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ì)算出來沒有K值,謝謝你
回復(fù)

使用道具 舉報(bào)

ID:824397 發(fā)表于 2021-8-31 21:36 | 顯示全部樓層
188610329 發(fā)表于 2021-8-31 20:53
你還真說錯(cuò)了,這個(gè)就是算出來的。根據(jù)不同型號(hào)的芯片,while 語句所對(duì)應(yīng)的匯編代碼 DJNZ的周期數(shù),然后 ...

謝謝你的參與
回復(fù)

使用道具 舉報(bào)

ID:824397 發(fā)表于 2021-8-31 21:39 | 顯示全部樓層
已解決,謝謝各位
回復(fù)

使用道具 舉報(bào)

ID:390416 發(fā)表于 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%,打開中斷之后,延遲時(shí)間變成了5毫秒了。誤差500%了,精確計(jì)算有意義嗎?
4、假設(shè)上述條件不影響延遲時(shí)間,那么,編譯器呢?誰敢說編譯器不同的優(yōu)化等級(jí)不影響delay的延遲時(shí)間?
5、還有硬件不同的情況,就需要重新計(jì)算了。比如晶振頻率不同,CPU內(nèi)核速度不同,STC8H單片機(jī)就比STC15快了很多了比89系列快了十幾倍了。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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