单片机原理与应用课后习题参考题答案1~6章 下载本文

- - .. --

执行RET时,PCH←(SP),SP←SP-1,PCL←(SP),SP←SP-1

3-16 若(sp)=25H,(PC)=2345H,标号LABEL所在的地址为3456H,问执行调用指令“LCALL LABEL”后,堆栈指针和堆栈内容发生什么变化?(PC)的值等于什么?

答:最后堆栈指针SP=27H。堆栈指针SP=26H处SP内容为45H,指针SP=27H处内容为23H。最后程序计数器指针PC=3456H。

执行LCALL后,PC←PC+3,SP←SP+1,(SP) ←PCL,SP←SP+1,(SP)←PCH,PC←addr16。

3-17 试编写程序,查找在内部RAM的20H~50H单元中是否有0AAH这一数据。若有,则将51H单元置01H,若未找到,则将51H单元置00H。

MOV 51H,#00H MOV R0,#20H CJNE A,#0AAH,NEXT INC 51H

SJMP EEE CJNE R0,#51H,LOOP

;先设没找到 ;起始地址 ;取出数字 ;不相等就跳转 ;相等将51单元置1 ;找到转去结束 ;下一个地址 ;地址没找完就继续 ;暂停

LOOP: MOV A,@R0

NEXT: INC R0 EEE: SJMP $

3-18 试编写程序,统计在外部RAM 2000H~205FH单元中出现00H的次数,并将统计结果丰收入内部RAM 50H单元。

MOV R0,#00H MOV DPTR,#2000H MOV R1,#60H JNZ NEXT INC R0

;RO设为计数器,初始为0 ;置片外RAM起始地址 ;置传送数据个数 ;外部RAM单元内容送A ;传送数据不为0 跳转 ;传送数据为0,计数器加1 ;下一个地址 ;地址没找完就继续 ;统计结果存入50H单元 ;暂停

LOOP: MOVX A,@DPTR

NEXT: INC DPTR

DJNZ R1,LOOP MOV 50H,R0 SJMP $

3-19 已知R3和R4中存有一个16位的二进制数,高位在R3中代位在R4中。请编程将其求补,并存回原处。

答:首先假设R3、R4中是原码,根据原码求补的方法当最高位(R3的D7

word 可编辑.

- - .. --

位)为0时表示为正数,那么补码与原码相同,当最高位为1时,表明是负数,负数的补码是最高位不变,其余位取反加1.

MOV A,R3 JB ACC.7,NEG SJMP $ CPL A CLR C ADD A,#01H

MOV R4,A MOV A,R3 CPL A ADDC A,#00H SETB ACC.7 MOV R3,A SJMP $

NEG: MOV A,R4

3-20 编写一个程序,把片外RAM从2000H开始存放的10个数传送到片内RAM 30H开始单元。

START: MOV R0,#30H

MOV R1,#10H MOV DPTR,#2000H MOV @R0,A

INC R0 INC DPTR DJNZ R1,LOOP SJMP $

LOOP: MOVX A,@DPTR

3-21 试编程将内部RAM的30H至4FH单元的内容分别传送到外部RAM的2040H~205FH单元。

START: MOV R0,#30H

MOV R1,#20H MOV DPTR,#2040H MOVX @DPTR,A

INC DPTR INC R0 DJNZ R1,LOOP SJMP $

LOOP: MOV A,@R0

3-22 若外部RAM的(2000H)=X,(2001H)=Y,编程实现Z=3X+2Y,结果存入内部RAM的20H单元,设Z<=255。

START: MOV DPTR,#2000H

MOVX A,@DPTR MOV B,#03H MUL AB MOV R0,A

INC DPTR MOVX A,@DPTR ADD A,A ADD A,R0 MOV 20H,A

3-23 试对内部RAM 20H单元的内容进行判断,若为正数,转向2100H若为负数,转向2200H;若为0,转向2300H。

START: MOV A,20H

JB ACC.7,NEG

;为负数

word 可编辑.

- - .. --

JNB ACC.7, POSI LJMP #2100H SJMP EEE SJMP EEE SJMP EEE

;为0

NEG: LJMP #2200H POSI: LJMP #2300H EEE: SJMP $

3-24 已知30H、31H中存有一个16位二进制数,高位在前低位在后。试编程将它们乘2,再存回原单位中。

START: MOV A,31H

ADD A,31H MOV 31H,A MOV A,30H

ADDC A,30H MOV 30H,A SJMP $

3-25 已知从外部RAM 2000H开始的单元中有20个带符号的补码数,试编程把正数和0取出来存放到内部RAM20H开始的存储单元中(负数为作处理)。

START: MOV R0,#20H

MOV DPTR,#2000H MOV R1,#20H JB ACC.7,NEG MOV @R1,A INC R1 DJNZ R0,LOOP SJMP $

;需处理的数的个数 ;需处理数的起始地址 ;用于存储的目标地址 ;负数不需处理

LOOP: MOVX A,@DPTR

NEG: INC DPTR

第四章 汇编语言程序设计

4-1 什么叫伪指令?伪指令与指令有什么区别?

答:伪指令不属于单片机指令集中的指令,在汇编时不产生目标代码,不影响程序的执行,仅指明在汇编时执行一些特定的操作。如为程序指定一个存储区、将一些数据、表格常数存放在指定的存储单元、对地址赋用户名等。

指令是计算机所能执行的一种基本操作的描述,是计算机软件的基本单元。51单片机单片机的指令有二种表达方式:机器码指令和汇编语言指令。

word 可编辑.

- - .. --

4-2 循环程序由哪几部分组成?

答:由初始化部分、循环处理部分、循环控制部分、循环结束部分这四部分组成。

4-3 什么是子程序?对于子程序设计有什么要求?

答:一段具有某一特定功能,能被其它程序所调用,调用结束后能自动返回到调用处的程序块就称为子程序。

对子程序设计的要求:

4-4 试对下列程序进行人工汇编,并说明此程序的功能。

地址 ; ;1000H ;1002H ;1004H ;1006H ;1007H ;1008H ;1009H ;100AH ;100BH ;100CH ;100EH ;

78 79 7A C3 E4 E6 37 18 19 DA 80

FA FE 25 2b 06

指令码

ORG 1000H MOV R1,#2BH MOV R2,#06H CLR C CLR A

ACDL: MOV R0,#25H

LOOP: MOV A,@R0

ADDC A,@R1 DEC R0 DEC R1 SJMP $ END

DJNZ R2,LOOP

1008H-100EH=-06H,其补码为(11111010)2→0FAH

功能:将25H单及前5个数与2BH单元及前5个数分6组相加,结果丢弃。 4-5 从内部RAM的20H单元开始,有15个数据。试编一程序,把其中的正数、负数分别送到41H和61H开始的存储单元,并分别将正数、负数的个数送40H单元和60H单元。

MOV R0,#41H MOV R1,#61H MOV SP,#2EH MOV R3,#00H MOV R4,#00H MOV R7,#15

;存放正数的起始地址 ;存放负数的起始地址 ;指明栈顶地址 ;正数个数 ;负数个数 ;需判断数的个数 ;出栈放入A

LOOP: POP ACC

word 可编辑.