单片机原理及应用第2版(徐泳龙编)课后习题参考答案 下载本文

《单片机原理及应用》习题答案第一章计算机基础知识

1-1微型计算机主要由哪几部分组成?各部分有何功能?

答:一台微型计算机由中央处理单元(CPU)、存储器、I/O接口及I/O设备等组成,相互之间通过三组总线(Bus):即地址总线AB、数据总线DB和控制总线CB来连接。

CPU由运算器和控制器组成,运算器能够完成各种算术运算和逻辑运算操作,控制器用于控制计算机进行各种操作。

存储器是计算机系统中的“记忆”装置,其功能是存放程序和数据。按其功能可分为RAM和ROM。

输入/输出(I/O)接口是CPU与外部设备进行信息交换的部件。

总线是将CPU、存储器和I/O接口等相对独立的功能部件连接起来,并传送信息的公共通道。

1-3什么叫单片机?其主要由哪几部分组成?

答:单片机(SingleChipMicrocomputer)是指把CPU、RAM、ROM、定时器/计数器以及I/O接口电路等主要部件集成在一块半导体芯片上的微型计算机。

1-4在各种系列的单片机中,片内ROM的配置有几种形式?用户应根据什么原则来选用?

答:单片机片内ROM的配置状态可分四种:

(1)片内掩膜(Mask)ROM型单片机(如8051),适合于定型大批量应用产品的生产;

(2)片内EPROM型单片机(如8751),适合于研制产品样机;

(3)片内无ROM型单片机(如8031),需外接EPROM,单片机扩展灵活,适用于研制新产品;

(4)EEPROM(或FlashROM)型单片机(如89C51),内部程序存储器电可擦除,使用更方便。

1-5写出下列各数的另两种数制的表达形式(二、十、十六进制)

1100010100111001000111100100100111111101101100111011011101011119862H

200394E47H

585249H

162363F6CH

291D

14955D7

1-6写出下列各数的BCD参与:

59:01011001,1996:0001100110010110,4859.2:0100100001011001.0010

389.41:001110001001.01000001

第二章MCS-51单片机的硬件结构

2-18052单片机片内包含哪些主要逻辑功能部件?答:8052单片机片内包括:①8位中央处理器CPU一个②片内振荡器及时钟电路③256B数据存储器RAM。④8KB片内程序存储空间ROM⑤21个特殊功能寄存器SFR⑥4个8位并行I/O端口(32条线)⑦1个可编程全双工串行口

⑧可寻址64KB的外部程序存储空间和外部数据存储空间⑨3个16位的定时器/计数器

⑩6个中断源、2个优先级嵌套中断结构

2-28052的存储器分哪几个空间?如何区别不同空间的寻址?答:⑴8052的存储器分为6个编址空间:

①片内ROM的容量为8KB,其地址为0000H~1FFFH;②可扩展片外ROM的容量为64KB,其地址为0000H~FFFFH;

片内RAM的容量为256B,其地址为00H~FFH分为二块:③地址00H~7FH共128B为片内RAM低区,④另128B为片内RAM高区,其地址空间为80H`FFH,其地址空间与SFR功能寄存器地址重叠;

⑤可扩展片外RAM的容量为64KB,其地址为0000H~1FFFH;

⑥特殊功能寄存器SFR的空间为128B,其地址为80H~FFH,但实际只定义了26B单元,这26B单元分散在80H`F0H。

⑵程序存储器和数据存储器在逻辑上是完全分开的。

CPU通过指令MOVC访问程序存储器。当8052第31脚EA接高电平时,CPU将从片内程序存储器0000H单元开始执行,当PC值超出片内程序存储空间,即大于1FFFH时,会自动转向片外程序存储空间。当EA接低电平时,CPU将从片外程序存储器ROM的0000H单元开始执行。

CPU通过MOV指令访问片内数据存储空间RAM,低区128B地址空间00H~7FH中地址为00H~1FH这32个单元分为4个工作寄存器组,分别用R0~R7表示,通过工作寄存器指令进行访问。片内RAM中的20H~2FH单元除可作为一般字节寻址单元使用外,这16个单元共128位中的每一位又可单独作为软件触发器使用,具有位寻址功能,其位地址范围为00H`7FH;对片内高区128B寻址只能用寄存

器间接寻址,而对特殊功能寄存器建起必须使用直接寻址。

CPU通过指令MOVX访问片外数据存储器。

2-3DPTR的作用是什么?它由哪几个寄存器组成?

答:相对于地址指针,DPTR被称为数据指针,但实际上DPTR中存放的是一个16位的地址,作为访问程序存储器和外部数据存储器的地址指针。当对64KB外部数据存储器空间寻址时,作为间址寄存器使用,而在访问程序存储器时,作为基址寄存器使用。DPTR是一个16位的特殊功能寄存器,由两个8位寄存器DPH、DPL组成,使用SFR中的82H和83H单元。

2-4简述布尔处理存储器的空间分配。

答:在单片机中位处理又称布尔处理,允许按位处理的存储器称为布尔处理存储器。其地址空间由二部分构成:一部分是片内RAM中字节地址为20H~2FH的16字节的128个位,这些位编址为00H`7FH;另一部分在特殊寄存器中,其地址码能被8整除的12个特殊功能寄存器可以按位寻址,但其中4个未定义,一共有92位可按位寻址。这二部分结合起来形成一个具有220位的位寻址空间。

2-58052单片机设置4组工作寄存器,如何选择确定和改变当前工作寄存器?

