单片机习题参考答案 下载本文

铁道社单片机习题集参考答案

习题一

一、选择题

1. 十进制121转换为8位二进制数是( A )。

A.01111001B B.01110111B C.01101110B D.10001010B 2. 十进制数112.375转换成十六进制数是( B )。

A.70.5H B.70.6H C.71.5H D.71.6H 3. 十进制254.28转换为BCD码是( D )。

A.0011010100.101000 B.010001010100.00110000 C.1101010100.00101 D.001001010100.00101000

4. 11101111101.1B=( A )。

A.77D.8H B.77C.8H C.77D.1H D.77C.1H 5. ABC.DEH=( D ) B。

A.101010111100.11101111 B.010101100111.10001001

C.101111001101.11101111 D.101010111100.11011110 6. 数字符号0和9的ASCII码十进制表示为( C )。

A.30、39 B.30H、39H C.48、57 D.48H、57H 7. 一个字节的十六进制数最大相当于十进制数的( B )。

A.256 B.255 C.254 D.100 8. 将BCD码0011011101010010转换为十进制数,应为( A )。

A.3752 B.1BA90 C.3964 D.2725 二、简答题

1. 什么是单片机?

答:把微型计算机的基本功能部件:中央处理器(CPU)、存储器、输入/输出接口、

定时器/计数器、中断系统等多种资源集成在一个半导体芯片上,使得一块集成电路芯片就能构成一个完整的微型计算机。这种集成电路芯片被称为单片微型计算机(single chip microcomputer),简称单片机。

2. 单片机主要应用于哪些领域? 答:(1) 生产自动化 (2) 实时测控 (3) 智能化产品

(4) 智能化仪表 (5) 信息通信技术 (6) 科学研究 (7) 国防现代化

3. 单片机应用系统由哪几部分组成?

答:单片机应用系统由单片机、外部存储器、输入通道、输出通道等部分组成 4. MCS-51系列中8031,8051,8751有什么区别?

答:8031/8051/8751 这3种芯片常称为 8051子系列,它们之间的区别仅在于

片内程序存储器不同。8031片内无程序存储器,8051片内有4KB的ROM,8751片内有4KB的EPROM,其它结构性能相同。其中8031易于开发,价格低廉,应用广泛

5. 为什么单片机又称为嵌入式微控制器?

答:单片机在应用时通常装入到各种智能化产品之中,所以又称嵌入式微控制器

(Embedded Micro Controller Unit EMCU)。单片机应用系统就是典型的嵌入式系统。 嵌入式计算机系统,是作为其他系统的组成部分使用的。由于通用计算机系统有限的可靠性、较高的价位及庞大的身躯,限制了其在嵌入式系统的广泛应用,尤其限制了以嵌入式计算机系统作为核心控制产品的发展。单片机以较小的体积、现场运行环境的高可靠性满足

1

了许多对象的嵌入式应用要求。在嵌入式系统中,单片机是最重要也是应用最多的智能核心器件。

6. 在51子系列单片机中,程序存储器和数据存储器最大可扩展为多少字节?

答:在51子系列单片机中,片外程序存储器和数据存储器最大可扩展为64K字节。 7. 在单片机中,片内ROM的配置有几种形式?用户应根据什么原则选用? 答:在单片机中,片内ROM的配置有3种形式?用户应根据实用原则选用。如:

片内驻留掩膜ROM配置的单片机,用户无法自行改写片内的程序,推广应用受到限制;片内驻留EPROM配置的单片机,用户可用开发工具把应用程序写入片内EPROM,该用户带来极大方便,简化系统结构,易于推广应用;片内无ROM配置的单片机,用户必须外接片外EPROM作为程序存储器,其容量可视需要灵活配置。

三、计算题

1. 将下列十进制数转换为十六进制和二进制数。

(1) 44.375=2C.6H=101100.011B

(3) 0.6875=0.BH =0.1011B

(2) 171=ABH =10101011B

(4) 127.65625=7F.A8H =1111111.10101B

2. 将下列十六进制数转换为二进制和十进制数。 (1) 7E2H= 11111100010 B =2018 (2) 1FFFH= 1111111111111 B =8191

(3) 3200H= 11001000000000 B =12800 (4) F7H= 11110111 B =247 3. 将下列二进制带符号数,分别用原码和补码表示。

(1) +1010011B [+1010011B]原=[+1010011B]补=01010011B

(2) -01011010B [-01011010B]原=11011010B [-01011010B]补=10100110B

(3) +0101010B [+0101010B]原=[+0101010B]补=00101010B

(4) -0111100B [-0111100B]原=10111100B [-0111100B]补=11000100B 4. 下列机器数为带符号数的补码,试写出他们对应的真值。

(1) E2H [E2H]真值=-30

(2) 1FH [1FH]真值=+31

(3) 00111100B [00111100B]真值=+60 (4) 11000011B [11000011B]真值=-61

5. 将下列BCD码转换为十进制数。

(1) BCD码0011011101010010转换为十进制数为3752

(2) BCD码1001011010000100转换为十进制数为9684

6. 已知X、Y,试分别计算[X+Y]补和[X-Y]补,并指出是否产生溢出。

(1) X=+1001110, Y=+0010110

[X+Y]补=01100100 不会产生溢出 [X-Y]补=00111000 不会产生溢出

(2) X=+0101101, Y=-1100100

[X+Y]补=11001001 不会产生溢出

[X-Y]补=10010001 产生溢出

(3) X=-0101110, Y=+0111011 (4) X=-1000101, Y=-0110011

习题二

一、选择题

1. 在MCS-51单片机中,DPTR和SP分别是( C )的寄存器

A.DPTR和SP均为8位 B.DPTR为8位,SP为16位

2

C.DPTR为16位,SP为8位 D.DPTR和SP均为16位

2. 在MCS—51单片机中,地址总线和数据总线分别是( D )条。

A.均为8条 B.地址总线为8条,数据总线为16条 C.均为16位 D.地址总线为16条,数据总线8条 3. 决定程序执行顺序的寄存器是( B )。

A.程序是否有转移指令 B.指令地址寄存器(程序计数器)PC

C.累加器A D.堆栈指针SP 4. MCS-51单片机有( B )条引脚。

A.28 B.40 C.20 D.32

5. MCS-51单片机的一个指令周期包括( A )个机器周期。

A.1~4 B.6 C.12 D.2 6. R0~R7所在的工作寄存器区是由( A )来选定的。

A.PSW寄存器的RS1和RS0 B.CPU C.内部数据存贮器 D.程序

7. 8031单片机的外部程序存储器的读选通信号是( D )有效。

A.输入,高电平 B.输出,高电平

C.输入,低电平 D.输出,低电平

8. 在MCS-51单片机中,PC的初值和P0、P1、P2、P3的初值为( A )。

A.PC的初值为0000H,P0、P1、P2、P3的初值为FFH

B.PC的初值为0003H,P0、P1、P2、P3的初值为00H C.PC的初值为0000H,P0、P1、P2、P3的初值为00H

D.PC的初值为0003H,P0、P1、P2、P3的初值为FFH

9. 单片机存储器在物理上它们是( D )个相互独立的存贮器空间。

A.1 B.2 C.3 D.4

10. MCS-51单片机的工作寄存器区的地址范围是( A )。 A.00H~1FH B.00H~0FH C.00H~07H D.00H~08H 二、简答题

1.8051有多少个特殊功能寄存器?它们可以分为几组?各完成什么主要功能? 答:8051有21个特殊功能寄存器;

2.决定程序执行顺序的寄存器是哪个?它是几位寄存器?是特殊功能寄存器吗?

答:决定程序执行顺序的寄存器是程序计数器PC;它是16位寄存器;不是特殊功能

寄存器。

3.DPTR是什么寄存器?它的作用是什么?它是由哪几个寄存器组成?

答: DPTR数据地址指针是一个16位的专用地址指针寄存器,它由DPH和DPL这两个特殊功能寄存器组成。DPH是DPTR的高8位,DPL是DPTR的低8位,DPTR用于存放16位地址,可对外部数据存储器RAM64KB(0000H~0FFFFH)地址空间寻址。

