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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8450|回復: 22
打印 上一主題 下一主題
收起左側

你還在浪費時間去計算單片機延時程序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的代碼執行效率,是很有必要的!
“什么是單片機?咱玩的就是時間!”





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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

5#
ID:910171 發表于 2021-4-24 16:37 來自手機 | 只看該作者
不知所云呀。
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

15#
ID:383215 發表于 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的代碼執行效率,是很有必要的!”重點中的重點是最后一句:“什么是單片機?咱玩的就是時間!”可惜很多人不理解。
回復

使用道具 舉報

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

使用道具 舉報

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

廣告才是關鍵
回復

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

給個教程怎么搞的?
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久综合av | 久日精品 | 97国产一区二区精品久久呦 | 精品国产久 | 久久亚洲视频网 | 免费在线一区二区 | 天堂成人国产精品一区 | 在线看亚洲| 色婷婷av一区二区三区软件 | 国产一区二区美女 | 亚洲欧美在线一区 | 久久综合色综合 | 少妇一级淫片aaaaaaaaa | 2018天天干天天操 | 欧美激情在线观看一区二区三区 | 久久日韩精品一区二区三区 | av网站免费| 99re在线播放 | 69视频在线播放 | 91在线色视频 | 97人人爱| 中文字幕在线第一页 | 亚洲精品久久久久久久久久久 | 高清国产一区二区 | 国产欧美日韩综合精品一 | 91亚洲国产成人久久精品网站 | 二区欧美 | 羞羞视频网站免费观看 | 一区二区国产精品 | 操射视频| 国产精品久久久久久久久久软件 | aaaaaaa片毛片免费观看 | 久久99久久99久久 | 精品在线一区二区 | 亚洲一区二区三区四区五区中文 | 亚洲免费视频一区二区 | 欧美日韩精品久久久免费观看 | 欧美另类日韩 | 日韩视频一区二区 | 国产精品一区二区不卡 | 中文字幕爱爱视频 |