男女午夜激情_www.天堂av.com_亚洲综合小说区_亚洲欧美自拍视频_成年精品_久久www免费人成—看片_激情综合五月天_久久高潮视频_最新国产成人ab网站_国产精品卡一

機電之家資源網
單片機首頁|單片機基礎|單片機應用|單片機開發|單片機文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發
培訓信息
贊助商
51單片機整數二一十進制轉換的快速算法
51單片機整數二一十進制轉換的快速算法
 更新時間:2009-9-17 15:34:56  點擊數:0
【字體: 字體顏色

摘要 旨在提高89C51系列單片機鳊程中經常用到的整數二十進制轉換的代碼執行效率。提出的快速算法思路是,首先求出整數中包含的1000的個數,方法是采用二進制整數的高6位作為其預估,再通過2次校正得到準確值。算法的關鍵是充分利用89C51單片機的兩條特殊指令——單字節乘和單字節除。其耗費時間不及使用sprintf()函數的1/10。
關鍵詞 89C5l 單片機二一十進制轉換快速算法


    89C5l系列單片機歷經20多年的發展,仍然長盛不衰,在工業控制及儀器儀表中得到廣泛應用;用于89C5l單片機軟件開發的Keil C51編譯系統也日臻成熟,成為89C5l系列單片機軟件開發的優先選擇。在單片機系統開發中,經常遇到整數二十進制轉換的問題,一般可以采用C語言中的標準函數sprintf()來實現;但由于該函數是通用格式輸出函數,代碼量大(超過l KB),用于整數二一十進制轉換的運算時間過妊(在12 MHz晶振頻率下超過l ms),這在計算密集(computation intensive)的應用中是一個影響系統性能的重要因素。在低功耗系統設計中,也必須考慮因為運算時間長而增加系統耗電量的問題。經常有網發詢問如何高效地實現這種轉換。筆者通過對二進制整數的深入分析,巧妙運用89C5l單片機的特殊單字節乘除指令,成功地實現了整數二一十進制轉換的快速算法。本文將詳細介紹快速算法,給出頗具實用性的優化代碼,并與使用sprintf()函數的實現及傳統的匯編代碼實現進行性能比較。


1 傳統的匯編代碼實現
    要實現快速運算,很自然地想到教科書中提到的雙字節二進制整數轉換成3字節BCD碼整數的子程序。其采用的算法是,依次將整數的每位左移至CY位,再把CY位左移至一個3字節隊列中,并進行十進制調整。通過16次移位完成運算,結果為壓縮格式的3字節BCD編碼。
匯編子程序如下:
   

    該算法代碼簡潔明了,只使用51條指令代碼,但執行這段程序卻要耗費312個指令周期。如果要符合C51調用規則,則要多出25個指令代碼空間和21個指令周期,顯然效率不高。


2 快速算法
    快速算法從千位入手,首先求取整數中包含l 000的個數(以下稱為“千數”)。求取了千數,其他問題就迎刃而解了。
    設二進制整數以b=[b15…b0]表示,取值范圍為O~65535。其高6位[b15…b10]取值范圍為0~63,在整數中代表的數值為(0~63)*1024;后10位[b9…b0]代表的數值范圍為O~l 023。可以寫出如下算式:

   
    可以用[b15…b10]作為整數中千數的預估。
    余數的最大值為63×24+1 023=2535。這表明余數中最多還有2個l000,也就是說千數的預估誤差最多為2,因此最多通過2次校正,就可求得千數的準確值。2次校正方法:
    ①如果余數高位字節≥4(即余數≥1024,這樣用只是為了簡化代碼;也可以用余數≥1000的判定條件),則千數+l,余數~1000;
    ②如果余數≥l000,則千數+1,余數~l000。
    至此就求出了千數。千數用10整除所得商和模余作為萬位數和千位數。
    從余數中求取百、十,個位數也很簡單:
    余數用100整除得到百位數。實際是先把余數右移2位,此時已成單字節數,再用單字節除指令進行除以25的操作,即得到百位數;而除去百位后的余數已是單字節數,可輕易取得十位數與個位數。
    用C語言編寫的函數如下:

   

   
    在Keil C51集成環境中,為該函數生成匯編程序源碼,再對源碼進行優化,最后得到滿足C51調用規則的、效率極高的匯編語言源代碼。(源代碼見本刊網站www.mesnct.com.cn——編者注。)
    這個匯編語言源代碼可以直接作為項目文件使用,也可以用來生成函數庫。

3 性能比較
(1)與傳統匯編語言的性能比較
    符合C5l調用規則的傳統匯編語言子程序占用76字節的代碼空間,耗用333個指令周期;快速算法最多耗用107個指令周期,耗時只有傳統算法的32%。
(2)與使用sprintf()函數相比較
    使用如下的程序來比較二者的性能:
       

    sprintf()函數占用1064字節的代碼空間,耗用1151個指令周期;快速算法占用97字節的代碼空間,最多耗用107個指令周期,只占使用sprintf()函數耗時的9.3%。

結論
    無論是與傳統匯編語言子程序,還是與使用sprintf()函數的程序相比,快速算法都有很大的速度優勢;是一種針對8位機的創新算法,具有很強的工程實用性,值得推廣應用。

  • 上一篇: 單片機系統軟件抗干擾方法
  • 下一篇: 沒有了
  • 發表評論   告訴好友   打印此文  收藏此頁  關閉窗口  返回頂部
    熱點文章
     
    推薦文章
     
    相關文章
    網友評論:(只顯示最新5條。)
    關于我們 | 聯系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機電之家 | 會員助手 | 免費鏈接

    點擊這里給我發消息66821730(技術支持)點擊這里給我發消息66821730(廣告投放) 點擊這里給我發消息41031197(編輯) 點擊這里給我發消息58733127(審核)
    本站提供的機電設備,機電供求等信息由機電企業自行提供,該企業負責信息內容的真實性、準確性和合法性。
    機電之家對此不承擔任何保證責任,有侵犯您利益的地方請聯系機電之家,機電之家將及時作出處理。
    Copyright 2007 機電之家 Inc All Rights Reserved.機電之家-由機電一體化網更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術支持

    主辦:杭州市高新區(濱江)機電一體化學會
    中國行業電子商務100強網站

    網站經營許可證:浙B2-20080178-1
    主站蜘蛛池模板: 阿坝| 堆龙德庆县| 阳东县| 汾西县| 余干县| 周宁县| 图片| 九江县| 嘉义市| 包头市| 增城市| 温州市| 石泉县| 阳西县| 赤城县| 镇远县| 乌什县| 台安县| 株洲县| 会理县| 沅陵县| 郯城县| 松溪县| 大厂| 兖州市| 浙江省| 广宁县| 彩票| 金平| 长武县| 垫江县| 江口县| 临沧市| 铜川市| 青河县| 洛浦县| 贞丰县| 宜宾市| 板桥市| 特克斯县| 桃江县|