4.8051的工作寄存器分成几个组?每组为多少个单元?8051复位后,工作寄存器位

于哪一组?

答:8051的工作寄存器分成4组;每组8个单元;8051复位后工作寄存器位于0组。 5.MCS-51引脚中有多少I/O线?它们和单片机对外的地址总线和数据总线有什么

关系?地址总线和数据总线各是几位?

答:MCS-51引脚中有多少32条线;它们由P2、P0口构成单片机对外的地址总线,

由P0口分时使用构成数据总线;地址总线和数据总线各是16位和8位。

6.什么叫堆栈?堆栈指针SP的作用是什么?8051单片机堆栈的容量不能超过多少

3

字节?

答:在程序中往往需要一个后进先出(LIFO)的RAM区域,用于调用子程序响应中断

时的现场保护,这种LIFO的缓冲区称为堆栈。堆栈指针SP的作用是在压栈时SP加1,在出栈时SP减1,始终指向当前的栈顶。堆栈原则上可以设在内部RAM的任意区域,但由于00H~1FH为工作寄存器区,20H~2FH为位寻址区,所以堆栈一般设在30H~7FH的范围之内,这个区域只能字节寻址。8051单片机堆栈的容量不能超过80个字节。

7.8051单片机的内部数据存贮器可以分为几个不同区域?各有什么特点?

答:对于8051单片机,其片内有256字节的数据存储器地址空间,可把它们的物理地址空间划分成四个用途不同的区域。低128字节地址空间(00H~7FH)为片内数据存储器区,包含(1)工作寄存器区、(2) 位寻址区、(3)数据缓冲区和堆栈区。高128字节地址空间(80H~FFH)为特殊功能寄存器区SFR。

8.MCS-51单片机程序存储器的寻址范围是多少?8051单片机可以配置的存贮器最

大容量是多少?

答:MCS-51单片机程序存储器的寻址范围是0000H~FFFFH;8051单片机可以配置的存贮器最大容量是64KB。

9.8051单片机对外有几条专用控制线?其功能是什么?

答:8051单片机对外有4条专用控制线;ALE/PROG:ALE为地址锁存允许信号。在访问外部存储器时,ALE用来把扩展地址低8位锁存到外部锁存器。在不访问外部存储器时,ALE引脚以不变的频率(时钟振荡器频率的1/6)周期性地发出正脉冲信号,因而它又可用作外部定时或其它需要。但要注意,在遇到访问外部数据存储器时,会丢失一个ALE脉冲,ALE能驱动8个LSTTL负载。在8751单片机内部EPROM编程期间,此引脚接编程脉冲(PROG功能)。

RST/VPD:RST为复位信号输入端。当RST引脚持续接入两个机器周期(24个时钟周期)以上的高电平时,使单片机完成复位操作。此引脚还可以接入备用电源。当主电源Vcc 一旦发生断电(称掉电或失电),降到一定低电压值时,可由VPD向内部RAM提供电源,以保护片内RAM中的信息不丢失,使上电后能继续正常运行(有关此方面的电路可查阅其它书籍)。

PSENPSEN:外部程序存储器ROM 的选通信号。当从外部程序存储器取指令(或数据)期间,

产生负脉冲作为外部ROM的选通信号。而在访问外部数据RAM或片内ROM时,不会产

生有效的PSEN信号。PSEN可驱动8个LSTTL负载。

EA/VPP :EA访问外部程序存储器控制信号。对8051和8071,当EA为高电平时,若访问的地址空间在0~4KB(0000H~0FFFH)范围内,CPU访问片内程序存储器;若访问的地址超出4KB时,CPU将自动执行外部程序存储器的程序,即访问片外程序存储器;当EA为低电平时,只能访问片外程序存储器。对于8031,EA必须接地,只能访问片外程序存储器。第二功能为对8751的EPROM编程期间,接+21V编程电源。

10.什么叫指令周期?什么叫机器周期?MCS-51的一个机器周期包括多少时钟周

期?

答:指令周期指执行一条指令所占用的全部时间;若把一条指令的执行过程划分为几

个基本操作,则完成一个基本操作所需的时间称为机器周期;MCS-51的一个机器周期包括6

个时钟周期。

11.为什么要了解CPU的时序?

答:了解CPU的时序有助于程序设计时计算程序段的执行时间。

12.8051是低电平复位还是高电平复位?复位后,P0~P3口处于什么状态? 答:8051是高电平复位;复位后,P0~P3口处于全?1?状态 13.8051的时钟周期,机器周期,指令周期是如何分配的?当振荡频率为10MHz时,

4

一个机器周期为多少微秒?

答:8051的一个指令周期通常由1~4个机器周期组成;一个机器周期由6个时钟周

期组成;当振荡频率为10MHz时,一个机器周期为0.2微秒。

14.在8051扩展系统中,片外程序存储器和片外数据存储器共处同地址空间,为什

么不会发生总线冲突?

答:访问片外程序存储器使用MOVC类指令、访问片外数据存储器使用MOVX类指令,

因使用不同的指令产生不同的控制信号,所以不会发生总线冲突。

15.8051的P3口具有哪些第二功能? 答:P3.0的第二功能是RXD(串行输入口)

P3.1的第二功能是 TXD(串行输出口) P3.2的第二功能是INT0 (外部中断0输入) P3.3的第二功能是INT1(外部中断1输入) P3.4的第二功能是T0(定时器0外部输入) P3.5 的第二功能是T1(定时器1外部输入)

P3.6的第二功能是WR(外部数据存储器写脉冲输出) P3.7的第二功能是RD(外部数据存储器读脉冲输出)

16.位地址7CH与字节地址7CH有什么区别?位地址7CH具体在内存中什么位置? 答:位地址7CH指向一个存储位的地址;字节地址7CH指向一个存储单元的地址;位

地址7CH在内存中字节地址为2FH的D4位。

17.程序状态字PSW的作用是什么?常用的状态标志有哪几位?作用是什么? 答:程序状态字寄存器PSW相当于标志寄存器,用于存放指令执行结果的一些特征,供程序查询和判别之用。常用的状态标志有6位。CY:进位标志;AC:辅助进位;RS1和RS0:工作寄存器组选择位;OV:溢出标志;P:奇偶标志。

18.在程序存储器中,0000H,0003H,000BH,0013H,001BH,0023H这6个单元

有什么特定的含义?

答:在程序存储器中,有六个单元是分配给系统使用的,具有特定的含义。

0000H: 单片机系统复位后,PC=0000H,即程序从0000H开始执行指令。通常在0000H ~00002H单元安排一条无条件转移指令,使之转向主程序的入口地址。

0003H: 外部中断0入口地址。

000BH: 定时器0溢出中断入口地址。 0013H: 外部中断1入口地址。

001BH: 定时器1溢出中断入口地址。

0023H: 串行口中断入口地址。

19.若P1~P3口作通用I/O口使用,为什么把它们称为准双向口? 答:用于输入时,必须先向相应端口的锁存器写入?1?。

习题三

一、简答题

1. 简述下列名词术语的基本概念:

指令、指令系统、程序、汇编语言指令。

2. MCS-51 单片机有哪几种寻址方式?这几种寻址方式是如何寻址的?

3. 要访问特殊功能寄存器和片外数据存储器,应采用哪些寻址方式? 4. MCS-51 单片机的指令系统可分为哪几类?试说明各类指令的功能。 5. 外部数据传送指令有哪几条?试比较下面每一组中两条指令的区别。

5

(1) MOVX A,@R0 ; MOVX A,@DPTR

MOVX A,@R0 和MOVX A,@DPTR指令均为外部数据传送指令,但访问的存

储空间大小不同

(2) MOVX @R0,A ; MOVX @DPTR,A 同上

(3) MOVX A,@R0 ; MOVX @R0,A A与外部数据存储器和外部数据存储器与A 之间的传送

6. 在 MCS-51 单片机片内RAM中,已知(30H)= 38H,(38H)= 40H,(40H)= 48H,