答:8052片内数据存储器的00H~1FH这32个单元分为4级作为4个工作寄存器第0组地址00H`07H,第一组08H~0FH,第二组10H~17H,第3组18H~1FH。每个工作寄存器都有8个单元,分别用R0~R7表示。4组寄存器中每一组都可能被选为CPU的工作寄存器,这是通过程序状态字PSW的PSW.3(RS0)和PSW.4(RS1)两位的状态来选择决定的。见下表:

PSW.4(RS1)

0011

PSW.3(RS0)

0101

当前使用的工作寄存器组R0`R7

0组(00H`07H)1组(08H`0FH)2组(10H`17H)3组(18H`1FH)

通过程序改变RS1和RS0的状态,就可方便地更换工作寄存器组。2-6程序状态字寄存器PSW的作用是什么?常用的状态标志位有哪些位?作用分别是什么?

答:PSW是一个8位的特殊功能寄存器,由一些标志位组成,用于存放程序运行中的各种状态信息。它可以进行位寻址。各位的作用如下:

Cy:进位标志位。在进行加(或减)法运算时,若操作结果的最高位(D7位)有进位(或借位)时,Cy由硬件置1,否则Cy清0。在进行位操作时,Cy又是位累加器,指令助记符用C表示。

AC:辅助进位标志位。在进行加(或减)运算时,若操作结果的低半字节(D3位)向高半字节产生进位(或借位)时,AC位将由硬件自动置1,否则AC位清0。

F0:用户标志位。用户根据需要对F0置位或复位,作为软件标志。RS1和RS0:工作寄存器组选择控制位。由用户用软件改变RS1和RS0的状态,以选择内RAM中的哪组工作寄存器为当前工作寄存器组。

OV:溢出标志位。当进行补码运算时,运算结果超出-128~+127范围时,产生溢出,则OV自动置1,否则OV清0。

PSW.1:保留位。8051中未定义。

P:奇偶校验标志位。每条指令执行完后,该位始终跟踪累加器A中1的数目的奇偶性。如果A中有奇数个1,则P=1;否则P=0。

2-78052单片机的EA引脚有何功能?在使用8032时,EA引脚就如何处理?

答:8052单片机的31脚为EA,EA为访问外部或内部程序存储器控制信号。当EA引脚接高电平且PC值小于1FFFH时,CPU访问内部程序存储器读取指令,当EA引脚接低电平时,CPU只访问外部等量齐观存储器读取指令。

在8032芯片中没有内部程序存储器,因此,8032芯片的31脚EA只能接地。2-88052内部RAM中低128B单元划分为哪几个主要部分?各部分主要功能是什么?

答:8052内部数据存储器RAM中低128B单元地址空间00H~7FH被划分为三个部分。第一部分地址为00H~1FH这32个单元分为4个工作寄存器组,分别用R0~R7表示,通过工作寄存器指令进行访问。片内RAM中的第二部分20H~2FH单元除可作为一般字节寻址单元使用外,这16个单元共128位中的每一位又可单独作为软件触发器使用,具有位寻址功能,其位地址范围为00H`7FH;第三部分地址30H~7FH,这部分存储区域可作为8位数据缓冲区使用,一般地,用户把堆栈就设置在这部分区域。

2-98052内部RAM中高128B单元与特殊功能寄存器区地址空间重叠,使用中是如何区分这两个空间的?

答:对8052片内高区(80H`0FFH)128B只能采用寄存器间接寻址,而对特殊功能寄存器SFR建起必须采用直接寻址。

2-10什么叫堆栈?堆栈指针SP的作用是什么?

答:堆栈是按照“先进后出,后进先出”的原则来存取数据的一个内部RAM区域,这个存储器区域的一端是固定的(栈底),另一端是活动的(栈顶),每个存储单元是不能按字节任意访问的。

堆栈指针SP始终指向栈顶单元,栈顶随着数据入栈和出栈上下浮动。2-12什么是时钟周期、机器周期和指令周期?

答:(1)时钟周期(又称为振荡周期)是指振荡器产生一个振荡脉冲信号所用的时间,是振荡频率的倒数,称为拍节。

(2)机器周期是指CPU完成某一个规定操作所需的时间,8051单片机的一个机器周期包含6个状态,并依次表示为S1~S6,每个状态分为2个节拍。因此一个机器周期包含12个时钟周期(振荡周期),依次表示为:S1P1、S1P2、S2P1、…、S6P1、S6P2。

(3)指令周期是指CPU执行一条指令所需要的时间称为指令周期。MCS-51单片机指令周期根据指令的不同,可包含有1或2或4个机器周期。

第三章MCS-51单片机指令系统

3-1指出下列每一条指令的寻址方式及其完成的操作。MOV2FH,#40HMOVA,2FHMOVR1,#2FHMOVA,@R1累加器A

MOV2FH,A答:直接寻址:

间接寻址:

;隐含寻址,将累加器A中的值移入片内2FH单元MOVR1,4FHMOVR1,#4FH

3-2内部RAM的4FH单元,可用哪几种寻址方式?分别举例说明。

;立即寻址,将40H移入片内2FH单元;直接寻址,将片内2FH单元的数移入累加器A;立即寻址,将2FH移入当前寄存器组的R1单元;寄存器间接寻址,将寄存器R1中所存地址中的值移入

寄存器间接寻址:MOVA,@R13-3指出下列各条指令中,45H代表什么?MOVA,#45HMOVA,45HMOV45H,46HMOV45H,#45HMOVC,45H条指令的执行结果:

答:PSW的各位为11110000,即Cy=1,AC=1,F0=1,RS1=1,RS0=0,OV=0,P=0(1)SUBBA,30H

结果:(A)=D4H,CY=1,AC=0,OV=1,P=0(2)SUBBA,#30H

