单片机课后题答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第三章习题解答
4.在8051片内RAM中,已知(30H)=38H,(38H)=40H,(40H)=48H,(48H)=90H,试分析下段程序中各条指令的作用,说出按顺序执行完指令后的结果:
MOV A.40H ;(A)=48H
MOV R1,A ;(R1)=48H
MOV P1,#0FOH ;(P1)=F0H
M0V @R1,30H ;(48H)=38H
MOV DPTR,#1234H ;(DPTR)=1234H
MOV 40H,38H ;(40H)=40H
MOV R1,30H ;(R1)= 38H
MOV 90H,R1 ;(90H)= 38H ,P1的地址为90H
MOV 48H,#30H ;(48H)= 30H
MOV A,@R1 ; (A)= 40H
MOV P2,P1 ; (P2)= 38H F0H错误
8.试编程将片外数据存储器80H单元的内容送到片内RAM的2BH单元。
MOV DPTR, #0080H 或:MOV R0, #80H
MOVX A, @DPTR MOV P2,#00H
MOV 2BH, A MOVX A, @R0
MOV 2BH, A
10.试编程将片内RAM20H单元中的两个BCD数拆开,并变成相应的ASCII码存入片内RAM 21H和22H单元。
MOV A, 20H ;20H的内容不变
ANL A,#0F0H
SWAP A ;4次移位 RR A 也可以
ADD A,#30H
MOV 21H, A
MOV A, 20H
ANL A,#0FH
ADD A,#30H
MOV 22H, A
12.试分析以下两段程序中各条指令的作用,程序执行完后转向何处?
(1) MOV P1,#0CAH ;(P1)= 11001010
MOV A,#56H ;(A)= 01010110
JB P1.2,L1
JNB ACC.3,L2 ;转向L2
L1:…
L2:…
(2)MOV A,#43H ;(A)=01000011
JBC ACC.2,L2
JBC ACC.6,L2 ;转向L2
L1:…
L2:…
18.分析下列程序执行后,(SP)的值。
MOV SP,#2FH
MOV DPTR,#2000H
MOV R7,#50H
NEXT:MOVX A,@DPTR
PUSH A
DJNZ R7,NEXT ;(SP)=2FH+50H 2F+2*50错误
19.试编写程序,查找在30~50H单元中是否有66H这个数据,若有将F0置1,否则将F0清0。
MOV R0,#30H
CLR F0 ;MOV A,#66H
L0:CJNE @R0,#66H, L1 ;SUBB A,@R0 错,因为A已发生变化,不能循环SETB F0 ;JNZ L1……
SJMP STP ;MOV A,@R0 正确
L1: INC R0 ; XRL A,#66H
CJNE R0,#51H, L0 ; JNZ L1
STP: ……
第四章习题解答
4.已知从内部RAM BLOCK单元开始存有一组无符号数,其长度存于LEN单元。试编制程序,将它们按从小到大的顺序排列之后仍存放在原存储区域内。
例4-15将给定数据块中的数据排序
设:N个数据依次存放在内部RAM LIST地址开始的存储区域中,将N个数比较大小之后,使它们按从小到大(或从大到小)的次序排列,仍存放在原存储区域中。
排序是在程序设计中经常使用的一种编程方法。排序的方法有多种,本例采用了较常用的“冒泡”排序法。
冒泡排序的基本思路是:从前向后依次将相邻两个单元中的数据进行比较,即第一个数与第二个数比较,第二个数与第三个数比较……,如两数比较的大小次序符合排序顺序,则不改变它们的存放顺序,否则交换两数位置,使其符合排序要求。
由于每次冒泡后只是从前向后排定一个大数(对于升序排列),所以在整个排序过程中,执行的内容包含两层:第一层为每一轮内的两两比较,第二层为每当一轮比较之后重新组织下一轮的比较,因此宜采用二重循环结构。源程序如下:
ORG 8000H
MOV R7,#N-1 ;置外循环计数 MOV R7,LEN
DEC R7
NEXT:MOV A,R7 ;置内循环计数
MOV R5,A
MOV R0,#LIST ;置数据指针 LIST改为BLOCK
MOV Rl,#0 ;清交换标志
COMP:MOV A,@R0 ;取数据Xi,i=o~n-1
MOV R3,A ;暂存Xi
INC R0 ;修改指针
CLR C ;清进位标志CY
SUBB A,@R0 ;Xi与Xi+1比较
JC LESS ;Xi<Xi+1,不交换
MOV A,R3 ;Xi>Xi+1,交换
XCH A,@R0
DEC R0
MOV @R0,A
INC R0 ;恢复数据指针
MOV R1,#1 ;置交换标志
LESS:DJNZ R5,COMP ;内循环未完,继续
DJNZ R7,LOOP ;外循环未完,查交换标志
SJMP STOP
LOOP:CJNE R1,#0,NEXT ;有交换;继续
STOP:END
程序中R7为外循环计数器,R5为内循环计数器,R0为数据指针,R1为交换标志,R3为暂存寄存器。
对于n个数据的排序,外循环次数需n-1次。内循环次数随着外循环执行次数按递减1规律变化,即第一次内循环次数为n-1,第二次内循环次数n-2,……,依此类推。为了提高排序速度,程序中还设置了数据交换标志R1,当两数比较发生过交换,使其置1,否则清零。在排序过程中,若两数比较没有发生过交换,说明数据顺序已排列就绪,可提前结束循环。
7.编程实现将内部RAM中以50H开始的10个字节的压缩BCD数转换成十六进制数,存放在以60H开始的单元中。
MOV R7,#10 ;循环10次
MOV R1,#60H ;结果存放地址
MOV R0,#50H
LP: MOV A,@R0
ANL A,#0F0H ;取高4位
SWAP A
MOV @R1,A