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

QQ登錄

只需一步,快速開(kāi)始

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

你還在浪費(fèi)時(shí)間去計(jì)算單片機(jī)延時(shí)程序delay的循環(huán)次數(shù)?

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
本帖最后由 人人學(xué)會(huì)單片機(jī) 于 2021-4-4 19:08 編輯

好久沒(méi)有發(fā)貼子了,最近都在51hei論壇上回答網(wǎng)友問(wèn)題。我發(fā)現(xiàn)很多個(gè)網(wǎng)友都有提問(wèn)同樣的問(wèn)題,如何精確的計(jì)算delay 里面多少個(gè)循環(huán)是1ms ;蛘哒f(shuō)for循環(huán)的語(yǔ)句時(shí)間多少,循環(huán)一次多少時(shí)間???比如這樣的一個(gè)單片機(jī)延時(shí)代碼:
void delay_ms(unsigned char ms)
{
    unsigned char  i,k;
    for(i=0;i<ms;i++)
    for(k=0;k<110;k++);
}

我今天發(fā)這個(gè)貼子,并不是告訴小白們?nèi)绾稳ビ?jì)算這種參數(shù),因?yàn)檎嬲愎こ添?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系列快了十幾倍了。
實(shí)例說(shuō)明:
      下面的代碼,都是使用STC8H8K單片機(jī)測(cè)試,晶振頻率24M(既FOSC=24000000UL),并且沒(méi)有使用任何中斷資源。但是使用了其他函數(shù)。
第一種情況,函數(shù)延遲時(shí)間是1.004ms。
#define FOSC 24000000UL       
void TFT_Delay1ms(u8 x)
{
        u16 data i;
        i=FOSC/10000;
        while(i--);
}


第二種情況,給x賦值200,延遲時(shí)間是0.1807秒=180.7ms,嘿嘿,多寫一層while死循環(huán),居然少于200ms。
#define FOSC 24000000UL       
void TFT_Delay1ms(u8 x)
{
        u16 data i;
        i=FOSC/10000;
        while(i--)
        {
                while(x--);
        }
}


第三種情況,也給x賦值200,變量先減后判,延遲時(shí)間是0.1547秒=154.7ms。比上面兩種情況都快。
#define FOSC 24000000UL       
void TFT_Delay1ms(u8 x)
{
        u16 data i;
        i=FOSC/10000;
        while(--i)
        {
                while(--x);
        }
}



所以,不要去精確的計(jì)算delay 延遲了多少時(shí)間,畢竟單片機(jī)的運(yùn)行情況有很多變數(shù)。學(xué)會(huì)提高CPU的代碼執(zhí)行效率,是很有必要的!
“什么是單片機(jī)?咱玩的就是時(shí)間!”





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

使用道具 舉報(bào)

沙發(fā)
ID:884042 發(fā)表于 2021-3-26 20:37 | 只看該作者
好東西啊!
回復(fù)

使用道具 舉報(bào)

板凳
ID:881715 發(fā)表于 2021-4-20 19:24 來(lái)自手機(jī) | 只看該作者
為什么第二種情況多加了一層死循環(huán)延時(shí)時(shí)閘反而會(huì)更短呢請(qǐng)老師指教
回復(fù)

使用道具 舉報(bào)

地板
ID:457221 發(fā)表于 2021-4-22 17:22 | 只看該作者
說(shuō)半天,都不知想表達(dá)什么
回復(fù)

使用道具 舉報(bào)

5#
ID:910171 發(fā)表于 2021-4-24 16:37 來(lái)自手機(jī) | 只看該作者
不知所云呀。
回復(fù)

使用道具 舉報(bào)

6#
ID:106977 發(fā)表于 2021-4-26 16:56 | 只看該作者
現(xiàn)在的51單片機(jī)資源也多了。可以利用T1做精確定時(shí)器。
回復(fù)

使用道具 舉報(bào)

7#
ID:912593 發(fā)表于 2021-4-26 17:59 來(lái)自手機(jī) | 只看該作者
初學(xué)也是看不懂,謝謝大大們分享
回復(fù)

使用道具 舉報(bào)