;数值;源地址;目标地址;目标地址和数值;源地址

3-4已知:(A)=7AH,(R0)=30H,(30H)=0A5H,(PSW)=80H,请写出下列各

结果:(A)=49H,CY=0,AC=0,OV=0,P=1(3)ADDA,R0

结果:(A)=AAH,CY=0,AC=0,OV=1,P=0(4)ADDA,30H

结果:(A)=1FH,CY=1,AC=0,OV=0,P=1(5)ADDA,#30H

结果:(A)=AAH,CY=0,AC=0,OV=1,P=0(6)ADDCA,30H

结果:(A)=20H,CY=1,AC=1,OV=0,P=1(7)SWAPA

结果:(A)=A7H,对标志位无影响(8)XCHDA,@R0

结果:(A)=75H,(30H)=AAH,(R0)=AAH,P=1(9)XCHA,30H

结果:(A)=0A5H,(30H)=7AH,P=0(10)XCHA,R0

结果:(A)=30H,(R0)=7AH,P=0(11)MOVA,@R0结果:(A)=0A5H,P=0(12)XCHA,@R0

结果:(A)=0A5H,(30H)=7AH,P=03-5试分析以下程序段的执行结果:MOVSP,#3AHMOVA,#20HMOVB,#30HPUSHACCPUSHBPOPACCPOPB

结果:(SP)=3AH,(A)=30H,(B)=20H,(3BH)=20H,(3CH)=30H3-6指出下列指令的执行结果,并写出每条指令的机器码。MOV30H,#52HMOVA,#70HMOVA,30H

;(30H)=52H;(A)=70H;(A)=52H

01110101(753052H)01110100(7470H)11100101(E530H)

MOVR0,#30HMOVA,@R0MOVA,#70HMOVX@DPTR,AMOV30H,#40HMOVR0,#30HMOVA,@R0

;(R0)=30H;A=52H;(A)=70H;(2030H)=70H;(30H)=40H;(R0)=30H;(A)=40H

10101000(7830H)11100010(E6H)01110100(74H)10010000(90H)11110000(F0H)01110101(75H)01111000(78H)11100110(E6H)

3-7分析下列指令的执行结果,并写出每条指令的机器码。MOVDPTR,#2030H;(DPTR)=2030H

3-8设R0的内容为32H,A的内容为48H,内部RAM的32H单元内容为80H,40单元内容为08H,指出在执行下列程序段后上述各单元内容的变化。

MOVA,@R0MOV@R0,40HMOV40H,AMOVR0,#35H

结果:(R0)=35H,(A)=80,(32H)=08H,(40H)=80H

3-9已知:(A)=81H,(R0)=20H,(20H)=35H,指出执行完下列程序段后A的内容。

ANLA,#17HORL20H,AXRLA,@R0CPLA结果:(A)=CBH

3-10用指令实现下述数据传送:

(1)内部RAM20H单元送内部RAM40H单元。答:MOV40H,20H

(2)外部RAM20H单元送R0寄存器。答:MOVR1,#20HMOVXA,@R1MOVR0,A(3)外部RAM20H单元送内部RAM20H单元答:MOVR1,#20H

MOVXA,@R1

MOV20H,A

MOV20H,AMOVCA,@A+DPTR

MOV20H,A

(4)外部RAM1000H单元送内部RAM20H单元答:MOVDPTR,#1000H答:MOVDPTR,#1000H

MOVXA,@DPTRMOVA,#00H

(5)外部ROM1000H单元送内部RAM20H单元。

;(A)=00000001;(20H)=00110101;(A)=00110100;(A)=11001011

(6)外部ROM1000H单元送外部RAM20H单元。答:MOVDPTR,#1000H@R1,A

3-11已知16位二进制数的高8位和低8位分别存放在20H和21H单元,请编写将其右移一们的程序。

CLRMOVRRCMOVMOVRRCMOVCA,20HA20H,AA,21HA21H,AMOVA,#00HMOVCA,@A+DPTRMOVR1,#20HMOVX

3-12编程实现内部RAMR0~R7的内容传递到20H~27H单元。

3-13试编程进行两个16位数的减法,6F5DH-13B4H,结果存入内部RAM的30H和31H单元,30H存放差的低8位。

CLRCMOVA,#5DHSUBBA,#B4HMOV30H,AMOVA,#6FHSUBBA,13HMOV31H,A

3-14编写程序,若累加器A的内容分别满足下列条件时,程序则至LABEL存储单元,设A中存放的是无符号数。

①A>=10CJNEA,#10H,LABLAB:JNCLABEL......LABEL:

......LABEL:②A>0JNZLABEL

③(A)<=10MOVR0,AMOVA,#10CJNEA,R0,LABLAB:JNCLABEL......LABEL:

3-15已知(SP)=25H,(PC)=2345H,(24H)=12H,(25H)=34H,(26H)=56H.问此时执行“RET”指令后,(SP)=?,(PC)=?

答:(SP)=23H,(PC)=3412H

执行RET时,PCH←(SP),SP←SP-1,PCL←(SP),SP←SP-1

3-16若(sp)=25H,(PC)=2345H,标号LABEL所在的地址为3456H,问执行调用指令“LCALLLABEL”后,堆栈指针和堆栈内容发生什么变化?(PC)的值等于什么?

答:最后堆栈指针SP=27H。堆栈指针SP=26H处SP内容为45H,指针SP=27H处内容为23H。最后程序计数器指针PC=3456H。

执行LCALL后,PC←PC+3,SP←SP+1,(SP)←PCL,SP←SP+1,(SP)←PCH,PC←addr16。

