久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 你還在浪費時間去計算單片機延時程序delay的循環次數? [打印本頁]

作者: 人人學會單片機    時間: 2021-3-26 11:16
標題: 你還在浪費時間去計算單片機延時程序delay的循環次數?
本帖最后由 人人學會單片機 于 2021-4-4 19:08 編輯

好久沒有發貼子了,最近都在51hei論壇上回答網友問題。我發現很多個網友都有提問同樣的問題,如何精確的計算delay 里面多少個循環是1ms 。或者說for循環的語句時間多少,循環一次多少時間???比如這樣的一個單片機延時代碼:
void delay_ms(unsigned char ms)
{
    unsigned char  i,k;
    for(i=0;i<ms;i++)
    for(k=0;k<110;k++);
}

我今天發這個貼子,并不是告訴小白們如何去計算這種參數,因為真正搞工程項目設計的,壓根就不去計算這種參數的。理由如下:
1、假設在同一個硬件上做測試,單片機CPU指令周期是一致的。那么 變量i、K,存放在data跟存放在XDATA,讀寫速度能一樣?精確計算有意義嗎?
2、假設都存放在data,延遲1ms只需要char類型的變量即可完成,但是,延遲100ms必須16位變量,那么執行時間還能照著公式去套算?
3、假設上述條件都一樣,計算好的延遲時間是1ms并且誤差1%,打開中斷之后,延遲時間變成了5毫秒了。誤差500%了,精確計算有意義嗎?
4、假設上述條件不影響延遲時間,那么,編譯器呢?誰敢說編譯器不同的優化等級不影響delay的延遲時間?
5、還有硬件不同的情況,就需要重新計算了。比如晶振頻率不同,CPU內核速度不同,STC8H單片機就比STC15快了很多了比89系列快了十幾倍了。
實例說明:
      下面的代碼,都是使用STC8H8K單片機測試,晶振頻率24M(既FOSC=24000000UL),并且沒有使用任何中斷資源。但是使用了其他函數。
第一種情況,函數延遲時間是1.004ms。
#define FOSC 24000000UL       
void TFT_Delay1ms(u8 x)
{
        u16 data i;
        i=FOSC/10000;
        while(i--);
}


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


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



所以,不要去精確的計算delay 延遲了多少時間,畢竟單片機的運行情況有很多變數。學會提高CPU的代碼執行效率,是很有必要的!
“什么是單片機?咱玩的就是時間!”






作者: xjx51    時間: 2021-3-26 20:37
好東西啊!
作者: 創造生活    時間: 2021-4-20 19:24
為什么第二種情況多加了一層死循環延時時閘反而會更短呢請老師指教
作者: winson007    時間: 2021-4-22 17:22
說半天,都不知想表達什么
作者: Fireflying    時間: 2021-4-24 16:37
不知所云呀。
作者: lgwd    時間: 2021-4-26 16:56
現在的51單片機資源也多了。可以利用T1做精確定時器。
作者: ansion3000    時間: 2021-4-26 17:59
初學也是看不懂,謝謝大大們分享
作者: 人人學會單片機    時間: 2021-4-30 22:23
創造生活 發表于 2021-4-20 19:24
為什么第二種情況多加了一層死循環延時時閘反而會更短呢請老師指教

你們不要去看懂這些延遲,因為根本沒什么卵用,我文章的主題思想 就是告訴你們不要用delay來做長延遲或者精準延遲。
作者: 人人學會單片機    時間: 2021-4-30 22:24
winson007 發表于 2021-4-22 17:22
說半天,都不知想表達什么

你們不要去看懂這些延遲,因為根本沒什么卵用,我文章的主題思想 就是告訴你們不要用delay來做長延遲或者精準延遲。
作者: 人人學會單片機    時間: 2021-4-30 22:28
Fireflying 發表于 2021-4-24 16:37
不知所云呀。

你們不要去看懂這些延遲,因為根本沒什么卵用,我文章的主題思想 就是告訴你們不要用delay來做長延遲或者精準延遲。
作者: kmsj    時間: 2021-5-1 17:12
人人學會單片機 發表于 2021-4-30 22:23
你們不要去看懂這些延遲,因為根本沒什么卵用,我文章的主題思想 就是告訴你們不要用delay來做長延遲或者 ...

