<li id="8g3ty"><tbody id="8g3ty"><th id="8g3ty"></th></tbody></li>
    <label id="8g3ty"><samp id="8g3ty"></samp></label>
  • <span id="8g3ty"></span>

    1. <center id="8g3ty"><optgroup id="8g3ty"></optgroup></center>
    2. <bdo id="8g3ty"><meter id="8g3ty"><bdo id="8g3ty"></bdo></meter></bdo><center id="8g3ty"><optgroup id="8g3ty"></optgroup></center>
      <label id="8g3ty"><samp id="8g3ty"></samp></label>

    3. 電子開發網

      電子開發網電子設計 | 電子開發網Rss 2.0 會員中心 會員注冊
      搜索: 您現在的位置: 電子開發網 >> 電子開發 >> EDA開發應用 >> Keilc >> 正文

      Keil C51下快速小數運算算法

      作者:佚名    文章來源:本站原創    點擊數:    更新時間:2008-10-31

      1引言
          實時控制系統程序設計中,常涉及到小數運算問題.計算機系統中用二進制表示小數的方法有定點數表示法和浮點數表示法.采用浮點數表示法表示的小數范圍大、精度高,但程序代碼長,運算速度慢.定點數表示的小數范圍小、精度低,但程序代碼短,運算速度快.
          使用C語言設計程序具有程序可讀性強,編程方便等優點,但按常規方法設計程序時,實時性不如采用匯編語言設計的程序,這在涉及到小數運算時表現更為突出.這樣就限制了C語言的應用.如果采用合適的計算方法,使用C語言編程可以獲得與匯編語言編程同樣的實時性.
          實時控制系統中的前向通道采集的原始數據大多是定點整數,例如前向模擬通道的A/D轉換器的轉換結果,定時/計數器的計數結果等,都是定點整數.而系統的后向通道能接受的輸入量也都為整數,即由量化產生的有限字長誤差不可避免,精確到小數位的控制量因執行機構無法接受而不得不舍去.因而,雖然采用定點數表示小數的方法精度低,但在大多數情況下,仍能滿足實時控制系統的控制精度要求.
          MCS-51單片機的內部程序存儲器僅有4K,運算速度較慢.對于實時性、代碼長度限制要求較高的控制系統,采用MCS-51單片機控制時,不宜大量采用浮點運算.本文介紹Keil C51下的16位定點小數的乘法程序.

      2 定點小數運算算法
      1.1 控制算法的特點.
          計算機實時控制系統中,控制算法通常可用下面的差分方程表示.
       
          式中y[n]為第n個采樣周期的輸出,通常為二進制整數;x [n]為第n個采樣周期的輸入,通常也為二進制整數;ai、bi為實系數.在保證計算精度的條件下,計算上述差分方程時,將系數ai、bi轉換成整數或定點小數,會大幅度提高運算速度和大幅度減少代碼長度.這對于在程序存儲器容量或運算速度有限的嵌入式控制器中實現快速控制算法計算有重要意義.

      1.2 定點小數
          小數可分為整數部分為0的純小數和帶整數的小數.純小數可直接用定點小數表示,當使用16位定點小數時,分辯率可達2-16,可以獲的足夠的運算精度.

      1.3 定點算法
          設x為十進制純小數,M為16位二進制整數.若程序需計算y=(x·M)取整,則可先將x轉換成16位二進制定點小數.
      X =(x·65536)取整          (2)
          由于X的小數點在X的最高位前,2個16位二進制數相乘結果為32位二進制數,小數點在高16位和低16位間,乘法運算后的高16位為計算結果的整數部分,低16位為計算結果的小數部分.即
      (x·M)取整=(X·M)取高16位                    (3)
          這樣處理后可以大幅度提高運算速度,且大幅度減少代碼長度.
          匯編語言程序設計中的取整操作容易實現,在C語言中實現取整操作可以使用聯合體,方法如下.
      先定義2個聯合體.
      union{
      unsigned char a_byte[4];
      long a_long;
      }r;
      union{
      unigned char b_byte[2];
      int b_int;
      }p;
           第一個是長整數變量與4字節變量的聯合體,長整型變量用于保存計算結果,第二個是整型變量與2個字節型變量的聯合體,用于取整運算.在Keil C51中,長整數占4個字節,在RAM中按從高到低的順序存放,r.a_byte[0]、r.a_byte[1]存放計算結果的整數部分,r.a_byte[2]、r.a_byte[3]存放計算結果的小數部分.
          通過下列程序,實現取整運算.
      p.b_byte[0]=r.a_byte[0];
      p.b_byte[1]=r.a_byte[1];
          這樣p.b_int為計算結果的整數部分.以上程序在編譯后僅為2條數據傳送指令,需要4個機器周期的執行時間.與采用除法運算或移位運算實現取整運算相比,具有更快的執行速度.

      3 程序
          設程序需要計算0.12345乘16位二進制數后取整,采用浮點數時的程序如下所示.
      main()
      {
      int b;
      b=20000;
      a=0.12345*b;
      }
      本程序的運行結果a=2527,程序編譯后長度513字節,做浮點運算時需要602個機器周期.
      main()
      {
      int a,b;
      union{
      char c[4];
      long d;
      }u1;
      union{
      char e[2];
      int f;
      }u2;
      b=20000;
      u1.d=(long)8090*b;
      u2.e[0]=u1.c[0];
      u2.e[1]=u1.c[2];
      }
      本程序的運行結果u2.f=2527,程序編譯后長度129字節,做整數運算時僅需134個機器周期.

      4 結束語
          采用本文中所述方法,使用c語言設計MCS-51單片機控制算法程序,可獲得與采用匯編語言設計的控制算法程序同樣的效果.充分發揮了
      c語言設計程序的優點,筆者在設計的某控制系統時,采用這種方法在獲得了很好的效果.

      Tags:Keil c,小數運算算法  
      責任編輯:admin
      請文明參與討論,禁止漫罵攻擊,不要惡意評論、違禁詞語。 昵稱:
      1分 2分 3分 4分 5分

      還可以輸入 200 個字
      [ 查看全部 ] 網友評論
      推薦文章
      最新推薦
      熱門文章
      關于我們 - 聯系我們 - 廣告服務 - 友情鏈接 - 網站地圖 - 版權聲明 - 在線幫助 - 文章列表
      返回頂部
      刷新頁面
      下到頁底
      晶體管查詢
      主站蜘蛛池模板: 丁香五月亚洲综合深深爱| 91精品国产综合久久四虎久久无码一级| 狠狠色丁香久久婷婷综合_中| 激情五月激情综合| 亚洲国产综合久久天堂| 91精品国产综合久久香蕉 | 久久综合九色综合97手机观看| 99久久综合狠狠综合久久aⅴ| 亚洲精品国产综合久久久久紧| 狠狠色综合久色aⅴ网站| 国产成人综合久久精品免费| 色妞色综合久久夜夜| 亚洲综合无码AV一区二区| 本道久久综合无码中文字幕| 五月婷婷综合在线| 99久久国产综合精品swag| 亚洲色图综合在线| 国产综合成人色产三级高清在线精品发布 | 精品亚洲综合在线第一区| 色欲色香天天天综合VVV| 亚洲欧美国产国产综合一区| 99久久婷婷国产综合亚洲| 精品亚洲综合久久中文字幕| 国产婷婷色综合AV蜜臀AV| 一本一道久久a久久精品综合| 色偷偷91久久综合噜噜噜| 久久精品桃花综合| 国产精品亚洲综合网站| 国产精品亚洲综合天堂夜夜| 综合激情区视频一区视频二区 | 久久综合九色综合97伊人麻豆| 久久久久综合一本久道| 色欲久久久天天天综合网| 久久综合亚洲色HEZYO社区| 色综合网天天综合色中文男男| 成人综合久久精品色婷婷| 婷婷久久久五月综合色| 中文字幕国产综合| 曰韩人妻无码一区二区三区综合部 | 色综合久久无码中文字幕| 久久天堂av综合色无码专区|