Keil C51程序設計中幾種精確延時方法

2021-01-08 電子產品世界

實際的單片機應用系統開發過程中,由於程序功能的需要,經常編寫各種延時程序,延時時間從數微秒到數秒不等,對於許多C51開發者特別是初學者編制非常精確的延時程序有一定難度。本文從實際應用出發,討論幾種實用的編制精確延時程序和計算程序執行時間的方法,並給出各種方法使用的詳細步驟,以便讀者能夠很好地掌握理解。

本文引用地址:http://www.eepw.com.cn/article/172766.htm

關鍵詞 Keil C51 精確延時 程序執行時間

引言

  單片機因具有體積小、功能強、成本低以及便於實現分布式控制而有非常廣泛的應用領域[1]。單片機開發者在編制各種應用程式時經常會遇到實現精確延時的問題,比如按鍵去抖、數據傳輸等操作都要在程序中插入一段或幾段延時,時間從幾十微秒到幾秒。有時還要求有很高的精度,如使用單總線晶片DS18B20時,允許誤差範圍在十幾微秒以內[2],否則,晶片無法工作。用51彙編語言寫程序時,這種問題很容易得到解決,而目前開發嵌入式系統軟體的主流工具為C語言,用C51寫延時程序時需要一些技巧[3]。因此,在多年單片機開發經驗的基礎上,介紹幾種實用的編制精確延時程序和計算程序執行時間的方法。

  實現延時通常有兩種方法:一種是硬體延時,要用到定時器/計數器,這種方法可以提高CPU的工作效率,也能做到精確延時;另一種是軟體延時,這種方法主要採用循環體進行。

1 使用定時器/計數器實現精確延時

  單片機系統一般常選用11.059 2 MHz、12 MHz或6 MHz晶振。第一種更容易產生各種標準的波特率,後兩種的一個機器周期分別為1 μs和2 μs,便於精確延時。本程序中假設使用頻率為12 MHz的晶振。最長的延時時間可達216=65 536 μs。若定時器工作在方式2,則可實現極短時間的精確延時;如使用其他定時方式,則要考慮重裝定時初值的時間(重裝定時器初值佔用2個機器周期)。

  在實際應用中,定時常採用中斷方式,如進行適當的循環可實現幾秒甚至更長時間的延時。使用定時器/計數器延時從程序的執行效率和穩定性兩方面考慮都是最佳的方案。但應該注意,C51編寫的中斷服務程序編譯後會自動加上PUSH ACC、PUSH PSW、POP PSW和POP ACC語句,執行時佔用了4個機器周期;如程序中還有計數值加1語句,則又會佔用1個機器周期。這些語句所消耗的時間在計算定時初值時要考慮進去,從初值中減去以達到最小誤差的目的。

2 軟體延時與時間計算

  在很多情況下,定時器/計數器經常被用作其他用途,這時候就只能用軟體方法延時。下面介紹幾種軟體延時的方法。

2.1 短暫延時

  可以在C文件中通過使用帶_NOP_( )語句的函數實現,定義一系列不同的延時函數,如Delay10us( )、Delay25us( )、Delay40us( )等存放在一個自定義的C文件中,需要時在主程序中直接調用。如延時10 μs的延時函數可編寫如下:

  void Delay10us( ) {
    _NOP_( );
    _NOP_( );
    _NOP_( );
    _NOP_( );
    _NOP_( );
    _NOP_( );
  }

  Delay10us( )函數中共用了6個_NOP_( )語句,每個語句執行時間為1 μs。主函數調用Delay10us( )時,先執行一個LCALL指令(2 μs),然後執行6個_NOP_( )語句(6 μs),最後執行了一個RET指令(2 μs),所以執行上述函數時共需要10 μs。  可以把這一函數當作基本延時函數,在其他函數中調用,即嵌套調用[4],以實現較長時間的延時;但需要注意,如在Delay40us( )中直接調用4次Delay10us( )函數,得到的延時時間將是42 μs,而不是40 μs。這是因為執行Delay40us( )時,先執行了一次LCALL指令(2 μs),然後開始執行第一個Delay10us( ),執行完最後一個Delay10us( )時,直接返回到主程序。依此類推,如果是兩層嵌套調用,如在Delay80us( )中兩次調用Delay40us( ),則也要先執行一次LCALL指令(2 μs),然後執行兩次Delay40us( )函數(84 μs),所以,實際延時時間為86 μs。簡言之,只有最內層的函數執行RET指令。該指令直接返回到上級函數或主函數。如在Delay80μs( )中直接調用8次Delay10us( ),此時的延時時間為82 μs。通過修改基本延時函數和適當的組合調用,上述方法可以實現不同時間的延時。

