用51单片机编程

发布网友

我来回答

3个回答

热心网友

单片机中只有一条语句是对进制调整的
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

热心网友

汇编,还是C?
--------------------
用51单片机编程求二进制转化为十进制的程序,可以看看如下链接:
http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/6154551f93ba561440341732.html

http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/9ce19408f3dcc8c43ac763aa.html
其它的一般问题,大概也能在此空间找到。

热心网友

汇编和C语言都是直接写就可以,如果是十六进制,就写上如0x5a,二进制在C中直接赋值就可以,在编译的时候都会直接生成机器代码

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com