当前位置:首页 > 单片机原理与运用-第三章答案
MOV 50H,#00H;正数个数统计单元清零 MOV 70H,#00H;负数个数统计单元清零 LOOP:MOVA,@R0 ;取数
JB ACC.7,NEG ;是负数转NEG处理
POST:MOV R1,1EH;是正数,将暂存的地址送R1(间址寄存器)
MOV @R1,A;将正数入存 INC50H;正数个数加1
INC 1EH;正数暂存地址加1修正
LOOP1:INCR0;取数地址加1修正
DJNZ R2,LOOP;计数长度减1,不等于零,继续循环统计 SJMP $;结束
NEG: MOVR1,1FH;是负数,将暂存的地址送R1(间址寄存器)
MOV @R1,A;将正数入存 INC 70H;负数个数加1
INC1FH;负数暂存地址加1修正 SJMP LOOP1;转取数地址修正
15内部存储单元40H中有一个ASCII码字符,试编一程序,给该数的最高位加上奇检验。
解:ORG 0000H SJMP START
ORG 0030H
START: MOV A,40H;取数给A
CLR ACC.7 ;A最高位(奇偶校验位)清零
JB P, LOOP ;40H中的ASCII码原来就是奇数个1(最高位给零) SETB ACC.7 ;40H中的ACSII码原来是偶数个1,最高位置1
LOOP:MOV 40H,A ;入存 SJMP $;结束 END
16.编写一段程序,将存放在自DATA单元开始的一个四字节数(高位在前)取补后送回原单元。
解:若DATA在内部数据存储器中(假如存放在30H起始的4个单元中);采用求反加1的算法;
ORG 000H SJMP START ORG 0030H
START: SETB C ;置进位位为1
MOV R2,#04H ;预置计数长度
MOV R0,#DATA1+3 ;取数指针指向低字节的地址 LOOP:MOV A,@R0 ;取数
CPL A ;求反
ADDC A,#00H ;加进位 MOV @R0,A ;入存
DEC R0 ;地址指针修正
DJNZ R2,LOOP ;4字节未处理完,继续循环处理 SJMP $;结束 DATA1 EQU 30H; END
17.以BUF1为起始地址的外存储区中,存放有16个单字节无符号二进制数,是编一程序,求其平均值并送BUF2单元。
解:设R2、R3存放和,将其除以16(R2、R3联合左移4位)即为平均置值(单字节存放)
ORG 0000H SJMP START ORG 0030H
START: MOV R2,#00H;和高字节清零
MOV R3,#00H;和低字节清零
MOV DPTR,#DATA1 ;建立外部数据存储器的地址指针 MOV R4,#10H;预置计数长度
LOOP:MOVX A,@DPTR;从外部数据存储器取数
ADD A ,R3 MOV R3,A MOV A,R2; ADDC A,#00H; MOV R2,A;累加
INC DPTR;地址指针修正
DJNZ R4,LOOP;16字节未累加完,继续循环累加 MOV R4,#04H;R2、R3联合移位4次(除以16) LOOP1: CLR C
MOVA,R2 RRC A
MOV R3,A
DJNZ R4,LOOP1;平均值存放于R3中 SJMP $;结束
DATA1 EQU 1000H; END
18.在DATA1单元中有一个带符号8位二位进制数x。编一程序,按以下关系计算y值,送DATA2单元。
y =x+5,x>0 y=x,x=0 y=x-5,x<0
解:设DATA1、DATA2为内部数据存储器的二个单元(假设为30H、31H)且y的值单字节不会产生溢除出
ORG 000H SJMP START
ORG 0030H
START:MOV A,30H;取数X给A
JZ ZERO;若X=0,则Y=0,转入存 JB ACC.7,NEG;若X<0,则转X-5
POZI :ADD A,#05H;若X>0,则X=5,入存
SJMP ZERO;
NEG:CLR C;
SUBB A,#05H;
ZERO:MOV 31H,A;结果入存
SJMP $ END
19.设内部RAM中30H和31H单元中有两个带符号数,求出其中的大数存放在32H单元中。
解:若两数同号,则值大的数大;两数异号,正数值大
ORG 000H SJMP START ORG 0030H
START: MOV A,30H
XRL A,31H;两数异或
JB ACC.7,YIHAO ;两数异号
TONGHAO:CLRC;两数同号
MOV A,30H SUBB A,31H JC LOOP1-2
LOOP0:MOV A,30H;同号被减数大,值大 LOOED:MOV 32H, A
SJMP $
LOOP1:MOV A,31H;异号被减数大,值小
SJMP ED;
YIHAO:MOV A,30H;异号,哪个正,其值大
JNB ACC.7,LOOP0 SJMP LOOP1 END
20.利用逻辑控制的方法,设计一个主程序,在第1,3,5,6次调出SB1子程序,第2,4,7,8次调用SB2程序。 解:ORG 000H
SJMP TEST ORG 0030H
TEST:MOV R2,#08H
MOV A,#10101100B
LOOP:RLC A
JC LOOP1
LCALL SB1
SJMP RELT
LOOP1:LCALL SB2 RELT:DJNZ R2,LOOP
SJMP $
PRGO : RET PRG1:RET
END
21.将DATA单元存放的以ASCII码表示的16进制数转换成十进制数存放于DATA+1单元。 解:先将DATA的ASCII码转换成十六进制的数,再转换成十进制数。数字的ASCII码转成十六进制数(即为十进制数)采用减30H
字母的ASCII码转成十六进制数采用减37H,十六进制再转十进制可采用先减0AH,再加10H;这样-37H-0AH+10H=-31H,可采用直接减31H。
数字与字母的ASCII的区别,可采用对D6的检测D6=1为字母的ASCII码,反之为数字的ASCII码。
ORG 000H SJMP TEST ORG 0030H
TEST:MOV R0,#DATA1
MOV A,@R0;将DATA1的数给A CLR C;
LOOP:JB ACC.6,LOOP1;是字母,转LOOP1
SUBB A,#30H;是数字减30H
ED:MOV DATA+1,A;入存
SJMP $;结束
LOOP1:SUBB A,#31H;是字母减31H
SJMP ED;
DATA1 EQU 30H END
22.编一个将十六进制数转换成十进制数的子程序。
解:一个单字节的十六进制数转成十进制数一般考虑用二字节BCD码来存放。设转换后的数存放在R3(高)、R4(低)中。
ORG 000H SJMP TEST ORG 0030H
TEST:MOV DPTR,#TAB;建立表头地址
MOV A,30H ANL A,#0F0H
SWAPA;高半字节分离
ADD A,0E0H;高半字节数乘2 MOV B,A;暂存
共分享92篇相关文档