51单片机汇编程序范例文档格式.docx
《51单片机汇编程序范例文档格式.docx》由会员分享,可在线阅读,更多相关《51单片机汇编程序范例文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
上式可以变形为:
n=[b15~b12]*4000+{[b15~b12]*(100-4)+[b11~b0]}
;
用x代表[b15~b12],有:
n=x*4000+{x*(100-4)+[b11~b0]}
即:
n=4*x(千位)+x(百位)+[b11~b0]-4*x
写到这里,就可以看出一点BCD码变换的意思来了。
上式中后面的位:
[b11~bO]-4*x,如果小于256,那就太简单了,马上就可以去按照常规转换BCD了。
如果数值较大,就要把[b11~b7]看成128的个数y;
在百位中加上y、在十位加上3*y、并在[b6~b0]中减去2*y。
那么就有:
n=4*x(千位)+x(百位)+[b11~b0]-4*x
n=4*x(千位)+(x+y)(百位)+3*y(十位)+[b6~b0]-2*y
由此,就可以明确由高9位[b15~b7]变换出来十进制的各个位的数值,可能大于9,到最后整理一下即可。
剩下的低7位[b6~b0],已经是单字节数据,变换成BCD码那就十分简单了。
从最后的表达式中可以看出,高9位变换的计算方法极为简单,只是使用
左移、加减等指令即可,基本上不涉及多字节的运算。
编程的时候,要充分利用单字节、单周期的指令,使程序的长度和执行时间尽量缩短。
做而论道的编程思路已经给出,程序代码还是过一段时间再公布,给大家留下一个发挥的时间。
感兴趣的网友可以留言,写出自己编写的程序。
51单片机把4位16进制数转成10进制数的方法2010-02-1023:
33,2位16
进制转10进制,用除以10求商跟余数的方法,即可。
4位16进制数呢?
DIV指令只可以对2位16进制数进行除法运算啊,求高
手解答。
例如把TH1TL1的数值转成十进制,分别存入R4R3R2R1R0
我要的是汇编的方法,C语言还没学到。
悬赏分:
30-解决时间:
2010-2-1022:
47
最佳
答案:
两个字节的二进制数转换成BCD码,必须编写程序来解决。
下面把这段转换程序,写成子程序的结构,便于网友移植。
程序经过仿真调试通过,如下所示:
MOVR0,TH1
MOVR1,TL1
CALLHEX2BCD;
用子程序把R0R1中的数字,转换成压缩的BCD码,送到R2R3R4
下面,把万千百十个位,分别存入R4R3R2R1R0
MOVA,R4先分离R4中的压缩型BCD码,包含的是十位与个位的数MOVB,#16
DIVAB除以16,目的是分离出高、低四位
MOVR1,A存放十位
MOVR0,B存放个位;
MOVA,R2万位数不超过6,即R2中的压缩型BCD码只有一个,直接放到万位R4中
MOVR4,A存放万位;
MOVA,R3分离R3中的压缩型BCD码,其包含的是千位和百位数MOVB,#16半字节分离
DIVAB
MOVR3,A
MOVR2,B
SJMP$到;
此,完成了题目要求
两个字节的二进制数转换成BCD码的程序如下:
功能:
16位二进制数变换成为BCD码;
xx:
R0R1中是16位二进制数,其中R0中是高8位;
出口:
R2R3R冲是BCD码,其中R2中是万位,R3中是千、百位,R4中是十、个位。
HEX2BCD:
CLRA
MOVR2,A先对要放入转换后的压缩型BCD码的寄存器通通清零MOVR3,A
MOVR4,A
MOVR5,#16共;
转换十六位数
LOOP:
CLRC
MOVA,R1从待转换数的高端移出一位到Cy从低8位R1开始转换)RLCA
MOVR1,A
MOVA,R0
RLCA
MOVR0,A
MOVA,R4送到BCD码的低端
ADDCA,R4带进位加。
自身相加,相当于左移一位
DAA;
十进制调整,变成BCD码
MOVA,R3
ADDCA,R3
DAA
MOVA,R2
ADDCA,R2
MOVR2,A
DJNZR5,L00共转换十六位数
RET
.2010-01-11
31H中,十位
将A中的二进制数转换为3位的BCD码,其中百位数存放.09:
13请各位懂得帮写下这个程序片段。
将A中的二进制数转换为3位的BCD码。
其中百位数存放到和个位数压缩后,存放到30H中。
80-解决时间:
2009-10-1909:
59
看来这个题目是属于MCS-51单片机的
下面用51单片机的汇编语言来求解。
MOVB,#100
DIVAB
M0V31H,A存百位数
MOVA,#10
XCHA,B
SWAPA十位数换到高四位
ADDA,B加上个位数
MOV30H,A保存
R0中的8位二进制数转换成3位BCD码—单片机编程2010-01-1023:
18单片机的不难编程题!
急!
!
将R0中的8位二进制数转换成3位BCD码,结果存入外部RAM的1002H~1000H(从高位到低位)单元中。
例如:
地址:
R0执行后:
1002H1001H1000H
数据:
81H010209
15-解决时间:
2009-10-1519:
10
提问者:
stefine_-一级
呵呵,楼上的程序,使用了DECDPTR要知道,51单片机指令系统里面,是没有DECDPT指令的。
按照下面的思路做,还可以再简练些。
R0中的8位二进制数转换成3位BCD码:
MOVDPTR,#1000H个位的地址
MOVA,R0
MOVB,#10
MOVX@DPTR,A
INCDPTR
仅用了24字节
16位二进制转BCD码--单片机2010-01-0314:
19要求:
编写一段程序,把计数器中T0中计的数(TH0和TL0转成8421BCD码。
并且高8位给p1口,低8位给p0口,要是转成BCD码超过16位,则给p2.0高电平。
我是做单片机课设的,这段程序实在编不明白了,向各位大侠请教了!
无比感谢中!
答对有额外加分啊!
!
200-解决时间:
2010-1-313:
03
16bit表示:
65536,万位不超6
程序如下:
MOVR0,TL0;
MOVR1,TH0寺转换的16bit数分别放入(由高到低)R1R0中;
MOVR2,A先清零
转换16位数
CLRC;
c=0
MOVA,R0从待转换低8bit数的高端移出一位到Cy转换最先由低8位开始)
RLCA;
R0xX勺最高位移入到Axx
MOVA,R1;
(高8位二进制数)
RLCA此时C中的由低8位所移入的数重新移入高8位的低端MOVR1,A相当于16bit的高端移出了1bit到C中了
ADDCA,R4带进位加。
ADDCA,R3
ADDCA,R2
DJNZR5,LOO循环16遍转换即完成;
MOVP0,R4按照要求输出
MOVP1,R3
CLRP
2.0
JZP20_L
SETBP
P20_L:
如果随意对一个累加器A中的二进制数据进行“二进制转十进制”调整是没有任何实际意义的!
DA调整的对象是在ADD或ADDC之后的结果,而且是以BCD码相加以后才能够调整,否则没有实际意义!
比如,现在要执行12D+39D也就是两个十进制数相加这样一个加法(有时候程序处理的需要,数据在单片机中是以BCD码的形式存储的,也就是12H和39H(十六进制),但我们可以人为将它们看为12D和39D(十进制),而且还希望相加以后的结果为51H,也就是说符合十进制运算规则12+39=51,而不是4BH的结果),但这样的十进制加法运算在单片机中是不能够直接实现的。
因为单片机只能够执行二进制加法指令,也就是所有的运算都按照二进制中的规则进行!
于是就出现了DA调整指令!
现在12H+39H,将12H放于A中,执行ADDA#39H指令,则结果为4BH,这不是我们希望的51H的数据形式!
这时执行DAA指令后,就会将A中的数据调整为51H(具体调整过程和原理你可以详细看书,如果单片机书中讲的不详细,那么微机原理中一定说的非常详细),而我们按照BCD码规则就
将其看为51D,符合我们的要求!
也就是说加数和被加数都是BCD码的形式,最大也只可能是99H,也就是我们十进制数中的99,只有这样才会有实际的意义!
所以你说的当A=#24H的时候的情况是不会存在的,严格的说是没有意义的!
而且DAA指令只用于十进制BCD码加法指令ADD/ADDC以后,否则是没有实际意义的!
定义:
用4位二进制数来表示1位十进制数中的0~9这10个数码,简称BCD码即BCD代码。
Binary-CodedDecimal?
简称BCD称BCD码或二-十进制代码,亦称二进码十进数。
是一种二进制的数字编码形式,用二进制编码的十进制代码。
这种编码形式利用了四个位元来储存一个十进制的数码,使二进制和十进制之间的转换得以快捷的进行。
这种编码技巧,最常用于会计系统的设计里,因为会计制度经常需要对很长的数字串作准确的计算。
相对于一般的浮点式记数法,采用BCD码,既可保存数值的精确度,又可免却使电脑作浮点运算时所耗费的时间。
此外,对于其他需要高精确度的计算,BCD编码亦很常用。
由于十进制数共有
0、1、
2、,,、9十个数码,因此,至少需要4位二进制码来表示1位十进制数。
4位二进制码共有2八4=16种码组,在这16种代码中,可以任选10种来表示10个十进制数码,共有N=16!
/(16-10)!
约等于
2.9乘以10的10次方种方案。
常用的BCD代码列于末。
常用BCD编码方式
最常用的BCD编码,就是使用"
0"
至"
9"
这十个数值的二进码来表示。
这种编码方式,在中国大陆称之为“8421码”。
除此以外,对应不同需求,各人亦开发了不同的编码方法,以适应不同的需求。
这些编码,大致可以分成有权码和无权码两种:
有权BCD码,如:
8421(最常用)、
2421、5421,
无权BCD码,如:
余3码、xx码,
以下为三种常见的BCD编码的比较。
十进数8421-BCD码余3-BCD码2421-A码
(M10)DCBAC3C2C1C0a3a2a1a0
0000000110000
1000101000001
2001001010010
3001101100011
4010001110100
5010110000101
6011010010110
7011110100111
8100010111110
9100111001111
常用BCD码
十进制数8421码5421码2421码余3循环码
000000000110010
100010001000101000110
2001000100010010111
3001100110011011001
401000100010001110100
5011000101110001100
601101001110010011101
701111011011011
810001011111010111110
91001110011110010
特点:
8421编码直观,好理解。
5421码和2421码中大于5的数字都是高位为1,5以下的高位为0。
余3码是8421码加上3,有上溢出和下溢出的空间。
格雷码相邻2个数有三位相同,只有一位不同。
什么是BCD码2006-3-1913:
24:
45
bcd码也叫8421码就是将十进制的数以8421的形式展开成二进制,大家知道十进制是0〜9十个数组成,着十个数每个数都有自己的8421码:
0=00
1=0001
2=0010
3=0011
4=0100
5=01
6=0110
7=0111
8=1000
9=1001
举个例子:
321的8421码就是
321
001100100001
原因:
0011=8x0+4x0+1x2+1x1=30010=8x0+4x0+2x1+1x0=
2.000仁8x0+4x0+2x0+1x1=1具体:
bcd码是四位二进制码,也就是将十进制的数字转化为二进制,但是和普通的转化有一点不同,每一个十进制的数字0-9都对应着一个四位的二进制码,对应关系如下:
十进制0对应二进制00;
十进制1对应二进制000191001接下来的10
就有两个上述的码来表示10表示为000100也就是BCD码是遇见1001就产生进位,不象普通的二进制码,到11才产生进位100
举例:
某二进制无符号数111010,转换为三位非压缩BCD数,按百位、十位和个位的顺序表示,应为<
U>
__C<
/U>
__。
A.0000100011000111
B.0001100001000111
C.0001000011000100
D.0001100001001001
解:
(1)111010转换为十进制:
234
(2)按百位、十位和个位的顺序表示,应为<
附注:
压缩BCD码与非压缩BCD码的区别一一压缩BCD码的每一位用4位二进制表示,一个字节表示两位十进制数。
例如100110B表示十进制数96D;
非压缩BCD码用1个字节表示一位十进制数,高四位总是00,低4位的00~1001表示0~
9.例如001000B表示十进制数
关于MCS-51单片机是如何将单字节二进制数转化为BCD码的问题
20-解决时间:
2010-5-515:
15
BINBCD:
MOVB,#100(100作为除数送入B中)
DIVAB(十六进制数除以100)
MOVR3,A(百位数送r3,余数放入B中)
MOVA,#10(分离十位数与个位数)
XCHA,B(余数放入A中,除数放入B中)
DIVAB(分离出十位在A中,个位在B中)
SWAPA(十位数交换到A的高4位)
ADDA,B(十位数与个位数相加送入A中)
END
1请问这个程序求解的思路是什么?
2该程序的第二句"
DIVAB啲解释是十
六进制数除以100,可是A中应该存放的是一个八位的二进制数,这是怎么回事?
3最后为什么要十位数与个位数相加,不是要分离十位数与个位数吗?
乘除法的时候可以不考虑进制的,比如说#OFFH这个十六进制数存放于A中,#100这个十进制数放于B中然后DIVAB这时A等于#02HB等于#37H等于55
在然后
假设A中的数为FFH
MOVB,#100(B=100,十进制100,)
DIVAB(A等于#02H,B等于#37H等于55)
MOVR3,A(A=02H)
MOVA,#10(A=10=0AH,B=55=37H)
XCHA,B(A=55=37H,B=10=0AH)
DIVAB(A=05H=5,B=5=05H)
SWAPA(A=50H,B=05H)
ADDA,B(A=55H这时十位各位的BCD吗已经求出来了,将
37H=55转换为55H
1请问这个程序求解的思路是什么?
思路就是对一个数求模和求于来分离百位十位和个位
例如168
余68
余8
余0
这样就分离了百位十位和个位
2该程序的第二句"
DIVAB啲解释是十六进制数除以100,可是A中应该存放的是一个八位的二进制数,这是怎么回事?
这个是你没理解cpu存数据的方式,A中存放的其实归根结底说是二进制数,机器只认识二进制数,对这段程序编译之后我们输入的十进制100也变成二进制数了,我们通常说十六进制数是因为十六进制数和二进制数有位上的对应关系,比如11000110B=C6H也就是说二进制数每4位一段各自写成十六进制数就把二进制转换成十六进制了,
3最后为什么要十位数与个位数相加,不是要分离十位数与个位数吗?
我想如果你清楚BCD码的含义你就xx了
BCD码就是用十六进制数来表示十进制的数
45H是等于十进制的69的,但如果你说他是BCD码他就代表十进制数45这样你就会发现不是每个十六进制数都是BCD码的,例如AAH就不是
BCD码,因为没有AA这样的十进制数
我最后总结一下,就是我们所说的十进制数也好十六进制数也好,归根到底机器都是要把他变为二进制数的,机器也只认识二进制数,这样你就好理解了,我们不会处理不同进制数之间的运算,运算时必须要把他转换同进制的数,机器也是这样,只不过我们擅长的是十进制的运算,而机器擅长的是二进制运算,二进制数位数多不方便我们就找了一个帮手十六进制数
希望你能看得懂