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