16位二进制数转换成BCD码.docx

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
16位二进制数转换成BCD码

16位二进制数转换成BCD码的的快速算法-51单片机2010-02-18 00:43在做而论道上篇博文中,回答了一个16位二进制数转换成BCD码的问题,给出了一个网上广泛流传的经典转换程序。说它经典,不仅是因为它已经流传已久,重要的是它的编程思路十分清晰,十分易于延伸推广。做而论道曾经利用它的思路,很容易的编写出了48位二进制数变换成16位BCD码的程序。但是这个程序有个明显的缺点,就是执行时间太长,转换16位二进制数,就必须循环16遍,转换48位二进制数,就必须循环48遍。上述的HEX2BCD子程序,虽然长度仅仅为26字节,执行时间却要用331个机器周期。.单片机系统多半是用于各种类型的控制场合,很多时候都是需要“争分夺秒”的,在低功耗系统设计中,也必须考虑因为运算时间长而增加系统耗电量的问题。为了提高整机运行的速度,在多年前,做而论道就另外编写了一个转换程序,程序的长度为81字节,执行时间是81个机器周期,(这两个数字怎么这么巧!) 执行时间仅仅是经典程序的1/4!.近来,在网上发现了一个链接:/news/Article/uc/uc8051/200803/4751.html,也对这个经典转换程序进行了改进,话是说了不少,只是没有实质性的东西。这篇文章提到的程序,一直也没有找到,也难辩真假。这篇文章好像是选自某个著名杂志,但是在术语的使用上,有着明显的漏洞,不像是专业人员的手笔。比如说文中提到的:“使用51条指令代码,但执行这段程序却要耗费312个指令周期”,就是败笔。51条指令代码,真不知道说的是什么,指令周期是因各种机型和指令而异的,也不能表示确切的时间。.下面说说做而论道的编程思路。;-----------------------------------------------------------------------;已知16位二进制整数n以b15~b0表示,取值范围为0~65535。;那么可以写成:; n = [b15 ~ b0];把16位数分解成高8位、低8位来写,也是常见的形式:; n = [b15~b8] * 256 + [b7~b0];那么,写成下列形式,也就可以理解了:; n = [b15~b12] * 4096 + [b11~b0];式中高4位[b15~b12]取值范围为0~15,代表了4096的个数;;上式可以变形为:; n = [b15~b12] * 4000 + {[b15~b12] * (100 - 4) + [b11~b0]};用x代表[b15~b12],有:; n = x * 4000 + {x * (100 - 4) + [b11~b0]};即:; n = 4*x (千位) + x (百位) + [b11~b0] - 4*x;写到这里,就可以看出一点BCD码变换的意思来了。;;上式中后面的位:[b11~b0] - 4*x,如果小于256,那就太简单了,马上就可以去按照常规转换BCD了。;如果数值较大,就要把[b11~b7]看成128的个数y;在百位中加上y、在十位加上3*y、并在[b6~b0]中减去2*y。;那么就有:; n = 4*x (千位) + x (百位) + [b11~b0] - 4*x; n = 4*x (千位) + (x + y) (百位) + 3*y (十位) + [b6~b0] - 2*y;由此,就可以明确由高9位[b15~b7]变换出来十进制的各个位的数值,可能大于9,到最后整理一下即可。;剩下的低7位[b6~b0],已经是单字节数据,变换成BCD码那就十分简单了。;-----------------------------------------------------------------------从最后的表达式中可以看出,高9位变换的计算方法极为简单,只是使用左移、加减等指令即可,基本上不涉及多字节的运算。编程的时候,要充分利用单字节、单周期的指令,使程序的长度和执行时间尽量缩短。做而论道的编程思路已经给出,程序代码还是过一段时间再公布,给大家留下一个发挥的时间。感兴趣的网友可以留言,写出自己编写的程序。51单片机把4位16进制数转成10进制数的方法2010-02-10 23:33, 2位16进制转10进制,用除以10求商跟余数的方法,即可。4位16进制数呢?DIV指令只可以对2位16进制数进行除法运算啊,求高手解答。例如把TH1 TL1的数值转成十进制, 分别存入R4 R3 R2 R1 R0。我要的是汇编的方法,C语言还没学到。悬赏分:30 - 解决时间:2010-2-10 22:47 ;------------------------------------------------------------------最佳答案:两个字节的二进制

文档评论(0)

wuyuetian + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档