3-17试编写程序,查找在内部RAM的20H~50H单元中是否有0AAH这一数据。若有,则将51H单元置01H,若未找到,则将51H单元置00H。

MOV51H,#00HMOVR0,#20H

LOOP:MOVA,@R0

CJNEA,#0AAH,NEXTINC51HSJMPEEE

NEXT:INCR0

CJNER0,#51H,LOOP

EEE:

SJMP$

;先设没找到;起始地址;取出数字;不相等就跳转;相等将51单元置1;找到转去结束;下一个地址;地址没找完就继续;暂停

3-18试编写程序,统计在外部RAM2000H~205FH单元中出现00H的次数,并将统计结果丰收入内部RAM50H单元。

MOVR0,#00HMOVDPTR,#2000HMOVR1,#60H

LOOP:MOVXA,@DPTR

JNZNEXTINCR0

NEXT:INCDPTR

DJNZR1,LOOPMOV50H,R0SJMP$

中。请编程将其求补,并存回原处。

答:首先假设R3、R4中是原码,根据原码求补的方法当最高位(R3的D7

;RO设为计数器,初始为0;置片外RAM起始地址;置传送数据个数;外部RAM单元内容送A;传送数据不为0跳转;传送数据为0,计数器加1;下一个地址;地址没找完就继续;统计结果存入50H单元;暂停

3-19已知R3和R4中存有一个16位的二进制数,高位在R3中代位在R4

位)为0时表示为正数,那么补码与原码相同,当最高位为1时,表明是负数,负数的补码是最高位不变,其余位取反加1.

MOVA,R3JBACC.7,NEGSJMP$

NEG:

MOVA,R4CPLACLRCADDA,#01H

RAM30H开始单元。

START:MOVR0,#30H

MOVR1,#10HMOVDPTR,#2000H

LOOP:MOVXA,@DPTR

MOV@R0,A

3-21试编程将内部RAM的30H至4FH单元的内容分别传送到外部RAM的2040H~205FH单元。

START:MOVR0,#30H

MOVR1,#20HMOVDPTR,#2040H

LOOP:MOVA,@R0

MOVX@DPTR,A

3-22若外部RAM的(2000H)=X,(2001H)=Y,编程实现Z=3X+2Y,结果存入内部RAM的20H单元,设Z<=255。

START:MOVDPTR,#2000H

MOVXA,@DPTRMOVB,#03HMULABMOVR0,A

负数,转向2200H;若为0,转向2300H。

START:MOVA,20H

JBACC.7,NEG

;为负数

INCDPTRMOVXA,@DPTRADDA,AADDA,R0MOV20H,AINCDPTRINCR0DJNZR1,LOOPSJMP$INCR0INCDPTRDJNZR1,LOOPSJMP$MOVR4,AMOVA,R3CPLAADDCA,#00HSETBACC.7MOVR3,ASJMP$

3-20编写一个程序,把片外RAM从2000H开始存放的10个数传送到片内

3-23试对内部RAM20H单元的内容进行判断,若为正数,转向2100H若为

JNBACC.7,POSILJMP#2100HSJMPEEE

NEG:

LJMP#2200HSJMPEEE

POSI:LJMP#2300H

SJMPEEE

EEE:

SJMP$

;为0

3-24已知30H、31H中存有一个16位二进制数,高位在前低位在后。试编程将它们乘2,再存回原单位中。

START:MOVA,31H

ADDA,31HMOV31H,AMOVA,30H

3-25已知从外部RAM2000H开始的单元中有20个带符号的补码数,试编程把正数和0取出来存放到内部RAM20H开始的存储单元中(负数为作处理)。

START:MOVR0,#20H

MOVDPTR,#2000HMOVR1,#20H

LOOP:MOVXA,@DPTR

JBACC.7,NEGMOV@R1,AINCR1

NEG:

INCDPTRDJNZR0,LOOPSJMP$

;负数不需处理;需处理的数的个数;需处理数的起始地址;用于存储的目标地址

ADDCA,30HMOV30H,ASJMP$

第四章汇编语言程序设计

4-1什么叫伪指令?伪指令与指令有什么区别?

答:伪指令不属于单片机指令集中的指令,在汇编时不产生目标代码,不影响程序的执行,仅指明在汇编时执行一些特定的操作。如为程序指定一个存储区、将一些数据、表格常数存放在指定的存储单元、对地址赋用户名等。

指令是计算机所能执行的一种基本操作的描述,是计算机软件的基本单元。51单片机单片机的指令有二种表达方式:机器码指令和汇编语言指令。

4-2循环程序由哪几部分组成?

答:由初始化部分、循环处理部分、循环控制部分、循环结束部分这四部分组成。

4-3什么是子程序?对于子程序设计有什么要求?

答:一段具有某一特定功能,能被其它程序所调用,调用结束后能自动返回到调用处的程序块就称为子程序。

对子程序设计的要求:

4-4试对下列程序进行人工汇编,并说明此程序的功能。

地址

ORG1000H

ACDL:MOVR0,#25H

MOVR1,#2BHMOVR2,#06HCLRCCLRA

LOOP:MOVA,@R0

ADDCA,@R1DECR0DECR1DJNZR2,LOOPSJMP$END

;;1000H;1002H;1004H;1006H;1007H;1008H;1009H;100AH;100BH;100CH;100EH;

78797AC3E4E6371819DA80

FAFE252b06

指令码

1008H-100EH=-06H,其补码为(11111010)2→0FAH

功能:将25H单及前5个数与2BH单元及前5个数分6组相加,结果丢弃。4-5从内部RAM的20H单元开始,有15个数据。试编一程序,把其中的正数、负数分别送到41H和61H开始的存储单元,并分别将正数、负数的个数送40H单元和60H单元。