你說的非常非常的正確,這些延時程序根本沒什么卵用,我從來不計算任何程序的時間,都是設計電路的時候多預留一個I/O口,就用這個口靠示波器測量,什么18B20、HX711、紅外接收之類的程序延時,就是用示波器測量著編出來的。我把單片機延時程序定為普通精度、高精度和超高精度三個檔次,每種精度我都有辦法實現。我編的所有單片機程序除了程序入口處,其它地方超過100微秒的延時程序根本就沒有,幾百微秒以上的延時程序用其它方法都解決了。
作者: 1588848    時間: 2022-12-21 14:15
說了半天都是有道理的,但是等于又什么都沒有說。。。。。。。
樓主真是高手啊
作者: anjianguo    時間: 2022-12-21 23:03
我初學一般情況是把時間收/放一下,再用示波器或用秒表驗證
作者: joyb    時間: 2023-12-27 09:19
18B20、HX711、紅外接收
不用delay,有什么方法
作者: kmsj    時間: 2023-12-27 15:25
joyb 發表于 2023-12-27 09:19
18B20、HX711、紅外接收
不用delay,有什么方法

不是18B20、HX711、紅外接收不用delay,是18B20、HX711、紅外接收的這些程序,幾十μS到100μS以內的延時只能用軟件延時,至少51單片機100μS以內沒有必要安排其它程序,100μS以內的延時精度要求較高,誤差太大就會導致單總線器件的讀寫不正常,幾百μS以上的長延時不能用軟件延時,會造成CPU代碼執行效率降低,單總線器件的長延時對精度要求并不高,可以用中斷完成,不用中斷還可以用循環周期。樓主最后說的是重點:“學會提高CPU的代碼執行效率,是很有必要的!”重點中的重點是最后一句:“什么是單片機?咱玩的就是時間!”可惜很多人不理解。
作者: wkman    時間: 2023-12-28 14:21
示波器,是干什么用的???
現在各種mcu的內核速度不一樣,靠數幾個_nop_之類的,絞盡腦汁去計算,不如示波器卡一下時間,一目了然!!!
作者: xiexianxiao    時間: 2023-12-28 14:57
winson007 發表于 2021-4-22 17:22
說半天,都不知想表達什么

廣告才是關鍵
作者: cnfloatleaf    時間: 2023-12-28 17:21
延時程序我也是用示波器來測量,因為各種原因,計算的都不準。
作者: yzw846562238    時間: 2023-12-28 17:50
wkman 發表于 2023-12-28 14:21
示波器,是干什么用的???
現在各種mcu的內核速度不一樣,靠數幾個_nop_之類的,絞盡腦汁去計算,不如示 ...

如果是STM32的單片機,建議用dwt功能進行計時,免去接硬件的繁瑣,直接在軟件里就可以計算運行時長
作者: 4758866    時間: 2024-1-11 23:16
cnfloatleaf 發表于 2023-12-28 17:21
延時程序我也是用示波器來測量,因為各種原因,計算的都不準。

給個教程怎么搞的?
作者: 科長2008    時間: 2024-1-14 23:10
一般8位機,盡量避免阻塞式延時,這種方式,會讓定時器要求高,開兩個定時都會有函數超時的問題的可能。
作者: 科長2008    時間: 2024-1-14 23:17
阻塞式延時,最大的問題在函數的運行的時間很長,后面的語句要等待,說個例子,IIC的工作里面就有大量的延時操作,完成一個動作,等待10MS再操作其他的動作,程序都停止等待這個10MS的結束。這個等待會影響到其他的操作,好象按鍵輸入,AD輸入等等,小程序還好,大一點的程序就有麻煩了。
作者: ufb    時間: 2024-1-16 11:13
解決辦法也很簡單,占用一個定時器,用定時器計算精確時間。不過如果沒有加晶振的話時間也不準的




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产精品黄 | 日日干狠狠干 | 免费观看a级片 | 啪啪导航 | 国产精品毛片久久久久久久 | 日韩视频精品 | 国产一区一区 | 亚洲综合激情 | 午夜国产在线 | 国产永久在线 | 久久精品国产77777蜜臀 | 午夜视频一区二区 | 青草网| av三级在线观看 | 国产日产精品一区二区三区的介绍 | 亚洲精品中文字幕乱码三区91 | 日韩精品第一页 | 99精品视频免费观看 | 成人一区在线观看 | 亚洲欧美日韩另类 | 亚洲视频在线观看免费 | 伊人成人在线视频 | 亚洲精品乱码久久久久久蜜桃91 | av影片在线观看 | 午夜伦理福利 | 久久cao| 久草视频免费看 | 性色av一区二区三区 | 日本黄色免费视频 | 五月婷婷在线视频 | 国产精品第二页 | 日韩免费一级片 | 国产成人精品亚洲男人的天堂 | 精品久久网| 午夜色婷婷 | 成人在线视频网站 | 午夜影院福利 | 成人一级片 | a级片在线观看 | 久久瑟瑟 | 日本中文字幕在线播放 |