51单片机如何吧十六进制化为十进制?(好像没有直接的指令去实现)

有这么一段程序,不过我看不懂:

mov a,temp ;将temp中的十六进制数转换成10进制
mov b,#10 ;10进制/10=10进制
div a b
mov b_bit,a ;十位在a
mov a_bit,b ;个位在b

普林斯顿结构,它采用了不在程序与数据的存储上进行逻辑区分的设计思想,这种设计思想在通用计算机和通用微型计算机中被广泛使用。
mcs-51单片机 就是基于这种结构 MCS-51汇编语言程序的一般格式
与8086不同,没有代码段、数据段等区分,统一编址。
程序由指令行或注释行组成,指令行每行只能写一条指令。
指令前可用“标号:”表示指令地址,以便在指令中引用;标号是符号名,以字母开头。
注释行应以“;”号开头;指令后也可用“;”号分隔,附加注释。
程序由伪指令ORG XXXXH 定位,ORG中的16位地址就是将来写入程序存储器的绝对地址。程序中的ORG应按地址从小到大排列。由ORG定位的程序段可以不连续,汇编程序将会在段间的空地址上填00H,即NOP。因此,每个ORG段的最后一条指令一般应是转移指令。
数据由伪指令DB(字节)或DW(双字节)说明。数值应以数码0-9开头;尾缀说明:B-二进制,D-十进制,H-十六进制。十进制D可缺省。
也就是说你可以想象你的数据空间是从0000-FFFF
因为你在编程时你只能操纵这个区,而程序性指令如JUMP永远不会跳到数据区的
所以一个简单的初始化可以这样来做
MOV R0,#00H
MOV A,#00H
MOV R1,#FFFFH
loop:
MOV@R0,A
INC R0
DANZ R1,loop
将0000-FFFF全置零了

如果用C来写可以这样吧
memset(0000,0000,FFFF) /*add,int val,int count */
如果memset函数可以使用的话.
我总觉的void pokeb(int segment,int offset,int value) 将字节value写到segment:offset处
这个涵数无法使用。因为mcs-51没段概念。
参考 http://zhidao.baidu.com/question/53464989.html?si=7
如果随意对一个累加器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,只有这样才会有实际的意义!所以你说的当A=#24H的时候的情况是不会存在的,严格的说是没有意义的!

而且DA A指令只用于十进制BCD码加法指令 ADD/ADDC 以后,否则是没有实际意义的!

谢谢!
参考 http://zhidao.baidu.com/question/65545405.html?si=5

顺序编程,分支编程,循环编程,子程序调用:

;p1口八个灯作跑马灯。

org 0000h
ajmp start
org 0030h
start:
mov a,#0ffh ;
clr c ;
mov r2,#08h ;循环八次。
loop: rlc a ;带进位左移。
mov p2,a ;输出到P1口。
call delay ;延时一段时间
djnz r2,loop ;反复循环
mov r2,#07h ;再往回循环。
loop1:
rrc a ;带进位右移
mov p2,a ;输出到P1口。
call delay ;延时一段时间
djnz r2,loop1 ;反复循环
jmp start ;重新开始

delay:
mov r3,#20 ;延时子程序
d1: mov r4,#200
d2: mov r5,#248
djnz r5,$
djnz r4,d2
ret

end

查表编程:

;例程:100

参考资料:bba127d3abb9d8b4

温馨提示:内容为网友见解,仅供参考
第1个回答  2008-10-20
程序中的16进制不用转换,给你举个例子,如果A中的值为FFH,也就是256,实际上程序中除以10,你可以当作是256除以10,跟FFH除以10没有分别,你将除数的商保存在十位,余保存在个位就可以了!!!本回答被提问者采纳
第2个回答  2008-10-19
简单的说把,比如一个十进制数67,除以10等于6,余数是7,所以就把一个十进制数拆成个位数和十位数了,即相当于非压缩的BCD码。你提到的程序就是这个意思,把temp的数字除以10(在B中),得到的商在A,余数在B,而商就是十位数,余数就是个位数。
第3个回答  2008-10-20
其实你首先要明白的是,做程序关键是思路,我们用计算机处理事情实际上就是让它模仿我们人的行为,那么在你是如果通过什么方法把十六进制转十进制的,你是如何实现的,然后将你的方法和步骤通过单片机相应的指令来完成这个程序
第4个回答  2008-10-20
你这个程序下面应该还有几句程序,才能完成这个功能
mov a, b_bit
anl a, #0fh
swap a
mov b, a
mov a ,a_bit
anl a ,#0fh
add a, b
mov temp, a ;这时temp里面的数为十进制数
多看两边应该就能理解的。