MOVR0,#41HMOVR1,#61HMOVSP,#2EHMOVR3,#00HMOVR4,#00HMOVR7,#15

LOOP:POPACC

;存放正数的起始地址;存放负数的起始地址;指明栈顶地址;正数个数;负数个数;需判断数的个数;出栈放入A

JBACC.7,NEGCJNEA,#00H,LOOP1SJMPLOOP

LOOP1:MOV@R0,A

INCR0INCR3SJMPLOOP2

NEG:

MOV@R1,AINCR1INCR4

LOOP2:DJNZR7,LOOP

MOV40H,R3MOV60H,R4SJMP$END

;负数跳转

;非负非零转正数处理;零不处理,取下一个数;正数保存;正数存放地址加1;正数个数加1;未结束就继续;将负数送负数保存地址;负数地址加1;负数个数加1;未结束就继续;正数个数送40H单元;负数个数送60H单元

4-6设内部RAM的30H和31H单元中有二个带符号数求出其中的大数存放在32H单元中。

MOVA,30HXRLA,31HJBACC.7,LOOPMOVA,30HSUBBA,31HJCLOOP1MOV32H,30H

SJMP$

LOOP1:MOV32H,31H

SJMP$

LOOP:MOVA,30H

JBACC.7,LOOP1MOV32H,ASJMP$

4-7试编制实现ASCII码转十进制数的程序。在8032单片机内RAM的40H单元中存放一个代码。若此代码为十进制数的ASCII码,则将其相应的十进制数送片内RAM的50H单元,否则将此单元置成0FFH。

MOVA,40HCLRCSUBBA,#30HJCLOOPMOVR0,AMOVA,#09HSUBBA,R0

;减30H后差大于0,是否不;大于9?

;数字比其ASCII码值小30H

;存的ASCII值小于0的ASCII码值跳转

JCLOOPMOV50H,R0SJMP$

LOOP:MOV50H,#0FFH

SJMP$END

;差大于9,跳转;将数字存入50H单元;不是数字,存入0FFH

4-8试编程将存放在8032单片机内部RAM中首址为20H、长度为50H的数据快传送到片外RAM以20H为首址的连续单元中。

MOVR0,#20HMOVR1,#20HMOVR7,#50H

LOOP:MOVA,@R0

MOVX@R1,A

4-9设一个字符串存放在8032单片机内部RAM以20H为首址的连续单元中,字符串以回车结束。要求统计该字符串中字符C(’C’=43H)的个数,并将其存入外部RAM的40H单元。试编写实现上述要求的程序。

MOVR0,#20HMOVR2,#00H

LOOP:MOVA,@R0

XRLA,#0DH

;判断是否是回车符

JZEXITMOVA,@R0XRLA,#43HJNZLOOP2

4-10设有一长度为20H的字符串,它存放在片外RAM1000H为首地址的连续单元中。试编制将其中数字与字母分开并将它们送到片内RAM以30H和50H为首地址的连续单元中的程序。

MOVDPTR,#1000HMOVR7,#20HMOVR0,#30HMOVR1,#50H

LOOP:MOVXA,@DPTR

CJNEA,#30H,LOOP1

SJMPISNUM

LOOP1:JNCLOOP2

SJMPISCHAR

LOOP2:CJNEA,#3AH,LOOP3LOOP3:JCISNUM

SJMPISCHARINCR2

LOOP2:INCR0

SJMPLOOP

EXIT:MOVDPTR,#0040H

MOVA,R2MOVX@DPTR,ASJMP$ENDINCR0INCR1DJNZR7,LOOPSJMP$

ISCHAR:MOV@R1,A

INCR1SJMPNEXT

ISNUM:CLRC

SUBBA,#30HMOV@R0,A

元为起始地址的20H个单字节进行交换。

MAIN:MOVR7,#20H

DATA1EQU20HDATA2EQU40HMOVR0,#DATA1MOVR1,#DATA2

LOOP:MOVA,@R0

XCHA,@R1

INCR0SJMPNEXT

NEXT:INCDPTR

DJNZR7,LOOPSJMP$END

4-11试编程将片内RAM区DATA1单元开始的20H个单字节依次与DATA2单

MOV@R0,AINCR0INCR1DJNZR7,LOOPSJMP$END

4-13设片内RAM的20H~4FH单元中有若个无符号数,试编程求出其中的最大值及所在单元地址,将最大值存入片内RAM的50H单元,最大值所在单元地址存入片内RAM的51H单元。

MOVR0,#20HMOVR7,#20HMOVA,R0MOVR2,AMOVA,@R0MOVR1,A

LOOP:INCR0

CLRCSUBBA,@R0JNCLOOP1

MOVA,R0MOVR2,AMOVA,@R0MOVR1,A

LOOP1:MOVA,R1

DJNZR7,LOOPMOV50H,R1MOV51H,R2SJMP$END

4-14设片外RAM从1000H单元开始存放100个无符号8位二进制数。试编程将它们从大到小依次入片内RAM从10H开始的单元中。

MOVR7,#100MOVDPTR,#1000HMOVR0,#10H

LOOP:MOVXA,@DPTR

MOV@R0,AINCDPTRINCR0DJNZR7,LOOP

MOVR7,#99MOVR6,#99

NEXT:MOVR0,#10H

MOVA,@R0MOVR1,A

LOOP2:INCR0

MOVA,@R0CLRCSUBBA,R1JNZLOOP3SJMPLOOP4

LOOP3:JCLOOP4

MOVA,@R0DECR0

MOV@R0,AMOVA,R1INCR0MOV@R0,A

