单片机作业题及答案(胡乾斌版教材)
第一章
1.5 解:
129,
253,
21.125,
18.6
1000 0001B,
1111 1101B,
1 0101.0010B,
1 0010.1001B,
81H
FDH
15.2H
12.9H
1.6 将下列二进制、十六进制数转换为十进制数。
(1010 1101)2 , (1011 0110)2 , (1110 0111.101)2 , (3E8)16 , (5D.8)16
答:(1010 1101)2=173D
(1011 0110)2=182D
(1110 0111.101)2=231.625D
(3E8)16=1000D
(5D.8)16=93.5D
1.7 完成下列数制转换。
(1101 1110.01)2=(DE.4)16
(6A8.4)16=(110 1010 1000.01)2
1.11 写出下列二进制数的原码、反码和补码。
+101 1011 , -101 1011 , +111 111 , -111 1111
解:
+1011011 -1011011
+1111111 -1111111
原码 01011011 11011011
01111111 11111111
反码 01011011 10100100 01111111 10000000
补码 01011011 10100101 01111111 10000001
1.12 已知机器数[X1]原=[X2]反=[X3]补= 01010111B,试求 X1、X2 和 X3 的真值(用十进制数表
示)。
解:X1、X2 和 X3 的真值为 87D。
1.13 已知:[x1]原=1011 0101,[x2]反=1011 0101,[x3]补=1011 0101,试求:[x1]反,
[x2]补,[x3]原各为何值?
解:
反
11001010
B
补
10110110
B
原
11001011
B
1.14 将下列十进制数分别用压缩 BCD 码和非压缩 BCD 码表示。
123,
1997.7
解:(1)
压缩
BCD
000100100011
非压缩
BCD
000000010000001000000011
(2)
[1997.7]压缩 BCD 码=0001 1001 1001 0111. 0111
[1997.7]非压缩 BCD 码=0000 0001 0000 1001 0000 1001 0000 0111. 0000 0111
第二章
2.4 解:
RST:复位引脚,当 RST 引脚端出现≥10ms 的高电平时,单片机复位,各
寄存器恢复默认值。
ALE:地址锁存使能输出,当访问外部存储器时,P0 口输出的低八位地址
由 ALE 输出的控制信号锁存到片外地址锁存器,ALE 高电平期间,P0 口上一般出
现地址信息,在 ALE 下降沿时,将 P0 口上地址信息锁存到片外地址锁存器,在
ALE 低电平期间 P0 口上一般出现指令和数据信息。平时不访问片外存储器时,
该端也以六分之一的时钟频率固定输出正脉冲。因而亦可作系统中其它芯片的时
钟源。ALE 可驱动 8 个 TTL 门。
/EA :内部和外部程序存储器选择信号,在使用 8051 时,当/EA 引脚接高
电平时,4 KB 以内的地址在片内 ROM,大于 4KB 的地址在片外 ROM 中,两者
共同构成 64KB 空间;当/EA 引脚接低电平时,片内 ROM 被禁用,全部 64KB
地址都在片外 ROM 中。使用 8031 单片机时,由于 8031 单片机无片内 ROM, /EA
应接地。
2.6 什么是堆栈?堆栈有何作用?在 MCS-51 单片机应用系统程序设计时,有时
为什么要对堆栈指针 SP 重新赋值?如果CPU 在操作中要使用两组工作寄存
器,试问 SP 的初值应如何设定?
答:堆栈是在内存 RAM 中开辟的一个特定的存储区,专门用来暂时存放数据或
存放返回地址,并按照“后进先出”的原则进行操作。
因为 SP 的默认值为 07H,当工作寄存器组选为组 1、组 2、组 3 时,堆栈区
会与工作寄存器组发生冲突,因此要对 SP 重新赋值。
如果 CPU 在操作中要使用 0、1 这两组作为工作寄存器组,SP 的初值最小
为 0FH。
2.7 MCS-51 设置 4 组工作寄存器有什么特点?开机复位后,CPU 使用的是哪组
工作寄存器?他们的地址如何?CPU 如何指定和改变当前工作寄存器组?
答: MCS-51 单片机共 4 组工作寄存器组,每组寄存器均可选作 CPU 当前使用
的工作寄存器组,其余各组只能作为数据缓冲器使用。
开机复位后,CPU 使用组 0 工作寄存器
它们的地址 R0~R7:00H~07H
CPU 通过改变 PSW 中的 RS1、RS0 的值指定当前工作寄存器组。
2.10
2.12
第三章
3.4 解:机器码为
F8A7
C8
C4
C8
程序执行完后 R0 的内容为 7A。
3.5
3.6
3.8
3.11 试分析下面程序段执行后,A=? (30H)=?
MOV
MOV
MOV
MOV
ANL
ORL
SWAP
CPL
XRL
ORL
30H , #0A4H
A , #0D6H
R0 , #30H
R2 , #51H
A
A
A
A
A
30H , A
, R2
, @R0
, #0FEH
解:A=6EH (30H)=0EEH
3.12 下述程序执行后,SP=? A=? B=?
2000H
SP , #40H
A , #30H
SUBR
A , #10H
B , A
L1
ORG
MOV
MOV
LCALL
ADD
MOV
L1:SJMP
2000H
2003H
2005H
2008H
200AH
200BH
200EH
2011H
2013H
SUBR: MOV
PUSH
PUSH
DPTR , #200AH
DPL
DPH
2015H
RET
解:A=B=30H SP=42H
3.13 两个 4 为 BCD 码数相加,设被加数和加数分别存于片内 RAM 的 40H~41H、
45H~46H 单元中,和数存于 50H、51H 单元中(均是低位在前,高位在后),
试编写程序。
解:
ORG
MOV
ADD
DA
MOV
MOV
ADDC
DA
MOV
2000H
A , 40H
A , 45H
A
50H , A
A , 41H
A , 46H
A
51H , A
3.19 若 A=80H,指令 CJNE A,#8DH,—50H 的第一个字节地址为 0150H,试问指
令执行后,转移的目标地址为多少?
解:转移的目标地址为:0100H
3.22 把累加器 A 中的内容与立即数 24H 相加,若结果不等于 80H,则程序跳转
8 个字节后继续执行,否则顺序执行,试编写程序。
解:
3.23
ORG
ADD
CJNE
2000H
A , #24H
A , #80H , 08H
3.24 设 R0=20H , R1=25H , (20H)=80H , (21H)=90H , (22H)=A0H , (25H)=A0H ,
(26H)=6FH , (27H)=76H ,下列程序执行后,结果如何?
CLR
MOV
LOOP:MOV
ADDC
MOV
INC
INC
DJNZ
JNC
MOV
SJMP
NEXT:DEC
SJMP
C
R2 , #3
A , @R0
A , @R1
@R0 , A
R0
R1
R2 , LOOP
NEXT
@R0 , #01H
$
R0
$
解:A=17H R0=23H R1=28H
(20H)=20H (21H)=00H (22H)=17H (23H)=01H
(25H)=0A0H (26H )=6FH
(27H)=76H
3.25 设片内 RAM (30H)=0EH,执行下面程序后,A=?指出该程序的功能。
MOV
MOV
RL
MOV
RL
RL
ADD
R0 , #30H
A , @R0
A
B , A
A
A
A , B
解:A=8CH,该程序功能:将 30H 中存储的数据乘以 10,结果装入累加器 A 中。
3.27
第四章
4.13 试编程吧以 2040H 为首地址的连续 10 个单元的内容按升序排列,存到原来
的存储区中。
; 大循环次数
;小循环次数
解:
ORG 2000H
DATAA EQU 2040H
MOV R2, #09H
SORT: MOV A, R2
MOV R3, A
MOV DPTR, # DATAA
LOOP:MOVX A,@DPTR
MOV R4, A
INC DPTR
MOVX A, @DPTR
MOV R5, A
MOV A, R4
CLR C
SUBB A, R5
JC NEXT
MOV A, R4
MOVX @DPTR, A
MOV RO, DPL
DEC R0
MOV DPL, R0
MOV A, R5
MOVX @DPTR, A
INC DPTR
NEXT: DJNZ R3, LOOP
DJNZ R2, SORT
HERE: SJMP $
4.14 试编一查表程序,已知数据块的首地址为 2100H,数据块以-1 作为结束,
现要求找出 ASCII 码 A,并将其地址存入 21A0H 和 21A1H 单元中,若未
找到,则 21A0H 和 21A1H 单元中村 FFH。
解:
ORG
SJMP
0000H
MAIN
R0, #09
MAIN: MOV
SORT: MOV A, R0
R1, A
DPTR, #2040H
A, @DPTR
R2, A
DPTR
A, @DPTR
C
A, R2
EXCHANGE
NEXT
MOV
MOV
LOOP: MOVX
MOV
INC
MOVX
CLR
SUBB
JC
SJMP
EXCHANGE: MOVX
MOV
DEC
MOVX
XCH
MOVX
INC
MOV
MOVX
DJNZ
DJNZ
END
NEXT:
A,@DPTR
R3, A
DPL ;注意!!!DEC 指令不能对 DPTR 进行操作,
;但可以对 DPH、DPL 进行操作
A, @DPTR
A, R3
@DPTR, A
DPTR
A, R3
@DPTR, A
R1, LOOP
R0, SORT
4.21 在 2030H 单元和 2031H 单元中各有一个小于 16 的数,试编程求这两个数
的平方差,用调用子程序方法实现,结果存在 2040H 单元中
解:
ORG
0000H
LJMP START
1000H
ORG
START: MOV
DPTR, #2031H
MOVX
A, @DPTR
LCALL SQURSUB
MOV
MOV
MOVX
A,@DPTR
LCALL SQURSUB
CLR
SUBB
MOV
MOVX @DPTR,A
SJMP
C
A,R0
DPTR,#2040H
R0,A
DPTR,#2030H
OVER
SQURSUB:MOV
B,A ;平方函数,参数是 A
MUL AB
RET
SJMP
END
$
OVER:
第五章
5.7 试用 74LS138 译码器一个译码电路,分别选中 4 片 2764 和 2 片 6264,且列
出各芯片所占的地址空间。
解:74LS138 的接法不唯一。给出了图示接法的地址范围答案。