(48H)= 90H,分析下段程序中各指令的功能;说明源操作数的寻址方式,以及按序执行每条指令后的结果。

MOV A,40H MOV R0,A

;直接寻址 A=48H ;寄存器寻址 R0=48H

MOV @R0,30H ;直接寻址 (48H)=38H MOV 40H,38H ;直接寻址 (40H)=40H MOV R0,30H MOV 90H,R0

;直接寻址 R0=38H ;寄存器寻址 (90H)=38H

MOV 48H,# 30H ;立即寻址 (48H)=30H MOV A,@R0 ;寄存器间接寻址A=40H 7. DA A指令的作用是什么?怎样使用?

DA A指令的作用是在进行BCD码运算时,跟在ADD和ADDC指令之后,将相加后

存放在累加器A中的结果进行调整修正。

8. 试编程将片外数据存储器50H中的内容传送到片内RAM 54H 单元中。 MOV R0,#50H MOVX A,@R0 MOV 54H,A 9. 试编程将寄存器 R7 的内容传送到 R1中去。 MOV A,R7 MOV R1,A

10. 用两种方法实现累加器A与寄存器B的内容交换。 XCH A,B

或 MOV R0,A MOV A,B MOV B,R0

11. 试编程将片外 RAM 40H 单元的内容与 R1 的内容交换。 MOV B,R1 MOV

MOV

R0,#40H MOVX A,@R0 MOV R1,A A,B MOVX @R0,A

12. 若要完成以下的数据传送,应如何用MCS-51的指令来实现?

(1)R1内容传送到R0。

(2)外部RAM 20H单元内容R0。

(3)外部RAM 20H单元内容送内部RAM 20H单元。 (4)外部RAM 1000H单元内容送内部RAM 20H单元。 (5)外部ROM 20H单元内容R0。

(6)外部ROM 2000H单元内容送内部RAM 20H单元。

13. 已知:A= 0C9H,B= 8DH,CY= 1。

执行指令 ADDC A,B 结果如何? A=57H

执行指令 SUBB A,B 结果如何? A=3BH

6

14. 列举4条能使累加器 A清零的指令。 CLR A

MOV A,#00H AND A,#00H XOR A,ACC

15. 试用 3 种方法将累加器 A 中无符号数乘 2。 1) MOV B,#02 MUL AB 2) RL A

3) ADD A,ACC

16. 分析下列指令执行后, A及PSW中进位位CY、奇偶位P和溢出位OV的值。

(1) 当 A = 5BH 时; (2) 当 A = 5BH 时;

ADD ANL

A,# 8CH A,# 7AH

(3) 当 A = 5BH 时; (4) 当 A = 5BH,CY=1 时 ; XRL A,# 7FH SUBB A,# 0E8H

17. 试说明指令 CJNE @R1,#7AH,10H 的作用。若本指令地址为250H,其转

移地址是多少?

(@R1)与#7AH比较不等于转移,转移的偏移量为10H;其转移地址是263H 18. 参照例题21若系统的晶振频率为 5MHz,求子程序 DELAY 的延时时间。若想

加长或缩短延时时间,应怎样修改?

晶振频率为 5MHz时,1M=2.4微秒,子程序 DELAY 的延时时间共为

1002*2.4=2404.8微秒;若想加长或缩短延时时间可以增加/减少NOP指令或增加/减少循环

19. 试编一程序将外部数据存储器2100H单元中的高4位置“1”,其余位清“0”。

MOV A,#0F0H MOV DPTR,#2100H MOVX @DPTR,A 20. 试编程将内部数据存储器40H单元的第0位和第7位置“1”,其余位变反。 MOV A,40H CPL A

SETB ACC.0

SETB ACC.7 MOV 40H,A

21. 将 ACC.5 与80H位相与的结果,通过 P1.4 输出。 MOV C,80H ANL C,ACC.5

MOV P1.4,C

22. 使用位操作指令,求下面逻辑方程: (1) P1.7=ACC.0∧(B.0∨P2.1)∨P3.2 MOV C,B.0

7

ORL C,P2.1 MOV MOV

30H,C C,ACC.0

ANL C,30H ORL C,/P3.2 MOV

P1.7,C

(2) PSW.5=P1.3∧ACC.2∨B.5∧P1.1 MOV C,P1.3 ANL C, ACC.2 ORL C, B.5 ANL C,/P1.1

MOV PSW.5,C

(3) P2.3= P1.5∧B.4∨ACC.7∧P1.0

基本同上

三、分析计算

1. 已知A=7AH,R0=30H,(30H)=A5H,PSW=81H。问执行以下各指令的结果

(每条指令都以题中规定的数据参加操作)。

(1) XCH (2) XCH (3) XCH

A,R0 A,30H A,@R0

A=30H R0=7AH

P=0

A=A5H (30H)=7AH P=0 A=A5H (30H)=7AH P=0 A=75H (30H)=AAH A=A7H P=1

P=1

(4) XCHD A,@R0 (5) SWAP A (6) ADD (7) ADD (8) ADD

A,R0 A,30H A,#30H A=AAH CY=0 OV=1 P=0 A=1FH CY=1 OV=1 P=1 A=AAH CY=0 OV=1 P=0 A=ABH CY=0 OV=1 P=1 A=D4H CY=1 OV=0 P=0 A= A= A= A=

CY= OV= P= CY= P= CY= P= CY= P=

P= P=

(9) ADDC A,R0 (10) SUBB A,30H (11) ADD (12) DA (13) RL (14) RLC (15) CJNE (16) CJNE

A,#30H A A A

A,#30H,00 A= CY= A,30H,00 A= CY=

2. 设A=82H,R0=17H,(17H)=34H,问执行以下指令后A=? ANL A,#17H ;A=02H ORL 17H,A ;A=02H (17H)=36H XRL CPL

A,@R0 A

;A=34H

;A=CBH

3. 已知:A=75H,PSW=81H,转移指令所在地址为2080H,当执行以下指令后,

PC值等于多少? (1) 执行JNZ PC=2094H (2) 执行JNC PC=2082H (3) 执行JB

PC=20D8H (4) 执行JBC

12H后,PC值=? 4H后, PC值=? P,55H后, PC值=? AC,78H后, PC值=?

A,#50H,9AH后, PC值=?

PC=2083H

(5) 执行CJNE PC=201DH

8

(6) 执行DJNZ PSW,0BCH后,PC值=?

PC=203FH

4. 已知SP=25H,PC=2345H,(24H)=12H,(25H)=34H。问此时执行RET指令

以后,SP=?PC=?

执行RET指令以后,SP=23H PC=3412H 5. 若SP=25H,PC=2345H,标号LABEL所在的地址为3455H,问执行长调用指

令LCALL LABLE后,堆栈指针和堆栈的内容发生什么变化?PC的值等于什么?

堆栈指针SP=27H;堆栈的内容发生变化(26H)=48H,(27H)=23H;PC的值等于3455H 6. 上题中的LCALL指令能否直接换成ACALL指令,为什么?如果使用ACALL指

令,则可调用的地址范围是什么?

LCALL指令不能直接换成ACALL指令,因为超出了转移范围,如果使用ACALL指令,

则可调用的地址范围是2K

四、编写程序

1. 试编写程序,将内部RAM的20H,21H,22H,三个连续单元的内容依次存入2FH,2EH和2DH单元。 MOV 20H,2FH

MOV 21H,2EH MOV 22H,2DH

2. 试编写程序能够将内部RAM中32H~30H的内容左移1位,即:

CY 32H 31H 30H 0

CLR C MOV A,30H RLC A MOV 30H,A MOV A,31H RLC A MOV 31H,A

MOV A,32H RLC A MOV 32H,A

3. 编写程序,若累加器A的内容分别满足以下条件时,则程序转至LABEL存贮单

元。设A中存的是无符号数。

(1) A≥10

CLR C

SUBB A,#10H JNC LABEL (2) A>10

(3) A≤10

9

4. 利用查表技术将累加器A中的一位BCD码转换为相应的十进制数的七段字型码,

结果送P1口输出。0~9的七段码分别是:3FH、05H、5BH、4FH、55H、5DH、7DH、07H、TFH、5FH。