LOOP4:MOVA,@R0

MOVR1,ADJNZR7,LOOP2DECR6MOVA,R6MOVR7,AINCR6DJNZR6,NEXTSJMP$END

4-15设有2个4B的BCD数:X=24350809,Y=12450379。X从片内RAM的25H单元开始存放,Y从片内RAM的35H单元开始存放,求两数的和。设数据在内存中按照低字节在前,高字节在后的顺序存放。

MOV25H,#24HMOV26H,#35HMOV27H,#08HMOV28H,#09HMOV35H,#12HMOV36H,#45HMOV37H,#03HMOV38H,#79HMOVR7,#04HMOVR0,#25HMOVR1,#35H

4-16设晶振频率为6MHz,试编一能延时20ms的子程序

答:一个机器周期T=12/6*10=2μs,延时20ms需要20000/2=10000个机器周期。

拟用以下程序:START:MOVR6,#data1LOOP1:MOVR7,#data2

工作需要机器周期数;1;1

6

CLRC

LOOP:MOVA,@R0

ADDCA,@R1DAAMOV@R0,AINCR0INCR1DJNZR7,LOOPSJMP$

END

NOPNOP

LOOP:NOP

NOPNOP

DJNZR7,LOOPDJNZR6,LOOPRET

;1;1;1;1;1;2;2;2

延时周期数为1+(5*data2+5)*data1+2,选择最合适的data1和data2Data1=200,data2=99,延时机器周期数为10003个,延时20.006ms4-17利用查表技术将累加器A中的一位BCD码转换成相应的十进制数的七段码,结果仍放在A中(设显示管0~9的七段码分别是40H,79H,24H,30H,19H,12H,02H,78H,00H,1BH)。

SUB1:INCA

MOVCA,@A+PCRET

DB40H,79H,24H,30H,19H,12H,02H,78H,00H,1BH

4-18试编一采用查表法求1~20的二次方数的子程序。要求:X在累加器A中,1≤X≤20,二次方高位存放在R6中,低位存放在R7中。

SUB:

MOVDPTR,#0100HMOVR0,AADDA,R0MOVR0,AMOVCA,@A+DPTRMOVR7,AINCDPTRMOVA,R0MOVCA,@A+DPTRMOVR6,ARETORG102H

DB01H,00H,04H,00H,09H,00H,10H,00H,19H,00HDB24H,00H,31H,00H,40H,00H,51H,00H,64H,00HDB79H,00H,90H,00H,0A9H,00H,0C4H,00H,0E1H,00H

DB00H,01H,21H,01H,44H,01H,69H,01H,90H,01H

第五章MCS-51单片机中断系统

5-1MCS-51单片机的中断系统由哪些功能部件组成?分别有什么作用?答:51单片机的中断系统由与中断有关的特殊功能寄存器(中断允许控制寄存器IE、中断优先等控制寄存器IP、定时器/计数器控制寄存器TCON、T2CON、串行口控制寄存器SCON)和6个中断源(2个外部中断源INT0[P3.2]、

INT1[P3.3],3个定时器/计数器中断源T0[P3.4]、T1[P3.5]、T2[P1.0]),1个串行接口中断源(RXD[p3.0]接收数据中断、TXDp[P3.1]发送数据中断)组成。

中断允许控制寄存器IE由七个控制位构成,其中D7位EA是所有中断的总开关,若EA=1,CPU中断允许,EA=0时,CPU屏蔽一切中断请求。其余6位D5~D0分别控制6个中断源,置1为允许申请中断,清0为禁止申请中断。其字节地址是A8H,位地址是A8H~ADH和AFH,每位都可由软件来置1或清0。

中断优先等控制寄存器IP用于设置每个中断的优先级,该寄存器由6个控制位构成(D5~D1)分别控制每个中断源的优先级,置1为高优先级,置0为低优先级。其位地址为B8H~BDH,每位都可由软件来置1或清0。

定时器/计数器控制寄存器TCON字节地址88H,其位地址88H~8FH,除D6和D4位用于控制定时器/计数器0、1启停外,其余6位分二组分别控制定时器/计数器0、1的中断信号方式(IT0/IT1),外部中断请求标志位(IE0/IE1)、溢出标志位(TF0/TF1)、T2CON字节地址为C8H,可按位寻址,但只有2位(D7和D6位)用作中断控制,当T2EX(P1.1脚)的负跳变有效时T2的硬件置D6位EXF2(T2CON.6)=1,tmCPU申请中断。当T2计数溢出时由硬件置D7(TF2,T2CON.7)=1,向CPU申请中断。

串行口控制寄存器SCON字节地址为98H,其位地址98H~9FH。与中断有关的只有D0位和D1位。串行口发送了一帧信息,便由硬件置TI=1,向CPU申请中断。串行口接收一邓一帧信息,便由硬件置RI=1,向CPU申请中断。

5-2MCS-51系列单片机能提供几个中断源?答:MCS-51系列单片机能提供6个中断源,。

5-3MCS-51单片机的中断系统中有几个优先级?如何设定?

MCS-51单片机有2个中断优先级。各个中断源的优先级是由特殊功能寄存器IP来确定,IP中和各个中断源对应位为1时,此中断源为高优先级,否则为低优先级。在同一优先级中,各个中断源的优先顺序是由自然优先级来确定的。

5-4CPU响应中断有哪条件?在什么情况下中断响应会受阻?

答:CPU响应中断的基本条件有以下三个:①有中断源提出中断请求。②中断总允许位EA=1,即CPU开放中断。③申请中断的中断源的中断允许位(ET2、ES、ET1、EX1、ET0、EX0)为1,即没有被屏蔽。

