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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

  [復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:390416 發(fā)表于 2021-3-26 11:16 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 人人學會單片機 于 2021-4-4 19:08 編輯

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

我今天發(fā)這個貼子,并不是告訴小白們?nèi)绾稳ビ嬎氵@種參數(shù),因為真正搞工程項目設(shè)計的,壓根就不去計算這種參數(shù)的。理由如下:
1、假設(shè)在同一個硬件上做測試,單片機CPU指令周期是一致的。那么 變量i、K,存放在data跟存放在XDATA,讀寫速度能一樣?精確計算有意義嗎?
2、假設(shè)都存放在data,延遲1ms只需要char類型的變量即可完成,但是,延遲100ms必須16位變量,那么執(zhí)行時間還能照著公式去套算?
3、假設(shè)上述條件都一樣,計算好的延遲時間是1ms并且誤差1%,打開中斷之后,延遲時間變成了5毫秒了。誤差500%了,精確計算有意義嗎?
4、假設(shè)上述條件不影響延遲時間,那么,編譯器呢?誰敢說編譯器不同的優(yōu)化等級不影響delay的延遲時間?
5、還有硬件不同的情況,就需要重新計算了。比如晶振頻率不同,CPU內(nèi)核速度不同,STC8H單片機就比STC15快了很多了比89系列快了十幾倍了。
實例說明:
      下面的代碼,都是使用STC8H8K單片機測試,晶振頻率24M(既FOSC=24000000UL),并且沒有使用任何中斷資源。但是使用了其他函數(shù)。
第一種情況,函數(shù)延遲時間是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死循環(huán),居然少于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 延遲了多少時間,畢竟單片機的運行情況有很多變數(shù)。學會提高CPU的代碼執(zhí)行效率,是很有必要的!
“什么是單片機?咱玩的就是時間!”





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

使用道具 舉報

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

使用道具 舉報

板凳
ID:881715 發(fā)表于 2021-4-20 19:24 來自觸屏版 | 只看該作者
為什么第二種情況多加了一層死循環(huán)延時時閘反而會更短呢請老師指教
回復

使用道具 舉報

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

使用道具 舉報

5#
ID:910171 發(fā)表于 2021-4-24 16:37 來自觸屏版 | 只看該作者
不知所云呀。
回復

使用道具 舉報

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

使用道具 舉報

7#
ID:912593 發(fā)表于 2021-4-26 17:59 來自觸屏版 | 只看該作者
初學也是看不懂,謝謝大大們分享
回復

使用道具 舉報

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

你們不要去看懂這些延遲,因為根本沒什么卵用,我文章的主題思想 就是告訴你們不要用delay來做長延遲或者精準延遲。
回復

使用道具 舉報

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

你們不要去看懂這些延遲,因為根本沒什么卵用,我文章的主題思想 就是告訴你們不要用delay來做長延遲或者精準延遲。
回復

使用道具 舉報

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

你們不要去看懂這些延遲,因為根本沒什么卵用,我文章的主題思想 就是告訴你們不要用delay來做長延遲或者精準延遲。
回復

使用道具 舉報

11#
ID:383215 發(fā)表于 2021-5-1 17:12 | 只看該作者
人人學會單片機 發(fā)表于 2021-4-30 22:23
你們不要去看懂這些延遲,因為根本沒什么卵用,我文章的主題思想 就是告訴你們不要用delay來做長延遲或者 ...

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

使用道具 舉報

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

使用道具 舉報

13#
ID:673920 發(fā)表于 2022-12-21 23:03 來自觸屏版 | 只看該作者
我初學一般情況是把時間收/放一下,再用示波器或用秒表驗證
回復

使用道具 舉報

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

使用道具 舉報

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)的延時只能用軟件延時,至少51單片機100μS以內(nèi)沒有必要安排其它程序,100μS以內(nèi)的延時精度要求較高,誤差太大就會導致單總線器件的讀寫不正常,幾百μS以上的長延時不能用軟件延時,會造成CPU代碼執(zhí)行效率降低,單總線器件的長延時對精度要求并不高,可以用中斷完成,不用中斷還可以用循環(huán)周期。樓主最后說的是重點:“學會提高CPU的代碼執(zhí)行效率,是很有必要的!”重點中的重點是最后一句:“什么是單片機?咱玩的就是時間!”可惜很多人不理解。
回復

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

18#
ID:1085441 發(fā)表于 2023-12-28 17:21 | 只看該作者
延時程序我也是用示波器來測量,因為各種原因,計算的都不準。
回復

使用道具 舉報

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

如果是STM32的單片機,建議用dwt功能進行計時,免去接硬件的繁瑣,直接在軟件里就可以計算運行時長
回復

使用道具 舉報

20#
ID:145357 發(fā)表于 2024-1-11 23:16 來自觸屏版 | 只看該作者
cnfloatleaf 發(fā)表于 2023-12-28 17:21
延時程序我也是用示波器來測量,因為各種原因,計算的都不準。

給個教程怎么搞的?
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

23#
ID:1108782 發(fā)表于 2024-1-16 11:13 | 只看該作者
解決辦法也很簡單,占用一個定時器,用定時器計算精確時間。不過如果沒有加晶振的話時間也不準的
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲成人免费视频 | 91色视频在线观看 | 日韩一二三区视频 | 亚洲精品久久久久中文字幕二区 | а天堂中文最新一区二区三区 | 久久精品久久久久久 | 99re6热在线精品视频播放 | 欧美一区二区免费 | 精品国产一区二区三区观看不卡 | av黄色免费| 国产在线视频一区二区 | 欧美一级欧美三级在线观看 | 欧美成人a | 日本亚洲欧美 | www.亚洲| 在线观看欧美日韩视频 | 成人午夜影院 | 视频在线一区二区 | 一区二区三区日本 | 久草免费在线视频 | 亚洲精品一区中文字幕 | 日韩欧美三区 | 欧美国产日韩一区二区三区 | 国产三级在线观看播放 | 国产黄色大片 | 国产一区二区三区四区五区加勒比 | 亚洲精品国产电影 | 日韩一级精品视频在线观看 | 国产乡下妇女做爰 | 国产精品久久精品 | 在线视频第一页 | 超碰91在线 | 日韩欧美1区2区 | 观看av | 狠狠操狠狠搞 | 久久久精品一区二区三区 | 一区二区成人 | 免费一区在线观看 | 中文字幕在线观看 | 日日做夜夜爽毛片麻豆 | 亚洲视频在线看 |