MOV DPTR,#TAB MOVC A,@A+DPTR MOV P1,A

TAB:DB 3FH、05H、5BH、4FH、55H、5DH、7DH、07H、TFH、5FH

习题四

一、简答题

1.什么叫“伪指令”?伪指令与指令有什么区别?

2.MCS-51系列单片机汇编语言有哪些伪指令?它们的用途是什么?汇编语言的格式是怎样的?

3.汇编语言程序设计分哪几个步骤?

4.列出画程序流程图的各种图形符号,并说明用途。 5.分析下述程序的功能。

X DATA 30H

Y DATA 32H

MOV A,X

JNB

ACC.7,TRUE

CPL A

ADD A,#01H

TRUE:MOV Y,A

本程序的功能是求片内RAM地址为30H单元中数的补码后送32H单元

二、计算题

1.下列程序执行后,按要求回答问题。 (1) ORG 2000H

MOV A,#00H

MOV MOV PUSH PUSH

B,#01H SP,#10H ACC B

RET

结果:SP= 10H ,PC= 0201H 。 (2) 运行前:CY=0,AC=0,OV=0,P=0。

MOV MOV ADD

A,#77H B,#34H A,B

DA A

结果: A= 11H ,CY= 1 。

(3) 运行前:CY=0,AC=0,OV=0,P=0。 MOV A,#07H

10

MOV B,#02H

MUL AB

结果:A= 0EH ,B= 00H ,OV= 0 ,P= 1 。 (4) MOV R0,#10H MOV 10H,#20H

MOV MOV

@R0,#30H A,R0

结果:A= 10H ,R0= 10H ,(10H)= 30H 。

2.下列程序段汇编后,从3000H开始的各有关存储器单元的内容将是什么? ORG 3000H

TAB1: EQU 3234H TAB2: EQU 4000H

DB DW

‘START’

TAB1,TAB2,9000H

从3000H开始的各有关存储器单元的内容是‘S’ 、‘T’、‘A’ 、‘R’、 ‘T’、 32H、

34H、40H、00H、90H 、00H

三、应用题

1.编写程序将内部RAM 30H中的压缩BCD码转换为ASCII码,并存入31H和32H单元中。

MOV A,30H ANL A,#0FH ADD A,#30H MOV 31H,A MOV A,30H SWAP A ANL A,#0FH ADD A,#30H

MOV 32H,A SJMP $

2.若晶振为6MHz,试编制一个延时5ms的子程序。 MOV R0,#5 LP1:MOV R1,#124 LP2:NOP

NOP

DJNZ R1,LP2 DJNZ R0,LP1 RET

(((1+1+2)*124+1+2)*5+1+2)*2μs=4996μs

3.试编制一段程序,其功能是在P1.0输出周期大约为6MS,占空比为2:1的脉冲(设fose=12MHz)。

START: SETB P1.0

ACALL YS ACALL YS CPL P1.0

11

ACALL YS

SJMP START

Ys: MOV R0,#6 LP1: MOV R1,#249 LP2: NOP

NOP

DJNZ R1,LP2 DJNZ R0,LP1 RET

4.编程将片内20H单元开始的30个数传送到片外RAM3000H开始的单元中。

MOV R0,#20H MOV DTPR,#3000H MOV R1,#30 LP: MOV A,@R0

MOVX @DPTR,A INC R0 INC DPTR DJNZ R1 SJMP $

5.在片外2000H开始的单元中有100个有符号数,试编程统计其中正数、负数、零的个数的程序

MOV R0,#100

MOV DPTR,#2000H HUI: MOVX A,@DPTR

CJNE A,#00H,PT1

INC R1 JMP SSS

PT1: JNB ACC.7 ZHEN

INC R3 JMP SSS ZHEN:INC R2 SSS: INC DPTR

DJNZ R0,HUI SJMP $

6. 试设计数据块传送程序,将起始地址为0200H的100个连续单元中的内容送到以2000H为首址的区域中去。

MOV R7,#100 MOV P2,#20H MOV R0,#00H

MOV DTPR,#0200H

LOOP: MOVX A,@DPTR

MOVX @R0,A INC R0 INC DPTR

12

DJNZ R7,LOOP

SJMP $

7.设有两个长度为15的数组,分别存放在0200H和0500H为首址的存储区域中,试编写程序求其对应项之和,结果存放在以0600H为首址的存储区域中。

MOV R7,#15

MOV R0,#00H CLR C

LOOP:

MOV P2,,#02H MOVX A,@R0 MOV B,A MOV P2,#05H MOVX A,@R0 ADDC A,B

MOV P2,#06H MOVX @R0,A INC R0

DJNZ R7,LOOP SJMP $

8.分别用数据传送指令和位操作指令编写程序,将内RAM位寻址区的128位单元全部清零。

MOV R0,#20H

MOV R1,#0FH MOV A,#00H

LOOP: MOV @R0,A

INC R0

DJNZ R1,LOOP SJMP $

9.编程求内部RAM中40H~49H10个单元中的内容的平均值,并放人4AH单元中。

START:MOV R3,#0

MOV R4,#0

MOV MOV

LOOP: MOV

ADD

MOV

R2,#10 R0,#40H A,R3 A,@R0 R3,A

CLR A

ADDC A,R4

MOV R4,A INC R0

DJNZ R2,LOOP

;调用单字节无符号除法程序即可

13

10.设内部RAM中30H和31H单元中有2个带符号数,求出其中的大数存放在32单元中。

CLR C

MOV A,30H SUBB A,31H JZ XMAX

JB ACC.7,NEG JB SJMP

NEG: JB YMAX: MOV

SJMP

XMAX: MOV RMAX: MOV

OV,YMAX XMAX OV,XMAX A,31H RMAX A,30H 32H,A

RET

11.请用位操作指令编写下面逻辑表达式值的程序。 (1) P1.7=ACC.0∧ (B.0∨P2.1)∨P3.2 MOV C, B.0 ORL C, P2.1

ANL C, ACC.0 ORL C, P3.2

MOV P1.7,C

(2) PSW.5=P1.3∧ACC.2∨B.5∧P1.1 (3) P2.3=P1.5∧B.4∨ACC.7∧P1.0

12.使用位操作指令实现下列逻辑操作,但不得改变未涉及位的内容。 (1) 使ACC.0置“1” SETB ACC.0

(2) 清除累加器高4位 CLR ACC.7 CLR ACC.6 CLR ACC.5 CLR ACC.4 (3) 清除ACC.3,ACC.5,ACC.7位。

CLR ACC.7 CLR ACC.5 CLR ACC.3

13.试编程把片外RAM从2040H开始的连续50个单元的内容按降序排列,结果存入3000H开始的存储区中。

START;MOV R0,#50

MOV DPTR,#2040H MOV R1,#20H

A,@ DPTR

MOV @ R1,A INC DPTR

LOOP: MOVX

INC R1

DJNZ R0,LOOP

14

ACALL SORT

MOV DPTR,#3000H MOV R1,#20H

LOOP: MOV A ,@ R1 MOVX @ DPTR, A

INC DPTR INC R1

DJNZ R0,LOOP SJMP $

14.试编一查表程序,从首地址为2000H,长度为100的数据表中,查找出A的ASCII码,将其地址存入2010H和2011H单元中。

MOV R7,#100 MOV B,’A’

MOV DPTR,#2000H LOOP: MOVX A,@DPTR CJNE A,B,NFIND SJMP FIND RET

NFIND: INC DPTR DJNZ R7,LOOP FIND: MOV 2010H,DPL MOV 2011H,DPH

RET

15.设计一个多字节无符号数加法子程序和减法子程序。

N字节无符号数加法程序 ([R0]+[R1])=([R0]) ;入口: R0,R1,R7 ;占用资源: ACC,B

;出口: R0,CF NADDN: MOV B,R0 CLR C

NADN1: MOV A,@R0 ADDC A,@R1 MOV @R0,A INC R0 INC R1

DJNZ R7,NADN1 MOV R0,B RET

