您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 交通运输 > mcs51单片机第四章习题解答
14—1若有两个无符号数。、xy分别存放在内部存储器50H、51H单元中,试编写一个程序实现10xy,结果存人52H、53H两个单元ORG0000HSJMPSTARTORG0030HSTART:MOVA,50HMOVB,#10MULAB;(50H)x10积的高、低字节分别在B、A中ADDA,51HMOV53H,A;积的低字节加(51H)其和存放在53H中MOVA,#00HADDCA,BMOV52H,A;积的高字节加进位位存放在52H中。SJMP$4—2从内部存储器20H单元开始,有30个数据。试编一个程序,把其中的正数、负数分别送51H和71H开始的存储单元,并分别记下正数、负数的个数送50H和70H单ORG0000HSJMPSTARTORG0030HSTART:MOV1EH,#51H;正数存放首地址51H存暂存于1EH单元MOV1FH,#71H;负数存放首地址71H存暂存于1EH单元MOVR0,#20H;建立取数(源操作数)的地址指针MOVR2,#30;预置数据长度MOV50H,#00H;正数个数统计单元清零MOV70H,#00H;负数个数统计单元清零LOOP:MOVA,@R0;取数JBACC.7,NEG;是负数转NEG处理POSI:MOVR1,1EH;是正数,将暂存的地址送R1(间址寄存器)MOV@R1,A;将正数入存INC50H;正数个数加1INC1EH;正数暂存地址加1修正LOOP1:INCR0;取数地址加1修正DJNZR2,LOOP;计数长度减1,不等于零,继续循环统计SJMP$;结束NEG:MOVR1,1FH;是负数,将暂存的地址送R1(间址寄存器)MOV@R1,A;将负数入存INC70H;负数个数加1INC1FH;负数暂存地址加1修正SJMPLOOP1;转取数地址修正4—3内部存储单元40H中有一个ASCII码字符,试编一程序,给该数的最高位加上奇校验。ORG0000HSJMPSTART2ORG0030HSTART:MOVA,40H;取数给ACLRACC.7;A最高位(奇偶校验位)清零JBP,LOOP;40H中的ACSII码原来就是奇数个1(最高位给零)SETBACC.7;40H中的ACSII码原来是偶数个1,最高位置1LOOP:MOV40H,A;入存SJMP$;结束END4—4编写一段程序,将存放在自DATA单元开始的一个四字节数(高位在前),取补后送回原单元。一:若DATA在内部数据存储器中(假如存放在30H起始的4个单元中);解1、采用求反加1的算法ORG0000HSJMPSTARTORG0030HSTART:SETBC;置进位位为1MOVR2,#04H;预置计数长度MOVR0,#DATA1+3;取数指针指向低字节的地址LOOP:MOVA,@R0;取数CPLA;求反ADDCA,#00H;加进位MOV@R0,A;入存DECR0;地址指针修正DJNZR2,LOOP;4字节未处理完,继续循环处理SJMP$;结束DATA1EQU30H;END解2、采用0减原数的算法ORG0000HSJMPSTARTORG0030HSTART:MOVR2,#04H;预置计数长度MOVR0,#DATA1+3;取数指针指向低字节的地址CLRC;进位位清零LOOP:MOVA,#00H;SUBBA,@R0;用零减原数MOV@R0,A;入存DECR0;地址指针修正DJNZR2,LOOP;4字节未处理完,继续循环处理SJMP$;结束DATA1EQU30H;END二:若DATA在外部数据存储器中(假如存放在1000H起始的4个单元中);解1、3ORG0000HSJMPSTARTORG0030HSTART:MOVR2,#04H;预置计数长度MOVP2,#10H;取数指针指向数据低字节的高8位地址MOVR0,#03H;取数指针指向数据低字节的低8位地址SETBC;进位位置1LOOP:MOVXA,@R0;从外部数据存储器取数CPLA;求反ADDCA,#00H;加进位位MOVX@R0,A;入存DECR0;地址指针修正DJNZR2,LOOP;4字节未处理完,继续循环处理SJMP$;结束DATA1EQU30H;解2ORG0000HSJMPSTARTORG0030HSTART:MOVR2,#04H;预置计数长度MOVP2,#10H;取数指针指向低字节数据的高8位地址MOVR0,#03H;取数指针指向低字节数据的低8位地址CLRC;进位位清零LOOP:MOVXA,@R0;从外部数据存储器取数MOVB,A;暂存MOVA,#00HSUBBA,B;用零减原数MOVX@R0,A;入存DECR0;低8位地址地址指针修正DJNZR2,LOOP;4字节未处理完,继续循环处理SJMP$;结束DATA1EQU30H;END4—5以BUFl为起始地址的外存储区中,存放有16个单字节无符号二进制数,试编一程序,求其平均值并送BUF2单元。解:设R2、R3存放和,将其除以16(R2、R3联合左移4位)即为平均置值(单字节存放)ORG0000HSJMPSTARTORG0030HSTART:MOVR2,#00H;和高字节清零MOVR3,#00H;和低字节清零4MOVDPTR,#DATA1;建立外部数据存储器的地址指针MOVR4,#10H;预置计数长度LOOP:MOVXA,@DPTR;从外部数据存储器取数ADDA,R3MOVR3,AMOVA,R2;ADDCA,#00H;MOVR2,A;累加INCDPTR;地址指针修正DJNZR4,LOOP;16字节未累加完,继续循环累加MOVR4,#04H;R2、R3联合移位4次(除以16)LOOP1:CLRCMOVA,R2RRCAMOVR2,AMOVA,R3RRCAMOVR3,ADJNZR4,LOOP1;平均值存放于R3中SJMP$;结束DATA1EQU1000H;END4—6在DATAl单元中有一个带符号8位二进制数。编一程序,按以下关系计算y值,送DATA250=050xxyxxxx解1:设DATA1、DATA2为内部数据存储器的二个单元(假设为30H、31H)且y的值单字节不会产生溢除出ORG0000HSJMPSTARTORG0030HSTART:MOVA,30H;取数X给AJZZERO;若X=0,则Y=0,转入存JBACC.7,NEG;若X0,则转X-5POZI:ADDA,#05H;若x0,则X=5,入存SJMPZERO;NEG:CLRC;SUBBA,#05H;ZERO:MOV31H,A;结果入存SJMP$;END解2:考虑Y有可能产生溢出的更为一般的情况,DATA2用双字节存放(31H、32H)5ORG0000HSJMPSTARTORG0030HSTART:MOVA,30H;取数X给AJZZERO;若X=0,则Y=0,转入存JBACC.7,NEG;若X0,则转X-5POZI:ADDA,#05H;若x0,则X+5,MOV31H,AMOVA,#00HADDCA,#00HMOV32H,A;x+5的和入存31H(低字节)、32H(高字节)中ED:SJMP$;NEG:CLRC;X0,用FF、X-5SUBBA,#05H;MOV31H,AMOVA,#0FFHSUBBA,#00HMOV32H,A;x-5的差入存31H(低字节)、32H(高字节)中SJMPEDZERO:MOV31H,A;x=0结果入存MOV32H,#00HSJMPED;END4—7设内部RAM中30H和31H单元中有两个带符号数,求出其中的大数存放在32H单元中。解一:思路:若两数同号,则值大的数大;两数异号,正数值大ORG0000HSJMPSTARTORG0030HSTART:MOVA,30H;XRLA,31H;两数异或JBACC.7,YIHAO;两数异号TONGHAO:CLRC;两数同号MOVA,30HSUBBA,31HJCLOOP1,LOOP0:MOVA,30H;同号被减数大,值大LOOED:MOV32H,ASJMP$LOOP1:MOVA,31H;异号被减数大,值小SJMPED;YIHAO:MOVA,30H;异号,哪个正,其值大JNBACC.7,LOOP0SJMPLOOP1END6解二:把两个数分别扩展成双字节的带符号数,再将两个双字节的带符号数相减,符号位为正,表示被减数大,反之则小。(若正数,扩展的高字节为00H,若负数,扩展的高字节为FFH)ORG0000HSJMPSTARTORG0030HSTART:MOV21H,30H;将30H的带符号数扩展成双字节存放在20HMOV20H,#00H;(高)、21H(低)中JNB0FH,LOOP1;bitOFH=21H.7MOV20H,#0FFH;LOOP1:MOV23H,31H;将31H的带符号数扩展成双字节存放在20H;;MOV22H,#00H;(高)、21H(低)中JNB1FH,LOOP2;bit1FH=23H.7MOV22H,#0FFH;LOOP2:CLRC;将20H、21H内容减22H、23HMOVA,21H;SUBBA,23H;MOVA,20H;SUBBA,22H;JNBACC.7,LOOP0;差为正,20H、21H数大,即30H数大MOVA,31H;差为负,22H、23H数大,即31H数大ED:MOV32H,ASJMP$;LOOP0:MOVA,30H;SJMPEDEND4—8利用逻辑尺控制的方法,设计一个主程序,在第1、3、5、6次调用SBI子程序,第2、4、7、8次调用SB2子程序。ORG0000HSJMPTESTORG0030HTEST:MOVR2,#08HMOVA,#10101100BLOOP:RLCAJCLOOP1LCALLSBISJMPRELTLOOP1:LCALLSB2RELT:DJNZR2,LOOPSJMP$PRGO:RETPRG1:RETEND4—9将DATA单元存放的以ASCII码表示的16进制数转换成十进制数存放于DATA+1单元。7解:先将DATA单元的ASCII码转换成十六进制的数,再转转成十进制的数。数字的ASCII码转成十六进制数(即为十进制数)采用减30H字母的ASCII码转成十六进制数采用减37H,十六进制再转十进制可采用先减0AH,再加10H;这样-37H-0AH+10H=-31H,可采用直接减31H。1、数字与字母的ASCII的区别,可采用对D6的检测D6=1为字母的ASCII码,反之为数字的ASCII码。ORG0000HSJMPTESTORG0030HTEST:MOVR0,#DATA1MOVA,@R0;将DATA1的数给ACLRC;LOOP:JBACC.6,LOOP1;是字母,转LOOP1SUBBA,#30H;是数字减30HED:MOVDATA1+1,A;入存SJMP$;结束LOOP1:SUBBA,#31H;是字母,减31HSJMPED;DATA1EQU30HEND2、数字与字母的ASCII的区别,也可采用与3AH相比较,若大于它则为字母的ASCII码,反之为数字的ASCII码。也可先减30H,再对D4位进行检测,若为1则为字母的ASCII码,可再减1,即为它所对应的十进制数。反之为数字的ASCII码的十进制数。ORG0000HSJMPTESTORG0030HTEST:MOVR0,#DATA1MOVA,@R0;将DATA1的数给ACLRC;进位位清零LOOP:SUBBA,#30H;先减30HJBACC.4,LOOP1;是字母,转LOOP1ED:MOVDATA1+1,A;入存SJMP$;结束LOOP1:SUBBA,#01H;是字母,减31HSJMPED;DATA1EQU30HEND4—10编一个将十六进制数转换成十进制数的子程序。1、编一个单字节(内部数据存储器30H)的十六进制数转换成十进制数的子程序2、编一个将内部数据存储器30H起始的10个字节的十六进制数转换成十进制数,从40H起始存放的子程序1解、一个单字节的十六进制的数转成十进制数一般考虑用二个字节BCD码来存放。设转换后的数存放在R3(高)、R4(低)中。8思路;a、一种可将其分离成高
本文标题:mcs51单片机第四章习题解答
链接地址:https://www.777doc.com/doc-2882574 .html