1、《单片机原理及应用》习题答案 第一章 计算机基础知识 1-1 微型计算机主要由哪几部分组成?各部分有何功能? 答:一台微型计算机由中央处理单元(CPU)、存储器、I/O接口及I/O设备等组成,相互之间通过三组总线(Bus):即地址总线AB、数据总线DB和控制总线CB来连接。 CPU由运算器和控制器组成,运算器能够完成各种算术运算和逻辑运算操作,控制器用于控制计算机进行各种操作。 存储器是计算机系统中的“记忆”装置,其功能是存放程序和数据。按其功能可分为RAM和ROM。 输入/输出(I/O)接口是CPU与外部设备进行信息交换的部件。 总线是将CPU、存储器和I/O接口等相对独立的
2、功能部件连接起来,并传送信息的公共通道。 1-3 什么叫单片机?其主要由哪几部分组成? 答:单片机(Single Chip Microcomputer)是指把CPU、RAM、ROM、定时器/计数器以及I/O接口电路等主要部件集成在一块半导体芯片上的微型计算机。 1-4 在各种系列的单片机中,片内ROM的配置有几种形式?用户应根据什么原则来选用? 答:单片机片内ROM的配置状态可分四种: (1)片内掩膜(Mask)ROM型单片机(如8051),适合于定型大批量应用产品的生产; (2)片内EPROM型单片机(如8751),适合于研制产品样机; (3)片内无ROM型单片机(如8031)
3、需外接EPROM,单片机扩展灵活,适用于研制新产品; (4)EEPROM(或Flash ROM)型单片机(如89C51),内部程序存储器电可擦除,使用更方便。 1-5 写出下列各数的另两种数制的表达形式(二、十、十六进制) 1100010 1001110 01000111 10 01001001 111111 01101100 11101 101 11010111 98 20039 585 16236 29 1495 62H 4E47H 249H 3F6CH 1D 5D7 1-6 写出下列各数的BCD参与: 59:01011001,1996
4、0001100110010110,4859.2:0100100001011001.0010 389.41:001110001001.01000001 第二章 MCS-51单片机的硬件结构 2-1 8052单片机片内包含哪些主要逻辑功能部件? 答:8052单片机片内包括: ①8位中央处理器CPU一个 ②片内振荡器及时钟电路 ③256B数据存储器RAM。 ④8KB片内程序存储空间ROM ⑤21个特殊功能寄存器SFR ⑥4个8位并行I/O端口(32条线) ⑦1个可编程全双工串行口 ⑧可寻址64KB的外部程序存储空间和外部数据存储空间 ⑨3个16位的定时器/计数器 ⑩6
5、个中断源、2个优先级嵌套中断结构 2-2 8052的存储器分哪几个空间?如何区别不同空间的寻址? 答:⑴8052的存储器分为6个编址空间: ①片内ROM的容量为8KB,其地址为0000H~1FFFH; ②可扩展片外ROM的容量为64KB,其地址为0000H~FFFFH; 片内RAM的容量为256B,其地址为00H~FFH分为二块:③地址00H~7FH共128B为片内RAM低区,④另128B为片内RAM高区,其地址空间为80H`FFH,其地址空间与SFR功能寄存器地址重叠; ⑤可扩展片外RAM的容量为64KB,其地址为0000H~1FFFH; ⑥特殊功能寄存器SFR的空间为128
6、B,其地址为80H~FFH,但实际只定义了26B单元,这26B单元分散在80H`F0H。 ⑵程序存储器和数据存储器在逻辑上是完全分开的。 CPU通过指令MOVC访问程序存储器。当8052第31脚接高电平时, CPU将从片内程序存储器0000H单元开始执行,当PC值超出片内程序存储空间,即大于1FFFH时,会自动转向片外程序存储空间。当接低电平时,CPU将从片外程序存储器ROM的0000H单元开始执行。 CPU通过MOV指令访问片内数据存储空间RAM,低区128B地址空间00H~7FH中地址为00H~1FH这32个单元分为4个工作寄存器组,分别用R0~R7表示,通过工作寄存器指令进行访问。
7、片内RAM中的20H~2FH单元除可作为一般字节寻址单元使用外,这16个单元共128位中的每一位又可单独作为软件触发器使用,具有位寻址功能,其位地址范围为00H`7FH;对片内高区128B寻址只能用寄存器间接寻址,而对特殊功能寄存器建起必须使用直接寻址。 CPU通过指令MOVX访问片外数据存储器。 2-3 DPTR的作用是什么?它由哪几个寄存器组成? 答:相对于地址指针,DPTR被称为数据指针,但实际上DPTR中存放的是一个16位的地址,作为访问程序存储器和外部数据存储器的地址指针。当对64KB外部数据存储器空间寻址时,作为间址寄存器使用,而在访问程序存储器时,作为基址寄存器使用。DPT
8、R是一个16位的特殊功能寄存器,由两个8位寄存器DPH、DPL组成,使用SFR中的82H和83H单元。 2-4 简述布尔处理存储器的空间分配。 答:在单片机中位处理又称布尔处理,允许按位处理的存储器称为布尔处理存储器。其地址空间由二部分构成:一部分是片内RAM中字节地址为20H~2FH的16字节的128个位,这些位编址为00H`7FH;另一部分在特殊寄存器中,其地址码能被8整除的12个特殊功能寄存器可以按位寻址,但其中4个未定义,一共有92位可按位寻址。这二部分结合起来形成一个具有220位的位寻址空间。 2-5 8052单片机设置4组工作寄存器,如何选择确定和改变当前工作寄存器? 答:
9、8052片内数据存储器的00H~1FH这32个单元分为4级作为4个工作寄存器第0组地址00H`07H,第一组08H~0FH,第二组10H~17H,第3组18H~1FH。每个工作寄存器都有8个单元,分别用R0~R7表示。4组寄存器中每一组都可能被选为CPU的工作寄存器,这是通过程序状态字PSW的PSW.3(RS0)和PSW.4(RS1)两位的状态来选择决定的。见下表: PSW.4(RS1) PSW.3(RS0) 当前使用的工作寄存器组R0`R7 0 0 0组(00H`07H) 0 1 1组(08H`0FH) 1 0 2组(10H`17H) 1 1 3组(18H`1F
10、H) 通过程序改变RS1和RS0的状态,就可方便地更换工作寄存器组。 2-6 程序状态字寄存器PSW的作用是什么?常用的状态标志位有哪些位?作用分别是什么? 答:PSW是一个8位的特殊功能寄存器,由一些标志位组成,用于存放程序运行中的各种状态信息。它可以进行位寻址。各位的作用如下: Cy:进位标志位。在进行加(或减)法运算时,若操作结果的最高位(D7位)有进位(或借位)时,Cy由硬件置1,否则Cy清0。在进行位操作时,Cy又是位累加器,指令助记符用C表示。 AC:辅助进位标志位。在进行加(或减)运算时,若操作结果的低半字节(D3位)向高半字节产生进位(或借位)时,AC位将由硬件自动置
11、1,否则AC位清0。 F0:用户标志位。用户根据需要对F0置位或复位,作为软件标志。 RS1和RS0:工作寄存器组选择控制位。由用户用软件改变RS1和RS0的状态,以选择内RAM中的哪组工作寄存器为当前工作寄存器组。 OV:溢出标志位。当进行补码运算时,运算结果超出-128~+127范围时,产生溢出,则OV自动置1,否则OV清0。 PSW.1:保留位。8051中未定义。 P:奇偶校验标志位。每条指令执行完后,该位始终跟踪累加器A中1的数目的奇偶性。如果A中有奇数个1,则P=1;否则P=0。 2-7 8052单片机的引脚有何功能?在使用8032时,引脚就如何处理? 答:8052单片
12、机的31脚为, 为访问外部或内部程序存储器控制信号。当引脚接高电平且PC值小于1FFFH时,CPU访问内部程序存储器读取指令,当引脚接低电平时,CPU只访问外部等量齐观存储器读取指令。 在8032芯片中没有内部程序存储器,因此,8032芯片的31脚只能接地。 2-8 8052内部RAM中低128 B单元划分为哪几个主要部分?各部分主要功能是什么? 答:8052内部数据存储器RAM中低128B单元地址空间00H~7FH被划分为三个部分。第一部分地址为00H~1FH这32个单元分为4个工作寄存器组,分别用R0~R7表示,通过工作寄存器指令进行访问。片内RAM中的第二部分20H~2FH单元除可
13、作为一般字节寻址单元使用外,这16个单元共128位中的每一位又可单独作为软件触发器使用,具有位寻址功能,其位地址范围为00H`7FH;第三部分地址30H~7FH,这部分存储区域可作为8位数据缓冲区使用,一般地,用户把堆栈就设置在这部分区域。 2-9 8052内部RAM中高128B单元与特殊功能寄存器区地址空间重叠,使用中是如何区分这两个空间的? 答:对8052片内高区(80H`0FFH)128B只能 采用寄存器间接寻址,而对特殊功能寄存器SFR建起必须采用直接寻址。 2-10 什么叫堆栈?堆栈指针SP的作用是什么? 答:堆栈是按照“先进后出,后进先出”的原则来存取数据的一个内部RAM区
14、域,这个存储器区域的一端是固定的(栈底),另一端是活动的(栈顶),每个存储单元是不能按字节任意访问的。 堆栈指针SP始终指向栈顶单元,栈顶随着数据入栈和出栈上下浮动。 2-12 什么是时钟周期、机器周期和指令周期? 答:(1)时钟周期(又称为振荡周期)是指振荡器产生一个振荡脉冲信号所用的时间,是振荡频率的倒数,称为拍节。 (2)机器周期是指CPU完成某一个规定操作所需的时间,8051单片机的一个机器周期包含6个状态,并依次表示为S1~S6,每个状态分为2个节拍。因此一个机器周期包含12个时钟周期(振荡周期),依次表示为:S1P1、S1P2、S2P1、…、S6P1、S6P2。 (3)指
15、令周期是指CPU执行一条指令所需要的时间称为指令周期。MCS-51单片机指令周期根据指令的不同,可包含有1或2或4个机器周期。 第三章 MCS-51单片机指令系统 3-1 指出下列每一条指令的寻址方式及其完成的操作。 MOV 2FH,#40H ;立即寻址,将40H移入片内2FH单元 MOV A,2FH ;直接寻址,将片内2FH单元的数移入累加器A MOV R1,#2FH ;立即寻址,将2FH移入当前寄存器组的R1单元 MOV A,@R1 ;寄存器间接寻址,将寄存器R1中所存地址中的值移入累加器A MOV 2FH,A ;隐含寻址,将累加器A中的值移入片内2FH单元 3-2 内部
16、RAM的4FH单元,可用哪几种寻址方式?分别举例说明。 答:直接寻址: MOV R1,4FH 间接寻址: MOV R1,#4FH 寄存器间接寻址: MOV A,@R1 3-3 指出下列各条指令中,45H代表什么? MOV A,#45H ;数值 MOV A,45H ;源地址 MOV 45H,46H ;目标地址 MOV 45H,#45H ;目标地址和数值 MOV C,45H ;源地址 3-4 已知:(A)=7AH,(R0)=30H,(30H)=0A5H,(PSW)=80H,请写出下列各条指令的执行结果: 答:PSW的各位为11110000,即Cy=1,AC=1,F0=1,RS
17、1=1,RS0=0,OV=0,P=0 (1)SUBB A,30H 结果:(A)=D4H,CY=1,AC=0,OV=1,P=0 (2)SUBB A,#30H 结果:(A)=49H,CY=0,AC=0,OV=0,P=1 (3)ADD A,R0 结果:(A)=AAH,CY=0,AC=0,OV=1,P=0 (4)ADD A,30H 结果:(A)=1FH,CY=1,AC=0,OV=0,P=1 (5)ADD A,#30H 结果:(A)=AAH,CY=0,AC=0,OV=1,P=0 (6)ADDC A,30H 结果:(A)=20H,CY=1,AC=1,OV=0,P=1 (7)SWA
18、P A 结果:(A)=A7H,对标志位无影响 (8)XCHD A,@R0 结果:(A)=75H,(30H)=AAH,(R0)=AAH,P=1 (9)XCH A,30H 结果:(A)=0A5H,(30H)=7AH,P=0 (10)XCH A,R0 结果:(A)=30H,(R0)=7AH,P=0 (11)MOV A,@R0 结果:(A)=0A5H,P=0 (12)XCH A,@R0 结果:(A)=0A5H,(30H)=7AH,P=0 3-5 试分析以下程序段的执行结果: MOV SP,#3AH MOV A,#20H MOV B,#30H PUSH ACC PUS
19、H B POP ACC POP B 结果:(SP)=3AH,(A)=30H,(B)=20H,(3BH)=20H,(3CH)=30H 3-6 指出下列指令的执行结果,并写出每条指令的机器码。 MOV 30H,#52H ;(30H)=52H 01110101(753052H) MOV A,#70H ;(A)=70H 01110100(7470H) MOV A,30H ;(A)=52H 11100101(E530H) MOV R0,#30H ;(R0)=30H 10101000(7830H) MOV A,@R0 ;A=52H 11100010(E6H) 3-7 分析下列指令的执行
20、结果,并写出每条指令的机器码。 MOV A,#70H ;(A)=70H 01110100(74H) MOV DPTR,#2030H ;(DPTR)=2030H 10010000(90H) MOVX @DPTR,A ;(2030H)=70H 11110000(F0H) MOV 30H,#40H ;(30H)=40H 01110101(75H) MOV R0,#30H ;(R0)=30H 01111000(78H) MOV A,@R0 ;(A)=40H 11100110(E6H) 3-8 设R0的内容为32H,A的内容为48H,内部RAM的32H单元内容为80H,40单元内容为08H
21、指出在执行下列程序段后上述各单元内容的变化。 MOV A,@R0 MOV @R0,40H MOV 40H,A MOV R0,#35H 结果:(R0)=35H,(A)=80,(32H)=08H,(40H)=80H 3-9 已知:(A)=81H,(R0)=20H,(20H)=35H,指出执行完下列程序段后A的内容。 ANL A,#17H ;(A)=00000001 ORL 20H,A ;(20H)=00110101 XRL A,@R0 ;(A)=00110100 CPL A ;(A)=11001011 结果:(A)=CBH 3-10 用指令实现下述数据传送: (1)内部
22、RAM20H单元送内部RAM40H单元。 答:MOV 40H,20H (2)外部RAM20H单元送R0寄存器。 答:MOV R1,#20H MOVX A,@R1 MOV R0,A (3)外部RAM20H单元送内部RAM20H单元 答:MOV R1,#20H MOVX A,@R1 MOV 20H,A (4)外部RAM1000H单元送内部RAM20H单元 答:MOV DPTR,#1000H MOVX A,@DPTR MOV 20H,A (5)外部ROM1000H单元送内部RAM20H单元。 答:MOV DPTR,#1000H MOV A,#00H MOVC A,@A+
23、DPTR MOV 20H,A (6) 外部ROM1000H单元送外部RAM20H单元。 答:MOV DPTR,#1000H MOV A,#00H MOVC A,@A+DPTR MOV R1,#20H MOVX @R1,A 3-11 已知16位二进制数的高8位和低8位分别存放在20H和21H单元,请编写将其右移一们的程序。 CLR C MOV A,20H RRC A MOV 20H,A MOV A,21H RRC A MOV 21H,A 3-12 编程实现内部RAM R0~R7的内容传递到20H~27H单元。 3-13
24、 试编程进行两个16位数的减法,6F5DH-13B4H,结果存入内部RAM的30H和31H单元,30H存放差的低8位。 CLR C MOV A,#5DH SUBB A,#B4H MOV 30H,A MOV A,#6FH SUBB A,13H MOV 31H,A 3-14 编写程序,若累加器A的内容分别满足下列条件时,程序则至LABEL存储单元,设A中存放的是无符号数。 ①A>=10 ②A>0 ③(A)<=10 CJNE A,#10H,LAB JNZ LABEL MOV R0,A LAB:JNC LABEL MOV A,#10 ...... ...... CJNE A,
25、R0,LAB LABEL: LABEL: LAB:JNC LABEL ...... LABEL: 3-15 已知(SP)=25H,(PC)=2345H,(24H)=12H,(25H)=34H,(26H)=56H.问此时执行“RET”指令后,(SP)=?,(PC)=? 答:(SP)=23H,(PC)=3412H 执行RET时,PCH←(SP),SP←SP-1,PCL←(SP),SP←SP-1 3-16 若(sp)=25H,(PC)=2345H,标号LABEL所在的地址为3456H,问执行调用指令“LCALL LABEL”后,堆栈指针和堆栈内容发生什么变化?(PC)的值等于
26、什么? 答:最后堆栈指针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 ;起始地址 LOOP: MOV A,@R0 ;取出数字 CJNE A,#0AAH,NEXT
27、 ;不相等就跳转 INC 51H ;相等将51单元置1 SJMP EEE ;找到转去结束 NEXT: INC R0 ;下一个地址 CJNE R0,#51H,LOOP ;地址没找完就继续 EEE: SJMP $ ;暂停 3-18 试编写程序,统计在外部RAM 2000H~205FH单元中出现00H的次数,并将统计结果丰收入内部RAM 50H单元。 MOV R0,#00H ;RO设为计数器,初始为0 MOV DPTR,#2000H ;置片外RAM起始地址 MOV R1,#60H ;置传送数据个数 LOOP: MOVX A,@DPTR ;外部RAM单元内容送
28、A JNZ NEXT ;传送数据不为0 跳转 INC R0 ;传送数据为0,计数器加1 NEXT: INC DPTR ;下一个地址 DJNZ R1,LOOP ;地址没找完就继续 MOV 50H,R0 ;统计结果存入50H单元 SJMP $ ;暂停 3-19 已知R3和R4中存有一个16位的二进制数,高位在R3中代位在R4中。请编程将其求补,并存回原处。 答:首先假设R3、R4中是原码,根据原码求补的方法当最高位(R3的D7位)为0时表示为正数,那么补码与原码相同,当最高位为1时,表明是负数,负数的补码是最高位不变,其余位取反加1. MOV A,R3
29、 JB ACC.7,NEG SJMP $ NEG: MOV A,R4 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 $ 3-20 编写一个程序,把片外RAM从2000H开始存放的10个数传送到片内RAM 30H开始单元。 START: MOV R0,#30H MOV R1,#10H MOV DPTR,#2000H LOOP: MOVX A,@DPTR MOV @R0,A INC R0 INC
30、 DPTR DJNZ R1,LOOP SJMP $ 3-21 试编程将内部RAM的30H至4FH单元的内容分别传送到外部RAM的2040H~205FH单元。 START: MOV R0,#30H MOV R1,#20H MOV DPTR,#2040H LOOP: MOV A,@R0 MOVX @DPTR,A INC DPTR INC R0 DJNZ R1,LOOP SJMP $ 3-22 若外部RAM的(2000H)=X,(2001H)=Y,编程实现Z=3X+2Y,结果存入内部RAM的20H单元,设Z<=255。 START: MO
31、V 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 ;为负数 JNB ACC.7, POSI ;为0 LJMP #2100H SJMP EEE NEG: LJMP #2200H SJMP EE
32、E POSI: LJMP #2300H SJMP EEE 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 ;需处理的数的个数
33、 MOV DPTR,#2000H ;需处理数的起始地址 MOV R1,#20H ;用于存储的目标地址 LOOP: MOVX A,@DPTR JB ACC.7,NEG ;负数不需处理 MOV @R1,A INC R1 NEG: INC DPTR DJNZ R0,LOOP SJMP $ 第四章 汇编语言程序设计 4-1 什么叫伪指令?伪指令与指令有什么区别? 答:伪指令不属于单片机指令集中的指令,在汇编时不产生目标代码,不影响程序的执行,仅指明在汇编时执行一些特定的操作。如为程序指定一个存储区、将一些数据、表格常数存放在指定的存储单元、对地址赋用户名等。 指令
34、是计算机所能执行的一种基本操作的描述,是计算机软件的基本单元。51单片机单片机的指令有二种表达方式:机器码指令和汇编语言指令。 4-2 循环程序由哪几部分组成? 答:由初始化部分、循环处理部分、循环控制部分、循环结束部分这四部分组成。 4-3 什么是子程序?对于子程序设计有什么要求? 答:一段具有某一特定功能,能被其它程序所调用,调用结束后能自动返回到调用处的程序块就称为子程序。 对子程序设计的要求: 4-4 试对下列程序进行人工汇编,并说明此程序的功能。 地址 指令码 ORG 1000H ; ACDL: MOV R0,#25H ;1000H 78 25 MOV
35、 R1,#2BH ;1002H 79 2b MOV R2,#06H ;1004H 7A 06 CLR C ;1006H C3 CLR A ;1007H E4 LOOP: MOV A,@R0 ;1008H E6 ADDC A,@R1 ;1009H 37 DEC R0 ;100AH 18 DEC R1 ;100BH 19 DJNZ R2,LOOP ;100CH DA FA SJMP $ ;100EH 80 FE END ; 1008H-100EH=-06H,其补码为(11111010)2→0FAH 功能:将25H单及前5个数与2BH单元及前
36、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 ;需判断数的个数 LOOP: POP ACC ;出栈放入A JB ACC.7,NEG ;负数跳转 CJNE A,#00H,LOOP1
37、 ;非负非零转正数处理 SJMP LOOP ;零不处理,取下一个数 LOOP1:MOV @R0,A ;正数保存 INC R0 ;正数存放地址加1 INC R3 ;正数个数加1 SJMP LOOP2 ;未结束就继续 NEG: MOV @R1,A ;将负数送负数保存地址 INC R1 ;负数地址加1 INC R4 ;负数个数加1 LOOP2: DJNZ R7,LOOP ;未结束就继续 MOV 40H,R3 ;正数个数送40H单元 MOV 60H,R4 ;负数个数送60H单元 SJMP $ END 4-6 设内部RAM的30H和3
38、1H单元中有二个带符号数求出其中的大数存放在32H单元中。 MOV A,30H XRL A,31H JB ACC.7,LOOP MOV A,30H SUBB A,31H JC LOOP1 MOV 32H,30H SJMP $ LOOP1: MOV 32H,31H SJMP $ LOOP: MOV A,30H JB ACC.7,LOOP1 MOV 32H,A SJMP $ 4-7 试编制实现ASCII码转十进制数的程序。在8032单片机内RAM的40H单元中存放一个代码。若此代码为十进制数的ASCII码,则将其相应的十进制数送片内R
39、AM的50H单元,否则将此单元置成0FFH。 MOV A,40H CLR C SUBB A,#30H ;数字比其ASCII码值小30H JC LOOP ;存的ASCII值小于0的ASCII码值跳转 MOV R0,A MOV A,#09H ;减30H后差大于0,是否不 SUBB A,R0 ; 大于9? JC LOOP ;差大于9,跳转 MOV 50H,R0 ;将数字存入50H单元 SJMP $ LOOP:MOV 50H,#0FFH ;不是数字,存入0FFH SJMP $ END 4-8 试编程将存放在8032单片机内部RAM中首址为20
40、H、长度为50H的数据快传送到片外RAM以20H为首址的连续单元中。 MOV R0,#20H MOV R1,#20H MOV R7,#50H LOOP: MOV A,@R0 MOVX @R1,A INC R0 INC R1 DJNZ R7,LOOP SJMP $ 4-9 设一个字符串存放在8032单片机内部RAM以20H为首址的连续单元中,字符串以回车结束。要求统计该字符串中字符C(’C’=43H)的个数,并将其存入外部RAM的40H单元。试编写实现上述要求的程序。 MOV R0,#20H MOV R2,#00H LOOP: MOV A
41、@R0 XRL A,#0DH ;判断是否是回车符 JZ EXIT MOV A,@R0 XRL A,#43H JNZ LOOP2 INC R2 LOOP2: INC R0 SJMP LOOP EXIT: MOV DPTR,#0040H MOV A,R2 MOVX @DPTR,A SJMP $ END 4-10 设有一长度为20H的字符串,它存放在片外RAM1000H为首地址的连续单元中。试编制将其中数字与字母分开并将它们送到片内RAM以30H和50H为首地址的连续单元中的程序。 MOV DPTR,#1000H M
42、OV R7,#20H MOV R0,#30H MOV R1,#50H LOOP: MOVX A,@DPTR CJNE A,#30H,LOOP1 SJMP ISNUM LOOP1: JNC LOOP2 SJMP ISCHAR LOOP2: CJNE A,#3AH,LOOP3 LOOP3:JC ISNUM SJMP ISCHAR ISCHAR:MOV @R1,A INC R1 SJMP NEXT ISNUM:CLR C SUBB A,#30H MOV @R0,A INC R0 SJMP NEXT NEXT: INC DPTR DJN
43、Z R7,LOOP SJMP $ END 4-11 试编程将片内RAM区DATA1单元开始的20H个单字节依次与DATA2单元为起始地址的20H个单字节进行交换。 MAIN: MOV R7,#20H DATA1 EQU 20H DATA2 EQU 40H MOV R0,#DATA1 MOV R1,#DATA2 LOOP: MOV A,@R0 XCH A,@R1 MOV @R0,A INC R0 INC R1 DJNZ R7,LOOP SJMP $ END 4-13 设片内RAM的20H~4FH单元中有若个无符号数,试编程求
44、出其中的最大值及所在单元地址,将最大值存入片内RAM的50H单元,最大值所在单元地址存入片内RAM的51H单元。 MOV R0,#20H MOV R7,#20H MOV A,R0 MOV R2,A MOV A,@R0 MOV R1,A LOOP: INC R0 CLR C SUBB A,@R0 JNC LOOP1 MOV A,R0 MOV R2,A MOV A,@R0 MOV R1,A LOOP1:MOV A,R1 DJNZ R7,LOOP MOV 50H,R1 MOV 51H,R2 SJMP $ END
45、4-14 设片外RAM从1000H单元开始存放100个无符号8位二进制数。试编程将它们从大到小依次入片内RAM从10H开始的单元中。 MOV R7,#100 MOV DPTR,#1000H MOV R0,#10H LOOP: MOVX A,@DPTR MOV @R0,A INC DPTR INC R0 DJNZ R7,LOOP MOV R7,#99 MOV R6,#99 NEXT: MOV R0,#10H MOV A,@R0 MOV R1,A LOOP2: INC R0 MOV A,@R0 CLR C SUBB
46、 A,R1 JNZ LOOP3 SJMP LOOP4 LOOP3: JC LOOP4 MOV A,@R0 DEC R0 MOV @R0,A MOV A,R1 INC R0 MOV @R0,A LOOP4: MOV A,@R0 MOV R1,A DJNZ R7,LOOP2 DEC R6 MOV A,R6 MOV R7,A INC R6 DJNZ R6,NEXT SJMP $ END 4-15 设有2个4B的BCD数:X=24350809,Y=12450379。X从片内RA
47、M的25H单元开始存放,Y从片内RAM的35H单元开始存放,求两数的和。设数据在内存中按照低字节在前,高字节在后的顺序存放。 MOV 25H,#24H MOV 26H,#35H MOV 27H,#08H MOV 28H,#09H MOV 35H,#12H MOV 36H,#45H MOV 37H,#03H MOV 38H,#79H MOV R7,#04H MOV R0,#25H MOV R1,#35H CLR C LOOP: MOV A,@R0 ADDC A,@R1 DA A MOV @R0,A INC R0 INC
48、R1 DJNZ R7,LOOP SJMP $ END 4-16 设晶振频率为6MHz,试编一能延时20ms的子程序 答:一个机器周期T=12/6*106=2μs,延时20ms需要20000/2=10000个机器周期。 拟用以下程序: 工作需要机器周期数 START: MOV R6,#data1 ;1 LOOP1: MOV R7,#data2 ;1 NOP ;1 NOP ;1 LOOP: NOP ;1 NOP ;1 NOP ;1 DJNZ R7,LOOP ;2 DJNZ R6,LOOP ;2 RET ;2 延时周期数为1+
49、5*data2+5)*data1+2,选择最合适的data1和data2 Data1=200,data2=99,延时机器周期数为10003个,延时20.006ms 4-17 利用查表技术将累加器A中的一位BCD码转换成相应的十进制数的七段码,结果仍放在A中(设显示管0~9的七段码分别是40H,79H,24H,30H,19H,12H,02H,78H,00H,1BH)。 SUB1: INC A MOVC A,@A+PC RET DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,1BH 4-18 试编一采用查表法求1~20的二次方数的子程序。要求:
50、X在累加器A中,1≤X≤20,二次方高位存放在R6中,低位存放在R7中。 SUB: MOV DPTR,#0100H MOV R0,A ADD A,R0 MOV R0,A MOVC A,@A+DPTR MOV R7,A INC DPTR MOV A,R0 MOVC A,@A+DPTR MOV R6,A RET ORG 102H DB 01H,00H,04H,00H,09H,00H,10H,00H,19H,00H DB 24H,00H,31H,00H,40H,00H,51H,00H,64H,00H DB 79H,00H,90H,00H,0A






