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

有这么一段程序,不过我看不懂:mova,temp;将temp中的十六进制数转换成10进制movb,#10;10进制/10=10进制divabmovb_bit,a;十位在a... 有这么一段程序,不过我看不懂:

mov a,temp ;将temp中的十六进制数转换成10进制
mov b,#10 ;10进制/10=10进制
div a b
mov b_bit,a ;十位在a
mov a_bit,b ;个位在b
展开
 我来答
mira400
2008-10-19 · TA获得超过2351个赞
知道小有建树答主
回答量:938
采纳率:0%
帮助的人:0
展开全部
普林斯顿结构,它采用了不在程序与数据的存储上进行逻辑区分的设计思想,这种设计思想在通用计算机和通用微型计算机中被广泛使用。
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

tianhj2001
2008-10-20 · TA获得超过189个赞
知道小有建树答主
回答量:409
采纳率:0%
帮助的人:183万
展开全部
程序中的16进制不用转换,给你举个例子,如果A中的值为FFH,也就是256,实际上程序中除以10,你可以当作是256除以10,跟FFH除以10没有分别,你将除数的商保存在十位,余保存在个位就可以了!!!
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ATF144X
2008-10-19 · TA获得超过1.2万个赞
知道大有可为答主
回答量:5344
采纳率:77%
帮助的人:4649万
展开全部
简单的说把,比如一个十进制数67,除以10等于6,余数是7,所以就把一个十进制数拆成个位数和十位数了,即相当于非压缩的BCD码。你提到的程序就是这个意思,把temp的数字除以10(在B中),得到的商在A,余数在B,而商就是十位数,余数就是个位数。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ECU_MCU
2008-10-20 · TA获得超过456个赞
知道答主
回答量:69
采纳率:0%
帮助的人:54.2万
展开全部
其实你首先要明白的是,做程序关键是思路,我们用计算机处理事情实际上就是让它模仿我们人的行为,那么在你是如果通过什么方法把十六进制转十进制的,你是如何实现的,然后将你的方法和步骤通过单片机相应的指令来完成这个程序
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友b76e2f8
2008-10-20 · TA获得超过1103个赞
知道小有建树答主
回答量:1271
采纳率:0%
帮助的人:1120万
展开全部
你这个程序下面应该还有几句程序,才能完成这个功能
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里面的数为十进制数
多看两边应该就能理解的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(5)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式