;N字节无符号数减法程序 ([R0]-[R1])=([R0]) ;入口: R0,R1,R7 ;占用资源: ACC,B ;出口: R0,CF NSUBN: MOV B,R0 MOV R7,N CLR C

15

NSUBN1 : MOV A,@R0 SUBB A,@R1 MOV @R0,A INC R0 INC R1

DJNZ R7,NSUBN1 MOV R0,B

RET 16.在128分支程序中是用AJMP指令实现分支转移的。若用长转移指令LJMP来代替AJMP指令,以便子程序入口地址可在64KB范围内安排。试修改原来的程序,使之能适应新的要求。?

修改后的程序最多能有256个分支

MOV DPTR,#JPTAB

MOV A,R1 MOV B,#03 MUL AB PUSH A MOV A,B ADD A,DPH

POP AJMP @A+DPTR

JPTAB: LJMP PROGRAM0

LJMP PROGRAM1

LJMP PROGRAMN

习题五

一、选择题

(1) MCS-51单片机中断源和可设置的中断优先等级分别为( B )。 A.中断源为2个,中断优先等级为2个 B.中断源为5个,中断优先等级为2个 C.中断源为4个,中断优先等级为1个

D.中断源为3个,中断优先等级为1个

(2) MCS-51单片机定时/计数器的方式0和方式1分别是( A )位定时/计数器。 A.13和16 B.16和13 C.8和16 D.16和8

(3) MCS-51单片机定时/计数器的最大定时时间是( B )(设时钟频率为6MHz)。 A.65.536ms B.131.072ms C.8.192ms D.16.384ms (4) MCS-51单片机定时/计数器方式l时,其最大的计数个数是( A )。 A.65536 D.65635 C.8192 D.256 (5) T1中断源的中断矢量地址是( D )。

A.0003H B.000BH C.0013H D.001BH (6) IE0是( C )的中断标志。

A.T0 B.T1 C.INT0 D.INT1

16

二.简答题

(1) 以方式0为例,说明MCS-51的定时/计数器实现计数和定时功能的基本原理。 以THi、TLi 16位中的13位(TLi的高3位未用)构成一个加1计数器,定时方式工作时,以主频12分频后的频率信号作为加1脉冲信号;计数方式工作时,以从外部接口送入的频率信号作为加1脉冲信号。

(2) 单片机8051内部有几个定时/计数器?它们由哪些专用寄存器组成?

单片机8051内部有2个定时/计数器;它们由TH0、TL0、TH1、TL1、TMOD、TCON专用寄存器组成。

(3) 单片机8051的定时/计数器有哪几种工作方式?各有什么特点?

单片机8051的定时/计数器有4种工作方式;工作方式0:13位计数器;工作方式1:16位计数器;工作方式2:初值可以自动重新装入的8位计数器;工作方式3:T0拆分成两个独立的8位计数器,占用了T1的有关引脚、控制位、中断,T1仍可工作在不需中断控制的工作方式0、工作方式1、工作方式2。

(4) 定时/计数器作为定时用时,其定时时间与哪些因素有关?作为计数用时,对输入信号频率有何限制?

定时/计数器作为定时用时,其定时时间与工作方式、初值、主频等因素有关,作为计数用时,对输入信号频率的限制是不允许超出主频的1/24,且高低电平的保持时间大于1个机器周期。

(5) 说明对MCS-51定时器进行初始化编程的步骤和内容。

① 向TMOD写入工作方式控制字。 ② 向计数器TLi、THi装入初值。

③ 置TRi=1,启动计数。

④ 若需要时,置ETi=1,允许定时/计数器中断。 ⑤ 置EA=1,CPU开中断。

(6) 8051单片机提供了几个中断源?有几级中断优先级别?各中断标志是如何产生的?又如何清除这些中断标志?各中断源所对应的中断矢量地址是多少?

8051单片机提供了5个中断源;有2级中断优先级别;各中断源所对应的中断矢量地址是0003H、000BH、0013H、001BH、0023H

(7) 试分析以下几种中断优先级的排列顺序(级别由高到低)是否可能?若可能,则应如何设置中断源的中断级别?否则,请简述不可能的理由。

① 定时器T0溢出中断,定时器T1溢出中断,外部中断INT0,外部中断INT1,串行口中断;

② 串行口中断,外部中断INT0,定时器T0溢出中断,外部中断INT1,定时器T1溢出中断;

③ 外部中断INT0,定时器T1溢出中断,外部中断INT1,定时器T0溢出中断,串行口中断;

④ 外部中断INT0,外部中断INT1,串行口中断,定时器T0溢出中断,定时器T1溢出中断;

⑤ 串行口中断,定时器T0溢出中断,外部中断INT0,外部中断INT1,定时器T1溢出中断;

⑥ 外部中断INT0,外部中断INT1,定时器T0溢出中断,串行口中断,定时器T1溢出中断;

⑦ 外部中断INT0,定时器T1溢出中断,定时器T0溢出中断,外部中断INT1,串行口中断。

17

(8) 外部中断有几种触发方式?如何选择?在何种触发方式下,需要在外部设置中断请求触发器?为什么?

(9) 利用定时器来测量单次正脉冲宽度,采用何种工作方式可获得最大的量程?设fosc=6MHz,求允许测量的最大脉宽是多少?

(10) 串行通信与并行通信各有什么优缺点,它们分别适用于什么场合? (11) 串行通信与并行通信相比各有何特点? (12) 串行通信有几种通信方式?

(13) 串行口有几种工作方式?它们各有什么特点?

(14) 设串行异步通信的传送速率为2400波特,传送的是带奇偶校验的ASCII码字符,每个字符包含10位(1个起始位,7个数据位,1个奇偶校验位,1个停止符),试问每秒最多可传送多少个字符? 三.应用题

1. 利用MCS-51定时器分别实现以下要求,说明实现方法,并编制程序。 ① T1工作于方式1或方式2,使P1.0脚输出周期为400μs的连续方波。 利用定时器T1方式2 定时,200μs引起一次中断 MAIN: MOV TMOD,#20H

MOV

MOV MOV SETB SJMP

TL1,#9CH TH1,#9CH IE,#88H TR1 $

ORG 001BH CPL P1.0 RETI

② 测量不等宽方波的高低电平持续时间TH和TL。

测量不等宽方波的高电平持续时间TH同例5.6程序

测量不等宽方波的低电平持续时间TL将例5.6程序改动如下 WAIT1: JNB

SETB

WAIT2: JB

P3.2,WAIT1 TR0

P3.2,WAIT2

WAIT2: JNB P3.2,WAIT3

③ 检测一段程序的执行时间(估计不大于2ms)。

利用T1工作于方式2定时,使周期为1μs引起一次中断,记录中断次数*1μs即为程序的执行时间。

ORG AJMP ORG

0000H MAIN 001BH INT

TMOD,#20H TL1,#FFH TH1,#FFH

AJMP MAIN: MOV

MOV MOV

MOV IE,#88H SETB TR1

(需检测的程序段) 18

CLR

INT:

SJMP ORG INC RETI

TR1 $

001BH R0或INC

DPTR

END

④ 为MCS-51扩展一个外部中断源。 参见例5.5 MAIN: MOV TMOD,#60H

MOV MOV MOV SETB

SJMP

TL1,#FFH TH1,#FFH IE,#88H TR1 $

⑤ 对外部脉冲记数,当记到100时,从P1.1脚输出一个正跳变。 利用定时器T1方式2对外部信号计数 MAIN: MOV

MOV MOV

MOV SETB SJMP ORG SETB NOP NOP CPL RETI

2.设系统有两个中断源,分别为外部中断INT0和串口,要求串口中断为优先,试编制它的初始化程序。

ORG AJMP ORG AJMP ORG AJMP ORG

0000H MAIN 0003H INT0 0023H SIO 0100H EA ES EX0 PS TMOD,#60H TL1,#9CH TH1,#9CH IE,#88H TR1 $

001BH P1.1

P1.1

MAIN: SETB SETB

SETB

SETB

SJMP

19

$

