第一章
1. 给出下列有符号数的原码、反码和补码(假设计算机字长为8
位)。
+45 -89 -6 +112
答:【+45】原=00101101,【+45】反=00101101,【+45】补=00101101 【-89】原=11011001,【-89】反=10100110,【-89】补=10100111
【-6】原=10000110,【-6】反=11111001,【-6】补=11111010
【+112】原=01110000,【+45】反=01110000,【+45】补=01110000 2. 指明下列字符在计算机内部的表示形式。
AsENdfJFmdsv120
答:41H 73H 45H 4EH 64H 66H 4AH 46H 6DH 64H 73H 76H 31H 32H 30H
3. 什么是单片机?
答:单片机是把微型计算机中的微处理器、存储器、I/O接口、定时
器/计数器、串行接口、中断系统等电路集成到一个集成电路芯片上形成的微型计算机。因而被称为单片微型计算机,简称为单片机。
4. 单片机的主要特点是什么?
答:主要特点如下:
1) 在存储器结构上,单片机的存储器采用哈佛(Harvard)结构
2) 在芯片引脚上,大部分采用分时复用技术
3) 在内部资源访问上,采用特殊功能寄存器(SFR)的形式
2
错误!使用“开始”选项卡将标题 1,部分标题 1 应用于要在此处显示的文字。
4) 在指令系统上,采用面向控制的指令系统
5) 内部一般都集成一个全双工的串行接口
6) 单片机有很强的外部扩展能力
5. 指明单片机的主要应用领域。
答:单机应用:1) 工业自动化控制;2) 智能仪器仪表;3) 计算机外部设备和智能接口;4) 家用电器
多机应用:功能弥散系统、并行多机处理系统和局部网络系统。
第二章
1. MCS-51单片机由哪几个部分组成?
答:MCS-51单片机主要由以下部分组成的:时钟电路、中央处理器(CPU)、存储器系统(RAM和ROM)、定时/计数器、并行接口、串行接口、中断系统及一些特殊功能寄存器(SFR)。
2. MCS-51的标志寄存器有多少位,各位的含义是什么?
答:MCS-51的标志寄存器PSW有8位;
D D D D D D D
D7
含义如下:
C(PSW.7):进位或借位标志位。
AC(PSW.6):辅助进位或借位可标志位。
F0(PSW.5):用户标志位。是系统预留给用户自己定义的标志位。
错误!使用“开始”选项卡将标题 1,部分标题 1 应用于要在此处显示的文字。 3
RS1、RS0(PSW.4、PSW.3):寄存器组选择位。可用软件置位或清零,用于从四组工作寄存器中选定当前的工作寄存器组。
OV(PSW.2):溢出标志位。在加法或减法运算时,如运算的结果超出8位二进制数的范围,则OV置1,标志溢出,否则OV清零。
P(PSW.0):奇偶标志位。用于记录指令执行后累加器A中1的个数的奇偶性。若累加器A中1的个数为奇数,则P置位,若累加器A中1的个数为偶数,则P清零。
其中PSW.1未定义,可供用户使用。
3. 在8051的存储器结构中,内部数据存储器可分为几个区域?各有什么特点?
答:片内数据存储器按功能可以分成以下几个部分:工作寄存器组区、位寻址区、一般RAM区和特殊功能寄存器区,其中还包含堆栈区。工作寄存器组区,00H~1FH单元,可用R0~R7等8个寄存器访问;位寻址区,20H~2FH单元,可按位方式访问;一般RAM区,30H~7FH单元;堆栈区,可从08到7F单元;特殊功能寄存器区位于80H~FFH单元。
4. 什么是堆栈?说明MCS-51单片机的堆栈处理过程。
答:堆栈是按先入后出、后入先出的原则进行管理的一段存储区域。CS-51单片机的堆栈是向上生长型的,存入数据是从地址低端向高端延伸,取出数据是从地址高端向低端延伸。入栈和出栈数据是以字节为单位的。入栈时,SP指针的内容先自动加1,然后再把数据存入到SP指针指向的单元;出栈时,先把SP指针指向单元的数据取出,然后再把SP指针的内容自动减1。
5. MCS-51单片机有多少根I/O线?它们和单片机的外部总线有什么关系?
答:MCS-51单片机有32根I/O线,由P0口经地址锁存器提供低8位
(A7~A0),P2口提供高8位(A15~A8)而形成。数据总线宽度为8位,由P0口直接提供。控制总线由第二功能状态下的P3口和4根独立的控制线RST、EA、ALE和PSEN组成。
4
错误!使用“开始”选项卡将标题 1,部分标题 1 应用于要在此处显示的文字。
6. 什么是机器周期? MCS-51单片机的一个机器周期包括多少个时钟周期?
答:机器周期:机器周期是单片机的基本操作周期,每个机器周期包含
S1、S2、 、S66个状态,每个状态包含两拍P1和P2,每一拍为一个时钟周期(振荡周期)。因此,一个机器周期包含12个时钟周期。
7.如果时钟周期的频率为12MHz,那么ALE信号的频率为多少?
答:2MHZ
第三章
1.在MCS-51单片机中,寻址方式有几种?其中对片内RAM可以用哪几种寻址方式?对片外RAM可以用哪几种寻址方式?
答:寻址方式可分为数的寻址和指令寻址,数的寻址有:常数寻址(立即寻址)、寄存器数寻址(寄存器寻址)、存储器数寻址(直接寻址方式、寄存器间接寻址方式、变址寻址方式)和位寻址,指令的寻址有绝对寻址和相对寻址。片内RAM寻址有:寄存器寻址、直接寻址方式和寄存器间接寻址方式。片外RAM寻址有:寄存器间接寻址方式。
2.在对片外RAM单元寻址中,用Ri间接寻址与用DPTR间接寻址有什么区别?
答:片外数据存储器寻址中,用Ri间接寻址只能访问低端的256字节单元,而用DPTR作指针间接访问可访问整个64K字节。
3.在位处理中,位地址的表示方式有哪几种?
答:1.直接位地址(00H~0FFH)。例如:20H
错误!使用“开始”选项卡将标题 1,部分标题 1 应用于要在此处显示的文字。 5 2.字节地址带位号。例如:20H.3表示20H单元的3位。
3.特殊功能寄存器名带位号。例如:P0.1表示P0口的1位。
4.位符号地址。例如:TR0是定时/计数器T0的启动位
。
4.写出完成下列操作的指令。
(1)R0的内容送到R1中。
MOV A,R0
MOV R1,A
(2)片内RAM的20H单元内容送到片内RAM的40H单元中。
MOV 40H,20H
(3)片内RAM的30H单元内容送到片外RAM的50H单元中。
MOV A,30H
MOV R0,#50H
MOVX @R0,A
(4)片内RAM的50H单元内容送到片外RAM的3000H单元中。
MOV A,50H
MOV DPTR,#3000H
MOVX @DPTR,A
(5)片外RAM的2000H单元内容送到片外RAM的20H单元中。
MOV DPTR,#2000H
MOVX A,@DPTR
MOV 20H,A
6
错误!使用“开始”选项卡将标题 1,部分标题 1 应用于要在此处显示的文字。
(6)片外RAM的1000H单元内容送到片外RAM的4000H单元中。
MOV DPTR,#1000H
MOVX A,@DPTR
MOV DPTR,#4000H
MOV @DPTR,A
(7)ROM的1000H单元内容送到片内RAM的50H单元中。
MOV A,#0
MOV DPTR,#1000H
MOVC A,@A+DPTR
MOV 20H,A
(8)ROM的1000H单元内容送到片外RAM的1000H单元中。
MOV A,#0
MOV DPTR,#1000H
MOVC A,@A+DPTR
MOVX @DPTR,A
5.区分下列指令有什么不同?
(1)MOV A,20H和MOV A,#20H
答:前者源操作数是直接寻址,后者源操作数立即寻址。
(2)MOV A,@R1和MOVX A,@R1
答:前者源操作数是访问片内数据存储器,后者源操作数访问片外数据存储器低256字节。
(3)MOV A,R1和MOV A,@R1
答:前者源操作数是寄存器寻址,后者源操作数寄存器间接寻址。
(4)MOVX A,@R1和MOVX A,@DPTR
错误!使用“开始”选项卡将标题 1,部分标题 1 应用于要在此处显示的文字。7
答:前者源操作数是访问片外数据存储器低256字节,后者源操作数访问片外数据存储器整个64K字节。
(5)MOVX A,@DPTR和MOVC A,@A+DPTR
答:前者源操作数是访问片外数据存储器,后者源操作数访问程序数据存储器。
6.设片内RAM的(20H)=40H,(40H)=10H,(10H)=50H,(P1)
=0CAH。分析下列指令执行后片内RAM的20H、40H、10H单元以及P1、P2中的内容。
MOV R0,#20H
MOV A,@R0 ;A=40H
MOV R1,A ;R1=40H
MOV A,@R1 ;A=10H
MOV @R0,P1 ;(40H)=0CAH
MOV P2,P1 P2=0CAH
MOV 10H,A (10H)=10H
MOV 20H,10H (20H)=10H
结果:(20H)=10H、(10H)=10H、(40H)=0CAH、P2=0CAH和P1=0CAH
7.已知(A)=02H,(R1)=7FH,(DPTR)=2FFCH,片内RAM(7FH)
=70H,片外RAM(2FFEH)=11H,ROM(2FFEH)=64H,试分别写出以下各条指令执行后目标单元的内容。
(1)MOV A,@R1 结果:累加器A等于70H
(2)MOVX @DPTR,A 结果:片外RAM(2FFCH)单元等于02H
(3)MOVC A,@A+DPTR 结果:累加器A等于64H
(4)XCHD A,@R1 结果:累加器A等于00H,片内RAM(7FH)单元等于72H
8
错误!使用“开始”选项卡将标题 1,部分标题 1 应用于要在此处显示的文字。
8.已知:(A)=78H,(R1)=78H,(B)=04H,CY=1,片内RAM(78H)=0DDH,(80H)=6CH,试分别写出下列指令执行后目标单元的结果和相应标志位的值。
(1)ADD A,@R1 ;累加器A等于55H,CY等于1
(2)SUBB A,#77H ;累加器A等于00H,CY等于0
(3)MUL AB ;累加器A等于E0H,B寄存器等于01H,CY 等于1,OV等于0
(4)DIV AB ;累加器A等于1EH,B寄存器等于00H,CY、OV等于0
(5)ANL 78H,#78H ;片内RAM(78H)单元等于58H
(6)ORL A,#0FH ;累加器A等于7FH
(7)XRL 80H,A ;片内RAM(80H)等于14H
9.设(A)=83H,(R0)=17H,(17H)=34H,分析当执行完下面指令段后累加器A、R0、17H单元的内容。
ANL A,#17H ;A=03H
ORL 17H,A ;(17H)=37H
XRL A,@R0 ;A=34H
CPL A ;A=CBH
结果:A=CBH,(R0)=17H,(17H)=37H
10.写出完成下列要求的指令。
(1)累加器A的低2位清零,其余位不变。
ANL A,#11111100B
(2)累加器A的高2位置“1”,其余位不变。
ORL A,#11000000B
(3)累加器的高4位取反,其余位不变。
XRL A,#11110000B
错误!使用“开始”选项卡将标题 1,部分标题 1 应用于要在此处显示的文字。9 (4)累加器第0位、2位、4位、6位取反,其余位不变。
XRL A,#01010101B
11.说明LJMP指令与AJMP指令的区别?
答:LJMP指令后面提供的是16位目标地址,所以可以转移到64KB程序存储器的任意位置,缺点是:执行时间长,字节数多。
AJMP指令后带的是11位直接地址,执行时,先将程序指针PC的值加2(该指令长度为2字节),然后把指令中的11位地址addr11送给程序指针PC的低11位,而程序指针的高5位不变,只能在当前2K范围内转移。
12.设当前指令CJNE A,#12H,10H的地址是0FFEH,若累加器A的值为10H,则该指令执行后的PC值为多少?若累加器A的值为12H呢?
答:指令执行后的PC值为1011H,若累加器A的值为12H,则指令执行后的PC值为1001H。
13.用位处理指令实现P1.4=P1.0∧(P1.1∨P1.2)∨/P1.3的逻辑功能。
程序:
MOV C,P1.1
ORL C,P1.2
ANL C,P1.0
ORL C,/P1.3
MOV P1.4,C
14.下列程序段汇编后,从1000H单元开始的单元内容是什么?
ORG 1000H
TAB: DB 12H,34H
DS 3
DW 5567H,87H
答:(1000H)=12H,(1001H)=34H,(1002H)=00H,(1003H)
=00,(1004H)=00,(1005H)=67H,(1006H)=55H,(1007H)=87H,(1008H)=00H
10
错误!使用“开始”选项卡将标题 1,部分标题 1 应用于要在此处显示的文字。
15.试编一段程序,将片内RAM的20H、21H、22H单元的内容依次存入片外RAM的20H、21H、22H中。
程序:
MOV R0,#20H
MOV R2,#03H
LOOP:MOV A,@R0
MOVX @R0,A
INC R0
DJNZ R2,LOOP
SJMP $
16.编程实现将片外RAM的2000H~2030H单元的内容,全部搬到片内RAM 的20H单元开始位置,并将源位置清零。
程序:
MOV R0,#20H
MOV DPTR,#2000H
MOV R2,#30H
LOOP:MOVX A,@DPTR
MOV @R0,A
MOV A,#00
MOVX @DPTR,A
INC DPTR
INC R0
DJNZ R2,LOOP
SJMP $
错误!使用“开始”选项卡将标题 1,部分标题 1 应用于要在此处显示的文字。11
17.编程将片外RAM的1000H单元开始的100个字节数据相加,结果放于R7R6中。
程序:
MOV DPTR,#1000H
MOV R2,#100
MOV R7,#00
MOV R6,#00
LOOP:MOVX A,@DPTR
ADD A,R6
MOV R6,A
MOV A,R7
ADDC A,#0
MOV R7,A
INC DPTR
DJNZ R2,LOOP
SJMP $
18.编程实现R4R3?R2,结果放于R7R6R5中。
程序:
ORG 0100H
MUL1:MOV A,R2
MOV B,R3
MUL AB ;R2?R3,结果的低字节直接存入积的R5
MOV R5,A ;结果的高字节存入R6中暂存起来
MOV R6,B
12
错误!使用“开始”选项卡将标题 1,部分标题 1 应用于要在此处显示的文字。
MUL2:MOV A,R2
MOV B,R4
MUL AB ;R2 R4,结果的低字节与R6相加后,再存入R6中
ADD A,R6
MOV R6,A
MOV A,B ;结果的高字节加上进位位后存入R7中
ADDC A,#00
MOV R7,A
SJMP $
19.编程实现把片内RAM的20H单元的0位、1位,21H单元的2位、3位,22H单元的4位、5位,23H单元的6位、7位,按原位置关系拼装在一起放于R2中。
程序:
MOV C,20H.0
MOV A.0,C
MOV C,20H.1
MOV A.1,C
MOV C,21H.2
MOV A.2,C
MOV C,21H.3
MOV A.3,C
MOV C,22H.4
MOV A.4,C
MOV C,22H.5
错误!使用“开始”选项卡将标题 1,部分标题 1 应用于要在此处显示的文字。13 MOV A.5,C
MOV C,23H.6
MOV A.6,C
MOV C,23H.7
MOV A.7,C
MOV R2,A
20.用查表的方法实现一位十六进制数转换成ASCII。
程序:(设一位十六进制数放在R2中,轮换的ASCII也放于R2中)
C16STASC:MOV DPTR,#TAB
MOV A,R2
MOVC A,@A+DPTR
MOV R2,A
RET
TAB:DB 30H,31H,32H,33H,34H,35H,36H,37H
DB 38H,391H,41H,42H,43H,44H,45H,46H
21.编程统计从片外RAM2000H开始的100个单元中“0”的个数放于R2中。
程序:
MOV DPTR,#2000H
MOV R3,#100
MOV R2,#00
LOOP:MOVX A,@DPTR
JNZ NEXT
INC R2
14
错误!使用“开始”选项卡将标题 1,部分标题 1 应用于要在此处显示的文字。
NEXT:INC DPTR
DJNZ R3,LOOP
SJMP $
第四章
1. C语言有哪些特点?
答:C语言具有以下特点:
1) 语言简洁、紧凑,使用方便、灵活
2) 运算符丰富
3) 数据结构丰富,具有现代化语言的各种数据结构
4) 可进行结构化程序设计
5) 可以直接对计算机硬件进行操作
6) 生成的目标代码质量高,程序执行效率高
7) 可移植性好
2. 有哪些数据类型是MCS-51单片机直接支持的?
答:MCS-51单片机直接支持的数据类型标准分为基本数据类型和组合数据类型,基本数据类型有字符型char、短整型short、整型int、长整型long、浮点型float、双精度型double、特殊功能寄存器型和位类型,其中char型与short型相同,float型与double型相同。组合数据类型有数组类型、结构体类型、共同体类型和枚举类型,另外还有指针类型和空类型。
3. C51特有的数据类型有哪些?
答:C51特有的数据类型有特殊功能寄存器型和位类型。
4. C51中的存储器类型有几种,它们分别表示的存储器区域是什么?
答:C51中的存储器类型有6种,分别如下:
错误!使用“开始”选项卡将标题 1,部分标题 1 应用于要在此处显示的文字。15 data:直接寻址的片内RAM低128B,访问速度快
bdata:片内RAM的可位寻址区(20H~2FH),允许字节和位混合访问
idata:间接寻址访问的片内RAM,允许访问全部片内RAM
pdata:用Ri间接访问的片外RAM低256B
xdata:用DPTR间接访问的片外RAM,允许访问全部64KB片外RAM
code:程序存储器ROM 64KB空间
5. 在C51中,bit位与sbit位有什么区别?
答:bit位类型符用于定义一般的位变量。存储器类型只能是bdata、data、idata,只能是片内RAM的可位寻址区,严格来说只能是bdata。
sbit位类型符用于定义在可位寻址字节或特殊功能寄存器中的位,定义时需指明其位地址,可以是位直接地址,可以是可位寻址变量带位号,也可以是特殊功能寄存器名带位号。
6. 在C51中,通过绝对地址来访问的存储器有几种?
答:通过绝对地址来访问存储器有三种方法:1. 使用C51运行库中预定义宏。2. 通过指针访问。3. 使用C51扩展关键字_at_
7. 在C51中,中断函数与一般函数有什么不同?
答:中断函数在定义时后面带interrupt m修饰符,m的取值为0~31,对应的中断情况如下:0——外部中断0,1——定时/计数器T0,2——外部中断1,3——定时/计数器T1,4——串行口中断,5——定时/计数器T2,其他值预留。
编写MCS-51中断函数需要注意如下几点。
(1) 中断函数不能进行参数传递,如果中断函数中包含任何参数声明都将导致编译出错。
(2) 中断函数没有返回值。
(3) 在任何情况下都不能直接调用中断函数
16
错误!使用“开始”选项卡将标题 1,部分标题 1 应用于要在此处显示的文字。
(4) 如果在中断函数中调用了其他函数,则被调用函数所使用的寄存器必须与中断函数相同,否则会产生不正确的结果。
(5) C51编译器对中断函数编译时会自动在程序开始和结束处加上相应的内容。
(6) C51编译器从绝对地址8m+3处产生一个中断向量,其中m为中断号,也即interrupt后面的数字。该向量包含一个到中断函数入口地址的绝对跳转。
(7) 中断函数最好写在文件的尾部,并且禁止使用extern存储类型说明。防止其他程序调用。
8. 按给定的存储类型和数据类型,写出下列变量的说明形式。
(1) 在data区定义字符变量val1。
char data val1;
(2) 在idata区定义整型变量val2。
int idata val2;
(3) 在xdata区定义无符号字符型数组val3[4]。
unsigned char xdata val3[4];
(4) 在xdata区定义一个指向char类型的指针px。
char xdata *px;
(5) 定义可寻址位变量flag。
bit flag;
(6) 定义特殊功能寄存器变量P3。
sfr P3=0xa0;
(7) 定义特殊功能寄存器变量SCON。
sfr SCON=0x98;
(8) 定义16位的特殊功能寄存器T0。
sfr16 T0=0x8a;
错误!使用“开始”选项卡将标题 1,部分标题 1 应用于要在此处显示的文字。17 9. 写出下列关系表达式或逻辑表达式的结果,设a=3,b=4,c=5。
(1) a+b>c&&b= =c 结果:假
(2) a||b+c&&b-c 结果:真
(3) !(a>b)&&!c||1 结果:真
(4) !(a+b)+c-1&&b+c/2 结果:假
10. 写出下列C51程序的执行结果。
(1)
#include
extern serial_initial();
main()
{
int x,y,z;
serial_initial();
x=y=8;z=++x;
printf("\n %d %d %d",y,z,x);
x=y=8;z=x++;
printf("\n %d %d %d",y,z,x);
x=y=8;z=--x;
printf("\n %d %d %d",y,z,x);
x=y=8;z=x--;
printf("\n %d %d %d",y,z,x);
printf("\n");
while(1);
}
结果:8 9 9
8 8 9
8 7 7
8 8 7
(2)
#include
extern serial_initial();main()
{
int x,y,z;
serial_initial();
printf("input data x,y?\n");
18
错误!使用“开始”选项卡将标题 1,部分标题 1 应用于要在此处显示的文字。
scanf("%d %d",&x,&y);
printf("\n x y x
printf("\n");
printf("\n%3d%3d",x,y);
z=x z=x<=y; printf("%5d",z); z=x>y; printf("%5d",z); z=x>=y; printf("%5d",z); z=x!=y; printf("%5d",z); z=x==y; printf("%5d",z); while(1); } 执行结果: input data x,y? 1 2 x y x 1 2 1 1 0 0 1 0 (3) #include extern serial_initial(); main() { int x,y,z; serial_initial(); printf("input data x, y ?\n"); scanf("%d %d",&x,&y); printf("\n x y !x x||y x&&y"); printf("\n%3d%3d",x,y); z=!y; printf("%5d",z); z=x||y; printf("%5d",z); z=x&&y; printf("%5d",z); printf("\n");printf("\n"); printf("That is all\n"); while(1); } 执行结果: input data x, y ? x y !x x||y x&&y 错误!使用“开始”选项卡将标题 1,部分标题 1 应用于要在此处显示的文字。19 1 2 0 1 1 That is all 20 错误!使用“开始”选项卡将标题 1,部分标题 1 应用于要在此处显示的文字。 (4) #include extern serial_initial(); main() { int a,b; unsigned int x,y; serial_initial(); a=b=0xaa55;x=y=0xaa55; printf("\n a=%4x b=%4x x=%4x y=%4x",a,b,x,y); a=a<<1;b=b>>1; x=x<<1;y=y>>1; printf("\n a=%4x b=%4x x=%4x y=%4x",a,b,x,y); printf("\n"); printf("\n"); printf("That is all.\n"); while(1); } 执行结果: a=aa55 b=aa55 x=aa55 y=aa55 a=54aa b=d52a x=54aa y=552a That is all. 11. break和continue语句的区别是什么? 答:break语句可以跳出switch结构,使程序继续执行switch结构后面的一个语句。break语句还可以从循环体中跳出循环,提前结束循环而接着执行循环结构下面的语句。 continue语句用在循环结构中,用于结束本次循环,跳过循环体中continue下面尚未执行的语句,直接进行下一次是否执行循环的判定。 continue语句和break语句的区别在于:continue语句只是结束本次循环而不是终止整个循环;break语句则是结束循环,不再进行条件判断。 12. 用分支结构编程实现:输入“1”显示“A”,输入“2”显示“B”,输入“3”显示“C”,输入“4”显示“D”,输入“5”结束。 参考程序: #include