用51单片机编程

用51单片机编程求二进制转化为十进制的程序。 还有十进制转化为十六进制的程序,具体怎么编程啊。我是新手。各位知道的请帮一下忙。

第1个回答  2019-07-06
单片机中只有一条语句是对进制调整的
DA
A
对累加器A的结果进行十进制调整
如果随意对一个累加器A中的二进制数据进行“二进制转十进制”调整是没有任何实际意义的!
DA调整的对象是ADD或ADDC以后的结果,而且是BCD码相加以后才能够加以调整,否则没有实际意义!
比如,现在我想执行12D+39D也就是两个十进制数相加这样一个加法(有时候程序处理的需要,数据在单片机中是以BCD码的形式存储的,也就是12H和39H(十六进制),但我们可以人为将它们看为12D和39D(十进制),而且还希望相加以后的结果为51H,也就是说符合十进制运算规则12+39=51,而不是4BH的结果),但这样的十进制加法运算在单片机中是不能够直接实现的。因为单片机只能够执行二进制加法指令,也就是所有的运算都按照二进制中的规则进行!
于是就出现了DA调整指令!
现在12H+39H,将12H放于A中,执行
ADD
A,#39H指令,则结果为4BH,这不是我们希望的51H的数据形式!!这时执行DA
A
指令后,就会将A中的数据调整为51H(具体调整过程和原理你可以详细看书,如果单片机书中讲的不详细,那么微机原理中一定说的非常详细),而我们按照BCD码规则就将其看为51D,符合我们的要求!
也就是说加数和被加数都是BCD码的形式,最大也只可能是99H,也就是我们十进制数中的99,只有这样才会有实际的意义!
所以DA
A指令只用于十进制BCD码加法指令以后,否则是没有实际意义的!
在单片机中数据就是以二进制存放的也可以说是以16进制存放(4位二进制就是16进制),所以一般来说在单片机只有二进制转十进制才有意义,通过单片机将十进制转二进制是没意义的。
这个一般都是我们自己把一个十进制数转成二进制再送给单片机处理。
非得编写程序的话
程序如下
----------------------------------------------------------------------
;二进制整数(2位)转换为十进制整数(组合BCD码)
;入口:
R3,R4
;出口:
R0
IBTD22
:
MOV
A,R0
PUSH
A
MOV
R7,#03H
CLR
A
IBD221
:
MOV
@R0,A
INC
R0
DJNZ
R7,IBD221
POP
A
MOV
R0,A
MOV
R7,#10H
IBD222
:
PUSH
A
CLR
C
MOV
A,R4
RLC
A
MOV
R4,A
MOV
A,R3
RLC
A
MOV
R3,A
MOV
B,#03H
IBD223
:
MOV
A,@R0
ADDC
A,@R0
DA
A
MOV
@R0,A
INC
R0
DJNZ
B,IBD223
POP
A
MOV
R0,A
DJNZ
--------------------------------------------------
;二进制整数(M位)转换为十进制整数(组合BCD码)
;入口:
R1,M,N
;出口:
R0
IBTDMN
:
MOV
A,R0
MOV
R2,A
MOV
A,R1
MOV
R3,A
MOV
B,N
CLR
A
IBDMN1
:
MOV
@R0,A
INC
R0
DJNZ
B,IBDMN1
MOV
A,M
SWAP
A
RR
A
CLR
C
MOV
R7,A
IBDMN2
:
MOV
A,R2
MOV
R0,A
MOV
A,R3
MOV
R1,A
MOV
B,M
IBDMN3
:
MOV
A,@R1
RLC
A
MOV
@R1,A
INC
R1
DJNZ
B,IBDMN3
MOV
B,N
IBDMN4
:
MOV
A,@R0
ADDC
A,@R0
DA
A
JNB
ACC.4,IBDMN5
SETB
C
CLR
ACC.4
IBDMN5
:
MOV
@R0,A
INC
R0
DJNZ
B,IBDMN4
DJNZ
R7,IBDMN2
MOV
A,R2
MOV
R0,A
RET
----------------------------------------------------------------
BCD整数转换为二进制整数(1位)
;入口:
R0(高位地址),R7
;出口:
R4
IDTB1:
CLR
A
MOV
R4,A
IDB11:
MOV
A,R4
MOV
B,#0AH
MUL
AB
ADD
A,@R0
INC
R0
MOV
R4,A
DJNZ
R7,IDB11
RET
------------------------------------------
;BCD整数转换为二进制整数(N位)
;入口:
R1(高位地址),M,N
;出口:
R0
IDTBMN
:
MOV
A,R0
MOV
R2,A
MOV
B,N
CLR
A
IDBMN1
:
MOV
@R0,A
INC
R0
DJNZ
B,IDBMN1
MOV
A,R2
MOV
R0,A
MOV
A,M
MOV
NCNT,A
IDBMN2
:
MOV
R7,N
CLR
A
CLR
F0
IDBMN3
:
XCH
A,@R0
MOV
B,#0AH
MUL
AB
MOV
C,F0
ADDC
A,@R0
MOV
F0,C
MOV
@R0,A
INC
R0
MOV
A,B
DJNZ
R7,IDBMN3
MOV
A,R2
MOV
R0,A
MOV
A,@R1
INC
R1
ADD
A,@R0
MOV
@R0,A
DJNZ
NCNT,IDBMN2
RET
----------------------------------------------------------
NDIV31
:
MOV
A,R2
MOV
B,R7
DIV
AB
PUSH
A
MOV
R2,B
MOV
B,#10H
NDV311
:
CLR
C
MOV
A,R4
RLC
A
MOV
R4,A
MOV
A,R3
RLC
A
MOV
R3,A
MOV
A,R2
RLC
A
MOV
R2,A
MOV
F0,C
CLR
C
SUBB
A,R7
JB
F0,NDV312
JC
NDV313
NDV312
:
MOV
R2,A
INC
R4
NDV313
:
DJNZ
B,NDV311
POP
A
CLR
OV
JZ
NDV314
SETB
OV
NDV314
:
XCH
A,R2
MOV
R7,A
RET
相似回答