DJNZ R2,LOOP SJMP $
013、从20H单元开始存一组带符号数,数组长度存于1FH单元,要求统计出其中大于零、等于零和小于零
的数的数目,并把统计结果分别存入ONE,TWO,THREE三个单元。
014、从2000H单元开始的外部RAM中存有100个数,要求把它传送到自2500H单元开始的存贮区中去,
但在传递过程中要检查数的值,遇到第一个零就停止传送,编制完成此功能的程序。 解:程序如下:
START:MOV R7,#64H MOV R2,#00H MOV R3,#20H MOV R4,#00H MOV R5,#25H LOOP: MOV DPL,R2 MOV DPH,R3 MOVX A,@DPTR JZ STOP MOV DPL,R4 MOV DPH,R5 MOVX @DPTR,A INC R2 INC R4 DJNZ R7,LOOP STOP: SJMP STOP
015、设有一个巡回检测报警装置,需对16路输入值进行比较,当每一路输入值超过该路的报警值时,实现
报警,下面根据这一要求,编制一个查表程序,Xi为路数,查表时Xi按0、1、2、?15(n=15)取数,Yi为最大值,二字节数,依Xi顺序列成表格放在TABi中,进入查表程序前,路数Xi放在
16
解:程序如下: START:MOV R0,#20H MOV R2,#1FH CLR A MOV ONE,A MOV TWO,A MOV THREE,A LOOP: MOV A,@R0 JZ ZERO JB ACC。7,NEG INC ONE SJMP NEXT ZERO: INC TWO NEXT: INC R0 DJNZ R2,LOOP SJMP $
R2中,查表后的最大值放在R3,R4中。
解:程序如下: TB1: MOV A,R2 ADD A,R2 MOV R3,A ADD A,#TABMOVC A,@A+PC MOV R4,A SJMP $ TAB: DW 05F0H,0E89H,0A695H,1EAAH DW 0D9BH,7F93H,0373H,26D7H DW 2710,9E3FH,1A66H,22E3H DW 1174H,16EFH,33E4H,6CA0H 单元中(低位先存)
解:程序如下: START:MOV R0,#DATA MOV R2,#0AH MOV R3,#00H MOV R4,#00H LOOP: MOV A,R3 ADD A,@R0 MOV R3,A MOV A,R4 ADDC A,#00H MOV R4,A INC R0 DJNZ R2,LOOP MOV SUM,R3 MOV SUM+1,R4 SJMP $
开始存放的是以ASCII码表示的10进制数码,把它们转换为BCD码,且把两个相邻单元的数码并成一个单元(地址高的放高四位),放到从BUFF+1开始的存贮区中。 解:程序如下: START:MOV R2,BUFF MOV R0,#BUFF+1 MOV R1,#BUFF+1 LOOP: MOV A,@R0 MOV @R1,A INC R0 MOV A,@R0 SWAP A XCHD A,@R1 MOV @R1,A INC R0
17
016、从DATA单元开始,有10个8位无符号数,编写求这10个数和的程序,其和放到SUM和SUM+1
017、自内部RAM的BUFF单元开始,放有一个数据块,BUFF单元中放的是数据块的长度,从BUFF+1
INC R1
DJNZ R2,LOOP SJMP $
018、从内部RAM的BLOCK地址开始有一个无符号数据块,长度存于LEN单元,求出数据块中的最小元
素,并将其存入MINI单元。 解:程序如下: MINI DATA 20H LEN DATA 21H BLOCK DATA 22H MOV R0,#BLOCK MOV R1,LEN MOV MINI,#0FFH MOV A,R1 JZ FINI LOOP: MOV A,@R0 INC R0 CJNE A,MINI,NEXT JNC NEXT MOV MINI,A NEXT: DJNZ R1,LOOP FINI: SJMP $
019、在内部RAM的BLOCK单元开始的数据内存放着若干带符号数,数据块长度存于LEN单元。要求对
数据块内的正数和负数分别相加,相加的结果分别存入SUM1和SUM2单元。设相加的结果不超过8位二进制数。
解:程序如下: SUM1 DATA 20H SUM2 DATA 21H LEN DATA 22H BLOCK DATA 23H MOV R0,#BLOCK MOV R1,LEN MOV SUM1,#00H MOV SUM2,#00H MOV A,R1 JZ FINI LOOP: MOV A,@R0 INC R0 JB ACC。7,NEXT1 ADD A,SUM1 MOV SUM1,A SJMP NEXT2 NEXT1:ADD A,SUM2 MOV SUM2,A NEXT2:DJNZ R1,LOOP FINI: SJMP $
18
020、求内部RAM的50H-5AH中的最大值并放入5AH单元。
解:程序如下: MOV R0,#50H MOV R2,#10 MOV A,@R0 LOOP: INC R0 MOV B,@R0 CJNE A,B,$+3 JNC NEXT MOV A,@R0 NEXT: DJNZ R2,LOOP MOV @R0,A SJMP $
四、问答题
001、MCS-51引脚中有多少IO线?它们和单片机对外的地址总线和数据有什么关系? 地址总线和数据总线各是几位?
答:MCS-51芯片的引脚中有32条IO线,因为有4个8位并行口共32条,51系列单片机没有独立的
数据总线和地址总线,而是和一部分IO线复用。具体来说,P0口的8条线从那时起用作地址总线低8位和8位数据总线,而P2口8位线用作地址总线高位。所以是16位地址总线和8位数据总线。
002、什么叫堆栈?堆栈指示器SP的作用是什么?8051单片机堆栈的容量不能超过多少字节?
答:堆栈是数据存贮器的一部分,这一部分数据的存取是按照先入后出,后入先出的原则进行的。堆栈指针
SP在启用堆栈之前是用来决定堆栈的位置。如在8051芯片复位后,SP的值为07H,则RAM的其它部分。在堆栈启用之后,SP指向堆栈的顶部,好由SP来决定数据读出和存入堆栈的地十。8051单片机内部用作数据区的RAM的容量为128字节,前8个字节要用来作为工作寄存器R0-R7。堆栈可以从08H开邕设直到7FH,共120个节。但这只是最大可能的容量。一般情况下,内部RAM还要分出一部分用作一般的数据区,或者还要用其中的位寻址区来用于位操作,等等。所以8051的堆栈区是比较小的,使用时要注意到这个限制。
003、8051单片机的内部数据存贮器可以分为几个不同区域?各有什么特点?
答:8051单片机的内部数据存贮器的容量为256字节(地址为00H-FFH)。它可以分为两大部分,各占128
个字节。前128字节为读写数据区,地址为00H-7FH。后128个字节为特殊功能寄存器区,21个特殊功能寄存 分散地分布在这人区域,各有自己特定的地址。而这个区域中,没有被特殊功能寄存器占用的单元也不能当作一般的RAM单元使用。
00H-7FH的RAM单元,都可按它们的直接地址来读写数据。而其中的前32个单元。即00H-1FH单元又称为工作寄存器区,安排了4组工作寄存器,每组8个,都用R0-R7表示,并通过PSW寄存器中RS1和RS0来选组。通过工作寄存器R0---R7来对这部分数据单元读写数据不仅速度快而且指令字节数也少。另一个区域为位寻制区。占用20H-2FH共16个单元,这16个单元的每一位都可以独立进行操作,共用128个可单独操作的位。而30H-7FH这80个单元只能接它们的直接地址来操作。
19
004、MCS-51单片机的寻址范围是多少?8051单片机可以配置的存贮器最大容量是多少?而用户可以使用
的最大容量又是多少?
答:MCS-51单片机的指令存贮器寻址范围为64KB,数据存贮器也有64KB寻址范围,地址都是从0000H
-FFFFH,总共有2*64KB的寻址范围。8051可以配置的外部存贮器就是2*64KB容量。但8051片内还配有存贮器,包括4KB容量的只读存贮器和256字节的数据存贮器,总共容量为132,25KB。但用户可以使用的容量只有2*64KB再加上256字节的数据存贮器。
005、8051单片机对外有几条专用控制线?其功能是什么?
答:一般的说法是8051单片机有4条专用控制线。它们是复位信号线RST,高电位有效,当有复位信号
从此线输入时,使单片机复位。访问外部存贮器控制信号EA,低电平有效,当此控制线为低电平时,单片机全部使用外部指令存贮器,而当此控制线为高电平时,先使用片内的4KB指令存贮器(0000H-0FFFH),在4KB范围之外,才使用外部指令存贮器(地址为1000H-FFFFH)。另有两条输出控制线,外部程序存贮器的读选通信号PSEN和外部地址锁存器允许信号ALE。前者是低电平有效,在读外部程序存贮器时使用。后者是高电平有效,在锁存P0口输出的低8位地址时使用。
006、什么叫指令周期?什么叫机器周期?MCS-51的一个机器周期包括多少时钟周期?
答:完成一条指令的执行所需的时间叫做指令周期。对不同的指令,指令周期的长短是不一定相同的。机器
周期则是指计算机完成某种基本操作所需的时间,一个指令周期由一个或几个机器周期组成,一个机器周期则包括若干个时钟周期。MCS-51单片机的一个机器周期包括12个时钟周期。但对有些微处理器来说,不同的机器周期所包含的时钟周期可能是不相同的。
007、为什么要了解CPU的时序?
答:了解CPU时序就是了解在执行不同类型指令时CPU发出的控制信号有什么不同。了解CPU的时序至
少有两个目的,其一是掌握不同的指令或操作使用不同的控制信号后,便于CPU对外部设备的连接而不致于发生错误。其二是知道不同指令需要不同的机器周期后,可以选用功能相同而机器周期较少的指令,以减少程序的执行时间。当然,也可以有一些其它的作
008、在读外部程序存贮器时,P0口上一个指令周期中出现的数据序列是什么?在读外部数据存贮器时,P0
口上出现的数据序列是什么?
答:读外部程序存贮器(ROM)时,有两种情况,一种是单纯地取指令,这时P0口上先送出指令所在地
址低8位,然后从ROM中取回指令码。按照指令字节数的不同,这人数据序列可能重复若干次。另一种情况,则是执行从外部ROM中读取固有数据的指令,这时,P0口上先送出指令地址低8位,再从ROM中取回指令码,然后开始执行指令,接着从P0口上送出ROM数据单元地址低8位,再读回ROM中的数据。而在读外部数据存贮器(RAM)时,P0口上先送出指令地址低8位,然后读回指令码,再送出数据存贮单元地址低8位,再读回数据单元的内容
009、为什么外扩存贮器时,P0口要外接地址锁存器,而P2口却不接?
答:这是因为在读写外部存贮器时,P0口上先送的低8位地址只维持很短的时间,然后P0口就要当作数据总线用。为了使对外在整个读写外部存贮器期间,都存在有效的低8位地址信号,P0口就要外接一个地址锁存器,再从这个锁存器对外送同低8位地址。而P2口只用作高8位地址线,并在整个读
20