⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 多字节bin转bcd码.txt

📁 经常用到的51单片机子程序
💻 TXT
字号:
 BINADDR EQU 20H             ;存放二进制数的低位地址
 BCDADDR EQU 30H              ;存放BCD数的低位地址
 BYTES   EQU 3               ;二进制数的字节数
 ORG 0000H
 AJMP MAIN
 ORG 0030H
 MAIN:
     MOV 20H,#0ffH           ;赋实验值
     MOV 21H,#0ffH

;********************************************
;BCD码的内存清零
;********************************************
 BB0:
     MOV R1,#BCDADDR
     MOV R2,#BYTES
     INC R2
     CLR A
   B0:
     MOV @R1,A
     INC R1
     DJNZ R2,B0
;********************************************
;计算总的循环次数
;********************************************
     MOV A,#BYTES
     MOV B,#8
     MUL AB
     MOV R3,A       ;对于3字节的数,直接赋予#24就行了
;********************************************
;移出一位二进制数
;********************************************
  BB1:
     MOV R0,#BINADDR
     MOV R2,#BYTES
     CLR C
  B1:
     MOV A,@R0
     RLC A
     MOV @R0,A
     INC R0
     DJNZ R2,B1

;********************************************
;算法(  )*2+1
;********************************************
 BB3:
     MOV R2,#BYTES
     INC R2
     MOV R1,#BCDADDR
  B3:
     MOV A,@R1
     ADDC A,@R1
     DA A             
     MOV @R1,A         ;调整成为BCD码放在BCDADDR指针里
     INC R1
     DJNZ R2,B3     ;此时的R2是#4,共重复4次操作,BCD码的存放地址也应该是30H-33H

     DJNZ R3,BB1     ;总循环
     AJMP $
;余下的就是拆分压缩BCD码的操作

这是一个多字节的二进制数到BCD的转化程序,你只须再将30H-33H中的压缩BCD数转化一下即可.有不对的地方请批评指正

好复杂,稍微简化一下:(原理是一样的)


HEX2BCD:CLR A
        MOV 23H,A
        MOV 24H,A
        MOV 25H,A
        MOV R7,#16          ;2字节的!!!,改为#24
 LOOP16:MOV R0,#21H
        MOV R1,#25H
        MOV R6,#2           ;改为#3
        CLR C
    IN2:MOV A,@R0
        RLC A
        MOV @R0,A
        DEC R0
        DJNZ R6,IN2
        MOV R6,#3
   OUT3:MOV A,@R1
        ADDC A,@R1
        DA A
        MOV @R1,A
        DEC R1
        DJNZ R6,OUT3
        DJNZ R7,LOOP16
        RET 
的确是简单多了,不过好象是对两个字节数据的转化吧.不过要是多字节的话,把值该一下就好,多谢了.



在以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码的转换。





参考一下:
功能:多字节二进制转换为BCD数
入口:(BINADDR)=二进制数低位字节地址指针
(BCDADDR)=BCD数个位数地址指针
(BYTES)=二进制数字节数
__________________________________________
BINBCD2:

MOV R1,BCDADDR
MOV R2,BYTES
INC R2
CLR A

BB0:

MOV @R1,A
INC R1
DJNZ R2,BB0           清BCD码位
MOV A,BYTES
MOV B,#8
MUL AB
MOV R3,A                  ;需移位次数

BB3:

MOV R0,BINADDR
MOV R2,BYTES
CLR C

BB1:

MOV A,@R0
RLC A
MOV @R0,A
INC R0
DJNZ R2,BB1      ;各字节带进位左移动一次
MOV R2,BYTES
INC R2
MOV R1,BCDADDR

BB2:

MOV A,@R1
ADDC A,@R1
DA A
MOV @R1,A
INC R1
DJNZ R2,BB2
DJNZ R3,BB3
RET

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -