那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

教你一招——嵌入式C通用延時驅動的編寫方法

jf_35136247 ? 來源:jf_35136247 ? 作者:jf_35136247 ? 2023-07-05 10:27 ? 次閱讀

嵌入式C通用延時驅動編程中,免不了要用到軟件延時。這一般通過循環語句實現。通過控制循環語句的循環次數,便可獲得多種不同的延時時間。為了便于使用和提高程序代碼的復用率,一般又將循環語句封裝成一個帶參數的函數,稱為延時函數。如:

void wait(unsigned int n)

  {

    unsigned int i;

    for(i=0;i

}

延時函數的參數(形參,如上例中的變量 n ),即為控制循環語句循環次數的變量。這樣,在需要軟件延時的時候,只需要調用延時函數,并將實際參數(實參,即n的實際值)代入形參,便可獲得與該實際參數對應的延時時間。

這便是經典的軟件延時的實現方法,非常簡單。

但細心的讀者會發現:延時函數的參數(比如上面的 n ),表征的是循環語句的“循環次數”,而不是“實際的延時時間”。一般來說,假令循環語句每循環一次的時間為 b(注意,單位是“步”,即一個時鐘周期,下同),函數調用、傳值和返回所需的固有時間為 a ,那么,給定參數 n 時,調用一次延時函數實際實現的延時時間應為 t = a + b*n , ——而不是 n !

這就意味著,當需要的延時時間為 t 時,應當傳入的實參為 n = (t-a)/b,而不是 t 。這樣,為了獲得比較準確的延時,每次調用函數之前,都要手工計算實際參數,很不方便;其次,當需要改變晶振頻率的時候,程序中所有的延時參數都要重新計算,這顯然不利于程序的移植。

為了解決這兩個問題,提高嵌入式C通用延時驅動程序的可移植性,可以利用宏定義的方式,對延時函數進行參數預修正。例如,對上面給出的wait延時函數,可以使用下面的宏定義:

#define delay(n)   wait(     (   (n) - a  ) / b     )

這樣,調用 delay(t) 就意味著調用 wait( (t-a)/b ) ,從而得到時間為t的延時,實現了參數與延時時間的同步,使用起來更加方便。

為了進一步提高可移植性,使軟件延時能夠適應不同的晶振頻率,應當順著上面的思路選擇尋找更優方案。那么,應當怎樣做呢?其實方法很簡單。假設調用某個延時函數 wait_step(n) 可以獲得 n 步的延時,又設工作頻率為 f1,即每步的運行時間為 T=1/f1,則實際獲得的延時時間為 t= n*T=n/f1。當工作頻率變為 f2=C*f1 時,程序運行速度快了C倍,為了仍然獲得時間為t的延時,程序運行的步數應當是原來的C倍,即要調用wait_step(n*C)。這樣,我們就可以定義下面的宏,來完成(n*C)的運算:

#define   C    4
#define   delay_t(n)  wait_step( n*C )

第一行一般寫在文件開頭,當修改晶振頻率時,只需修改這一處就行了,不必在程序中對各個 wait_step(n)的參數一一修改,大為方便。

按照上面介紹的方法,可以編寫出準確、易用、通用的延時驅動。

下面給出一個完整的延時驅動程序。這是筆者早期編寫的版本,最近重新整理過。編繹器是ICC AVR V7.13A,運行環境是AVR系列的所有芯片。使用的語句有三個:

微秒級延時:delay_us(n); 延時n微秒

毫秒級延時:delay_ms(n); 延時n毫秒

秒級延時: delay_s(n); 延時n秒 (最大65秒)

以上就是嵌入式C通用延時驅動的編寫方法了,希望能對編程人員有一定的幫助,如有更多技術問題,可以電話聯系我們,直接獲取幫助,期待您的來電!

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5093

    文章

    19178

    瀏覽量

    307715
  • 編程
    +關注

    關注

    88

    文章

    3637

    瀏覽量

    93989
  • 函數
    +關注

    關注

    3

    文章

    4346

    瀏覽量

    62978
收藏 人收藏

    評論

    相關推薦

    教你如何學習嵌入式

    的幾種方式 熟悉嵌入式Linux中的任務間同步與通信編寫個簡單的管道程序實現文件傳輸 編寫個使用共享內存的程序7、
    發表于 11-07 09:34

    教你一招如何分辨PCB板層數

    教你一招如何分辨PCB板層數
    發表于 04-23 06:36

    教你一招如何去實現傅立葉變換算法?

    教你一招如何去實現傅立葉變換算法?
    發表于 04-30 06:05

    教你一招怎樣去選擇合適的CPLD

    CPLD有哪些優點?教你一招怎樣去選擇合適的CPLD
    發表于 05-06 09:48

    教你一招分分鐘實現頻譜儀帶寬的正確設置

    教你一招分分鐘實現頻譜儀帶寬的正確設置
    發表于 05-07 06:36

    教你一招定時器中斷該怎么辦?

    教你一招定時器中斷該怎么辦?
    發表于 05-14 06:34

    教你一招如何去選擇射頻濾波器?

    教你一招如何去選擇射頻濾波器?
    發表于 05-28 07:05

    求大神分享嵌入式C通用延時驅動編寫方法

    求大神分享嵌入式C通用延時驅動編寫方法
    發表于 09-24 06:46

    嵌入式C實現延時程序的不同變量的區別 幾種Linux嵌入式開發環境的簡單介紹

    嵌入式C實現延時程序的不同變量的區別 幾種Linux嵌入式開發環境的簡單介紹 ARM嵌入式開發基礎 對話微軟MVP:走進
    發表于 04-14 07:24 ?1696次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b>實現<b class='flag-5'>延時</b>程序的不同變量的區別 幾種Linux<b class='flag-5'>嵌入式</b>開發環境的簡單介紹

    嵌入式C通用延時驅動編寫方法

    嵌入式C編程中,免不了要用到軟件延時。這般通過循環語句實現。通過控制循環語句的循環次數,便可獲得多種不同的延時時間。為了便于使用和提高程
    發表于 05-23 15:30 ?2288次閱讀

    C語言里如何編寫精確的微量延時

    眾所周知,相比于其他編程語言,C語言在編寫嵌入式編程中有著絕對的優勢。但它總也有缺點的:它的時序性比較差,不容易編寫精準的延時。而在
    發表于 05-23 16:33 ?1701次閱讀

    教你如何編寫優質的嵌入式C程序?

    市面上介紹C語言以及編程方法的書數目繁多,但對如何編寫優質嵌入式C程序卻鮮有介紹,特別是對應用于單片機、ARM7、Cortex-M3這類微控
    的頭像 發表于 06-22 14:23 ?8233次閱讀
    <b class='flag-5'>教你</b>如何<b class='flag-5'>編寫</b>優質的<b class='flag-5'>嵌入式</b><b class='flag-5'>C</b>程序?

    一招讓手機屏立馬干凈

    手機屏幕油膩還滿是手印?教你一招,立馬干凈亮閃閃
    的頭像 發表于 08-27 17:26 ?4789次閱讀

    如何編寫優質的嵌入式C程序?

    1、簡介市面上介紹C語言以及編程方法的書數目繁多,但對如何編寫優質嵌入式C程序卻鮮有介紹,特別是對應用于單片機、ARM7、Cortex-M3
    的頭像 發表于 03-17 09:44 ?1903次閱讀
    如何<b class='flag-5'>編寫</b>優質的<b class='flag-5'>嵌入式</b><b class='flag-5'>C</b>程序?

    哪些晶體、諧振器和振蕩器可旋轉180°使用?一招教你快速識別

    哪些晶體、諧振器和振蕩器可旋轉180°使用?一招教你快速識別
    的頭像 發表于 12-05 16:37 ?437次閱讀
    哪些晶體、諧振器和振蕩器可旋轉180°使用?<b class='flag-5'>一招</b>兒<b class='flag-5'>教你</b>快速識別
    KTV百家乐的玩法技巧和规则| 怎样玩百家乐官网的玩法技巧和规则| 至尊百家乐吕文婉| 网上百家乐官网正规代理| 大发888检测技能| 百家乐游戏算牌| 百家乐官网网娱乐城| 博之道百家乐的玩法技巧和规则 | 大发888官方游戏平台| 解析百家乐投注法| 百家乐官网高手长胜攻略| 威尼斯人娱乐场wnsrdcylcbywz | 全迅网百家乐的玩法技巧和规则| 破解百家乐官网真人游戏| 澳门赌场| 免费百家乐统计| 做生意用的 风水上最好的尺寸有| 保单百家乐官网技巧| 大发888娱乐城下载电脑怎么上乐讯新足球今日比分 | 百家乐官网庄闲局部失衡| 百家乐赌现金| 百家乐官网网络游戏信誉怎么样| 木兰县| 大发888亚洲| 太阳城百家乐红利| 百家乐官网计划| 足球走地| 传奇百家乐的玩法技巧和规则 | 百家乐官网网站程序| 澳门永利| 威尼斯人娱乐城网上赌博| 百家乐博彩资讯论坛| 百家乐官网凯时娱乐网| 西丰县| 手机棋牌游戏下载| 钱隆百家乐的玩法技巧和规则| 做生意风水摆件| 百家乐官网电脑赌博| 投注平台出租| 大发888娱乐城菲律宾| 百家乐号解码器|