单片微型计算机原理与应用课后答案华中科技大学.docx
《单片微型计算机原理与应用课后答案华中科技大学.docx》由会员分享,可在线阅读,更多相关《单片微型计算机原理与应用课后答案华中科技大学.docx(32页珍藏版)》请在冰豆网上搜索。
![单片微型计算机原理与应用课后答案华中科技大学.docx](https://file1.bdocx.com/fileroot1/2023-1/24/2b7b14e5-43e4-4389-b22d-d7ea66f3869e/2b7b14e5-43e4-4389-b22d-d7ea66f3869e1.gif)
单片微型计算机原理与应用课后答案华中科技大学
习题2
2.1MCS-51单片机部包含哪些主要逻辑功能部件?
答:
微处理器(CPU)、数据存储器(RAM)、程序存储器(ROM/EPROM)、特殊功能寄存器(SFR)、并行I/O口、串行通信口、定时器/计数器及中断系统。
2.2说明程序计数器PC和堆栈指针SP的作用。
复位后PC和SP各为何值?
答:
程序计数器PC中存放将要执行的指令地址,PC有自动加1功能,以实现程序的顺序执行。
它是SFR中唯一隐含地址的,因此,用户无法对它进行读写。
但在执行转移、调用、返回等指令时能自动改变其容,以实现改变程序的执行顺序。
程序计数器PC中容的变化决定程序的流程,在执行程序的工作过程中,由PC输出将要执行的指令的程序存储器地址,CPU读取该地址单元中存储的指令并进行指令译码等操作,PC则自动指向下一条将要执行的指令的程序存储器地址。
SP是一个8位的SFR,它用来指示堆栈顶部在部RAM中的位置。
系统复位后SP为07H,若不对SP设置初值,则堆栈在08H开始的区域,为了不占用工作寄存器R0~R7的地址,一般在编程时应设置SP的初值(最好在30H~7FH区域)。
2.3程序状态字寄存器PSW的作用是什么?
其中状态标志有哪几位?
它们的含义是什么?
答:
PSW是保存数据操作的结果标志,其中状态标志有CY(PSW.7):
进位标志,AC(PSW.6):
辅助进位标志,又称半进位标志,F0、F1(PSW.5、PSW.1):
用户标志;OV(PSW.2):
溢出标志;P(PSW.0):
奇偶标志。
2.4什么是堆栈?
堆栈有何作用?
为什么要对堆栈指针SP重新赋值?
SP的初值应如何设定?
答:
堆栈是一种数据结构,所谓堆栈就是只允许在其一端进行数据写入和数据读出的线性表。
其主要作用有两个:
保护断点和保护现场。
堆栈区的设置原则上可以在部RAM的任意区域,但由于MCS-51单片机部RAM的00H~1FH地址单元已被工作寄存器R0~R7占用,20H~2FH为位寻址区,故堆栈一般设在30H~7FH(对于8032系列芯片可为30H~0FFH)的区域。
单片机复位后,SP的容为07H,堆栈事实上由08H单元开始,考虑到08H~1FH单元分别属于1~3组的工作寄存器区,则最好把SP值改置为1FH或更大的值。
2.5开机复位后,CPU使用的是哪组工作寄存器?
它们的地址如何?
CPU如何指定和改变当前工作寄存器组?
答:
开机复位后使用的是0组工作寄存器,它们的地址是00H~07H,对程序状态字PSW中的RS1和RS0两位进行编程设置,可指定和改变当前工作寄存器组。
RS1、RS0=00H时,当前工作寄存器被指定为0组;RS1、RS0=01H时,当前工作寄存器被指定为1组;RS1、RS0=10H时,当前工作寄存器被指定为2组;RS1、RS0=11H时,当前工作寄存器被指定为3组。
2.6MCS-51的时钟周期、机器周期、指令周期是如何定义的?
当振荡频率为12MHz时,一个机器周期为多少微秒?
答:
①时钟周期也称为振荡周期,定义为时钟脉冲的倒数,是计算机中最基本的、最小的时间单位。
②CPU取出一条指令至该指令执行完所需的时间称为指令周期,因不同的指令执行所需的时间可能不同,故不同的指令可能有不同的指令周期。
③机器周期是用来衡量指令或程序执行速度的最小单位。
它的确定原则是以最小指令周期为基准的,即一个最小指令周期为一个机器周期。
④当振荡频率为12MHz时,一个机器周期1微秒
2.7MCS-51单片机的控制信号、、有哪些功能?
答:
是访问程序存储器控制信号。
当端接低电平时,则不管芯片部是否有程序存储器,CPU只访问外部程序存储器。
对8031来说,因其部无程序存储器,所以该引脚必须接地。
当端接高电平时,CPU访问部程序存储器,但当PC(程序计数器)值超过某一值时,将自动转向片外程序存储器1000H地址继续执行程序。
是地址锁存允许信号。
当CPU访问外部存储器或I/O接口时,ALE输出脉冲的下降沿用于锁存16位地址的低8位。
在不访问外部存储器或I/O接口时,ALE端有周期性正脉冲输出,其频率为振荡频率的1/6。
但是,每当访问外部数据存储器或I/O接口时,在第二个机器周期中ALE只出现一次,即丢失一个ALE脉冲。
片外程序存储器读选通信号。
在CPU从外部程序存储器读取指令(或常数)期间,每个机器周期两次有效,但在访问外部数据存储器或I/O接口时,信号将不出现。
端可以驱动8个TTL负载。
2.8MCS-51的片外程序存储器和片外数据存储器共处同一地址空间为什么不会发生总线冲突?
答:
MCS-51的片外程序存储器和片外数据存储器共处同一地址空间,地址围都是0000H~FFFFH(64KB),但不会发生总线冲突。
因片外程序存储器和片外数据存储器的读写控制信号不同,片外程序存储器的读信号是,而片外数据存储器的读信号为、写信号为,访问片外程序存储器和片外数据存储器的指令也不同,所以它们不会发生总线冲突。
2.9简述MCS-51部数据存储器的存储空间分配。
答:
部数据存储器分为3个区域:
工作寄存器区(00H~1FH);
位寻址区(20H~2FH);
堆栈和数据缓冲器区(30H~7FH或30H~0FFH)。
2.10位地址和字节地址有何区别?
位地址20H具体在存中什么位置?
答:
MCS-51的位存储器由以部RAM中20H~2FH单元和特殊功能寄存器中地址为8的倍数的特殊功能寄存器两部分组成。
其中每个单元的每一位都有一个位地址映像,它们既可以像普通部RAM单元一样按字节存取,也可以对单元中的任何一位单独存取。
字节地址是部RAM中和特殊功能寄存器中每个存储单元的地址。
位地址20H是部RAM24H中的D0位。
2.118051的4个I/O口作用是什么?
8051的片外三总线是如何分配的?
答:
MCS-51单片机有4个8位并行I/O端口,分别记作P0、P1、P2、P3口。
①在访问片外扩展存储器时,P0口分时传送低8位地址和数据,P2口传送高8位地址。
P1口通常作为通用I/O口供用户使用。
P3口具有第二功能,为系统提供一些控制信号。
在无片外扩展存储器的系统中,这4个口均可作为通用I/O端口使用。
在作为通用I/O端口使用时,这4个口都是准双向口。
②在访问片外扩展存储器时,片外三总线的构成:
P0口传送低8位地址经锁存器所存构成低8位地址总线,高8位地址总线由P2口构成。
P0口作为单片机系统的低8位地址/数据线分时复用,在低8位地址锁存后,P0口作为双向数据总线。
由P3口的第二功能输出数据存储器的读、写控制信号与片外程序存储器读选通信号,访问程序存储器控制信号,地址锁存允许信号构成控制总线。
习题3
3.1汇编语句是由4个部分(字段)构成的,简述各部分的含义。
答:
汇编语句的4个部分为:
[标号:
][操作码][操作数];[注释]
标号是用户设定的一个符号,表示存放指令或数据的存储单元地址。
标号由以字母开始的1―8个字母或数字串组成,以冒号结尾。
不能用指令助记符、伪指令或寄存器名来作标号。
标号是任选的,并不是每条指令或数据存储单元都要标号,只在需要时才设标号。
如转移指令所要访问的存储单元前面一般要设置标号。
一旦使用了某标号定义一个地址单元,在程序的其它地方就不能随意修改这个定义,也不能重复定义。
操作码是指令或伪指令的助记符,用来表示指令的性质或功能。
对于一条汇编语言指令,这个字段是必不可少的。
操作数给出参加运算(或其它操作)的数据或数据的地址。
操作数可以表示为工作寄存器名、特殊功能寄存器名、标号名、常数、表达式等。
这一字段可能有,也可能没有。
若有两个或三个操作数,它们之间应以逗号分开。
注释字段不是汇编语言的功能部分,只是增加程序的可读性。
言简意赅的注释是汇编语言程序编写中的重要组成部分。
3.2举例说明MCS-51单片机的7种寻址方式,各寻址方式的寻址空间。
立即寻址立即寻址方式的寻址空间为程序存储器。
例如:
MOVA,#3FH;3FH→A
直接寻址直接寻址方式中操作数存储的空间有三种:
部数据存储器的低128个字节单元(00H~7FH)
例如:
MOVA,30H;(30H)→A
指令功能是把部RAM30H单元中的容送入累加器A。
⑵位地址空间
例如:
MOVC,00H;直接位00H容→进位位
⑶特殊功能寄存器
例如:
MOVIE,#85H;立即数85H→中断允许寄存器IE。
寄存器寻址寄存器寻址方式的寻址空间为工作寄存器和特殊功能寄存器等。
例如:
MOVA,R6;(R6)→A
寄存器间接寻址寄存器间接寻址空间为部RAM128字节,外部RAM
例如:
MOVA,R0;((R0))→A
变址寻址变址寻址空间为程序存储器。
例如:
MOVCA,A+DPTR;((DPTR)+(A))→A
MOVCA,A+PC;((PC)+(A))→A
相对寻址相对寻址空间为程序存储器。
当前PC值是指相对转移指令所在地址(源地址)加转移指令字节数。
即:
当前PC值=源地址+转移指令字节数
偏移量rel是有符号的单字节数,以补码表示,相对值在-128~+127围,负数表示从当前地址向上转移,正数表示从当前地址向下转移。
所以转移的目的地址为:
目的地址=当前PC值+rel=源地址+转移指令字节数+rel
例如:
JNC2AH,JZF8H
位寻址位寻址空间为部RAM20H~2FH的128位和SFR中的83位。
例如:
MOVC,30H,MOVP1.0,C
3.3指出下列指令的寻址方式和操作功能:
INC40H;直接寻址(40H)+1→40H
INCA;寄存器寻址(A)+1→A
INCR2;寄存器间接寻址((R2))+1→(R2)
MOVCA,A+DPTR;基址加变址寄存器寻址((A)+(DPTR))→A
MOVA,#6EH;立即寻址6EH→A
SETBP1.0;位寻址P1.0置1
3.4设部RAM中3AH单元的容为50H,写出当执行下列程序段后寄存器A、R0和部RAM50H,51H单元的容为何值?
MOVA,3AH;(A)=50H
MOVR0,A;(R0)=50H
MOVA,#00H;(A)=00H
MOVR0,A;(50H)=00H
MOVA,#25H;(A)=25H
MOV51H,A;(51H)=25H
答:
(A)=25H,(3AH)=50H,(R0)=50H,(50H)=00H,(51H)=25H
3.5设堆栈指针SP中的容为60H,部RAM30H和31H单元的容分别为27H和1AH,执行下列程序段后,61H,62H,30H,31H,DPTR及SP中的容将有何变化?
PUSH30H;(SP)+1→SP,(30H)→61H
PUSH31H;(SP)+1→SP,(31H)→62H
POPDPL;(62)→DPL,(SP)-1→SP
POPDPH;(61)→DPH,(SP)-1→SP
MOV30H,#00H;00H→30H
MOV31H,#0FFH;FFH→31H
答:
(61H)=27H,(62H)=1AH,(30H)=00H,(31H)=FFH,(DPTR)=271AH,(SP)=60H
3.6设(A)=30H,(R1)=23H,(30H)=05H。
执行下列两条指令后,累加器A和R1以及部RAM30H单元的容各为何值?
XCHA,R1
XCHDA,R1
答:
(A)=25H,(R1)=30H,(30H)=03H
3.7设(A)=01010101B,(R5)=10101010B,分别写出执行下列指令后的结果
ANLA,R5;(A)=00000000B,(R5)=10101010B
ORLA,R5;(A)=10101010B,(R5)=10101010B
XRLA,R5;(A)=00000000B
3.8设指令SJMPrel=7FH,并假设该指令存放在2113H和2114H单元中。
当该条指令执行后,程序将跳转到何地址?
答:
程序将跳转到2194H地址
3.9简述转移指令AJMPaddr11,SJMPrel,LJMPaddr16及JMPA+DPTR的应用场合。
答:
AJMPaddr11这是在当前PC的2K字节围的无条件转移指令,把程序的执行转移到指定的地址。
SJMPrel这是相对跳转指令,其中rel为相对偏移量。
转向的目标地址是在当前PC的前128字节到后127字节之间。
LJMPaddR16执行这条指令时把指令的第二和第三字节分别装入PC的高位和低位字节中,无条件地转向指定地址。
转移的目标地址可以在64KB程序存储器地址空间的任何地方,不影响任何标志。
JMPA+DPTR把累加器A中8位无符号数与数据指针DPTR中的16位数相加,将结果作为转移的目标地址送入PC,不改变累加器A和数据指针DPTR容,也不影响标志。
本指令以DPTR容作为基址,A的容作为变址。
只要把DPTR的值固定,而给A赋予不同的值,即可实现程序的多分支转移。
3.10查指令表,写出下列两条指令的机器码,并比较一下机器码中操作数排列次序的特点。
MOV78H,80H;858078
MOV78H,#80H;757880
答:
直接寻址单元传送到直接寻址单元的机器码是第二个操作数在前,而立即数传送到直接地址单元是第一个操作数在前,次序正好相反。
3.11试编写程序,查找在部RAM30H~50H单元中1AH这一数据。
若找到1AH则将51H单元置为01H;没找到则将51H单元置为00H。
答:
参考程序如下
MOVR1,#2FH
LOOP1:
INCR1
CJNER1,#1AH,LOOP2
SJMPLOOP3
LOOP2:
CJNER1,#51,LOOP1
MOV51H,#00H
SJMPEND
LOOP3:
MOV51H,#01H
END:
RET
3.12若SP=60H,子程序标号MULT所在的地址为3A40H。
执行LCALLMULT指令后,堆栈指针SP和堆栈容发生了什么变化?
答:
(SP)=62H,(61H)=40H,(62H)=3AH
3.13假设外部存储器215AH单元的容为3DH,执行下列指令后,累加器A中的容为何值?
MOVP2,#21H
MOVR0,#5AH
MOVXA,R0
答:
(A)=3DH
习题4
4.1编程将数据存储器中以2A00H为首地址的100个连续单元清零。
CLRA
MOVR0,#64H
MOVDPTR,#2A00H
LOOP:
MOVXDPTR,A
INCDPTR
DJNZR0,LOOP
END
4.2编程将片50H~70H单元中的容传送到以5C00H为起始地址的存储区中。
MOVDPTR,#5C00H
MOVR0,#50H
LOOP:
MOVA,R0
MOVXDPTR,A
INCR0
INCDPTR
CJNER0,#70H,LOOP
END
4.3片外RAM区从1000H单元开始存有100个单字节无符号数,找出最大值并存入1100H单元中,试编写程序。
MOVDPTR,#1000H;置片外RAM区首地址
MOVR0,#00H;清R0
MOVR1,64H;置计数初值100
LOOP:
MOVXA,DPTR;取片外RAM区的某个数送A
CJNZA,R0,NT1;与R0中的数比较
NT1:
JCNT2;(A)<(R0)跳转到NT2
MOVRO,A;若(A)(R0),则大数送RO
NT2:
INCDPTR;修改数据块指针
DJNZR1,LOOP;未完,循环
RET
4.4设有100个单字节有符号数,连续存放在以2100H为首地址的存储区中,试编程统计其中正数、负数、零的个数。
MOVR0,#00H;置负数的计数初值
MOVR1,#00H;置正数的计数初值
MOVR2,#00H;置0的计数初值
MOVR4,#64H;置循环计数初值
MOVDPTR,#2100H;置数据区首地址
START:
MOVXA,DPTR;取某一数据送入A
JZEQUAL;为0转EQUAL
JNBACC.7,POSI;为正数转POSI
INCR0;负数计数值加1
INCDPTR;修改数据块指针
DJNZR4,START;未完,返回
POSI:
INCR1;正数计数值加1
INCDPTR;修改数据块指针
DJNZR4,START
EQUAL:
INCR2;0计数值加1
INCDPTR
DJNZR4,START
END
4.5从2030H单元开始,存有100个有符号数,要求把它传送到从20BOH开始的存储区中,但负数不传送,试编写程序。
MOVR1,#64H;置计数初值
MOVR0,#B0H;目标数据区首地址低8位,高8位为20H
MOVDPTR,#2030H;源数据区首地址
START:
MOVXA,DPTR;取源数据区某数据送入A
ACC.7,D1;负数,转D1
MOVXR0,A;正数,送入目标数据区
INCDPTR;修改源数据块指针
INCR0;修改目标数据块指针
DJNZR1,START;未完,继续
RET;返回
D1:
INCDPTR;修改源数据块指针
INCR0;修改目标数据块指针
DJNZR1,START;未完,继续
RET;返回
4.6若从30H单元开始有100个数,编一个程序检查这些数,正数保持不变,负数取补后送回。
MOVR0,#30H;数据区首地址
MOVR1,#64H;计数初值
START:
MOVXA,R0;取某个数
JNBACC.7,POSI;正数,转POSI
CPLA;负数,取补
ADDA,#01H
MOVXR0,A;送回原地址
INCR0;修改数据块指针
DJNZR1,START;未完,继续
RET
POSI:
INCR0;修改数据块指针
DJNZR1,START;未完,继续
RET
4.7试编程把以2040H为首地址的连续10个单元的容按升序排列,存到原来的存储区中。
SORT:
MOVDPTR,#2040H;
MOVR3,#09H;
CLRF0;
D1:
MOVXA,DPTR;
MOVR2,A;前一个数送R2
INCDPTR
MOVXA,DPTR;
MOVR4,A;后一个数送R4
MOVA,R2;前一个数送A
CLRC
SUBBA,R4;前一个数减后一个数
JCNEXT;
MOVA,R2;相邻数互换
MOVXDPTR,A
MOVR0,DPL;数据指针低8位减1
DECR0
MOVDPL,R0
MOVA,R4;
MOVXDPTR,A
INCDPTR;
SETBF0
NEXT:
DJNZR3,D1;
F0,SORT
RET
4.8设在2000H~2004H单元中.存放有5个压缩BCD码,编程将它们转换成ASCII码,存放到以2005H为首地址的存储区中。
MOVDPTR,#2000H;
MOVR0,#05H;
MOVR1,#04H;
D1:
MOVXA,DPTR;
ANLA,#0FH
CLRC;
ADDA,#30H;
MOVP2,#20H
MOVXR0,A
INCDPTR;
INCR0
DJNZR1,D1;
RET
在以2000H为首地址的存储区中,存放着20个用ASCII码表示的O~9之间的数,试编程,将它们转换成BCD码,并以压缩BCD码的形式存放在3000H~3009H单元中。
MOVDPTR,2000H;
MOVR0,#20H;
MOVR1,#00H;
ASCBIN:
MOVXA,DPTR;
CLRC
SUBBA,#30H;
MOVP2,30H;
MOVXR1,A;
INCR1;
INCDPTR;
DJNZR0,ASCBIN;
RET
4.10试编写多字节BCD码数加法、减法子程序。
4.11若晶振为6MHz,试编写延时100ms、1s的子程序。
ORG2000H周期数
MOVR0,#0AH;毫秒数→R01
DL2:
MOVR1,#MT;1ms延时值→R11
DL1:
NOP1
NOP1
DJNZR1,DL1;1ms延时循环2
DJNZR0,DL2;10ms延时循环2
END
4.12试设计一个子程序,其功能为将片RAM20H~21H中的压缩BCD码转换为二进制数,并存于以30H开始的单元。
BCDB:
MOVA,20H
MOVR2,A;取千位、百位BCD码
ACALLBCDB1;调用子程序
MOVB,#0AH
MULAB;乘以10
MOVR6,A;乘积低8位送R6
XCHA,B;交换乘积高、低位
MOVR5,A;乘积高位送R5
MOVA,21H;取十位、个位BCD码
MOVR2,A;送入R2
ACALLBCDB1;调用子程序
ADDA,R6;加千位、百位乘积低8位
MOV31H,A;低8位送入31H
MOVA,R5;乘积高8位送A
ADDCA,#00H;加进位位
MOV30H,A;结果高8位送入30H
HERE:
SJMPHERE
子程序清单:
BCDB1:
MOVA,R2;取压缩BCD码
ANLA,#0F0H;屏蔽低4位
SWAPA
MOVB,#0AH
MULAB;高位BCD码乘以10
MOVR3,A;乘积送R3
MOVA,R2;取压缩BCD码
ANLA,#0FH;屏蔽高4位
ADDA,R3;高位BCD码乘以10后加低位BCD码
MOVR2,A;送R2
RET
习题5
5.1什么是中断系统?
中断系统的功能是什么?
答:
当CPU正在处理某件事情(例如,正在执行主程序)的时候,外部或部发生的某一事件(如某个引脚上电平的变化,一个脉冲沿的发生或计数器的计数溢出等)请求CPU迅速去处理,于是,CPU暂时终止当前的工作,转去处理所发生的事件。
中断服务程序处理完该事件后,再回到原来被终止的地方,继续原来的工作,这样的过程称为中断。
实现这种功能的部件称为中断系统。
中断系统的功能:
(1)实现中断及中断返回,
(2)实现优先级排队,(3)实现优先级控制。
5.2什么是中断嵌套?
答:
当CPU响应某一中断源的请求而进行中断处理时,若有优先级更高的中断源发出中断请求,则CPU中断正在执行的中断服务程序,保留程序的断点和现场,响应更高一级的中断,即是中断嵌套。
5.3什么是中断源?
MCS-51有哪些中断源?
各有什么特点?
答:
向CPU发出中断请求的来源称为中断源。
MC5-51单片机的中断系统有5个中断请求源:
⑴—外部中断0