8#
ID:390416 發(fā)表于 2021-4-30 22:23 | 只看該作者
創(chuàng)造生活 發(fā)表于 2021-4-20 19:24
為什么第二種情況多加了一層死循環(huán)延時(shí)時(shí)閘反而會(huì)更短呢請(qǐng)老師指教

你們不要去看懂這些延遲,因?yàn)楦緵](méi)什么卵用,我文章的主題思想 就是告訴你們不要用delay來(lái)做長(zhǎng)延遲或者精準(zhǔn)延遲。
回復(fù)

使用道具 舉報(bào)

9#
ID:390416 發(fā)表于 2021-4-30 22:24 | 只看該作者
winson007 發(fā)表于 2021-4-22 17:22
說(shuō)半天,都不知想表達(dá)什么

你們不要去看懂這些延遲,因?yàn)楦緵](méi)什么卵用,我文章的主題思想 就是告訴你們不要用delay來(lái)做長(zhǎng)延遲或者精準(zhǔn)延遲。
回復(fù)

使用道具 舉報(bào)

10#
ID:390416 發(fā)表于 2021-4-30 22:28 | 只看該作者

你們不要去看懂這些延遲,因?yàn)楦緵](méi)什么卵用,我文章的主題思想 就是告訴你們不要用delay來(lái)做長(zhǎng)延遲或者精準(zhǔn)延遲。
回復(fù)

使用道具 舉報(bào)

11#
ID:383215 發(fā)表于 2021-5-1 17:12 | 只看該作者
人人學(xué)會(huì)單片機(jī) 發(fā)表于 2021-4-30 22:23
你們不要去看懂這些延遲,因?yàn)楦緵](méi)什么卵用,我文章的主題思想 就是告訴你們不要用delay來(lái)做長(zhǎng)延遲或者 ...

你說(shuō)的非常非常的正確,這些延時(shí)程序根本沒(méi)什么卵用,我從來(lái)不計(jì)算任何程序的時(shí)間,都是設(shè)計(jì)電路的時(shí)候多預(yù)留一個(gè)I/O口,就用這個(gè)口靠示波器測(cè)量,什么18B20、HX711、紅外接收之類的程序延時(shí),就是用示波器測(cè)量著編出來(lái)的。我把單片機(jī)延時(shí)程序定為普通精度、高精度和超高精度三個(gè)檔次,每種精度我都有辦法實(shí)現(xiàn)。我編的所有單片機(jī)程序除了程序入口處,其它地方超過(guò)100微秒的延時(shí)程序根本就沒(méi)有,幾百微秒以上的延時(shí)程序用其它方法都解決了。
回復(fù)

使用道具 舉報(bào)

12#
ID:951974 發(fā)表于 2022-12-21 14:15 | 只看該作者
說(shuō)了半天都是有道理的,但是等于又什么都沒(méi)有說(shuō)。。。。。。。
樓主真是高手啊
回復(fù)

使用道具 舉報(bào)

13#
ID:673920 發(fā)表于 2022-12-21 23:03 來(lái)自手機(jī) | 只看該作者
我初學(xué)一般情況是把時(shí)間收/放一下,再用示波器或用秒表驗(yàn)證
回復(fù)

使用道具 舉報(bào)

14#
ID:1064915 發(fā)表于 2023-12-27 09:19 | 只看該作者
18B20、HX711、紅外接收
不用delay,有什么方法
回復(fù)

使用道具 舉報(bào)

15#
ID:383215 發(fā)表于 2023-12-27 15:25 | 只看該作者
joyb 發(fā)表于 2023-12-27 09:19
18B20、HX711、紅外接收
不用delay,有什么方法

