练习练习练习
第二章单片机结构及原理
1、MCS-51单片机内部包含哪些主要功能部件?它们的作用是什么?
答:(1)一个8bit CPU是微处理器的核心,是运算和逻辑计算的中心。
(2)片内震荡器及时钟电路:提供标准时钟信号,所有动作都依据此进行。
(3)4K ROM程序存贮器:存贮程序及常用表格。
(4)128B RAM 数据存贮器:存贮一些中间变量和常数等。
(5)两个16bit定时器/计数器:完全硬件定时器
(6)32根可编程I/O口线:标准8位双向(4个)I/O接口,每一条I/O线都能独立地作输入或输出。
(7)一个可编程全双工串行口。
(8)五个中断源。
2、什么是指令?什么是程序?
答:指令是规定计算机执行某种操作的命令。
程序是根据任务要求有序编排指令的集合。
3、如何认识89S51/52存储器空间在物理结构上可以划分为4个空间,而在逻辑上又可以划分为3个空间?
答:89S51/52存储器空间在物理结构上设有4个存储器空间:片内程序存储器、片外程序存储器、片内数据存储器、片外数据存储器。在逻辑上有3个存储器地址空间:片内、片外统一的64KB程序存储器地址空间,片内256B数据存储器地址空间,片外64KB的数据存储器地址空间。
4、开机复位后,CPU使用的是哪组工作寄存器?他们的地址是多少?CPU如何确定和改变当前工作寄存器组?
答:开机复位后,CPU使用的是第0组工作寄存器,地址为00H~07H,CPU通过改变状态字寄存器PSW中的RS0和RS1来确定工作寄存器组。
5、什么是堆栈?堆栈有何作用?在程序设计时,有时为什么要对堆栈指针SP重新赋值?如果CPU 在操作中要使用两组工作寄存器,SP应该多大?
答:堆栈是一个特殊的存储区,主要功能是暂时存放数据和地址,通常用来保护断点和现场。堆栈指针SP复位后指向07H单元,00H~1FH为工作寄存器区,20H~2FH为位寻址区,这些单元有其他
功能,因此在程序设计时,需要对SP重新赋值。如果CPU在操作中要使用两组工作寄存器,SP应该至少设置为0FH。
6、89S51/52的时钟周期、机器周期、指令周期是如何分配的?当振荡频率为8MHz时,一个单片机周期为多少微秒?
答:时钟周期为时钟脉冲频率的倒数,他是单片机中最基本的、最小的时间单位。机器周期是指完成一个基本操作所需要的时间,一个机器周期由12个时钟周期组成。指令周期是执行一条指令所需要的时间,由若干个机器周期组成。
若fosc=8MHz,则一个机器周期=1/8×12μs=μs
7、89S51/52扩展系统中,片外程序存储器和片外数据存储器共处同一地址空间为什么不会发生总线冲突?
答:访问片外程序存储器和访问数据存储器使用不同的指令用来区分同一地址空间。
8、程序状态字寄存器PSW的作用是什么?常用状态标志有哪些位?作用是什么?
答:程序状态字PSW是8位寄存器,用于存放程序运行的状态信息,PSW中各位状态通常是在指令执行的过程中自动形成的,但也可以由用户根据需要采用传送指令加以改变。各个标志位的意义如下:
(C y):进位标志位。
(AC):辅助进位标志位,又称为半进位标志位。
(F0):用户标志位。
、(RS1和 RS0):寄存器组选择位。
(OV):溢出标志位。
(空缺位):此位未定义。
(P):奇偶校验位。
9、位地址7CH和字节地址7CH有何区别?位地址7CH具体在内存中什么位置?
答:字节地址7CH是片内数据存储器中的一个地址单元,该地址单元中可以存放8位二进制数,位地址7CH是内部数据存储器中位寻址区中的一位,该地址单元中可以存放1位二进制数。位地址7CH具体在片内数据存储器字节地址为2FH中的第4位()。
10、89S51/52中4个I/O端口的作用是什么?89S51/52的片外三总线是如何分配的?
答:I/O端口是单片机与外界联系的重要通道,实现与外部设备的信息的传输。总线分配:片外数据总线(8根)通过P0口输出,片外地址总线(16根)通过P0口(低8位)和P2口(高8位)输出,片外控制总线(PSEN ,ALE , RD ,WR ,EA)主要通过P3口。
11、89S51/52中4个I/O端口在结构上有何异同?
89S51/52单片机的4个I/O口在结构上是基本相同的,但又各具特点。这四个端口都是8位双向口,每个端口都包括一个锁存器、一个输出驱动器和输入缓冲器。在无片外扩展存储器的系统中,这四个端口的每一位都可以作为双向通用I/O端口使用。在作为一般的通用I/O输入时,都必须先向锁存器写入“1”,使输出驱动场效应管FET截止,以免误读数据。各自特点如下:(1)P0口为双向8位三态I/O口,它既可作为通用I/O口,又可作为外部扩展时的数据总线及低8位地址总线的分时复用口。作为通用I/O口时,输出数据可以得到锁存,不需外接专用锁存器;输入数据可以得到缓冲,增加了数据输入的可靠性。每个引脚可驱动8个TTL负载。
(数字电路按工艺有肖特基双极晶体管和CMOS工艺两种,使用双极晶体管的数字电路称TTL数字电路,
单片机输出端带负载能力,意思就是单片机的P3端口只能并联4个TTL型集成电路输入端。)
(2)P1口为8位准双向I/O口,内部具有上拉电阻,一般作通用I/O口使用,它的每一位都可以分别定义为输入线或输出线,作为输入时,锁存器必须置1。每个引脚可驱动4个TTL负载。
(3)P2口为8位准双向I/O口,内部具有上拉电阻,可直接连接外部I/O设备。它与地址总线高8位复用,可驱动4个TTL负载。一般作为外部扩展时的高8位地址总线使用。
(4)P3口为8位准双向I/O口,内部具有上拉电阻,它是双功能复用口,每个引脚可驱动4个TTL 负载。作为通用I/O口时,功能与P1口相同,常用第二功能。
12、复位的作用是什么?有几种复位方法?复位后单片机的状态如何?
答:复位是单片机的初始化操作。单片机在RST引脚产生两个机器周期(即24个时钟周期)以上的高电平即可实现复位。主要的复位方法有上电自动复位和按键手动复位两种。按键手动复位又分:按键电平复位和按键脉冲复位。
第三章指令系统
1、简述下列名词术语的基本概念:指令、指令系统、程序、汇编语言指令
答:指令:规定单片机进行某种操作的命令称为指令。
指令系统:单片机能够执行的各种指令的集合。
程序:一系列指令的有序集合称为程序。
汇编语言指令:用助记符形式来表示机器指令。
2、80C51单片机有哪几种寻址方式?这几种寻址方式是如何寻址的?
答:共7种寻址方式,分别为:寄存器寻址,直接寻址,寄存器间接寻址,立即寻址,变址寻址,位寻址和相对寻址。
寄存器寻址方式:由指令指出某一寄存器的内容做为操作数。
直接寻址方式:指令中操作数直接以单元地址的形式给出。
寄存器间接寻址方式:寄存器间接寻址方式,寄存器中存放的则是操作数的地址,即操作数是通过寄存器间接得到的。
立即寻址方式:操作数在指令中直接给出。
变址寻址方式:变址寻址是为了访问程序存储器中的数据和表格。MCS-51的变址寻址是以DPTR或PC作基址寄存器,以累加器A作变址寄存器,并以两者内容相加形成的16?位地址做为操作数地址,以达到访问数据和表格的目的。
位寻址方式:指对片内RAM的位寻址区和某些可寻址的特殊功能寄存器进行位操作的寻址方式。
相对寻址方式:相对寻址方式是为解决程序转移而专门设置的,为转移指令所采用。
3、要访问特殊功能寄存器和片外数据寄存器,应采用哪些寻址方式?
答:访问特殊功能寄存器可以采用直接寻址、寄存器寻址和位寻址(针对可以进行位寻址的特殊功能寄存器)方式。访问片外数据存储器可采用寄存器间接寻址方式。
4、80C51单片机的指令系统可以分为哪几类?说明各指令的功能。
答:51单片机指令系统按功能可分为5类:
(1)数据传送指令主要进行数据的传送、交换等;
(2)算术运算指令主要进行基本的加减乘除运算;
(3)逻辑运算指令主要实现逻辑运算与移位运算;
(4)控制转移指令主要是实现对程序流程的控制;
(5)位操作指令
5、外部数据传送指令有哪几条?有和区别?
答:外部数据传送指令有读指令和写指令两类,每类指令的寻址范围不同,分别为:读外部存储器指令:MOVX A,@Ri ;寻址范围为256字节
MOVX A,@DPTR ;寻址范围为64K字节
写外部存储器指令:MOVX @Ri,A ;寻址范围为256字节
MOVX @DPTR,A ;寻址范围为64K字节
6、在89S51片内RAM中,已知(30H)=38H,(38H)=40H,(40H)=48H,(48H)=90H,请分别分析下段程序按序执行后的结果。
MOV A,40H ;A=48H
MOV R0,A ;R0=48H
MOV P1,#0FFH ;P1=FFH
MOV @R0,30H ;(48H)=38H
MOV DPTR,#1246H ;DPTR=1246H
MOV 40H,38H ;(40H)=40H
MOV R0,30H ;R0=38H
MOV 90H,R0 ;(90H)=38H
MOV 48H,#30H ;(48H)=30H
MOV A,@R0 ;A=40H
MOV P2,P1 ;P2=38H
7、略
8、DA A 指令的作用是什么?怎样使用?
答:对十进制BCD数作加法时进行调整,当结果的低4位A0~A3>9,或半进位AC=1,则A0~A3+6,否则不加;当结果的高4位A4~A7>9,或进位CY=1,则A4~A7+6,否则不加;这条指令是在进行BCD码加法运算时,跟在“ADD”和“ADDC”指令之后,用来对BCD码的加法运算结果自动进行修正,使其仍为BCD码表示形式。
9、试编程将片外数据存储器60H中的内容传送到片内RAM54H单元中。
答:MOV R0,#60H
MOV 54H,A
10、试编程将寄存器R7的内容传送到R1中去。
答:MOV A,R7
MOV R1,A
11、已知当前PC值为210H,请用两种方法将程序存储器2F0H中的常数送入累加器A中。答:(1)以程序计数器PC作为基址寄存器
MOV A,#0E0H
MOVC A,@A+PC
(2)以数据指针DPTR作为基址寄存器
MOV DPTR,#02F0H
MOV A,#00H
MOVC A,@A+DPTR
12、试说明下段程序中每条指令的作用,并分析当指令执行完后,R0中的内容是什么?
MOV R0,#0A7H ;R0=A7H,立即数送寄存器R0
XCH A,R0 ;A=A7H,累加器A中的数据与R0中的数据进行交换
SWAP A ;A=7AH,累加器A中的高低四位进行交换
XCH A,R0 ;R0=7AH,数据交换回R0
13、请用两种方法实现累加器A与寄存器B的内容交换。
答:(1)MOV R0,A
MOV A,B
MOV B,R0
(2)MOV R0,B
XCH A,R0
14、试编程将片外RAM中40H单元的内容与R1的内容交换。
答:MOV R0,#40H
XCH A,R1
MOVX @R0,A
15、已知:A=0C9H,B=8DH,CY=1。
执行指令 ADDC A,B结果如何? A=57H,CY=1,OV=1,AC=1,P=1
执行指令 SUBB A,B结果如何? A=3BH,CY=0,AC=1,OV=1
16、试编程将片外RAM中30H和31H单元中的内容相乘,结果存放在32H(低位)和33H(高位)单元中。
答:MOV R0,#30H
MOVX A,@R0
MOV B,A
INC R0
MOVX A,@R0
MUL AB
INC R0
MOVX @R0,A
MOV A,B
INC R0
MOVX @R0,A
17、试用3种方法将累加器A中的无符号数乘2.
答:(1)MOV R0,A
ADD A,R0
(2)MOV B,#2
MUL AB
(3)RL A
18、分析依次执行下列指令的结果:
MOV 30H,#0A4H ;(30H)=A4H
MOV A,#0D6H ;A=D6H
MOV R0,#30H ;R0=30H
MOV R2,#47H ;R2=47H
ANL A,R2 ;A=46H
ORL A,@R0 ;A=E6H
SWAP A ;A=6EH
CPL A ;A=91H
XRL A,#0FFH ;A=6EH
ORL 30H,A ;(30H)=EEH
19、求下列指令执行后,累加器A及PSW中进位CY、奇偶位P和溢出位OV的值。
(1)当A=5BH时;ADD A,#8CH
(2)当A=5BH时;ANL A,#7AH
(3)当A=5BH时;XRL A,#7FH
(4)当A=5BH,CY=1时;SUBB A,#0E8H
答:(1)A=E7H,CY=1,P=0,OV=0
(2)A=5AH ,P=0
(3)A=24H ,P=0
(4)A=72H,CY=1,P=0,OV=0
20、把累加器A中的低4位数据送到外部数据存储器的2000H单元。
答:ANL A,#OFH
MOV DPTR,#2000H
MOVX @DPTR,A
21、试说明指令CJNE @R1,#7AH,10H的作用,若本指令地址为250H,其转移地址是多少?答:指令作用:如果以R1内容为地址的单元中的数据等于7AH,则程序顺序执行,否则转移后继续执行。若本指令地址为250H,则转移地址为250H+03H+10H= 263H。
22、将累加器A中的数据由0递增,加到50,结果在累加器A中。
答:CLR A
MOV R0,#50
L1: INC A
DJNZ R0,L1
23、试说明压栈指令和弹栈指令的作用及执行过程。
答:压栈(入栈或进栈)指令的作用是将数据存入堆栈中,其执行过程是先将堆栈指针SP的内容加1,然后将直接地址单元中的数据压入SP指向的单元中。若数据已推入堆栈,则SP指向最后推入数据所在的存储单元(即指向栈顶)。
弹栈(出栈)指令的作用是将数据从堆栈中取出,其执行过程为先将堆栈指针SP所指出单元的内容送入直接寻址单元中,然后将SP的内容减1,此时SP指向新的栈顶。
24、下述程序执行后,SP=?,A=?,B=?。
ORG 2000H
MOV SP,#40H
MOV A,#30H
LCALL 250H ;下条指令地址2008H送41H、42H,SP=42H
ADD A,#10H
MOV B,A ;地址为200AH
L1: SJMP L1
ORG 250H
MOV DPTR,#200AH
PUSH DPL ;SP+1=43H,DPL→(43H)
PUSH DPH ;SP+1=44H,DPH→(44H)
RET ;200AH→PC
答:上述程序执行后,SP=42H,A=30H,B=30H。
25、发光二极管点亮规律:先是第1和第8个亮,延时一段时间后,第2和第7个亮,延时后,再是第3和第6个亮,延时后,最后是第4和第5个点亮,延时后循环。
26、若系统晶振频率为6MHz,求子程序DELAY的延时时间,若想加长或缩短时间,应该怎样修改?答:DELAY: MOV R2,#0FAH
L1: MOV R3,#0FAH
L2: DJNZ R3,L2
DJNZ R2,L1
RET
总时间计算:T=4μs+(250×4μs+4μs)×250+4μs=
估算:T=250×4μs×250=250ms
若想加长延时时间,可以增加循环次数或再加一重循环;
若想减小延时时间,可以减少循环次数或较少一重循环。
27、P1口连接8个共阳极连接的发光二极管,是编制灯亮移位程序。
答:MOV A,#0FEH
L1: MOV P1,A
RL A
LCALL DELAY ;DELAY子程序同上题
SJMP L1
28、试编一程序,将外部数据存储器2100H单元中的高4位置“1”,其余位清“0”。答:MOV DPTR,#2100H
MOVX A,@DPTR
ORL A,#0F0H
ANL A,#0F0H
MOVX @DPTR,A
29、试编程将片内数据存储器40H单元的第0为和第7位置1,其余取反。
答:MOV A,40H
CPL A
SETB
SETB
MOV 40H,A
30、将与80H位相与的结果,通过输出。
ANL C ,
MOV
,C
31、请用位操作指令,求下列逻辑方程。 (1)2.3)1.20.(0.7.1P P B ACC P ++?= MOV C , ORL C , ANL C , ORL C ,/
MOV
,C
(2)1.15.2.3.15.P B ACC P PSW ?+?= MOV C , ANL C , MOV 20H ,C MOV C , ANL C ,/ ORL C ,20H
MOV
,C
(3)0.17.4.5.13.2P ACC B P P ?+?= MOV C , ANL C ,/ MOV 20H ,C MOV C , ANL C ,/
ORL
C ,20H (下一行)MOV
,C
第四章 汇编语言程序设计
1、编程将片内40H ~60H 单元中的内容送到以3000H 为首的存储区内。
MOV R2,#21H
MOV DPTR,#3000H
L1: MOV A,@R1
MOVX @DPTR,A
INC R1
INC DPTR
DJNZ R2,L1
2、编程计算下列算式的程序
(1)23H+45H+ABH+03H=
MOV A,#23H
ADD A,#45H
ADD A,#0ABH
XCH A,B ;溢出处理
ADDC A,#00H
XCH A,B
ADD A,#03H ;A中为结果低位,B中为高位(2)CDH+15H-38H-46H=
MOV A,#0CDH
ADD A,#15H
SUBB A,#38H
SUBB A,#46H
(3)1234H+8347H=
MOV A,#34H
ADD A,#47H
MOV 30H,A
MOV A,#12H
ADDC A,#83H
MOV 31,A ;30H存结果低位,31H存结果高位
(4)AB123H-43ADCH=
CLR C
MOV A,#23H
SUBB A,DCH
MOV 30H,A
MOV A,#0B1H
SUBB A,#3AH
MOV 31H,A
MOV A,#0AH
SUBB A,,#04H
MOV 32H,A ;30H为低位,32H为高位
3、设有两个4位BCD码,分别存放在23H、22H单元和33H、32H单元中,求他们的和,并送入43H、42H单元中(低位在低字节,高位在高字节)。
答:MOV A,22H
ADD A,32H
MOV 42H,A
MOV A,23H
ADDC A,33H
MOV 43H,A
4、略
5、编程计算片内RAM区50H~59H单元中数的平均值,结果存放在5AH中。
答:MOV R0,#8
MOV R1,#50H
MOV A,#00H
L1: ADD A,@R1
INC R1 DJNZ R0,L1 MOV B ,#8 DIV AB
MOV
5AH ,A
6、编写计算下式的程序。设乘积和平方结果均小于255。a 、b 值分别存在片外3001H 和3002H 单元中,结果存于片外3000H 单元中。
(1)??
?
??÷?=b a b a Y 25
b a b a b a ><=,,,
MOV DPTR ,#3001H MOVX A ,@DPTR MOV 30H ,A
;a 暂存30H 单元
INC DPL MOVX A ,@DPTR CJNE A ,30H ,L1
;是否a=b
MOV A ,#25
SJMP SAVE L1: JNC L2 MOV B ,30H MUL AB
SJMP SAVE L2: MOV B ,A MOV A ,30H
DIV
AB
SAVE: MOV DPTR ,#3000H
MOVX
@DPRT ,A
(2)??
???-++++=10)()(10)(22
2b a b a b a Y 10)(,10)(,10)(,2
22>+=+<+b a b a b a
MOV DPTR ,#3001H MOVX A ,@DPTR MOV 30H ,A INC DPTR MOVX A ,@DPTR ADD A ,30H MOV B ,A MUL AB
; (a +b)
2
MOV 31H ,A CJNE A ,#10,L1
SJMP SAVE L1: JC L2 CLR C SUBB A ,#10
SJMP SAVE L2:
ADD
A ,#10 SAVE: MOV DPTR ,#3000H
MOVC
@DPTR ,A
7、设有两个长度均为15的数组,分别存放在以200H 和210H 为首地址的存储区中,试编程求其对应项之和,结果存放到以220H 为首地址的存储区中。 答: MOV DPH ,#02H MOV R1,#15 MOV R2,#00H ; 数组1首地址低位 MOV R3,#10H ; 数组2首地址低位
MOV
R4,#20H
; 和首地址低位
L1: MOV DPL,R2
MOVX A,@DPTR
MOV R1,A
MOV DPL,R3
MOVX A,@DPTR
ADD A,R1
MOV DPL,R4
MOVX @DTPR,A
INC R2
INC R3
INC R4
DJNZ R1,L1
SJMP $
8、设有100个无符号数,连续存放在以2000H为首地址的存储区中,试编程统计正数、负数和零的个数。
答:MOV 30H,#00H ;正数计数器
MOV 31H,#00H ;负数计数器
MOV 32H,#00H ;零计数器
MOV DPTR,#2000H
MOV R1,#100
L4: MOVX A,@DPTR
INC DPTR
CJNE A,#0,L1
INC 32H
SJMP L2
L1: JC L3
INC 30H
SJMP L2
L3: INC 31H
L2: DJNZ R1,L4
SJMP $
9、将片外数据存储器地址为1000H~1030H的数据块,全部搬迁到片内RAM 30H~60H中,并将原数据块区域全部清零。
答:MOV R0,#30H
MOV R2,#31H
MOV DPTR ,#1000H
LP: MOVX A,@DPTR
MOV @R0,A
AND A,#00H
MOVX @DPTR,A
INC R0
INC DPTR
DJNZ R2,LP
SJMP $
10、试编写一子程序,是R1、R0指向的两个片外RAM连续单元中的高4位二进制数,合并成一个字节,装入累加器A中。已知R0指向低地址,并要求该单元高四位放在A中高四位。
答:MOVX A,@R1
ANL A,#0F0H
SWAP A
MOV R2,A
MOVX A,@R0
ANL A,#0F0H
ORL A,R2
11、试编程把以2040H为首地址的连续50个单元的无符号数按降序排列,存放到以3000H为首地址的存储区中。
答:MOV R2,#50
MOV R3,#20H
MOV R4,#40H ;源地址
MOV R5,#30H
MOV R6,#00H ;目的地址
SEND: MOV DPH,R3 ;SEND将2040H数据块移入3000H存储区MOV DPL,R4
MOVX A,@DPTR
INC DPTR
MOV R3,DPH
MOV R4,DPL
MOV DPH,R5
MOV DPL,R6
MOVX @DPTR,A
INC DPTR
MOV R5,DPH
MOV R6,DPL
DJNZ R2,SEND
MOV R2,#49 ;重复次数
CMP1: MOV DPTR,#3000H
MOV R3,#49 ;比较次数
CMP2: MOVX A,@DPTR
MOV B,A
INC DPTR
MOVX A,@DPTR
CJNE A,B,L1
L1: JC NOMOVE
MOV 30H,A
CLR C
MOV A,DPL
SUBB A,#01H
MOV DPL,A
MOV A,30H
MOVX @DPTR,A
INC DPTR
MOV A,B
MOVX @DPTR,A
NOMOVE: DJNZ R3,CMP2 ;50个数重复一遍?
DJNZ R2,CMP1 ;排序结束?
LJMP $
12、试编一查表程序,从首地址为2000H,长度为100的数据块中找出ASCII码为A,将其地址送到20A0H和20A1H单元中。
答:MOV DPTR,#2000H
MOV R2,#100
GO_ON: MOVX A,@DPTR
CJNE A,#41H,IFEND
MOV A,DPH
MOV B,DPL
MOV DPTR,#20A0H
MOVX @DPTR,A
INC DPTR
XCH A,B