您好,欢迎访问三七文档
单片机原理及应用主讲:谢海明老师助教:王兴第三章习题一填空题1.指令2.111;49条单;45条双;17条三3.74.操作数本身;A;B;AB5.操作数本身;地址;R0;R1;DPTR;6.直接;7.DPTR;PC;A;程序存储器8.DPTR;SP;MOVX9.直接;立即一填空题10.80H11.68H12.68H13.62H;68H;36H14.41H;39H;88H15.0BFH;0;0;016.2D;1;1;017.26H;118.90H;06H;0;1一填空题19.16H;05H;0;020.06H;09H21.00H;96H二选择题1.42.33.44.2第三题编程与问答题2.要访问一特殊功能寄存器和外部数据存储器应分别采用哪种寻址方式?答:直接寻址方式、寄存器寻址可用于访问特殊功能寄存器,位寻址方式可对特殊功能寄存器中的可位寻址位进行寻址。外部数据存储器应采用寄存器间接寻址方式。5.请写出能完成每一种操作的指令序列①将R0的内容传送到R1MOVAR0MOVR1A②.将内部RAM20H单元的内容传送到R7MOVR720H③.将外部RAM1000H单元的内容传送到内部RAM30H单元MOVDPTR#1000HMOVXA@DPTRMOV30HA④.将外部RAM1000H单元的内容传送到R1MOVDPTR#1000HMOVXA@DPTRMOVR1A6.阅读下面的程序。要求:说明程序的功能;写出涉及的寄存器及片内RAM单元的最后结果答:该程序是将内部RAM40H中的内容与41H的内容相加,和放在43H,42H中。指令执行后:A的内容为01H,42H的内容为5AH,43H的内容为01H。7、假设在内RAM30H和31H中存放有一个16位的无符号二进制数(高字节在高地址单元),请编写程序对该数乘2,再放回原单元。思路:对一个16位无符号二进制数进行乘2操作需要将此数分成两个8位二进制乘2操作,因为在MCS-51的指令系统中仅有的乘法运算指令只能进行8位无符号数的乘法运算。注:MULAB;该指令的功能是把累加器A和寄存器B中的两个8位无符号数相成,乘积又送回到A,B。其中B中存放积的高位字节,A存放积的低位字节。乘法运算总对Cy清零,但不影响其他标志位。ORG1000HmovA30H;movB#2;mulAB;mov30HA;mov32HB;movA31H;movB#2;mulAB;ADDA32H;mov31HA;END30H的数据送入A将立即数2送入B低8位乘2A中的数送入30HB中的数送入32H31H的数据送入A将立即数2送入B高8位乘2高8位乘法低字节(A)与低8位乘法高字节(32H)相加A中的数送入31H开始结束START:8、写出16位数相加程序,设被加数存放在内RAM20H,21H单元,加数存放在22H,23H单元,并将结果存放在后续单元24H、25H中(要求低位数存放在低地址单元中)。注:MCS-51的指令系统中只有8位数据的加法运算指令。在完成两个8位二进制的加法运算时被加数总是在累加器A中,而加数可以采用不同的寻址方式得到,其运算结果仍放在累加器A中。思路:首先完成20H和22H的加法运算,将结果存放在24H中,然后完成21H、23H和Cy的加法运算,将结果存放在25H中。ORG1000HCLRCMOVA20H;ADDA22H;MOV24HA;MOVA21H;ADDCA23H;MOV25HA;END将20H中的数送入A20H与22H单元中数据加法操作将A中数送入24H将21H中的数送入A21H与23H完成带进位加法操作将A中数送入25H开始结束START:9、试编写程序:采用“与”运算,判断内RAM20H单元的8位二进制数是正数还是负数。试根据30H中的值编写程序判断20H单元中数的两种情况,在30H中存放‘0’代表正数,存放‘1’代表负数。注:1、有符号数中通常最高位为‘0’表示正数,最高位为1表示负数。2、正负数的判断条件,30H中存放‘0’代表正数,存放‘1’代表负数。3、选择的条件判断指令为JZ(59)。ORG1000H;movA#80;ANLA20H;JZNEXT0;mov30H#1;SJMPNEXT1;NEXT0:mov30H#0;NEXT1:SJMP$ENDSTART:开始将#80送入A(A)与(20H)与操作(A)=0?30H中写入130H中写入0YN结束10、从内RAM40H单元开始的区域内存有10个单字节十进制数(压缩的BCD码)试求它们的累加和,并将结果存放在内部RAM20H和21H单元中。注:在十进制调整指令DAA;(52页)本指令的功能是对两个BCD码的和(存放在A)进行十进制调整,使A中的数据也为BCD码数。指令只影响Cy.ORG1000HMOVR1#40H;MOVR2#10;MOV20H#0;MOV21H#0;CLRCLoop:MOVA@R1;ADDA20H;DAA;MOV20HA;MOVA21H;ADDCA#0;MOV21HA;INCR1;DJNZR2loop;SJMP$END取源数据首地址置循环变量存储单元初始化取数据,进行加法运算十进制修正A中数据送入20H带进位位加法A中数据送入21H修改数据地址单元(R2)-1=0?N程序踏步Y开始结束START:11、编写程序,将内RAM从20H开始存放的16个数传送到从18H开始的单元中。ORG1000HmovR0#20H;movR1#18H;movR2#16;loop:movA@R0;mov@R1A;INCR0;INCR1;DJNZR2loop;SJMP$END取源数据首地址,取目标单元首地址,置循环变量取数据,送到目标单元中修改数据地址和目标地址单元(R2)-1=0?N程序踏步Y开始结束START:12、编写程序,将内RAM从20H开始存放的16个数传送到从28H开始的单元中。ORG1000Hstart:movR0#2FH;movR1#37H;movR2#16;loop:movA@R0;mov@R1A;DECR0;DECR1;DJNZR2loop;SJMP$END取源数据末尾地址,取目标单元末尾地址,置循环变量取数据,送到目标单元中修改数据地址和目标地址单元(R2)-1=0?N程序踏步Y开始结束13、编写程序,将片外RAM从2000H开始存放的8个数传送到片内RAM从30H开始的单元中。ORG1000HmovDPTR#2000H;movR1#30H;movR2#8;loop:movxA@DPTR;mov@R1A;INCDPTR;INCR1;DJNZR2loop;SJMP$END取源数据首地址,取目标单元首地址,置循环变量取数据,送到目标单元中修改数据地址和目标地址单元(R2)-1=0?N程序踏步Y开始结束14、已知从外部RAM0040H单元开始存放有20个无符号数,试编制程序,将该数据块搬移到外部RAM从0060H单元开始的存储区域内。注:1、MCS-51指令系统中只有MOVX指令能访问外部数据存储器。2、外部数据存储器与内部数据存储器的数据传送只能通过累加器A进行,且只能采用间接寻址方式。含有@Ri的指令用于访问地址位数为8位的外RAM单元或I/O口。含有@DPTR的指令用于访问地址位数为16位的外RAM或I/O口。ORG1000HMOVDPTR#0040H;MOVR0#60H;MOVR2#20;loop1:MOVXA@DPTR;MOVX@R0A;INCR0;INCDPTR;DJNZR2loop1;SJMP$END取源数据首地址,取目标单元首地址,置循环变量取数据,送到目标单元中修改数据地址和目标地址单元(R2)-1=0?NY程序踏步结束开始第四章习题一填空题1.保护;恢复2.机器语言3.AREA1=0500HBUF=0505HTIME=01HACK=0507H解:ORG0200HMOVR7,#07H;R7作循环次数计数器MOVR3,#0;R3作和数高字节寄存器MOVA,20H;取被加数MOVR0,#21H;R0作加数地址指针CLRCLOOP:ADDA,@R0;作加法JNCNEXT;CY=0,和256,转INCR3;CY=1,加到高字节NEXT:INCR0;修改R0指针DJNZR7,LOOP;未完,重复加MOV51H,R3;存高字节MOV50H,A;存低字节3.求连续存放在20H中的8个单字节无符号数之和,并求其平均值存放在R2中MOVR2,#03HLOOP1:CLRCMOVA,51HRRCA;高8位右移,A0送入CY;MOV51H,A;右移结果送入51HMOVA,50HRRCA;低8位右移,CY为高八位中的A0且送入低8位的A7,;同时CY变为低8位中的A0MOV50H,A;结果存放在50H中DJNZR2,LOOP1;右移3次MOVR2,50H3.MOVR0,#07MOVR1,#20HMOVR2,#28HCLRCMOVA,@R1LOOP0:MOV28H,ARRCACLRCRRCACLRCRRCACLRCMOV@R1,AANL28H,#7HINCR1DJNZR0,LOOP0MOVR0,#07MOVR1,#20HMOVA,@R1LOOP1:INCR1ADDA,@R1DJNZR0,LOOP1RR28HRR28HRR28HADDA,28HMOVR2,AMOVR0,#21HMOVR1,20HCLRCMOVR7,#00HMOVR6,#00HLOOP:MOVA,@R0JBACC.7,STEPADDA,R6MOVR6,AINCR0SJMPHERESTEP:ADDA,R7MOVR7,AINCR0HERE:DJNZR1,LOOPEND4.设内部RAM从21H单元开始存有一组带符号数,数据长度存于20H单元,要求把改组中正数,负数分别求和,并存放在寄存器R6和R7中。取源数据首地址,取目标单元首地址,置循环变量取数据,送到目标单元中修改数据地址和目标地址单元(R1)-1=0?N程序踏步Y开始结束判断正负?送R6求和送R7求和NY5.设内部RAM从LIST单元开始存有一组符号数据,数据个数为30,变成找出其中的最大数,并存入BIG单元中。解:LISTEQU42HBIGEQU41HORG0000HMOVR0,#LISTMOVBIG,@R0MOVR2,#30DECR2NEXT:INCR0MOVA,@R0CJNEA,BIG,COMPCOMP:JCCONMOVBIG,ACON:DJNZR2,NEXTRET6.设内RAM从20H单元开始存有40H个无符号数,试编制程序将它们按从大到小的顺序排列,结果仍存放在原存贮区域内。解:数据排序的方法有很多,本例采用常用的冒泡排序法,又称为两两比较法。想象把40个数纵向排列,自上而下将存储单元相邻的两个数进行比较,若前数小于后数,则存储单元中的两个数互换位置;若前数大于后数,则存储单元中的两个数保持原来位置。按同样的原则依次比较后面的数据,直到该组数据全部比较完,经过第1轮的比较,最大的数据就像冒泡一样排在了存储单元最末的位置上。经过39轮冒泡,便可完成40个数据的排序。在实际排序中,40个数不一定要经过39轮排序冒泡,可能只要几次就可以了。为了减少不必要的冒泡次数,可以设计一个交换标志,每一轮冒泡的开始将交换标志位清0,在该轮数据比较中若有数据位置互换,则将交换标志位置1;每轮冒泡结束时,若交换标志位仍为0,则表明数据排序已完成,可以提前结束排序。ORG0000HLJMPMAINORG0100HMAIN:MOVR1,#20H;置数据块首地址MOVR2,#39;置每次冒泡比较次数CLR10H;交换标志位清0LOOP1:MOVA,@R1;取前数INCR1MOV70H,@R1;取后数CJNEA,70H,LOOP2;比较前数与后数的大小LOOP2:JNCLOOP3;若前数后数则转移,不互换MOV@R1,70H;小数存放到后数的位置DECR1MOV@R1,A;大数存放到前数的位置INCR1;恢复数据指针,准备下一次比较SETB10H;有互换,标志位置1LOOP3:DJNZR2,LOOP1;若一次冒泡未完,继续进
本文标题:单片机习题.
链接地址:https://www.777doc.com/doc-2594460 .html