1、 1 单片微型计算机与接口技术 思考题与习题解答 第 0 章 基础知识 0.1 将下列十进制数转换为十六进制数: 64, 98, 80, 100, 125, 255。 0.1 40H, 62H, 50H, 64H, 7DH, FFH 0.2 将下列十六进制无符号数转换为十进制数: 32CH, 68H, D5H, 100H, B78H, 3ADH。 O.2 812, 104, 213, 256, 2936, 941 0.3 写出下列十进制数的原码和补码,用 8 位或 16 位数填人表 1 中 (要求用十六进制数表示 )。 表 1 十进制数 原码 补码 十进制数 原码 补码 28 250 -28
2、-347 l00 928 -130 -928 0 3 十进制数 原码 补码 十进制数 原码 补码 28 1CH 1CH 250 FAH FAH -28 9CH E4H -347 815BH FEA5H 100 64H 64H 928 03AOH 03AOH -130 8082H FF7EH -928 83AOH FC60H 0.4 用十进制数写出下列补码表示的机器数的真值: 1BH, 97H, 80H, F8H, 397DH, 7AEBH,9350H, CF42H。 O.4 机器数的真值分别为: 27, 233, -128, -8, 14717, 31467, -27824, -12478 0
3、.5 用补码运算完成下列算式,并指出溢出 OV 和进位 CY: (1) 33H+5AH (2) -29H-5DH (3) 65H-3EH (4) 4CH-68H 0.5 (1) 33H+5AH=8DH, OV=1, CY=0 (2) -29H-5DH=7AH, OV=1, CY=1 (3) 65H-3EH=27H, OV=0, CY=1 (4) 4CH-68H=E4H, 0V=O, CY=O 0.6 将表 2 中的十进制数按要求转换,用十六进制数填入。 表 2 十进制数 压缩 BCD 数 非压缩 BCD 数 ASCII 码 38 255 483 764 1000 1025 2 O.6 十进制数
4、 压缩 BCD 数 非压缩 BCD 数 ASCII 码 38 38H 0308H 3338H 255 255H 020505H 323535H 483 483H 040803H 343833H 764 764H 070604H 373634H 1000 1000H 01000000H 31303030H 1025 1025H 01000205H 31303235H 0.7 写出下列 ASCII 码表示的十六进制数 (如 313035H 为 105H): 374341H, 32303030H,3841353DH。 0.7 ASCIl 码表示的十六进制数分别为: 105H, 7CAH, 200。
5、H, 8A50H 第 1 章 MCS-51单片机 1.1 什么是嵌入式系统 ?其控制核心有哪几种类型 ? 1.1 见绪论 1.2 单片微型计算机与微处理器在结构上和使用中有什么差异 ?单片机 和 DSP 在使用上有什么差别 ? 1.2 单片微型计算机是包含 CPU、存储器和 I O 接口的大规模集成芯片,即它本身包含了除外部设备以外构成微机系统的各个部分,只需接外设即可构成独立的微机应用系统。微机处理器仅为 CPU, CPU 是构不成独立的微机系统的。 DSP 是数据处理的专用芯片,单片机主要用做控制,也具有简单的数据处理能力。 1.3 51 系列单片机内部有哪些功能部件 ? 1.3 见 1
6、1 1 节 1.4 51 系列单片机有哪些品种 ?结构有什么不同 ?各适用于什么场合 ? 1.4 见绪论 1.5 51 系列单片机的存储器可划为 几个空间 ?各自的地址范围和容量是多少 ?在使用上有什么不同 ? 1.5 见表 1-5 1.6 在单片机内部 RAM 中,哪些字节有位地址,哪些没有位地址 ?特殊功能寄存器 SFR中哪些可以位寻址 ?有什么好处 ? 1.6 见表 1-1 和表 1-2 1.7 已知 PSW=10H,通用寄存器 R0 R7 的地址分别是多少 ? 1.7 当 PSw=10H,表明选中的为第二组通用寄器 RO R7 的地址为 10H 17H 1.8 程序存储器和数据存储器可
7、以有相同的地址,而单片机在对这两个存储区的数据进行操作时,不会发生错误,为什么 ? 1.8 序存储器和 数据存储器尽管地址相同,但在数据操作时,所使用的指令不同,选通信号也不同,因此不会发生错误。 1.9 填空: 堆栈设在 存储区,程序存放在 存储区, I 0 接口设置在 存储区,中断服务程序存放在 存储区。 3 1.9 内部数据 程序 外部数据 程序 1.10 若单片机使用频率为 6MHz 的晶振,那么状态周期、机器周期和指令周期分别是多少 ? 1.10 振荡周期 =0.1667us,机器周期 =2us,指令周期 =2 8us 1.11 复位时, A= , PSW= , SP= , P0 P
8、3= 1.11 A=0, PSW=0, SP=07, P0 P3=FFH 第 2 章 指令系统 2.1 MCS-51 单片机有哪几种寻址方式,适用于什么地址空间 ?用表格表示。 2.1 见 2 1 节 2.2 MCS-51 单片机的 PSW 程序状态字中无 ZERO(零 )标志位,怎样判断某内部数据存储单元的内容是否为 O? 2.2 因为累加器 A 自带零标志,因此,若判断某内部 RAM 单元的内容是否为零,必须将其内容送到 A,通过 JZ 指令即可进行判断。 2.3 设 A=0,执行下 列两条指令后, A 的内容是否相同,说明道理。 (1) MOVC A,A+DPTR (2) MOVX A,
9、DPTR 2.3 当 A=O 时,两条指令的地址虽然相同,但操作码不同, MOVC 是寻址程序存储器, MOVX是寻址外部数据存储器,送入 A 的是两个不同存储空间的内容。 2.4 指出下列各指令中操作数的寻址方式 指 令 目的操作数寻址方式 源操作数寻址方式 ADD A,40H PUSH ACC MOV B,20H ANL P1,#35H MOV R1,PSW MOVC A,A+DPTR MOVX DPTR, A 2.4 目的操作数 源操作数 寄存器 直接 SP 间接寻址 直接 直接 直接 直接 立即 寄存器问址 直接 寄存器 变址 寄存器间址 寄存器 2.5 执行下列程序段 MOV A,#
10、56H ADD A,#74H ADD A,ACC 后, CY= , OV= , A= 。 2.5 CY=1, OV=0, A=94H 2.6 在错误的指令后面括号中打。 MOV R1,#80H ( ) MOV R7,R1 ( ) 4 MOV 20H,R0 ( ) MOV R1,#0100H ( ) CPL R4 ( ) SETB R7,0 ( ) MOV 20H,21H ( ) ORL A,R5 ( ) ANL R1,#OFH ( ) XRL P1,#31H ( ) MOVX A,2000H ( ) MOV 20H,DPTR ( ) MOV A,DPTR ( ) MOV R1,R7 ( ) P
11、USH DPTR ( ) POP 30H ( ) MOVC A,R1 ( ) MOVC A,DPTR ( ) MOVX DPTR,#50H ( ) RLC B ( ) ADDC A, C ( ) MOVC R1, A ( ) 2.6 2.7 设内部 RAM 中 (59H)=50H,执行下列程序段: MOV A,59H MOV R0,A MOV A,#0 MOV R0,A MOV A,#25H MOV 51H,A MOV 52H,#70H 问 A= , (50H)= , (51H)= , (52H)= 。 2.7 A=25H, (50H)=O, (51H)=25H, (52H)=70H 2.8
12、设 SP=60H,内部 RAM 的 (30H)=24H, (31H)=10H,在下列程序段注释的括号中填执行结果。 PUSH 30H ; SP=( ), (SP)=( ) PUSH 3lH ; SP=( ), (SP)=( ) POP DPL ; SP=( ), DPL=( ) POP DPH ; SP=( ), DPH=( ) MOV A, #00H MOVX DPTR, A 最后执行结果是 ( )。 2.8 SP=(61H), (SP)=(24H) SP=(62H), (SP)=(10H) SP=(61H), DPL=(10H) SP=(60H), DPH=(24H)执行结果将 0 送外部
13、数据存储器的 2410 单元。 5 2.9 对下列程序中各条指令作出注释,并分析程序运行的最后结果。 MOV 20H,#0A4H MOV A,#017)6H MOV R0,#20H MOV R2,#57H ANL A,R2 ORL A,R0 SWAP A CPL A ORL 20H,A SJMP $ 2.9 程序运行后内部 RAM(20H)=B4H, A=90H 2.10 将下列程序译为机器码。 机器码 源程序 LA: MOV A,#01H LB: MOV P1,A RL A CJNE A, #10,LB SJMP LA 2.10 机器码 源程序 7401 LA: M()V A, #01H F
14、590 LB: M()V P1, A 23 RL A B40AFA CJNE A, #10, LB 80F6 SJMP LA 2.11 将累加器 A 的低 4 位数据送 P。口的高 4 位, P。口的低 4 位保持不变。 2.11 ANL A, #0FH SWAP A ANL P1 #OFH ORL P1, A SJMP $ 2 12 编程将 R0(R2)的内容和 R1(R3)的内容相交换。 2.12 MOV A,RO XCH A,R1 MOV R0,A SJMP $ 2 12 MOV A,R2 XCH A,R3 MOV R2,A SJMP $ 2.13 试用 3 种方法将 A 累加器中的无符
15、号数乘 4,积存放于 B 和 A 寄存器中。 2.13 (1)利用乘法指令 MOV B,#04H 6 MUL AB SJMP $ (2) 利用位移指令 RL A RL A MOV 20H。 A ANL A, #03H MOV B, A MOV A,20H ANL A, #OFCH SJMP $ (3) 用加法指令完成 ADD A, ACC MOV RO, A : RO=2A MOV A, #0 ADDC A。 #0 MOV B, A ; B 存 2A 的进位 MOV A,RO ADD A, ACC MOV R1, A ; R1=4A MOV A, B ADDC A, B ;进位 x 2 MOV
16、 B, A ;存积高位 MOV A, R1 ;存积低位 SJMP $ 2.14 编程将内部 RAM 40H 单元的中间 4 位变反,其余位不变放回原单元。 2.14 方法 1: XRL 40H, #3CH SJMP $ 方法 2: MOV A, 40H CPL A ANL A, #3CH ANL 40H, #OC3H ORL 40H, A SJMP $ 2 15 有两个 BCD 码数存放在 (20H)和 (21H)单元,完成 (21H)+(20H)=(23H)(22H)。(24H)+(25H)=(23H)(22H) 2.15 MOV A, 20H ADD A, 21H DA A MOV 22H
17、, A ;存和低字节 MOV A, #O ADDC A, #0 MOV 23H, A ;存进位 SJMP $ 7 2 15 MOV A, 24H ADD A, 25H DA A MOV 22H, A ;存和低字节 MOV A, #O ADDC A, #0 MOV 23H, A ;存进位 SJMP $ 2.16 如果 R0 的内容为 0,将 R1 置为 0,如 R0内容非 0, 置 R1 为 FFH,试进行编程。 2.16 MOV A R0 JZ ZE MOV R1 #OFFH SJMP $ ZE: MOV R1, #O SJMP $ 2.17 完成 (51H) (50H)=(53H)(52H)
18、的编程 (式中均为内部 RAM)。 2.17 MOV A, 50H MOV B, 51H MUL AB MOV 53H。 B MOV 52H, A SJMP $ 2 18 将 P1.1 和 P1.0 同时取反 10 次。 (将 P1.2 和 P1.0 同时取反 10次 ) 2.18 MOV R7,#0AH WOP: XRL P1, #03H DJNZ R7, WOP SJMP $ 2 18 MOV R7。 #0AH WOP: XRL P1, #05H DJNZ R7, WOP SJMP $ 2.19 将内部 RAM 单元 3 字节数 (22H)(21H)(20H) 2 送 (23H)(22H)
19、(21H)(20H)单元。 2.19 单片机的移位指令只对 A,且只有循环移位指令 ,为了使本单元的最高位移进下一单元的最低位,必须用大循环移位指令移位 4 次。 ORG O CLR C MOV A, 20H RLC A MOV 20H,A MOV A, 21H RLC A MOV 21H, A MOV A,22H 8 RLC A MOV 22H A MOV A, #O RLC A MOV 23H, A SLMP $ 第 3 章 程序设计 3.1 编写程序,把片外数据存储器 0000H 0050H中的内容传送到片内数据存储器 20H70H 中。 3.1 因为是多个单元操作,为方 便修改地址,使
20、用问址操作。片外地址用 DPTR 指示只能用 M()Vx 指令取数到 A,片内地址用 RO或 R1 指示,只能用 MOV 指令操作,因此,循环操作外部数据存储器一 A 一内部数据存储器。 ORG OOOOH MOV DPTR,#0000H MOV R0, #20H LOOP: MOVX A, DPTR MOV R0, A INC DPTR INC R0 CJNE R0, #71H, LOOP SJMP $ 3.2 编写程序,实现双字节加法运算,要求 RIR0+R7R6=(52H)(51H)(50H)(内部 RAM)。 3.2 要注意两高字节相加应加低字节相加时产生的进位,同时要考虑最高位的进位
21、。 ORG 0 MOV A,RO ADD A,R6 MOV 50H,A MOV A, R7 ADDC A,R1 MOV 51H, A MOV A, #0 ADDC A, #O MOV 52H, A SJMP$ 3.3 设 X 在累加器 A 中 (0 X 20),求 X2并将平方数高位存放在 R7中,低位存放在R6 中。试用查表法编出子程序。 3.3 A 中放 X(小于 14H)的数,平方表的一个数据占 2 个字节 ,可用 BCD 码或二进制数存放 (如A 中放的是 BCD 码,则要先化成二进制数再查表 )。 ORG 0 MOV DPTR, #TAB ADD A,ACC ;A*2 PUSH AC
22、C MOVC A, A+DPTR 9 MOV R7, A POP ACC INC A MOVC A, A+DPTR MOV R6, A SJMP $ TAB: DB 00, 00, 00, 01, OO, 04, OO, 09, OO, 16H, DB 04H, 00 3.4设内部 RAM的 20H和 21H单元中有两个带符号数,将其中的大数存放在 22H单元中,编出程序。 3.4 先用异或指令判两数是否同号,在同号中判大小,异号中正数为大。 ORG 0 MOV A, 20H XRL A 21H ANL A,#80H JZ CMP JB 20H.7, BG AG: MOV 22H, 20H S
23、JMP $ BG: MOV 22H, 21H SJMP $ CMP: MOV A, 20H CJNE A, 21H, GR GR: JNC AG MOV 22H, 21H SJMP $ 3.5 若单片机的晶振频率为 6MHz,求下列延时子程序的延时时间。 DELAY: MOV R1,#0F8H LOOP: MOV R3,#0FBH DJNZ R3,$ DJNZ R1,LOOP RET 3.5 fosc=6MHz, MC=2us 机器周期数 DELAY: MOV R1, #OF8H 1 LOOP: MOV R3, #0FBH 1 DJNZ R3, $ 2 DJNZ R1, LOOP 2 RET
24、2 (1+2+(1+2 251+2) 248) 2us=250.48ms 3.6 编程将内部数据存储器 20H 24H 单元压缩的 BCD 码转换成 ASCII 码存放在 25H 开始的单元内。 3.6 将待转换的数分离出高半字节并移到低 4 位加 30H;再将待转换的数分离出低半字节并加 30H,安排好源地址和转换后数的地址指针,置好循环次数。 ORG 0000H 10 MOV R7, #05H MOV RO, #20H MOV R1, #25H NET: MOV A, RO ANL A,#OFOH SWAP ADD A,#30H MOV R1, A INC R1 MOV A, RO ANL
25、 A, #OFH ADD A, #30H MOV R1, A INC R0 INC R1 DJNZ R7, NE SJMP $ END 3.7 从内部存储器 30H 单元开始,有 16 个数据,试编一个程序,把其中的正数、负数分别送 40H 和 50H 开始的存储单元,并分别将正数、负数和零的个数送 R4, R5, R6。 3.7 片内 RAM 间址寄存器只有 Ro 和 R1,而正数、负数和零共需 3 个寄存器指示地址,这时可用堆栈指针指示第 3 个地址, POP 和 PUSH 指令可自动修改地址。 RO 指正数存放地址, Rl指负数存放地址, SP 指源数据存放的末地址, POP 指令取源数据,每取一个数地址减 1。 ORG 0000H MOV R7, #10H MOV A, #0 MOV R4,A MOV R5,A MOV R6,A MOV R0, #40H MOV R1, #50H MOV SP, #2FH NEXT: POP ACC JZ ZER0 JB ACC.7, NE INC R4 MOV RO, A INC R0 AJMP DJ NE: INC R5 MOV R1, A INC R1 AJMP DJ ZER0: INC R6 DJ: DJNZ R7, NEXT