单片机课后习题
第三章
4.什么是ALU?简述MCS-51系列单片机
ALU的功能与特点。
答: ALU是用于对数据进行算术运算和逻辑操作的执行部件,由加法器和其他逻辑电路(移位电路和判断电路等)组成。在控制信号的作用下,它能完成算术加、减、乘、除和逻辑与、或、异或等运算以及循环移位操作、位操作等功能。
值。
如果CPU在操作中要使用两组工作寄存器,如果不使用位变量, SP的初值至少应为0FH
或更大的值;如果使用位变量,SP 的初值至少应为 2FH 或更大的值;Keil C51 编译器会自动计算SP的初始设定值,无需编程者关心。
8.程序状态寄存器PSW的作用是什么?
常用状态标识有哪几位?作用是什么? 答: PSW 是 8 位寄存器,用做程序运行状态的标识。
表4.7 PSW寄存器各位名称及地址
地址 D7H D6H D5H D4H D3H D2H D1H D0H
名称 C AC F0 RS1 RS0 OV F1 P
当CPU进行各种逻辑操作或算术运算时,为反映操作或运算结果的状态,把相应的标识
位置位或清 0。这些标识的状态,可由专门的指令来测试,也可通过指令读出。它为计算机
确定程序的下一步运行方向提供依据。PSW寄存器中各位的名称及地址如表4.7所示,下面
说明各标识位的作用。
●P:奇偶标识。该位始终跟踪累加器A的内容的奇偶性。如果有奇数个1,则置P为1,否则清0。在80C5l的指令系统中,凡是改变累加器A中内容的指令均影响奇偶标识位P。
● F1:用户标识。由用户置位或复位。 ●OV:溢出标识。有符号数运算时,如果发生溢出,OV置1,否则清0。对于1B的有
符号数,如果用最高位表示正、负号,则只有 7 位有效位,能表示-128~+127 之间 的数。如果运算结果超出了这个数值范围,就会发生溢出,此时,OV = l,否则OV = 0。在乘法运算中,OV = l表示乘积超过 255;在除法运算中,OV = l表示除数为 0。 ● RS0、RSl:工作寄存器组选择位。用于选择指令当前工作的寄存器组。由用户用软
6.什么是指令?什么是程序?简述程序在
计算机中的执行过程。
答:指令由操作码和操作数构成,分别表示何种操作和操作数的存储地址; 而程序则是:程序是可以连续执行,并能够完成一定任务的一条条指令的集合。 程序执行是由控制器控制的,控制器是CPU的大脑中枢,它包括定时控制逻辑、指令寄 存器IR、数据指针DPTR及程序计数器PC、堆栈指针SP、地址寄存器、地址缓冲器等。它的功能是对程序的逐条指令进行译码,并通过定时和控制电路在规定的时刻发出各种操作所需的内部和外部控制信号,协调各部分的工作,完成指令规定的操作。
7. 什么是堆栈?堆栈有何作用?在程序设
计时,有时为什么要对堆栈指针SP重新赋值?
如果CPU在操作中要使用两组工作寄存器,你认为SP的初值应为多大?
答: 堆栈是个特殊的存储区,主要功能是暂时存放数据和地址,通常用来保护断点和现场。
它的特点是按照先进后出的原则存取数据,这里的进与出是指进栈与出栈操作。 80C51片内RAM的部分单元可以用做堆栈。有一个8位的堆栈指针寄存器SP,专用于
指出当前堆栈顶部是片内RAM的哪一个单元。80C51单片机系统复位后SP的初值为07H,
也就是将从内部 RAM 的 08H 单元开始堆放信息。但是,80C51 系列的栈区不是固定的,只要通过软件改变 SP寄存器的值便可更动栈区。为了避开工作寄存器区和位寻址区,SP 的初值可置为2FH或更大的地址
- 1 -
单片机课后习题
件改变RS0 和RSl的组合,以切换当前选用的工作寄存器组,单片机在复位后, RS0 = RSl = 0,CPU自然选中第0组为当前工作寄存器组。根据需要,用户可利用传送指
令或位操作指令来改变其状态,这样的设置为程序中快速保护现场提供了方便。 ●F0:用户标识位,同F1。 ● AC:半进位标识。当进行加法(或减法)运算时,如果低半字节(位 3)向高半字 节(位 4)有进位(或借位) ,AC置 1,否则清 0。AC也可用于BCD码调整时的判别 位。
● CY:进位标识。在进行加法(或减法)运算时,如果操作结果最高位(位 7)有进 位,CY置1,否则清0。在进行位操作时,CY又作为位操作累加器C。
9.在 80C51 扩展系统中,片外程序存储
器和片外数据存储器共处同一地址空间为什么
不会发生总线冲突?
答: 在80C51扩展系统中,片外程序存储器和片外数据存储器虽然共处同一地址空间,但是在物理上是两个独立的存储空间,这两个空间都使用相同的16位地址线和8位数据线,分别为两个64KB的寻址空间,它们的选通控制信号不同。程序存储器使用PSEN 作为取指令控制信号,数据存储器使用WR 、RD作为存取数据控制信号。所以不会发生总线冲突。 从指令周期角度来看,取指令周期访问片外程序存储器,PSEN 有效,执行指令周期则存
取数据,WR 、RD信号有效,访问的是片外数据存储器。
时钟周期也称为振荡周期,定义为时钟脉冲频率(fosc)的倒数,是计算机中最基本、 最小的时间单位。
时钟周期经2分频后成为内部的时钟信号,用做单片机内部各功能部件按序协调工作的
控制信号,称为状态周期,用S表示。这样一个状态周期就有两个时钟周期,前半状态周期相应的时钟周期定义为P1,后半周期对应的节拍定义为P2。
完成一个基本操作所需要的时间称为机器周期,也称CPU周期。80C51有固定的机器周
期,规定一个机器周期有6个状态,分别表示为S1~S6,而一个状态包含两个时钟周期,那么一个机器周期就有12个时钟周期。 所以当振荡频率为8MHz时,
机器周期为 12×1/8MHZ=12×0.125μs=1. 5μs
15. 何谓单片机最小系统?请分别画出由
80C32单片机和89C52单片机组成的最小系统。 答: 单片机最小系统就是能使单片机工作的最少的器件构成的系统,是大多数控制系统必不可少的关键部分。80C32单片机和89C52单片机组成的最小系统如图4.2和图4.3所示。
第四章
1.80C51的指令系统具有哪些特点?
答 80C51指令系统由49条单字节指令、45条双字节指令和17条三字节指令组成,这样可以提高程序存储器的使用效率。对于大多数算术、逻辑运算和转移操作,可选用短地址或长地址指令实现,以提高运算速度、编程效率和节省存储器单元。在111条指令中,有64条指令的执行时间为12个振荡器周期 (1个机器周期) , 45条为24个振荡器周期 (2个机器周期) , 只有乘、除法指令需48个振荡周期(4个机器周期) 。当主频为12MHz时,典型指令的执行时间为1μs,运算速度是比较快的。
12.何谓时钟周期、机器周期、指令周期?
80C51 的时钟周期、机器周期、指令周期是
如何分配的?当振荡频率为8MHz时,一个单片机机器周期为多少微秒?
答: 为了便于对CPU时序进行分析,人们按指令的执行过程规定了几种周期,即时钟周期、状态周期、机器周期和指令周期,也称为时序定时单位,下面分别予以说明。
- 2 -
2.80C51单片机的指令系统按其功能可归
纳为几大类?请写出各类名称。
答: 80C51单片机指令系统操作码助记符
单片机课后习题
按功能可分为五大类。
(1)数据传送类指令(7种助记符) (2)算术运算类指令(8种助记符) (3)逻辑运算类指令(10种助记符) (4)控制转移类指令(18种助记符) (5)位操作指令(1种助记符)
代码。
6.对80C51片内RAM的128~255字节
区的地址空间寻址时,应注意些什么?对特殊
功能寄存器,应采用何种寻址方式进行访问?
答: 此空间有2类不同的物理存储空间,一个是特殊功能寄存器区,一个是RAM区。 直接寻址访问特殊功能寄存器,间接寻址访问RAM区。
3.何为寻址方式?80C51单片机有哪些寻
址方式?
答: 80C51 单片机共有 7 种寻址方式: ● 寄存器寻址 ● 寄存器间接寻址 ● 直接寻址 ● 立即寻址
● 基址寄存器+变址寄存器的间接寻址 ● 相对寻址 ● 位寻址
7.写出完成下列要求的C语言程序。
(1)将地址为4000H的片外数据存储单元内容,送入地址为30H的片内数据存储单元 中。
答: 可使用绝对地址访问函数实现 DBYTE[0x30] = XBYTE[0x4000]; (2)将地址为4000H的片外数据存储单元 4.什么是源操作数?什么是目的操作数?
通常在指令中如何加以区分? 内容,送入地址为3000H的片外数据存储单 答: 在双操作数的指令中,指令执行后的元中。 结果放在其中的一个操作数中,这个操作数答: 可使用绝对地址访问函数实现
XBYTE [0x3000] = XBYTE[0x4000]; 是目的操作数,另外一个是源操作数。80C51
指令系统中,不靠近指令操作码的是源操作 (3)将地址为0800H的程序存储单元内数,源操作数可以是立即数。80C51 指令系容,送入地址为30H的片内数据存储单元统中,紧跟在指令操作码之后是目的操作中。 数,算术运算和大多数逻辑运算其目的操作答: 可使用绝对地址访问函数实现
DBYTE [0x30] = CBYTE[0x0800]; 数必须是累加器A,目的操作数不允许使用
立即数寻址方式。 (4)将片内数据存储器中地址为30H与 5.查表指令是在什么空间上的寻址操作? 40H的单元内容交换。 答: 由于对程序存储器只能读而不能写,答: unsigned char temp;
temp= DBYTE [0x40]; 因此其数据传送是单向的,即从程序存储器
DBYTE [0x40]= DBYTE [0x30]; 读取数据,且只能向累加器A传送。这类指
DBYTE [0x30]= temp; 令共有两条,其功能是对存放于程序存储器
中的数据表格进行查找传送,所以又称查表此题答案不唯一,也可用指针运算或其他方指令。 案实现; MOVC A,@A+DPTR (5)将片内数据存储器中地址为30H单元MOVC A,@A+PC 的低4位与高4位交换。 这两条指令都为变址寻址方式。前一条指令答: 使用C51提供的本征函数_cror_实现;
#inclucle
_cror_(DBYTE [0x30],4); 可先给 DPTR 赋予任何地址,因此查表范
围可达整个程序存储器的 64KB 空间。后 8.将30H、31H单元中的十进制数与38H、一条指令以PC作为基址寄存器,虽然也提39H单元中的十进制数做十进制加法,其和 供16位基址,但其值是固定的。由于A的送入40H、41H单元中,即(31H,30H)+内容为8位无符号数,所以这种查表指令只(39H,38H)→(41H,40H)。 能查找所在地址以后256B范围内的常数或答: #include
- 3 -
单片机课后习题
#include
/*********** main C **************/ void main (void) { unsigned int sum;
sum = DBYTE[0x30]+DBYTE[0x38];
if((sum&0x000f)>0x9) sum += 0x06; //个位十进制调整
if(sum>0x99) sum += 0x60;//十位十进制调整
DBYTE[0x40]= sum;//和低位字节 DBYTE[0x41] = (sum>>8) + DBYTE[0x31]+DBYTE[0x39];//和高位字节 if(DBYTE[0x41]>0x09) DBYTE[0x41] += 0x06;//百位十进制调整
while(1); /* 程序在此死循环 */ }
END
10.编写程序,用 30H 单元内容除以 40H
单元内容,商送入 50H 单元,余数送入 51H
单元。 (答案不惟一)
解: 涉及直接地址,用汇编实现: ORG 0000H MOV SP,#49H
MOV A,30H ;被除数 MOV B,40H;除数 DIV AB;A/B
MOV 50H,A ;商存50H单元 MOV 51H,B ;余存51H单元 SJMP $ ;程序在此死循环 END
11.已知: (30H)= 55H,(31H)= 0AAH。
分别写出完成下列要求的指令,并写出32H 单元的内容。 解: (1)(30H)&(31H)→(32H); DBYTE[0x32]= DBYTE[0x30]& DBYTE[0x31];0x00 (2)(30H)|(31H)→(32H); DBYTE[0x32]= DBYTE[0x30]| DBYTE[0x31];0xff (3)(30H)(^31H)→(32H); DBYTE[0x32]= DBYTE[0x30]^DBYTE[0x31];0xff
9.编写程序段完成下列乘法操作: (R4,
R3)×(R5),(32H,31H,30H)。此式含义
是将R4、R3中的双字节被乘数与R5中的字节乘数相乘,乘积存放在地址为32H~30H
3个存储单元中((答案不惟一) 。 解: 涉及到寄存器,用汇编实现: ORG 0000H MOV SP,#49H MOV A,R3 MOV B,R5 MUL AB
MOV R0,#30H
MOV @R0,A ;将低8位存入30H INC R0 MOV R1,B MOV A,R4 MOV B,R5 MUL AB ADD A,R1
MOV @R0,A; 将中间8位存入31H MOV A,B
ADDC A,#00H ; 将中间8位的进位加入A中
INC R0
MOV @R0,A ;将高8位存入32H SJMP $ ;程序在此死循环
- 4 -
12.十进制调整指令DA起什么作用?用
在何处?
答: 十进制调整指令如下: DA A
功能是把A中二进制码自动调整成二-十进制码(BCD码)。用于对BCD码的加法结果
进行调整。
13.80C51 指令系统中有了长跳转
LJMP、长调用 LCALL 指令,为何还设置了短跳转
AJMP、短调用ACALL指令?在实际使用时应怎样考虑?
答: LJMP addr16,LCALL addr16,指令码中的目标地址均是16位的,所以可以指向64KB
程序存储器空间任意位置。
AJMP addr11,ACALL addr11,指令码中的
单片机课后习题
目标地址均是 12 位的,所以可以指向 2KB
程序存储器空间任意位置。
当使用的程序存储器空间在 2KB 之内或产生的代码长度在 2KB 之内时所有的跳转和调
用可以使用 AJMP ,ACALL 指令。否则建议使用 LJMP,LCALL。高级语言编译器根据所选目标器件和代码情况自动生成。
14.写出下列短跳转指令中标号L00的取
值范围。
37FFH AJMP L00
答: 最大转移地址为:37FFH +2KB
15.设堆栈指针(SP)= 60H:
(1)2500H LCALL L00 …… ……
(2)2700H MOV A,#03H …… …… (3)2750H RET
执行(1)指令后:(SP)、((SP))、((SP-1))、(PC) 各为多少?执行(2)指令后:(SP)、(PC) 为多少?若将(1)指令改为ACALL L00,标号L00的取值范围是多少? 答:
执行(1)指令后,(SP)=62H,((SP))=25H,((SP-1))=03H,(PC)= L00;
执行(2)指令后,(SP)=60H,(PC)= 2702H; 若将(1)指令改为ACALL L00,标号L00的取值范围是当前PC的高5位,加上低11位
从全0变全1;例如:2500H ACALL L00,当前PC=2500H,PC高5位是00100,则L00
取值范围是:[00100, 00000000000~00100, 11111111111]
MOV R0,A MOV 29H,R0 SETB RS0 MOV R1,A MOV 26H,A MOV 28H,C
(1)区分哪些是伪操作指令?哪些是字节操作指令?
(2)写出程序执行后,片内RAM有关单元的内容。
(3)如fosc=12MHz,计算这段程序的执行时间。 答: (1)(2)
CLR C;答:位操作指令 (C)= 0 CLR RS1;答:位操作指令 (RS1)= 0 CLR RS0;答:位操作指令 (RS0)= 0
MOV A,#38H;答:字节操作指令 A=38H MOV R0,A;答:字节操作指令R0=(A)=38H MOV 29H,R0;答:字节操作指令 (29H)=(R0)=38H
SETB RS0;答:位操作指令 (RS0)=1 MOV R1,A;答:字节操作指令 R1=(A)=38H
MOV 26H,A;答:字节操作指令 (26H)=(A)=38H
MOV 28H,C;答:位操作指令 (28H)=(C)=0 (3)如fosc=12MHz,这段程序的执行时间=11μs
18.请用位操作指令,求下列逻辑方程:
(1)P1.7 ACC.0&(B.0 P2.0) P3.0 =+ + (2)PSW.5 P1.0&ACC B.6&P1.4 =+ (3)PSW.5 P1.7&B.4 C ACC&P1.0 =++ 答: (1)P1_7=(ACC_0)&&(( B_0||P2_0)||(~P3_0)); 答: (2)PSW_5=(P1_0&&(~ACC))||( B_6&&(~P1_4)) //此处实际上是取ACC.0 答: (3)PSW_5=(~(P1_7)&&B_4)||CY||((~ACC)&&P1_0) //此处实际上是取ACC.0
16.为什么SJMP指令的rel=$时,将实现
单指令的无限循环? 答: $表示本指令所处地址, 该指令相当于:Here:SJMP Here
17.有程序如下:
CLR C CLR RS1 CLR RS0 MOV A,#38H
- 5 -
19.写出下列各条指令的机器码,并逐条
写出依次执行每条指令后的结果和 PSW 的内 容: