单片机课后重要习题答案.docx

上传人:b****5 文档编号:6142974 上传时间:2023-01-04 格式:DOCX 页数:12 大小:248.02KB
下载 相关 举报
单片机课后重要习题答案.docx_第1页
第1页 / 共12页
单片机课后重要习题答案.docx_第2页
第2页 / 共12页
单片机课后重要习题答案.docx_第3页
第3页 / 共12页
单片机课后重要习题答案.docx_第4页
第4页 / 共12页
单片机课后重要习题答案.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

单片机课后重要习题答案.docx

《单片机课后重要习题答案.docx》由会员分享,可在线阅读,更多相关《单片机课后重要习题答案.docx(12页珍藏版)》请在冰豆网上搜索。

单片机课后重要习题答案.docx

单片机课后重要习题答案

3.168051芯片需要外扩4KB程序存储器,要求地址范围为1000~1FFFH,以便和内部程序存储器地址相衔接。

所用芯片除了地址线和数据线外,只有一个片选控制端/CS,画出扩展系统的连接图。

解:

3.17在图3.13中,若因某种原因,P2.2、P2.1、P2.0误接为P2.5、P2.4、P2.3,这时所接的EPROM寻址区是如何分布的?

解:

误接后,A10,A9,A8则分别与P2.5,P2.4,P2.3相接,

P2.7P2.6P2.5P2.4P2.3P2.2P2.1P2.0P0.7~P0.0

**000***00000000—11111111

**001***00000000—11111111

**010***00000000—11111111

**011***00000000—11111111

**100***00000000—11111111

**101***00000000—11111111

**110***00000000—11111111

**111***00000000—11111111

所以地址分布为:

0000H~00FFH,0800H~08FFH,1000H~10FFH,1800H~18FFH,2000H~20FFH,

2800H~28FFH,3000H~30FFH,3800H~38FFH

 

4.8编写程序,进行两个16位数的减法:

6F5DH~13B4H,结果存至内部RAM的30H和31H单元。

30H单元存差的低8位。

解:

MOVA,#5DH

CLRC

SUBBA,#0B4H

MOV30H,A

MOVA,#6FH

SUBBA,#13H

MOV31H,A

SJMP$

4.9编写程序,若累加器内容分别满足一下条件,则程序转至LABEL存储单元。

(1)A≥10

(2)A>10(3)A≤10(4)A<10

解:

(1)CLRC

CJNEA,#10,LOOP

SJMPLABEL

LOOP:

JNCLABEL

SJMP$

(2)CJNEA,#10,LOOP

SJMP$

LOOP:

JNCLABEL

SJMP$

(3)CJNEA,#10,LOOP

SJMPLABEL

LOOP:

JCLABEL

SJMP$

(4)CJNEA,#10,LOOP

SJMP$

LOOP:

JCLABEL

SJMP$

4.10已知SP=25H,PC=2345H,(24H)=12H,(25H)=34H,(26H)=56H,问在这种条件下执行RET指令以后,SP,PC分别是多少?

解:

在执行RET指令后说明是一个子函数执行结束,则进行POP操作,于是SP在执行RET指令后变为23H,因为(25H)=34H,(24H)=12H,所以PC=3412H,因为在进入堆栈的时候是先压入低8位,然后进入堆栈的是高8位,出堆栈的时候正好相反。

所以最后结果是:

SP=23H,PC=3412H

4.11若SP=25H,PC=2345H,标号LABEL所在的地址为3456H,问执行长调用指令LCALLLABEL之后,堆栈指针和堆栈内容发生什么变化?

PC是多少?

解:

在进行长调用指令LCALLLABEL,则要进行堆栈保护,而LCALL指令是三字节的指令,所以PC在进入堆栈之前变为2348H,在执行完长指令LCALL之后,PC进入子函数程序,则进入之前的地址要首先保护起来,所以SP=27H,堆栈的内容(26H)=48H,(27H)=23H,此时PC将要指向子函数LABEL的入口地址,即PC=3456H。

4.12在4.11中的LCALL指令能否直接换成“ACALLLABEL”指令?

为什么?

解:

不能,因为ACALL是短调用指令,子程序调用的范围为围绕调用指令的2KB内,即它们的地址高5位应该是相同的。

或者说,在执行ACALL指令时,子程序入口地址的高5位是不能任意定的,只能由ACALL指令所在的位置来确定,例如4.11在调用子函数之前的地址为2345H,即高5位是00100,所以ACALL调用的地址范围为:

2000H——27FFH,而LABEL所在的地址为3456H已经超出调用范围,所以不能替换。

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

解:

参考程序如下:

M0VR0,#31H

M0VR1,#20H

LOOP:

MOVA,@R1

CLRC

CJNEA,#0AAH,LOOP1

SJMPL00P2

LOOP1:

INCR1

DJNZR0,LOOP

M0VA,#00H

SJMPLOOP3

LOOP2:

MOVA,#01H

LOOP3:

MOV51H,A

SJMP$

4.14试编写程序,查找在内部RAM的20H~50H单元内部出现00H的次数,并将查找的结果存入51H单元。

解:

参考程序如下:

MOVR0,#31H

MOVR1,#20H

MOVR2,#00H

LOOP:

MOVA,@R1

CJNEA,#00H,LOOP1

INCR2

LOOP1:

INCR1

DJNZR0,LOOP

M0V51H,R2

SJMP$

 

5.6从20H单元开始存放一组带符号数,其数目已经存在1FH单元。

要求统计出其中大于0,等于0和小于0的数的个数,并把统计结果分别存入ONE,TWO,THREE三个单元。

解:

参考程序如下:

ONEDATA#1CH

TWODATA#1DH

THREEDATA#1EH

MOVONE,#00H

MOVTWO,#00H

MOVTHREE,#00H

MOVR0,#20H

MOVR1,1FH

MOVA,R1/*判断是否存有数*/

JZFINISHI

LOOP:

MOVA,@R0

CLRC

CJNEA,#00H,LOOP1

INCTWO

SJMPLOOP3

LOOP1:

JNCLOOP2/*A>0时*/

INCTHREE/*A<0时*/

SJMPLOOP3

LOOP2:

INCONE

LOOP3:

DJNZR1,LOOP

FINISHI:

SJMP$

5.14外部数据RAM从2000H开始有100个数据,现要将它们移到从2030H开始的区域,试编写有关程序。

解:

参考程序如下

(1):

MOVDPTR,#2000H

MOVA,#63H

MOVR0,#100

ADDA,DPL

MOVDPL,A

LOOP:

MOVXA,@DPTR/*取出最后一个数*/

PUSHDPL

PUSHA

MOVA,DPL

ADDA,#30H

MOVDPL,A

POPA

MOVX@DPTR,A

POPDPL

DECDPL

DJNZR0,LOOP

SJMP$

参考程序如下

(2):

MOVR0,#100

MOVDPTR,#2063H

LOOP:

MOVXA,@DPTR

MOVR1,A

MOVA,DPL

ADDA,#30H

MOVDPL,A

MOVA,R1

MOVX@DPTR,A

MOVA,DPL

SUBBA,#30H

MOVDPL,A

DECDPL

DJNZR0,LOOP

SJMP$

5.15从内部数据RAM的BLOCK开始有一个无符号数数据块,长度存于LEN单元,求出数据块中的最小元素,并将其存入MINI单元。

要求使用比较条件转移指令CJNE。

解:

参考程序如下:

LENDATA20H

MINIDATA21H

BLOCKDATA22H

MOVR0,LEN

MOVR1,#BLOCK

MOVA,R0/*检查数据长度是否0*/

JZFINISH

MOVMINI,@R1

LOOP:

MOVA,@R1

INCR1

CLRC

CJNEA,MINI,LOOP1

SJMPLOOP2

LOOP1:

JNC,LOOP2

MOVMINI,A

LOOP2:

DJNZR0,LOOP

FINISH:

SJMP$

5.20若累加器A中存放的是一个十六进制数,则将它转换为相应的ASCII码,并将结果存入20HRAM单元,若A中存放的不是十六进制数,则将20H单元置为FFH,试编写有关程序。

解:

参考程序入下:

MOVR1,A

ANLA,#0F0H

CJNEA,#00H,REL

Clrc

CJNEA,#09H,LOOP

SJMPLOOP1(=9)

LOOP:

JCLO0P1(<9)

ADDA,#07H(>9)

LOOP1:

ADDA,#30H

MOV20H,A

SJMP$

REL:

MOV20H,#0FFH

SJMP$

7.1用8031单片机的P1口和微型打印机连接以输出数据。

数据传送采用中断方式。

现要把外部数据RAM中从20H单元开始的100个数据送到打印机中去打印。

试写出有关的程序,包括主程序和中断服务程序。

解:

本题采用中断方式,用ACK加到INTO作为中断请求信号,用一个4输入译码器进行部分地址译码,系统的硬件连接图如下图所示:

主程序:

SETBEA

SETBEX0

SETBPX0

SETBIT0

MOVRO,#20H

MOVR1,#0F0H

MOVR2,#99

MOVXA,@R0

MOVX@R1,A

LOOP:

SJMP$

中断服务程序:

ORG0003H

LJMPINT0

INT0:

PUSHPSW

PUSHACC

INCR0

MOVXA,@R0

MOVX@R1,A

DECR2

MOVA,R2

JNZNEXT

CLREXO

NEXT:

POPACC

POPPSW

RETI

7.3用8255芯片扩展单片机的I/0口。

8255的A口用做输入,A口的每一位接一个开关,用B口作为输出,输出的每一位接一个显示发光二极管。

现要求某个开关接1时,相应位上的发光二极管就亮(输出为0),试编写相应的程序。

解:

设8255的A口地址为70H,B口地址为71H,C口地址为72H,控制寄存器地址为73H。

8255的工作方式为:

A口:

方式0,输入

B口:

方式0,输出

C口:

无关

由此可以确定8255的工作方式控制字为10010000H,即90H。

有关程序如下:

MOVRO,#73H

MOVA,#90H

MOVX@R0,A

LOOP:

MOVRO,#70H

MOVXA,@R0

CPLA

INCRO

MOVX@R0,A

SJMPLOOP

7.8外部RAM以DAT1开始的数据区中有100个数,现要求每隔150ms向内部RAM以DAT2开始的数据区中传送10个数。

通过10次传送把数据全部传送完。

以定时器1作为定时,8155作为接口芯片。

试编写有关的程序。

单片机时钟频率为6MHz。

解:

现要求定时值为150ms,在单片机时钟频率为6MHz的情况,这个值已超过定时器可能提供的最大定时值。

为了能够实现150ms的定时值,可采用定时器定时和软件计数器相结合的方法。

本题可设定时器的定时值为50ms,另设一个软件计数器,初值为3。

每50ms定时时间到时,产生中断,在中断服务程序中使软件计数器减1,这样到软件计数器减到0时,就获得了150ms的定时。

先计算50ms定时所需的定时初始值。

这时需采用定时器方式1,即16位计数器方式。

故定时器初值为:

X=216-(50*10-3/(2*10-6)=65536-25000=40536=95E8H

本题采用定时器1定时,工作方式为1,TH1初值为9EH,TL1初值为58H。

中断服务程序入口为001BH。

相关程序如下:

ORG001BH

LJMPBRT1

START:

ORG2000H

MOVTMOD,#01H

MOVTH1,#9EH

MOVTL1,#58H

MOVIE,#88H

SETBTR1

MOVDPTR,#DAT1

MOVRO,#DAT2

MOVR1,#10

MOVR2,#10

MOVR3,#3

LOOP:

SJMP$

中断服务程序:

BRT1:

MOVTH1,#9EH

MOVTL1,#58H

DJNZR3,NEXT2

NEXT1:

MOVXA,@DPTR

MOV@RO,A

INCDPTR

INCR0

DJNZR2,NEXT1

MOVR3,#3

DJNZR1,NEXT2

CLRTR1

NEXT2:

RETI

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1