在51单片机中,使用汇编语言,如何将十六进制数转换成十进制。
MOV R2, A, ;先清零 MOV R3, A,MOV R4, A,MOV R5, #16 ;共转换十六位数 LOOP:CLR C MOV A, R0 ;从待转换数的高端移出一位到Cy RLC A MOV R0, A MOV A, R1 RLC A MOV R1, A MOV A, R4 ;送到BCD码的低端 ADDC A, R4 ...

的51单片机中c语言中如何将十六进制数转化为十进制
如果你仅仅是使用转换结果的话,那么赋值语句可以自动转换。比如:unsigned char x,y;y=0x5a;x=y;你输出格式是10进制,那么变量表示的就是十进制数。

单片机C51课程设计 16进制转为10进制
2、上面如果检测到有变化,则将定时器的数字清零,在这个定时器的服务程序里执行将一个标志置位。然后再执行内存中输入数字的变化,和显示的内容。3、判断是否有定时器中断触发的标志,有的话就执行将数转换成BCD码(就是转换成10进制数)的过程,并显示出来。如此就完成了。至于定时器中断怎样搞,和...

51单片机用汇编把16进制转化为10进制,这个程序不是很懂,希望高手能详细...
用 ADDC 指令,把 RW1,RW2,左移了16次,并把Cy,加入到了最低位。ADDC 指令后面,是十进制调整指令,所以,RW1,RW2 中的内容就是BCD码。

51单片机C语言里 怎样将16进制 直接化成 10进制
printf("请输入一个十进制数a= ");scanf("%d",&a);printf("请输入一个进制数n= ");scanf("%d",&n);if(n==16)q=tentoBOH(a,n);else p=tentoBOH(a,n);printf("输出正整数%d的%d进制为:",a,n);if(n==16)for(i=0;i<count;i++)printf("%c",*(q+i));else for(i=...

51单片机串口接收的数据怎么转成10进制?
串口接收到的数据都是十六进制。将A0C1转换成十进制程序如下:IBTD22 : MOV A,R0PUSH AMOV R3,#0A0HMOV R4,#0C0HMOV R7,#03HCLR AIBD221 : MOV @R0,AINC R0DJNZ R7,IBD221POP AMOV R0,AMOV R7,#10HIBD222 : PUSH ACLR CMOV A,R4RLC AMOV R4,AMOV A,R3RLC AMOV R3,AMOV B,...

51单片机怎么将十六进制转换成ascll码
方法一:利用查表实现 方法二:十六进制中0~9时加30H得到,A~F时加37H

单片机C51中16进制转10进制的问题
unsigned char i,m i=hex\/10;m=hex%10;其中hex为你存放十六进制的变量 i为十进制的十位 m为十进制的个位 即是shi=dd\/10;ge=dd%10这样算,自己可以调试看看

串口通信,如何单片机把上位机发来的16进制转化为10进制。
你从上位机发来的应该是一个十六位的16进制数,你可以直接定义一个int变量A,A=高八位*256+低八位,就能得到一个10进制的数A了,你如果要发一个十进制数A给上位机也是一样的,高八位=A\/256;低八位=A%256;

单片机C51十六进制浮点型转换为十进制,怎么转
用一个联合体就可以解决你的问题 union temp{ float x;char table[4];};比如上位机发给你一个4字节的浮点数给你,存放在recbuf[4]中 那么你只要执行了 temp.table[0]=recbuf[0];temp.table[1]=recbuf[1];temp.table[2]=recbuf[2];temp.table[3]=recbuf[3];后,temp.x就是浮点数...

相似回答