• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 測試測量 > 設計應用 > 智能儀表多字節二進制數轉換BCD碼

    智能儀表多字節二進制數轉換BCD碼

    作者: 時間:2006-05-07 來源:網絡 收藏

    摘要:多字節無符號二進制數轉BCD碼在以單片機為核心的智能儀表中應用很普遍。本文介紹一種新的轉換方法,并給出三字節二進制數轉BCD碼的源程序,該程序執行時間僅為原來的1.3%,效率提高顯著。

    本文引用地址:http://www.czjhyjcfj.com/article/255669.htm

    關鍵詞:多字節二進制整數 BCD碼 轉換

    一、引言

    在以MCS-51單片機為核心的智能儀表系統中,常遇到二進制整數轉換為BCD碼的情況。國內許多單片機書籍都對此進行了介紹并給出了子程序,但效率不高。本文參考文獻作者剖析了二進制整數轉BCD碼的子程序,分析了程序效率低的原因,給出了改進后的源程序,效率有所提高。以3字節的二進制整數為例,程序執行時間由2.856ms減小到2.410ms。還有沒有其它的辦法進一步大幅度減少轉換設計時間?本文介紹一種新的程序設計思路,給出的源程序將3字節二進制整數轉BCD碼執行時間僅為0.374ms。

    二、改進思路

    由進制數轉BCD碼的原理可知,這一轉換的實現的過程是(以3字節為例):首先把結果單元(這里是4個字節)清零,然后將待轉換的二進制數的最高位移入進位位C,把結果單元的值進行乘2加C運算的值又作為結果單元的值,循環24次后得出轉換的BCD碼。如果能完全避開效率運行的時間。這可用下例來說明:

    設結果單元某時的值為3456H,分別存放在R1、R2中,用如下的程序來完成結果單元乘2加(設C的當前值為1):

    MOV A,R1

    ADDC A,ACC

    DA A

    MOV R1,A

    MOV A,R2

    ADDC A,ACC

    DA A

    MOV R2,A

    程序中使用ADDC A,ACC指令完成乘2加C的工作,經過執行上面的程序,進位位C的值為0,R1、R2單元中的內容分別為69H、13H,該值即為結果單元的值。這樣就使程序避免了循環而又實現了結果單元乘2加C的功能。這個例子的結果單元為2字節,隨著進一步的運算,結果單元會變為3字節并最終變為4字節(以二進制數是3字節為例)。只要在程序中加以適當的控制,則可避免過多的運算,從而使轉換的速度加快。

    三、源程序

    程序名:FBCD

    程序功能:將三字節二進制數轉換為BCD碼。

    程序入口:20H,21H,22H,

    存放被轉換的三字節二進制數。

    程序出口為R1,R2,R3,R4,存放轉換的BCD碼的結果(見程序清單)。

    四、結語

    為了盡可能地減少轉換時間,使用了一些小技巧。例如:在程序開始轉換二進制數前3位時,考慮到這3位在進行乘2加C的操作時不會有進位位,則使用3條RL A,完成了前3位的轉換。該程序完成3字節二進制無符號整數轉BCD碼所需時間僅為374微秒,轉換時間縮短為原來的13%,效率提高是顯著的。另外,該程序比較靈活,程序中標注(****)處,已完成了2字節二進制整數轉三字節的BCD碼,程序執二字節二進制數轉BCD碼所需時間僅為194微秒,使用一條MOV R1,A指令,則轉換結果按由高到低的次序依次存放在R1,R2,R3中。當然,很容易在此程序基礎之上,實現4字節或更高字節無符號二進制整數向BCD碼的轉換。

    linux操作系統文章專題:linux操作系統詳解(linux不再難懂)


    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 浦县| 黑山县| 吉安县| 灯塔市| 洪湖市| 东至县| 广南县| 东源县| 余干县| 石阡县| 公安县| 鄂托克旗| 乌兰察布市| 井陉县| 多伦县| 台湾省| 茌平县| 榆林市| 南岸区| 光山县| 长汀县| 乐清市| 金沙县| 秦皇岛市| 原阳县| 阳新县| 岳普湖县| 怀远县| 清苑县| 即墨市| 淮安市| 松潘县| 安龙县| 余江县| 上虞市| 大荔县| 德江县| 合水县| 扶余县| 闽侯县| 福建省|