51单片机二~十进制的转化方法.doc_第1页
51单片机二~十进制的转化方法.doc_第2页
51单片机二~十进制的转化方法.doc_第3页
51单片机二~十进制的转化方法.doc_第4页
51单片机二~十进制的转化方法.doc_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘要 旨在提高89C51系列单片机鳊程中经常用到的整数二十进制转换的代码执行效率。提出的快速算法思路是,首先求出整数中包含的1000的个数,方法是采用二进制整数的高6位作为其预估,再通过2次校正得到准确值。算法的关键是充分利用89C51单片机的两条特殊指令单字节乘和单字节除。其耗费时间不及使用sprintf()函数的110。关键词 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=b15b0表示,取值范围为O65535。其高6位b15b10取值范围为063,在整数中代表的数值为(063)*1024;后10位b9b0代表的数值范围为Ol 023。可以写出如下算式: 可以用b15b10作为整数中千数的预估。 余数的最大值为6324+1 023=2535。这表明余数中最多还有2个l000,也就是说千数的预估误差最多为2,因此最多通过2次校正,就可求得千数的准确值。2次校正方法: 如果余数高位字节4(即余数1024,这样用只是为了简化代码;也可以用余数1000的判定条件),则千数+l,余数1000; 如果余数l000,则千数+1,余数l000。 至此就求出了千数。千数用10整除所得商和模余作为万位数和千位数。 从余数中求取百、十,个位数也很简单: 余数用100整除得到百位数。实际是先把余数右移2位,此时已成单字节数,再用单字节除指令进行除以25的操作,即得到百位数;而除去百位后的余数已是单字节数,可轻易取得十位数与个位数。 用C语言编写的函数如下: 在Keil C51集成环境中,为该函数生成汇编程序源码,再对源码进行优化,最后得到满足C51调用规则的、效率极高的汇编语言源代码。(源代码见本刊网站wwwmesnctcomcn编者注。) 这个汇编语言源代码可以直接作为项目文件使用,也可以用来生成函数库。3 性能比较(1)与传统汇编语言的性能比较 符合C5l调用规则的传统汇编语言子程序占用76字节的代

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论