3.当定时器T0作在方式3时,由于TR1位已被T0占用,如何控制定时器T1的开启和关闭?

当定时器T0作在方式3时,定时器T1仍可设置为方式0、方式、方式2。但由于TR1、TF1以及T1的中断源已被定时器T0占用,此时定时器T1仅由控制位C/T切换其定时或计数功能,当计数器计满溢出时,只能将输出送往串口。

4.已知单片机系统时钟频率fosc=6MHz,若要求定时值分别为0.1ms、1ms和10m,定时器T0工作在方式0、方式1、方式2时,定时器对应的初值各为多少?

定时值为0.1ms时:

定时器T0工作在方式0时,对应的初值为8142(FEH 0EH) 定时器T0工作在方式1 时,对应的初值为65486(FFH CEH ) 定时器T0工作在方式2时,对应的初值为206(CEH) 定时值为1ms时:

定时器T0工作在方式0时,对应的初值为7692(F0H 0CH) 定时器T0工作在方式1 时,对应的初值为65036(FEH 0CH) 定时器T0工作在方式2时,无对应的初值 定时值为10m时:

定时器T0工作在方式0时,对应的初值为3192(63H 18H) 定时器T0工作在方式1 时,对应的初值为60536(ECH 78H) 定时器T0工作在方式2时,无对应的初值

5.已知单片机系统时钟频率fosc=6MHz,试编写程序,使P1.0输出如下的矩形脉冲(建议用定时器工作方式2)

P1.0 → 40μs

--→

←-- 360μs

ORG AJMP ORG

0000H MAIN 000BH CTC0 0100H

TMOD,#02H TL0,#236 TH0,#236 R0,#0 EA ET0 TR0 P1.0 $ P1.0 R0 R0,#10,RT P1.0 R0,#0

AJMP ORG MAIN: MOV

MOV

MOV MOV SETB SETB SETB SETB SJMP

CTC0: CLR INC

CJNE CPL MOV

20

RT: RETI

6.已知单片机系统时钟频率fosc=6MHz,试编写程序,利用定时器T0工作在方式3,使P1.0和P1.1分别输出周期为1ms和400μs的方波。

ORG 0000H

AJMP MAIN

ORG AJMP ORG AJMP ORG MOV MOV SETB SETB SETB SETB SETB SJMP

CTC250:CPL

MOV RETI CTC100:CPL

MOV RETI

000BH CTC250 001BH CTC100 0100H TMOD,#03H TL0,#6 TH0,#156 EA ET0 ET1 TR0 TR1 $ P1.0 TL0,#6 P1.1

TH0,#156

MAIN: MOV

7.将定时器T1设置为外部事件计数器,要求每计数100个脉冲,T1转为1ms定时方式,定时到后,又转为计数方式,周而复始。设系统时钟频率为6MHz,试编写程序。

ORG AJMP ORG

0000H MAIN 0050H JS100 0100H

TMOD,#01100000B TH1,#156 TL1,#156 EA ET1 TR1

TF1,NEXT1 LOOP1 TR1 DS1ms $

0200H

MAIN: SJMP

ORG

JS100: MOV

MOV

MOV SETB SETB

SETB

LOOP1: JB SJMP NEXT1: CLR

AJMP SJMP ORG

21

DS1ms: MOV

MOV MOV SETB SETB

TMOD,#00000000B TH1,#F0H TL1,#0CH EA ET1 TR1

TF1,NEXT2 LOOP2 TR1 JS100 $

SETB

LOOP2: JB SJMP NEXT2: CLR

AJMP SJMP END

8.设单片机系统时钟频率fosc=6MHz,现利用定时器T1方式2产生110bps波特率,试计算出定时器的初值。

依据公式: 波特率=2SMOD/32*T1溢出率 取SMOD=0

T1溢出率=1/(28—初值) 计算得出: 定时器的初值为114

9.由MCS-51单片机的串行口的方式1发送1,2,?,FFH等255个数据,试用中断方式编写发送程序(波特率为2400,fosc=12MHz)。

ORG 0000H

AJMP MAIN ORG 0100H

MAIN: MOV TMOD,#20H MOV TH1,#0F3H MOV TL1,#0F3H SETB EA SETB TR1 MOV MOV MOV MOV

PCON,#00H SCON,#50H A,#01H R5,#255

SETB TI SJMP $ ORG ACOUT: CLR MOV

0023H TI

SBUF,A

INC A

DJNZ R5,TNEXT CLR CLR TNEXT: RETI

22

ES TR1

END

10.设计一个单片机的双机通信系统,并编写通信程序。将甲机内部RAM 30H~3FH 存储区的数据块通过串行口传送到乙机内部RAM 40H~4FH存储区中去。

习题六

1.利用8051定时器的门控位测量某正脉冲高电平的宽度。已知正脉冲宽度小于10ms,fosc=12MHz。试编程测量脉宽,并把测试的结果转换为BCD码存入片内50H开始的连续单元中,十位和个位存入50H单元。

解:该题与[例5.6]类似。

分析:[例5.6] 当GATE=1、TR0=1,只有/INT0引脚上出现高电平时,T0才被允许计数。利用这一功能测试/INT0引脚上正脉冲的宽度(以机器周期数表示)。

设外部待测脉冲由/INT0 (P3.2)输入,T0工作在方式1,设置为定时状态,GATE置?1?,测试时,在/INT0端为?0?时置TR0 为?1?,当/INT0端变为?1?时启动计数; /INT0端再次变为?0?时停止计数。此时的计数值就是被测正脉冲的宽度。如下图所示:

/INT0 (P3.2) 对T0初始化 │←T0从0开始计数→│TR0←0,停止T0计数, TMOD←09H, 读出T0值

TR←1

程序如下: ORG

0000H

LJMP MAIN ORG 0100H

TMOD,#09H ;T0工作于方式1定时,GATE=1 TL0,#00H TH0,#00H P3.2, WAIT1

;等待P3.2变低 ;启动T0

;等待P3.2变高 ;等待P3.2再变低 ;T0停止计数

TR0 P3.2,WAIT2 P3.2,WAIT3 TR0

MAIN:

MOV MOV MOV WAIT1:JB SETB WAIT2:JNB WAIT3:JB

CLR

; 16位二进制数转换十进制数。

MOV MOV MOV MOV MOV

R7,TH0;存放计数值 R6,TL0 R5,#00H R4,#0AH R0,#50H 31H,#05 DDIV @R0,02H R0

MOV LOOP:

23

LCALL MOV INC

DJNZ SJMP

31H,LOOP $

DDIV: MOV A,R4 JNZ DDIV0 MOV A,R5

JZ DDIV0: MOV MOV MOV DDIV1:

CLR MOV RLC

MOV MOV RLC MOV MOV RLC MOV MOV RLC MOV MOV SUBB JC MOV MOV SUBB JC INC MOV MOV MOV DDIV2:

DJNZ

CLR

SJMP ERROR: SETB NEXT: RET

24

ERROR

R2,#00H R3,#00H R1,#16 C

A,R6 A R6,A A,R7 A R7,A A,R2 A R2,A A,R3 A R3,A A,R2 A,R4 DDIV2 30H,A A,R3 A,R5 DDIV2 R6 R3,A A,30H R2,A R1,DDIV1 F0 NEXT F0

END

2.试用中断技术设计一个秒产生电路,用于控制P1.0口的发光二极管LED闪亮,其闪烁频率为5Hz,设fosc=6MHz。

分析:利用定时/计数器产生5HZ时序信号。 5HZ频率的周期是:1/5hz=0.2s

1/2周期是:0.1s

当时钟频率是:fosc=6MHz时,机器周期为2微秒。

所以:0.1s = x .2微秒 ,x = 0.1s/2微秒 = 0.05乘以10的6 次方=50000 解:

定时器T0工作以方式1。

时间常数的初值是:65536-50000=15536 15536= 3CB0H TL0=0B0H TH0=3CH 程序清单:

ORG 0000H

LJMP MAIN

ORG 000BH;T0 LJMP TT0 ORG 0100H MAIN:

