51单片机汇编程序范例
编程的时候,要充分利用单字节、单周期的指令,使程序的长度和执行时间尽量缩短。
做而论道的编程思路已经给出,程序代码还是过一段时间再公布,给大家留下一个发挥的时间。
感兴趣的网友可以留言,写出自己编写的程序。
51单片机把4位16进制数转成10进制数的方法2010-02-10 23:33, 2位16进制转10进制,用除以10求商跟余数的方法,即可。
MOVX @DPTR, A
RET
仅用了24字节
16位二进制转BCD码--单片机2010-01-0314:19要求:
编写一段程序,把计数器中T0中计的数(TH0和TL0)转成8421BCD码。
并且高8位给p1口,低8位给p0口,要是转成BCD码超过16位,则给p
2.0高电平。
我是做单片机课设的,这段程序实在编不明白了,向各位大侠请教了!无比感谢中!答对有额外加分啊!!!!
MOV R1, A
MOV A,R0
RLC A
MOV R0, A
MOV A,R4;送到BCD码的低端
ADDC A, R4;带进位加。自身相加,相当于左移一位
DAA;十进制调整,变成BCD码
MOV R4, A
MOV A,R3
ADDC A, R3
DAA
MOV R3, A
MOV A,R2
ADDC A, R2
最佳
答案:
两个字节的二进制数转换成BCD码,必须编写程序来解决。
下面把这段转换程序,写成子程序的结构,便于网友移植。
;程序经过仿真调试通过,如下所示:
;------------------------------------------------------------------;MOV R0, TH1
最佳
答案:
;------------------------------------------
看来这个题目是属于MCS-51单片机的。
下面用51单片机的汇编语言来求解。
MOVB,#100
DIVAB
MOV31H, A;存百位数
MOVA,#10
XCHA,B
DIVAB
SWAP A;十位数换到高四位
ADDA,B;加上个位数
按照下面的思路做,还可以再简练些。
R0中的8位二进制数转换成3位BCD码:
MOVDPTR,#1000H;个位的地址
MOVA,R0
MOVB,#10
DIVAB
XCHA,B
MOVX @DPTR, A
INCDPTR
MOVA,#10
XCHA,B
DIVAB
XCHA,B
MOVX @DPTR, A
INCDPTR
XCHA,B
MOV R3, A
MOV R4, A
MOV R5, #16;共转换16位数
LOOP:
CLR C;c=0
MOV A,R0;从待转换低8bit数的高端移出一位到Cy(转换最先由低8位开始)
RLC A;R0xx的最高位移入到Axx
MOV R0, A
MOV A,R1;(高8位二进制数)
RLC A;此时C中的由低8位所移入的数重新移入高8位的低端MOV R1, A;相当于16bit的高端移出了1bit到C中了
4位16进制数呢?DIV指令只可以对2位16进制数进行除法运算啊,求高手解答。
例如把TH1 TL1的数值转成十进制,分别存入R4 R3 R2 R1 R0。
我要的是汇编的方法,C语言还没学到。
悬赏分:30 -解决时间:2010-2-10 22:47
;------------------------------------------------------------------
MOV R2, A
DJNZ R5, LOOP;共转换十六位数
RET
将A中的二进制数转换为3位的BCD码,其中百位数存放......2010-01-11 09:13请各位懂得帮写下这个程序片段。
将A中的二进制数转换为3位的BCD码。其中百位数存放到31H中,十位和个位数压缩后,存放到30H中。
悬赏分:80 -解决时间:2009-10-19 09:59
16位二进制数转换成BCD码的的快速算法-51单片机2010-02-18 00:43在做而论道上篇博文中,回答了一个16位二进制数转换成BCD码的问题,给出了一个网上广泛流传的经典转换程序。
程序可见:
http:
32.html中的HEX2BCD子程序。
.说它经典,不仅是因为它已经流传已久,重要的是它的编程思路十分清晰,十分易于延伸推广。做而论道曾经利用它的思路,很容易的编写出了48位二进制数变换成16位BCD码的程序。
但是这个程序有个明显的缺点,就是执行时间太长,转换16位二进制数,就必须循环16遍,转换48位二进制数,就必须循环48遍。
上述的HEX2BCD子程序,虽然长度仅仅为26字节,执行时间却要用331个机器周期。.单片机系统多半是用于各种类型的控制场合,很多时候都是需要“争分夺秒”的,在低功耗系统设计中,也必须考虑因为运算时间长而增加系统耗电量的问题。
;式中高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]}
MOV A,R4;送到BCD码的低端
ADDC A,R4;带进位加。自身相加,相当于左移一位
DAA;十进制调整,变成BCD码
MOV R4, A
MOV A,R3
ADDC A,R3
DAA
MOV R3, A
MOV A,R2
ADDC A,R2
MOV R2, A
DJNZ R5, LOOP;循环16遍,转换即完成;MOV P0, R4;按照要求输出
也就是说加数和被加数都是BCD码的形式,最大也只可能是99H,也就是我们十进制数中的99,只有这样才会有实际的意义!所以你说的当A=#24H的时候的情况是不会存在的,严格的说是没有意义的!
MOV R2, B
SJMP $;到此,完成了题目要求
;------------------------------------------------------------------
;两个字节的二进制数转换成BCD码的程序如下:
;功能:16位二进制数变换成为BCD码;
;xx:
R0 R1中是16位二进制数,其中R0中是高8位;
MOV R1, TL1
CALL HEX2BCD;调用子程序把R0 R1中的数字,转换成压缩的BCD码,送到R2 R3 R4
;-------下面,把万千百十个位,分别存入R4 R3 R2 R1 R0
MOV A,R4;先分离R4中的压缩型BCD码,包含的是十位与个位的数MOV B,#16
DIV AB;除以16,目的是分离出高、低四位
这篇文章好像是选自某个著名杂志,但是在术语的使用上,有着明显的漏洞,不像是专业人员的手笔。比如说文中提到的:
“使用51条指令代码,但执行这段程序却要耗费312个指令周期”,就是败笔。51条指令代码,真不知道说的是什么,指令周期是因各种机型和指令而异的,也不能表示确切的时间。
.下面说说做而论道的编程思路。;-----------------------------------------------------------------------
悬赏分:200 -解决时间:2010-1-3 13:03
最佳
答案:16bit表示:65536,万位不超6
――――――――――――――――――――――――――
程序如下:
MOV R0, TL0;
MOV R1, TH0;待转换的16bit数分别放入(由高到低)R1R0中;CLR A
MOV R2, A;先清零
;剩下的低7位[b6~b0],已经是单字节数据,变换成BCD码那就十分简单了。
;-----------------------------------------------------------------------
从最后的表达式中可以看出,高9位变换的计算方法极为简单,只是使用左移、加减等指令即可,基本上不涉及多字节的运算。
;即:
; 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。
;出口:
R2 R3 R4中是BCD码,其中R2中是万位,R3中是千、百位,R4中是十、个位。
HEX2BCD:
CLR A
MOV R2, A;先对要放入转换后的压缩型BCD码的寄存器通通清零MOV R3, A
MOV R4, A
MOV R5, #16;共转换十六位数
LOOP:
CLR C
MOV A,R1;从待转换数的高端移出一位到Cy(从低8位R1开始转换)RLC A
MOV30H, A;保存
R0中的8位二进制数转换成3位BCD码-单片机编程2010-01-1023:18单片机的不难编程题!急!!!!!!
将R0中的8位二进制数转换成3位BCD码,结果存入外部RAM的1002H~1000H(从高位到低位)单元中。
例如:
地址:
R0执行后:1002H 1001H 1000H