在中断源提出中断申请后,有二种情况可以使中断受阻:①中断允许寄存器IE中对应于有中断请求的控制位为0,屏蔽了中断请求,即CPU没无法收到中断请求。②中断允许寄存器IE的D7位(EA位)为0,即CPU没有开放中断响应。

CPU正在处理同等级或高等级中断时,CPU将在处理完该中断并返回执行一条指令后才响应新中断请求。

现行的机器周期不是所执行指令的最后一个机器周期。正在执行的指令是RETI或访问IE、IP指令。5-5简述MCS-51系列单片机的中断响应过程。

答:MCS-51系列单片机的中断响应过程是按照以下顺序执行的:开中断→中断请求→中断判断→中断响应→中断返回。

5-6MCS-51单片机中断响应时间是否固定?为什么?

答:MCS-51单片机中断响应时间不固定,因为当中断源向CPU提出中断请求时,CPU正在执行的指令的指令周期是不一样的,一般情况下中断响应时间在3~8个机器周期之间。当然如果中断到来时是在处理同级或高级中断服务程序中,则响应时间就无法估计了。

5-7MCS-51中若要扩充8个中断源,可采用哪些方法?如何确定优先级?答:一般可采取中断加查询方式,软件先查询到的为高优先级,最后查询到的为低优先级。

5-88031芯片的INT0、INT1引脚分别输入压力超限、温度超限中断请求信号,定时器/计数器0作定时检测的实时时钟,用户规定的中断优先权排队次序为:压力超限→温度超限→定时检测。要求确定IE、IP的内容,以实现上述要求。

答:IE设87H,IP设05H。

第六章MCS-51单片机定时器/计数器

6-1MCS-51单片机内部设有几个定时器/计数器?它们是由哪些专用寄存器组成的?

设有3个定时器/计数器T0、T1、T2。

它们由特殊功能寄存器工作方式寄存器TMOD(字节地址89H,不能按位寻址,用来控制T0和T1的工作方式),TCON控制寄存器(字节地址88H,位地址88H~8FH,用高4位控制定时器/计数器0、1的启、停,和作溢出标志位),定时器/计数器2的控制寄存器T2CON(其字节址C8H,位地址C8H~CFH)组成,各定时器/计数器还有1个16位工作寄存器(TL0[8AH]、TH0[8CH]、TL1[8BH]、TH1[8DH]、TL2[CCH]、TH2[CDH],T2还有二字节特殊功能寄存器RLDL[CAH]和RLDH[CBH])。

6-2MCS-51单片机的定时器/计数器有哪几种工作方式?各有什么特点?答:MCS-51定时器/计数器有0,1,2,3四种工作模式。模式0为13位1定时器/计数器,模式1为16位1定时器/计数器,模式2为自动赋初值的8位定时器/计数器,模式3可以增加一个8位定时器(T1没有模式3)。

6-3MCS-51定时器作定时和计数时其计数脉冲分别由谁提供?

答:MCS-51定时器作定时器时,输入的记数脉冲是由晶体振荡器的输出经12分频后得到的,所以定时器可看作是对单片机机器周期的计数器。8051定时器作计数器时,则对外部事件进行计数。

6-48051定时器的门控信号GATE设置为1时,定时器如何启动?

答:8051定时器的门控信号GATE为1时,通常先设置TR0或TR1为1,将T0或T1的启动控制权交由INT0或INT1。当INT0(或INT1)引脚为高电平时,相应的T0或T1才能选通工作。

6-5定时器/计数器用作定时时,其定时时间与哪些因素有关?作计数器时,对外界计数脉冲频率有何限制?

答:作定时器时,其定时时间与晶振频率、定时计数器位数、定时初值有关。作计数器时,要求外界脉冲频率小于晶振频率除24。

6-6当T0设为工作方式3时,由于TR1位已被TH0占用,如何控制定时器T1的启动和关闭?

答:先设置T1的初始值和工作方式0~2,由于将T1设置为工作方式3时T1会停止工作,因此可以利用M1和M2来控制T1的启动和关闭。通常在T0工作在方式3的时候,将T1设置为方式2,8位自动装初值工作方式。

6-7已知8051单片机的fosc=6MHz,请利用T0和P1.2输出长形波。其长形高电平宽50us,低电平宽300us。

解:(1)定时时间设为50us,低电平时间相当于持续6个定时周期。可选择于方式2,8位自动重装初值方式。X=256-6×50/12=231,即E7H

(2)设置TMOD参数:T1的四位全“0”,低四位为“0010”,TMOD=02H(3)中断IE:EA=1,ET0=1.其余为0,IE=82H

(4)TCON用于控制启停的TR0位在程序中用位设置。(5)编写源程序如下:

ORG0000HAJMPT0INTAJMPMAINORG0030HORG000BHMAIN:MOVTH0,#0E7H

MOVTL0,#0E7HDJNZR7,LOOP2MOVR7,#06HSETBP1.2MOVTMOD,#02HSETBF0MOVIE,#82HMOVR7,#06HSETBTR0SJMPLOOP2SETBP1.2LOOP:CLRP1.2SETBF0LOOP2:RETISJMP$ENDT0INT:JBCF0,LOOP

6-8已知8051单片机的fosc=12MHz,用T1定时,试编程由P1.2和P1.3分别输出周期为2ms和500us的方波

解:2ms和500us的方波,以最小值500us为基本单位,将计时长度设为250us,可使用8位加法计数器,即T1的工作方式为方式2。2ms方波为4个计数溢出长度翻转一次。采用中断方式处理溢出。

6-6

(1)定时初值确定:X=256-12×10×250×10/12=256-250=6