MOV SP,#30H MOV TMOD,#01H MOV TH0,#3CH MOV TL0,#0B0H SETB EA SETB ET0 SETB TR0 SJMP $ TT0:

MOV TH0,#3CH MOV TL0,#0B0H

CPL P1.0 RETI

END

3.完善6.1.1动态显示控制LED显示器的设计,编写程序使其能够输出显示年字符“2006”。

分析:由于显示的是固定的字符,所以直接选择字符的编码输出即可。

解:

ORG 0000H LJMP START ORG 0100H MOV A,#0FFH

;使4个LED均不亮

;‘6’的七段字形码输出

; 11111110B、LED0显示字符6

START:

MOV P3,A LP0: MOV P1,#7DH MOV P3,#0FEH

25

LCALL DELAY10MS MOV MOV ACALL MOV

P1,#3FH P3,#0F9H DELAY10MS P1,#05BH

;延时10MS

;‘8’的七段字形码输出

;11111001B、LED2、LED1显示字符0 ;延时10MS

;‘2’的七段字形码输出

;11110111B、LED2、LED1显示字符2 ;延时10MS ;重复

MOV P3,#0F7H ACALL DELAY10MS

LP0

AJMP DELAY10MS: LOOP0:

MOV R7,#5 MOV R6,#212 DJNZ R6,$ DJNZ R6,$ DJNZ R6,$ DJNZ R6,$

DJNZ R7,LOOP0

;2VS

RET END

4.试设计使用8751单片机外接8个七段LED显示器和8个BCD码拨盘的电路。并编写程序能够依次读入8个BCD码拨盘数据后存入片内30H~37H单元中,然后依次送LED显示器输出显示。

分析:

1、8个LED数码显示字段,由P1口输出。 2、8个位控制由P3口输出。

3、8个BCD码拨盘由P2口输入,8421分别接P2.3、P2.2、P2.1、P2.0。

4、8个拨盘的公共端分别为,A1~A8,由P0口控制位选通,分别对应P0.0~P0.7。 解1:

编程读入1#~8#BCD拨盘置入的数据,并将读入的数据存入片内RAM的30H~37H单元中。

输入子程序RDIN: RDIN: MOV MOV MOV RDIN10: MOV MOV MOV CPL

MOV INC

R7,#08H R0,#30H A,#0FEH R2,A P0,A A,P2 A

;读入次数计数

;片内RAM的首址送R0 ;选通1#拨盘, ;暂存R2中 ;输出位选控制信号 ;读入拨盘数据

;取反使之为高电平有效 ;存入片内RAM

;指向下一个RAM单元 ;指向下一个拨盘

@R0,A R0 A,R2 A

MOV RL

DJNZ R7,RDIN10 ;8个拨盘未读完转 RET ;读完返主

解2:

26

显示子程序DISPLAY:

数码管显示的数据存放在内存单元30H~37H中,每一地址单元内均为十进制BCD码。由于采用软件动态扫描实现数据显示功能,显示用十进制BCD码数据的对应段码存放在ROM表中。显示时,先取出30H~37H某一地址中的数据,然后查得对应的显示用段码从P1口输出。P3口将对应的数码管选中,就能显示该地址单元的数据值。

DISPLAY:MOV R0,#30H MOV R3,#0FEH MOV A,R3 LD10: MOV P3,A MOV

A,@R0

MOV DPTR,#TAB MOVC A,@A+DPTR MOV P1,A ACALL DL1MS INC R0

MOV A,R3

JB ACC.7,LD20 RL A MOV R3,A AJMP LD10 LD20: RET

TAB: DB 0C0H DB 0F9H DB 0A4H DB 0B0H DB 99H DB 92H DB 82H DB 0F8H DB 80H DB 90H DB 88H

DB

0FFH

DL1MS: MOV R6,#14H DL1: MOV R7,#19H DL2: DJNZ

R7,DL2

DJNZ R6,DL1

RET

解3:

主程序MAIN:

ORG 0000H LJMP MAIN ORG 0100H

27

;建立显示缓冲区首址 ;从右数第一位显示 ;描字放入A ;从P3口输出 ;取显示数据到A

;取段码表地址 ;查显示数据对应段码 ; 码放P1口 ;延时1ms

;指向下一地址

;ACC.7=0一次显示结束 ;A中数据循环左移 ;将位控码送R3保存 ;继续扫描 ;字形代码表0 ;字形代码表1 ;字形代码表2 ;字形代码表3 ;形代码表4 ;字形代码表5 ;字形代码表6 ;字形代码表7 ;字形代码表8 ;字形代码表9 ;字形代码表A ;

;1ms延时程序

MAIN:

LCALL RDIN LCALL DISPLAY END

说明:本程序进行了软件调试,若实际应用还需与硬件调试。

5.仿造6.2.1音乐门铃的电路,设计一个音乐盒,当打开音乐盒盖时,自动播放“祝你生日快乐”的乐曲。

解:对教材中120页的程序进行硬件联机调试,获得成功之后,将?祝你生日快乐?的相应初值替换原来乐曲的初值即可。

;时钟频率12mhz,产生?小星星?乐曲。

ORG 8000H LJMP MAIN ORG 800BH LJMP TT0 ORG 801BH LJMP TT1 ORG 8100H

MAIN:

MOV TMOD,#11H MOV DPTR,#TAB MOV IE,#8AH MOV TCON,#50H MOV R6,#00H

NEXT:

MOV R7,#00H MOV TH1,#3CH MOV TL1,#0B0H MOV A,R6

MOVC A,@A+DPTR JZ TOEND

MOV TH0,#0FEH MOV TL0,A CJNE R7,#08,$ INC R6 SJMP NEXT

TOEND:

CLR TR0 SJMP $

TT1:

INC R7 RETI

TT0:

CPL P3.4

28

;T0 ;T1 ;

;T1,T0方式1

;10001010BCPU允许中断,T0,T1允许中断。 ;TR0=1,TR1=1.

MOV TH0,#0FEH

MOV TL0,A MOV P1,A RETI

;?祝你生日快乐?的初值。 ;TAB: DB ~

6.完善6.2.3实时时钟中断的设计,使其具有自动记秒、分、时、日的功能,即记满60秒加1分钟,记满60分钟加1小时,记满24小时加1天。

29

MAIN 定义堆栈区 显示缓冲区单元清0 定时器0工作方式1 计数初值 定时开始 开中断 设置循环次数 调用显示子程序 图9.6 系统主程序流程图

DISPLAY 取十位数

30

使十位数占A高半字节 取个位数,并占A低半字节 加1 十进制调整 个位数送缓冲单元 把十位数交换到低半字节 十位数送缓冲单元 图 9.7 加1子程序流程

图9-8 中断服务程序流程

是否满8次 PITO 分值加1 现场保护 计数器重新加载 循环次数减1 是否60分 分显示缓冲单元清0 时值加1 秒加1 是否24小时 是否60秒 时显示缓冲单元清0 现场恢复 秒显示缓冲单元清0 返回

(1)主程序清单如下:

ORG LJMP ORG LJMP

0000H START 000BH INTT0

;程序执行开始地址 ;跳到标号START执行 ;定时器0中断程序入口 ;跳到标号INTT0执行 ;确立堆栈区

;显示缓冲区首地址 ;显示位数

ORG 0100H

START:MOV SP,#60H ;显示缓冲单元清0

MOV MOV MOV INC

R0,#79H R7,#06H

ML1: @R0,#00H

R0 R7,ML1 79H,#08 7AH,#05 7BH,#07 7CH,#05 7DH,#02 7EH,#02

DJNZ 调试用赋初值

MOV

MOV MOV MOV MOV MOV

31

MOV MOV MOV SETB SETB SETB MOV

TMOD,#01H TL0,#0DCH TH0,#0CH EA ET0 TR0 30H,#08H

;设置定时器0为方式1 ;装计数器初值 ;总中断开放 ;允许T0中断 ;开启T0定时器 ;(30H)计数溢出次数 ;调用显示子程序

ML0: LCALL DISPLAY SJMP ML0

(2)显示子程序。调试而加的程序。