2.2 在C51中嵌套彙編程序段實現延時

  在C51中通過預處理指令#pragma asm和#pragma endasm可以嵌套彙編語言語句。用戶編寫的彙編語言緊跟在#pragma asm之後,在#pragma endasm之前結束。

  如:#pragma asm
    …
    彙編語言程序段
    …
    #pragma endasm

  延時函數可設置入口參數,可將參數定義為unsigned char、int或long型。根據參數與返回值的傳遞規則,這時參數和函數返回值位於R7、R7R6、R7R6R5中。在應用時應注意以下幾點:

  ◆ #pragma asm、#pragma endasm不允許嵌套使用;
  ◆ 在程序的開頭應加上預處理指令#pragma asm,在該指令之前只能有注釋或其他預處理指令;
  ◆ 當使用asm語句時,編譯系統並不輸出目標模塊,而只輸出彙編源文件;
  ◆ asm只能用小寫字母,如果把asm寫成大寫,編譯系統就把它作為普通變量;
  ◆ #pragma asm、#pragma endasm和 asm只能在函數內使用。

  將彙編語言與C51結合起來,充分發揮各自的優勢,無疑是單片機開發人員的最佳選擇。

2.3 使用示波器確定延時時間

  熟悉硬體的開發人員,也可以利用示波器來測定延時程序執行時間。方法如下:編寫一個實現延時的函數,在該函數的開始置某個I/O口線如P1.0為高電平,在函數的最後清P1.0為低電平。在主程序中循環調用該延時函數,通過示波器測量P1.0引腳上的高電平時間即可確定延時函數的執行時間。方法如下:

  sbit T_point = P1^0;
  void Dly1ms(void) {
    unsigned int i,j;
    while (1) {
      T_point = 1;
      for(i=0;i2;i++){
        for(j=0;j124;j++){;}
      }
      T_point = 0;
      for(i=0;i1;i++){
        for(j=0;j124;j++){;}
      }
    }
  }
  void main (void) {
    Dly1ms();
  }

塵埃粒子計數器相關文章:塵埃粒子計數器原理