(2)确定TMOD的参数:T0设为方式0定时器。TMOD=00100000=20H(3)编写源程序:

ORG0000HSETBEAAJMPMAINSETBTR1ORG001BHSJMP$AJMPT1INTT1INT:CPLP1.3ORG0030HDJNZR7,LOOPMAIN:MOVR7,#04CPLP1.2

MOVTH1,#06MOVR7,#04MOVTL1,#06LOOP:RETIMOVTMOD,#20HENDSETBET1

第七章

1、什么是串行异步通信,它有哪些作用?答:在异步串行通信中,数据是一帧一帧(包括一个字符代码或一字节数据)传送的,每一帧的数据格式参考书。通信采用帧格式,无需同步字符。存在空闲位也是异步通信的特征之一。2、89C51单片机的串行口由哪些功能部件组成?各有什么作用?答:89C51单片机的串行接口由发送缓冲期SBUF,接收缓冲期SBUF、输入移位寄存器、串行接口控制器SCON、定时器T1构成的波特率发生器等部件组成。由发送缓冲期SBUF发送数据,接收缓冲期SBUF接收数据。串行接口通信的工作方式选择、接收和发送控制及状态等均由串行接口控制寄存器SCON控制和指示。定时器T1产生串行通信所需的波特率。3、简述串行口接收和发送数据的过程。答:串行接口的接收和发送是对同一地址(99H)两个物理空间的特殊功能寄存器SBUF进行读和写的。当向SBUF发“写”命令时(执行“MOVSBUF,A”),即向缓冲期SBUF装载并开始TXD引脚向外发送一帧数据,发送完便使发送中断标志位TI=1。在满足串行接口接收中断标志位RI(SCON.0)=0的条件下,置允许接收位REN(SCON.4)=1,就会接收一帧数据进入移位寄存器,并装载到接收SBUF中,同时使RI=1。当发读SBUF命令时(执行“MOVA,SBUF”),便由接收缓冲期SBUF取出信息通过89C51内部总线送CPU。4、89C51串行口有几种工作方式?有几种帧格式?各工作方式的波特率如何确定?答:89C51串行口有4种工作方式:方式0(8位同步移位寄存器),方式1(10位异步收发),方式2(11位异步收发),方式3(11位异步收发)。有2种帧格式:10位,11位方式0:方式0的波特率≌fosc/12(波特率固定为振荡频率1/12)方式2:方式2波特率≌2SMOD/64×fosc方式1和方式3:方式1和方式3波特率≌2SMOD/32×(T1溢出速率)如果T1采用模式2则:5、若异步通信接口按方式3传送,已知其每分钟传送3600个字符,其波特率是多少?答:已知每分钟传送3600个字符,方式3每个字符11位,则:波特率=(11b/字符)×(3600字符/60s)=660b/s第八章8-1简要说明MCS-51单片机的扩展原理。一般的微型计算机系统都具有数据总线、地址总线和控制总线MCS-51单片机也是利用这三个总线进行扩展外部设备。其中,P2口作为地址总线的高8位A8~A15,P0口通过地址锁存器作为地址总线的低8位A0~A7同时兼做数据总线D0~D7,控制总线有外部程序储存器选通信号PSEN、外部数据存储器读写信号RD、WR、以及地址锁存选通信号ALE等构成。8-3使用3-8译码器最多可以扩展多少片6264?试画出其逻辑扩展图,并且写出每一片的地址范围。8片8-5画出综合扩展一片27C64和两片6264的逻辑扩展图,并写出它们的地址范围。27C64:C000H~DFFFH;1#6264:C000H~DFFFH;2#6264:A000H~BFFFH.10-18段LED显示器的结构形式有哪两种?静态显示器和动态显示器各有何优缺点?它们的工作原理如何?静态显示:各数码管接口的I/O口线是专用的,各数码管的显示码在整个显示过程中保持静态显示特点:无闪烁,用元器件多,占I/O线多,无须扫描,节省CPU时间,编程简单动态显示:各数码管接口的I/O口线是共用的。各数码管在显示过程中轮流得到显示码动态显示特点:有闪烁,用元器件少,占I/O线少,必须扫描,花费CPU时间,编程复杂10-3按键抖动期与什么因素有关?怎样克服按键抖动引起的误操作?键抖动时间的长短与开关的机械特性和人的操作有关,一般为5ms~10ms左右,然后达到稳定状态.为了保证CPU对键的一次操作仅作一次处理,必须去除抖动,使CPU在键的稳定闭合或断开状态时读取键值去除抖动分为硬件去抖和软件去抖。主要应用软件去抖:在检测到按键按下或释放时,记录按键的状态,延时大约10ms,再次检测按键的状态,若与前一次的状态相同,说明按键的状态已稳定,可进行处理;否则,表示键的状态不稳定,可能是误动作,不应被处理。10-7DAC0832有哪几种工作方式?各有何特点?直通方式输入、输出工作在直通的状态,常用连续反馈控制的环路中。单缓冲方式其中一个寄存器始终工作在直通状态,另一个处于受控的锁存器状态。双缓冲方式采用两步写操作完成。可使DAC转换输出前一个数据的同时,采集下一个数据送到8为输入寄存器,以提高转换速度。10-8模数转换器的主要参数有哪些?ADC0809参数如何?时钟频率范围多少?1、主要参数:分辨率、满刻度误差、转换速率、转换精度、是否方便与CPU接口。2、ADC0809参数:分辨率为8位;转换电压为-5~+5V;转换路数为8路模拟量转换时间为100us;转换绝对误差小于±1LSB;功耗仅为15mV;单一+5V电源;3、100kHz~640kHz。