不是18B20、HX711、紅外接收不用delay,是18B20、HX711、紅外接收的這些程序,幾十μS到100μS以內(nèi)的延時(shí)只能用軟件延時(shí),至少51單片機(jī)100μS以內(nèi)沒(méi)有必要安排其它程序,100μS以內(nèi)的延時(shí)精度要求較高,誤差太大就會(huì)導(dǎo)致單總線器件的讀寫不正常,幾百μS以上的長(zhǎng)延時(shí)不能用軟件延時(shí),會(huì)造成CPU代碼執(zhí)行效率降低,單總線器件的長(zhǎng)延時(shí)對(duì)精度要求并不高,可以用中斷完成,不用中斷還可以用循環(huán)周期。樓主最后說(shuō)的是重點(diǎn):“學(xué)會(huì)提高CPU的代碼執(zhí)行效率,是很有必要的!”重點(diǎn)中的重點(diǎn)是最后一句:“什么是單片機(jī)?咱玩的就是時(shí)間!”可惜很多人不理解。
回復(fù)

使用道具 舉報(bào)

16#
ID:433219 發(fā)表于 2023-12-28 14:21 | 只看該作者
示波器,是干什么用的???
現(xiàn)在各種mcu的內(nèi)核速度不一樣,靠數(shù)幾個(gè)_nop_之類的,絞盡腦汁去計(jì)算,不如示波器卡一下時(shí)間,一目了然。!
回復(fù)

使用道具 舉報(bào)

17#
ID:120219 發(fā)表于 2023-12-28 14:57 | 只看該作者
winson007 發(fā)表于 2021-4-22 17:22
說(shuō)半天,都不知想表達(dá)什么

廣告才是關(guān)鍵
回復(fù)

使用道具 舉報(bào)

18#
ID:1085441 發(fā)表于 2023-12-28 17:21 | 只看該作者
延時(shí)程序我也是用示波器來(lái)測(cè)量,因?yàn)楦鞣N原因,計(jì)算的都不準(zhǔn)。
回復(fù)

使用道具 舉報(bào)

19#
ID:458247 發(fā)表于 2023-12-28 17:50 | 只看該作者
wkman 發(fā)表于 2023-12-28 14:21
示波器,是干什么用的???
現(xiàn)在各種mcu的內(nèi)核速度不一樣,靠數(shù)幾個(gè)_nop_之類的,絞盡腦汁去計(jì)算,不如示 ...

如果是STM32的單片機(jī),建議用dwt功能進(jìn)行計(jì)時(shí),免去接硬件的繁瑣,直接在軟件里就可以計(jì)算運(yùn)行時(shí)長(zhǎng)
回復(fù)

使用道具 舉報(bào)

20#
ID:145357 發(fā)表于 2024-1-11 23:16 來(lái)自手機(jī) | 只看該作者
cnfloatleaf 發(fā)表于 2023-12-28 17:21
延時(shí)程序我也是用示波器來(lái)測(cè)量,因?yàn)楦鞣N原因,計(jì)算的都不準(zhǔn)。

給個(gè)教程怎么搞的?
回復(fù)

使用道具 舉報(bào)

21#
ID:804975 發(fā)表于 2024-1-14 23:10 | 只看該作者
一般8位機(jī),盡量避免阻塞式延時(shí),這種方式,會(huì)讓定時(shí)器要求高,開(kāi)兩個(gè)定時(shí)都會(huì)有函數(shù)超時(shí)的問(wèn)題的可能。
回復(fù)

使用道具 舉報(bào)

22#
ID:804975 發(fā)表于 2024-1-14 23:17 | 只看該作者
阻塞式延時(shí),最大的問(wèn)題在函數(shù)的運(yùn)行的時(shí)間很長(zhǎng),后面的語(yǔ)句要等待,說(shuō)個(gè)例子,IIC的工作里面就有大量的延時(shí)操作,完成一個(gè)動(dòng)作,等待10MS再操作其他的動(dòng)作,程序都停止等待這個(gè)10MS的結(jié)束。這個(gè)等待會(huì)影響到其他的操作,好象按鍵輸入,AD輸入等等,小程序還好,大一點(diǎn)的程序就有麻煩了。
回復(fù)

使用道具 舉報(bào)

23#
ID:1108782 發(fā)表于 2024-1-16 11:13 | 只看該作者
解決辦法也很簡(jiǎn)單,占用一個(gè)定時(shí)器,用定時(shí)器計(jì)算精確時(shí)間。不過(guò)如果沒(méi)有加晶振的話時(shí)間也不準(zhǔn)的
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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