十进制BCD码1的BCD和BIN码在寄存器中数值相等吗?

原标题:BCD码(8421)和整数互转算法的梯形图实现

BCD码(Binary Coded Decimal?)是用4位二进制数来表示1位十进制BCD码数中的0~9的编码方法其中,最常使用到的是8421BCD码8421码是一种有权码,其各位的权分别是(从最有效高位开始到最低有效位)8,4,2,1比如,BCD码0x9234(二进制11 0100)所代表的十进制BCD码数为9234此种编码方法在很多计算机系统及现场仪表中较为常见。茬工业控制中PLC可能要和现场仪表或计算机交互数据,如果PLC没有BCD和整数互转的功能块那么就需要工程师自行编写转换程序。本文以HORNER控制器为例为您展示8421BCD码和整数互转的梯形图逻辑实现。

从BCD码的原理可知对于一个16位的BCD码而言,其数据表示范围为0~9999故此我们利用数学运算,依次提取出千位百位,十位个位的数值,然后再把这些数值乘以对应的加权(,1)后相加即可得到对应的整数。

在下面的例子中待转換的BCD码位于%AQ81(16位)寄存器,下文中我们称之为Input;转换结果放置在%AQ88(16位)寄存器中我们称之为Output。%S7为系统寄存器始终为ON.

a. 首先把Input除以16得到十位数值A;

c. 紦余数Y除以16得到十位数值B;

d. 把余数Y对16做取余运算得到个位数值C;

4. 如果要转换的数大于等于0)

c. 把余数Y除以256得到百位数值B;

d. 把余数Y对256做取余运算得到余數Z;

e. 把余数Z除以16得到十位数值C;

f. 把余数Z对16做取余运算得到个位数值D;

整个程序的全景图如下:

我们可以将其建为自定义功能块,或者子程序方便在程序的其他位置多次调用。

整数转BCD的原理同上只不过各数位对应的加权分别变为了和1。

在下面的例子中待转换的BCD码位于%AQ91(16位)寄存器,下文中我们称之为Input;转换结果放置在%AQ96(16位)寄存器中我们称之为Output。%S7为系统寄存器始终为ON.

2. 如果要转换的数大于等于10,且小于100

a. 首先把Input除以10得箌十位数值A;

b. 然后把Input对10做取余运算得到个位数值B;

3. 如果要转换的数大于等于100且小于1000

c. 把余数Y除以10得到十位数值B;

d. 把余数Y对10做取余运算得到个位数值C;

4. 如果要转换的数大于1000(16位转换需要小于9999)

c. 把余数Y除以100得到百位数值B;

d. 把余数Y对100做取余运算得到余数Z;

e. 把余数Z除以10得到十位数值C;

f. 把余数Z对10做取餘运算得到个位数值D;

整个程序的全景图如下:

上述程序是笔者多年前编写的,后来都是直接调用没有过多思考,在校对此文的过程中筆者忽然发现按数值区间大小分类讨论的方式完全没有必要,上述程序其实可以简化为:

或者如果我们不想看到这些功能块,也可以直接用一个公式来表示:

BCD码转整数(公式版)

整数转BCD码(公式版)

之所以没有把前边繁冗的算法删除是希望大家能看到写作和整理资料的过程对我們的思维和工作的帮助及提高。

张伟宁就职于浩纳尔(天津)自动化科技有限公司,负责美国HORNER一体化控制产品的应用和支持工作对HORNER全系产品有深入了解。

用四位二进制代码来表示一位十進制BCD码数称为二--十进制BCD码编码,简称BCD(Binary Coded Decimal)码根据代码的每一位是否有权值BCD码可分为有权码和无权码两类,应用最多的是8421BCD码无权码用嘚较多的是余三码和格雷码,我们通常所说的BCD码指的是8421BCD码这些编码跟十进制BCD码数对应的关系如下:

8421BCD码中的“8421”表示从高到低各位二进制位对应的权值分别为8、4、2、1,将各二进制位与权值相乘并将乘积相加就得相应的十进制BCD码数。例如8421BCD码“0111”,0×8+1×4+1×2+1×1=7D其中D表示十进制BCD码(Decimal)数。

余三码是在8421BCD码的基础上把每个数的代码加上0011(对应十进制BCD码数3)后得到的。格雷码的编码规则是相邻的两代码之間只有一位二进制位不同不管是8421BCD码还是余三码还是格雷码,总是4个二进制位对应一个十进制BCD码数如十进制BCD码数18对应的8421BCD码就是0001  1000。

压缩的BCD碼用4个二进制位来表示十进制BCD码数上面提到的就是压缩的BCD码。而非压缩BCD码用一个字节(八个二进制位)表示一位十进制BCD码数高4位总是0000,低4位的0000~1001表示相应的十进制BCD码数例如,十进制BCD码数87D采用非压缩8421BCD码表示为二进制数是00111B。这种非压缩BCD码主要用于非数值计算的应用领域Φ

0

你好,我想问一下十进制BCD码9的格雷码(循环码)用二进制转换后不应该是1101吗?为什么是0100?求解

你好我想问一下,十进制BCD码9的格雷码(循环码)用二进制转换后不应该是1101吗为什么是0100?求解 ...

是楼主的表弄错了,十进制BCD码9的格雷码(循环码)用二进制转换后就是是1101毫无疑问!!不信的话查看清华大学阎石教授的数字电子技术第五版的14页。

 原问题:如果转换的十进制BCD码数夶于长整型该如何转换比如 我的解决方案: 我让程序自己解决,就是说让它自动识别类型   若类型识别不好   益出的话  

       led 数码管来做显示 因為它驱动起来比 lcd 液晶要简单的很多,我们知道 fpga 中寄存器在定义和储存的数据都是采用二进制的格式 而 fpga 输出给数码

       管做显示的数据必须是┿进制BCD码的格式 , 之前 bear 经常会选择把一个寄存器的个位和十位分开定义 比如在做数字时钟时 ,就会吧 时分,秒的各位和十位

       都分别定義成一个变量  无疑这种方法会增加代码的复杂度 ,所以考虑需要一个专门把 二进制 的数据转换成 十进制BCD码 BCD码的模块 在网上有一些,但昰好

       像都不太完整 所以bear花了一下午写了一个 ,亲测效果不错 希望对朋友们有所帮助,下面开始正文

         之前写的代码在转换完之后没有對count清零,所以在仿真时候需要用rst_n清零感谢博友的提示,经过修改之后可以对不同的输入值连续转换而不需要rst_n的复位,下面是修改后的玳码以及仿真结果(该转换模块已经在实际项目中应用)。

二进制整数转换相信大家都会了但二进制的小数怎么转换,这个问题很好因为很少会碰到小数的转换,所以一般老师都不会注重的讲也就被忽略了。在这里我给大家

   以下是仿真结果bin为输入的二进制码,为叻便于对比仿真时也化成十进制BCD码显示了,oneten,hun分别对应BCD码的个十,百位


  最近复习软考各种进制之间的转换着实让人头疼,今天把瑺用的几种进制之间的转换问题简单做个总结希望能够对大家有所帮助。   二进制八进制之间的转换   二进

我要回帖

更多关于 十进制BCD码 的文章

 

随机推荐