数码管显示的数据存放在内存单元79H~7EH中,其中79H、7AH存放秒数据,79H秒个位,7AH秒十位。

7BH~7CH存放分数据,7DH~7EH存放时数据,每一地址单元内均为十进制BCD码。 由于采用软件动态扫描实现数据显示功能,显示用十进制BCD码数据的对应段码存放在ROM表中。

示时,先取出79H~7EH某一地址中的数据,然后查得对应的显示用段码从P1口输出。 P3口将对应的数码管选中,就能显示该地址单元的数据值。 DISPLAY:MOV R0,#79H ;建立显示缓冲区首址 LD0: LD1:

MOV MOV MOV MOV MOV MOVC

R3,#0FEH A,R3

;从右数第一位显示 ;扫描字放入A ;从P3口输出 ;取显示数据到A ;取段码表地址

;查显示数据对应段码 ;段码放P1口 ;延时1MS ;指向下一地址

;ACC.5=0一次显示结束 ;A中数据循环左移 ;将位控码送R3保存 ;继续扫描

P3,A A,@R0 DPTR,#TAB A,@A+DPTR

MOV P1,A ACALL DL10MS INC

R0

MOV A,R3 JNB ACC.5,LD1 RL MOV

A R3,A

AJMP LD0 RET

DL10MS:

MOV R5,#50 LOOP1:

MOV R7,#00

LOOP0:

MOV R6,#00 DJNZ R6,$;2VS DJNZ R6,$ DJNZ R6,$ DJNZ R6,$

32

DJNZ R6,$;2VS

DJNZ R7,LOOP0 DJNZ R5,LOOP1 RET

⑶ 中断服务程序(PITO)

中断服务程序的主要功能是进行计时操作。程序开始先判断计数溢出是否满了8次, 满8次表明还没达到最小计时单位秒,中断返回;如满8次则表明已达到最小计时单位秒,顺序继续向下执行,进行计时操作。中断服务程序流程如图9-8所示。

中断子程序清单: INTT0: PUSH ACC

PUSH PSW SETB PSW.3 MOV TL0,#0DCH MOV TH0,#0CH MOV A,30H

DEC A

MOV 30H,A JNZ RET0 MOV 30H,#08H MOV R0,#7AH ACALL DAAD1 MOV A,R2 XRL A,#60H

JNZ

RET0

ACALL CLR0 MOV R0,#7CH ACALL DAAD1 MOV A,R2 XRL

A,#60H JNZ RET0 ACALL CLR0

MOV R0,#7EH ACALL DAAD1 MOV A,R2 XRL

A,#24H JNZ RET0

ACALL CLR0 RET0: POP ACC POP PSW

RETI

⑷ 清缓冲单元子程序 CLR0: CLR A MOV @R0,A

33

1组通用寄存器

1

8次转移 8次开始计时 1

1后秒值在R2 60秒

60S显示单元清0 1 60分 60分显示单元清0 1 24小时 24小时清缓冲单元

0

;现场保护;选;计数器重新加载 ;循环次数减

;不满;满;秒显示缓冲单元;秒加;加;判是否到;不到转移;到;分显示缓冲单元地址;分加;判是否到;到;时显示缓冲单元地址;时加;判是否;到;现场恢复;中断返回;清缓冲单元子程序;十位数缓冲单元清

DEC R0 MOV @R0,A ;个位数缓冲单元清0 RET ;返回 (5) 加1子程序(DAAD1)

加1子程序用于完成对秒、分和时的加1操作,

中断服务程序中在秒、分、时加1时共有三处调用此子程序。加1子程序流程图如图9-7所示。

加1子程序清单:

DAAD1: MOV A,@R0

DEC R0 SWAP A ORL ADD DA

A,@R0 A,#01H A

;;R0= ;加1子程序,十位送A ;十位数占高4位 ;个位数占低4位 ;加1

;十进制调整

;全值暂存R2中

;屏蔽十位数,取个位数 ;个位值送显示缓冲单元

MOV R2,A ANL A,#0FH MOV @R0,A MOV INC ANL SWAP MOV RET DB DB

A,R2 R0

A,#0F0H A

;屏蔽个位数取出十位数 ;使十位数占低4位 ;十位数送显示缓冲单元 ;返回

;字形代码表0 ;字形代码表1 ;字形代码表2 ;字形代码表3 ;字形代码表4 ;字形代码表5 ;字形代码表6 ;字形代码表7 ;字形代码表8 ;字形代码表9 ;字形代码表A ;灭

TAB:

@R0,A 0C0H 0F9H 0A4H 0B0H 99H 92H 82H 0F8H 80H 90H 88H 0FFH

DB DB DB DB DB DB DB DB DB DB

END

说明:1、上述程序经过软件模拟调试成功,但未与硬件联调。

2、程序中没有日的加1计算。

7.设计一个单片机的双机通信系统。试变成将甲机片外RAM 8001H~9000H存储区的数据块通过串行口传送到乙机片外RAM 3001H~4000H存储区中去。要求发送和接收均采用中断方式。

解:用串行口工作方式1进行甲(发送)、乙(接收)两机的异步通信,串行通信的波特率定为1200bps。

34

定时器T1采用工作方式2,作为波特率发生器。由表5-1可知,fosc取11.059MHz时,定时器T1的初始值为0E8H,波特率为1200。

甲机发送:将甲机外部RAM首地址为8001H~9000H单元的数据块,通过串行口的发送端TXD发送到乙机。

乙机接收:接收来自串行输入端RXD的数据,将接收到的数据块依次存入乙机片外RAM 3001H~4000H存储区中。

;甲机发送程序

ORG LJMP ORG LJMP

ORG TRANSFER: MOV MOV MOV SETB CLR E CLR MOV SETB MOV MOV MOV MOV

SETB

TWAIT:

SJMP ;中断服务程序 TINT: MOV CLR

MOV

CLR

SUBS1:

MOV SUBB MOV MOV SUBB MOV ORL JNZ

35

0000H

TRANSFER 0023H TINT

0100H

TMOD,#20H TH1,#0E8H TL1,#0E8H EA

T1

ES PCON,#10H TR1 SCON,#10H R1,#00H R2,#10H

DPTR,#8001H ES

TWAIT X A,@DPTR

TI SBUF,A C A,R1 A,#1 R1,A A,R2 A,#00

R2,A A,R1

TNEXT

T1方式2

T1装入时间常数 T1中断 T1

1 1000H

;从数据块中取数

;定时器;定时器;禁止;关闭串行口中断;波特率不增倍;启动;置串口方式;数据块长度;数据块首地址;允许串行口中断;等待中断 ;清除串行口中断标志;发送数据;数据块未完,则继续

CLR ES

CLR

TR1

RETI TNEXT: INC DPTR RETI END

;乙机接收程序

ORG 0000H LJMP

RECEIVE ORG

0023H

LJMP RINT ORG 0100H

RECEIVE: MOV TMOD,#20H MOV TH1,#0E8H MOV TL1,#0E8H SETB EA

CLR ET1

CLR ES

MOV PCON,#00H SETB TR1 MOV R2,#10H MOV R1,#00H

MOV DPTR,#3001H

MOV

SCON,#50H SETB ES

RWAIT: SJMP

RWAIT

;中断服务程序 RINT: MOV A,SBUF CLR

RI

MOVX @DPTR,A SUBS1:

MOV A,R1 SUBB A,#1 MOV R1,A MOV A,R2 SUBB A,#00

MOV R2,A ORL A,R1

JNZ

RNEXT

36

;数据结束关中断 ;关定时器

;指向下一个数据单元

;定时器T1方式2 ;定时器T1装入时间常数

;禁止T1中断 ;关闭串行口中断 ;波特率不增倍 ;启动T1

;共接收1000H个字节数据;数据存放区首地址

;串行口方式1,允许接收 ;串行口中断允许 ;等待中断

;接收数据

;清除接收数据中断标志

;存放数据

;未完,则继续

CLR CLR

ES TR1

;接收数据已完成,关中断 ;关闭定时器T1

RETI RNEXT: INC

RETI END

DPTR ;指向下一个单元

37