相關焦點

  • keil c51 與 MDK 衝突的解決
    最近又作了一些C51的工作,發現keil c51與 mdk 有衝突。然後上網一查果然有很多人遇到這個問題,錯誤提示為下圖:本文引用地址:http://www.eepw.com.cn/article/201611/323622.htm其實這個是MDK和KEIL C51 配置文件衝突的問題,可以參考下兩個人的配置文件:[C51]PATH="D:Program FilesKeil_C702c51
  • 51單片機的幾種精確延時
    51單片機的幾種精確延時實現延時通常有兩種方法:一種是硬體延時,要用到定時器/計數器,這種方法可以提高CPU的工作效率,也能做到精確延時;另一種是軟體延時,這種方法主要採用循環體進行。1  使用定時器/計數器實現精確延時  單片機系統一般常選用11.059 2 MHz、12 MHz或6 MHz晶振。第一種更容易產生各種標準的波特率,後兩種的一個機器周期分別為1 μs和2 μs,便於精確延時。本程序中假設使用頻率為12 MHz的晶振。最長的延時時間可達216=65 536 μs。
  • keil C51中的本徵函數庫及使用說明
    >(unsigned int)val左移n位extern unsigned long _lrol_ (unsigned long val, unsigned char n));(unsigned long)val左移n位extern unsigned char _chkfloat_(float);測試並返回float的狀態一下摘自keil
  • KEIL4 工程到 KEIL5 程序的移植方法
    keil4.74中運行s3c2440程序出現警告 進行一步驟修改 安裝提示 一步一步的修改 解析 警告  warning: A1608W
  • 單片機keil 常見問題
    一、混合編程1、模塊內接口:使用如下標誌符:#pragma asm彙編語句#pragma endasm注意:如果在c51程序中使用了彙編語言
  • 簡析單片機keil常見問題
    一、混合編程  1、模塊內接口:  使用如下標誌符:  #pragma asm  彙編語句  #pragma endasm  注意:如果在c51程序中使用了彙編語言,注意在keil編譯器中需要激活Properties中的「
  • Keil C51程序調試過程
    圖1 編譯界面圖2 調試界面點擊「單步跳出」按鈕(或功能鍵F10),黃色箭頭從第13行往下移一行(14),再單擊「單步跳出」,則箭頭移到15行那邊,表示程序從第13行執行到第15行,(註:這種方式是一步一步執行程序,如果要同時執行幾行
  • 第5節:用keil軟體新建,關閉,打開一個完整工程的操作流程
    第二步:啟動keil軟體。雙擊桌面」keil uVision4」的圖標啟動keil軟體。第三步:關閉默認被打開的已有工程。打開keil軟體時,如果發現此軟體默認打開了一個之前已經存在的工程,請先關閉此工程。如果默認沒有打開已有工程,這一步可以忽略跳過。關閉已有工程的操作是這樣子的:點擊上面」Project」選項,在彈出的下拉菜單中選擇「Close Project」即可。
  • 使用Keil C進行51單片機延時程序編寫的幾點心得
    應用單片機的時候,經常會遇到需要短時間延時的情況。需要的延時時間很短,一般都是幾十到幾百微妙(us)。
  • ​STM32延時函數的四種方法
    本文基於STM32F207介紹4種不同方式實現的延時函數。這種延時方式應該是大家在51單片機時候,接觸最早的延時函數。這個比較簡單,讓單片機做一些無關緊要的工作來打發時間,經常用循環來實現,在某些編譯器下,代碼會被優化,導致精度較低,用於一般的延時,對精度不敏感的應用場景中。
  • 在keil中怎麼燒寫程序
    打開APP 在keil中怎麼燒寫程序 發表於 2017-11-16 10:52:58   什麼是keil
  • 用Keil C51開發串行口
    在這種通信方式中,接收器和發送器有各自的時鐘,它們的工作是非同步的。異步通信用一幀來表示一個字符,其內容是一個起始位,緊接著是若干個數據位。Ø同步通信。同步通信格式中,發送器和接收器由同一個時鐘源控制,在異步通信中,每傳輸一幀字符都必須加上起始位和停止位,佔用了傳輸時間,若要求傳送數據量較大,速度就會慢得多。
  • keil5.24創建uCOSIII工程實現stm32實時作業系統(環境配置)
    > 推薦閱讀 Keil5中51單片機和MDK的整合的方法 不知道論壇的朋友們是怎麼處理MDK和51的,在前一段時間,我是用Keil4來寫51,Keil5寫ARM。
  • 非常詳細的Keil工程建立全過程講解
    在單片機的開發或使用過程中除了掌握必要的硬體外,同樣離不開軟體,只有通過軟體(程序)的執行,硬體才能發揮出具體的作用。機器如何認識我們用各種符號編寫的程序呢?早期我們寫的彙編語言源程序要變為CPU可以執行的機器碼有兩種方法,一種是手工彙編,另一種是機器彙編,目前已極少使用手工彙編的方法了。
  • 技巧1 -- 在 Keil C51 中增加 STC 型號
    有的單片機是 STC 型號的,在 Keil C51 中建立工程的時候,沒有對應的晶片型號……本文引用地址:http://www.eepw.com.cn
  • 自學單片機第三篇:keil軟體
    圖標雙擊打開軟體,界面如下。第一個選項是文件,下拉表中,我們當前要點擊下圖黃色部分,安裝證書。綠化上圖就是打開後的界面,把前面複製的CID粘貼到第一欄,後邊選51,然後點下方左側按鍵,會在下方長框中出來一大串字符。複製它們。粘貼到下圖中下部,然後點添加。
  • 單片機與C語言——keil c51教程(1)
    在眾多單片機中51架構的晶片風行很久,學習資料也相對很多,是初學的較好的選擇之一。51的程式語言常用的有二種,一種是彙編語言,一種是C語言。彙編語言的機器代碼生成效率很高但可讀性卻並不強,複雜一點的程序就更是難讀懂,而C語言在大多數情況下其機器代碼生成效率和彙編語言相當,但可讀性和可移植性卻遠遠超過彙編語言,而且C語言還可以嵌入彙編來解決高時效性的代碼編寫問題。
  • iphone延時攝影怎麼拍的具體教程及延時攝影介紹
    近些年來雖然眾多的手機品牌層出不窮,在偌大的手機市場中佔據著一點份額。但即使是如此, 蘋果 手機在人們心中仍然是不少人的購機首選。時尚靚麗的直板設計,優秀的系統加上強大的硬體支持,讓每一款的蘋果手機都非常出色。而逐漸開始開放的蘋果IOS系統,也越來越多的增加了不少的新功能,下面小編就為大家介紹蘋果手機中的延時攝影相關的介紹以及使用方法。
  • ARM DS-5開發STM32程序(Eclipse配合Keil插件使用)
    選擇keil安裝目錄下的ARM\ARMCC\bin,然後確認點next、next通常會檢測出armcc的版本確認後如下圖,黃色的就是添加後的工具鏈。ds-5的環境設置到這裡完成,然後進行項目設置。5.源碼複製到DS-5項目。
  • 索尼微單如何進行延時攝影,兩種方法教你簡單上手!
    延時攝影是攝影中極具特色的一部分,大家在擁有相機後都可以嘗試一下延時攝影,體驗一下它的魅力。今天我們講的是索尼微單如何進行拍攝。現在索尼的微單基本都具有防抖功能,拍攝延時攝影時一定要記得關閉防抖圖中為開,拍攝時關閉即可不同的場景預設拍攝間隔也要有差別,拍攝車流往往在2-5秒,拍攝雲彩,星空等變化慢的需要長時間拍攝的間隔時間要10-15秒,主要也是為了讓cmos休息一下。