Presentation is loading. Please wait.

Presentation is loading. Please wait.

《单片机原理与应用》电子教案 第1章 单片机概述 第2章 单片机的硬件结构 第3章 MCS-51单片机指令系统

Similar presentations


Presentation on theme: "《单片机原理与应用》电子教案 第1章 单片机概述 第2章 单片机的硬件结构 第3章 MCS-51单片机指令系统"— Presentation transcript:

1

2 《单片机原理与应用》电子教案 第1章 单片机概述 第2章 单片机的硬件结构 第3章 MCS-51单片机指令系统
第1章 单片机概述 第2章 单片机的硬件结构 第3章 MCS-51单片机指令系统 第4章 MCS-51单片机程序设计 第5章 中断与定时 第6章 存储器与存储器的扩展 第7章 单片机I/O接口的扩展 第8章 单片机与输入输出设备的接口 第9章 单片机的串行通信 第10章 单片机与A/D及D/A 转换器的接口 第11章 单片机应用系统设计

3 第1章 单片机概述 1.1 单片机的概念 1.2 单片幻灯片 15机的发展概况 1.3 MCS-51系列 1.4 AT89系列单片机
第1章 单片机概述 1.1 单片机的概念 1.2 单片幻灯片 15机的发展概况 1.3 MCS-51系列 1.4 AT89系列单片机 1.5 单片机的应用

4 第2章 单片机的硬件结构 2.1 MCS-51单片机的内部结构与信号引脚 2.2 MCS-51单片机的内部存储器
第2章 单片机的硬件结构 2.1 MCS-51单片机的内部结构与信号引脚 2.2 MCS-51单片机的内部存储器 2.3 MCS-51单片机的I/O口电路及功能 2.4 MCS-51单片机的时钟电路与时序 2.5 MCS-51的复位方式和复位电路 2.6 低功耗操作方式 2.7 AT89单片机的硬件结构

5 第3章 MCS-51单片机指令系统 3.1 指令系统概述 3.2 寻址方式 3.3 数据传送类指令 3.4 算术运算类指令
3.1 指令系统概述 3.2 寻址方式 3.3 数据传送类指令 3.4 算术运算类指令 3.5 逻辑运算及移位类指令 3.6 控制转移类指令 3.7 布尔操作类指令

6 第4章 MCS-51单片机程序设计 4.1 汇编语言概述 4.2 程序设计 4.3 常用程序设计

7 第5章 中断与定时 5.1 MCS-51单片机的中断系统 5.2 MCS-51单片机定时器/计数器 5.3 中断与定时器/计数器综合应用举例

8 第6章 存储器与存储器的扩展 6.1 单片机扩展存储器的设计 6.2 程序存储器的扩展 6.3 数据存储器的扩展
6.1 单片机扩展存储器的设计 6.2 程序存储器的扩展 6.3 数据存储器的扩展 6.4 同时扩展程序存储器和数据存储器

9 第7章 单片机I/O接口的扩展 7.1 I/O接口的直接应用 7.2 I/O接口技术概述 7.3 单片机简单I/O接口的扩展
A可编程并行I/O的扩展 A可编程并行I/O的扩展

10 第8章单片机与输入输出设备的接口 8.1 拨码盘接口 8.2 单片机与键盘的接口 8.3 LED显示器接口 8.4 LCD显示器的接口
8.1 拨码盘接口 8.2 单片机与键盘的接口 8.3 LED显示器接口 8.4 LCD显示器的接口 8.5 键盘/显示器专用接口芯片8279

11 第9章 单片机的串行通信 9.1 串行通信基本常识 9.2 MCS-51单片机的串行口及控制寄存器
9.1 串行通信基本常识 9.2 MCS-51单片机的串行口及控制寄存器 9.3 MCS-51单片机串行通信工作方式 9.4 多机通信

12 第10章单片机与A/D及D/A 转换器的接口 10.1 A/D及D/A转换器的性能指标 10.2 单片机与D/A转换器的接口

13 第11章 单片机应用系统设计 11.1 单片机应用系统设计 11.2 单片机应用系统的硬件电路 11.3 单片机应用系统的调试

14 1.什么叫单片机 它是把组成微型计算机的各功能部件:中央处理器CPU、随机存取存储器RAM、只读存储器ROM、I/O接口电路、定时器/计数器以及串行通信接口等制作在一块集成芯片中,构成一个完整的微型计算机。 单片机是单片微型计算机的简称。 单片机主要应用于控制领域,它的结构与指令功能都是按照工业控制要求设计的,故又称为微控制器(Micro Controller Unit)。在国际上,“微控制器”的叫法更通用些,在我国比较习惯“单片机”这一名称。 由于单片机在应用时通常是被控系统的核心并融入其中,即以嵌入的方式工作,为了强调其“嵌入”的特点,也常常将单片机称为嵌入式微控制器。

15 1.单片机的发展 单片机出现的历史并不长,它的产生与发展和微处理器的产生与发展大体上同步,经历了4个阶段:
第一阶段(1971~1974年):1971年11月美国Intel公司首先设计出集成度为2000只晶体管/片的4位微处理器Intel 4004,并且配有随机存取存储器RAM、只读存储器ROM和移位寄存器等芯片,构成第一台MCS-4微型计算机。1972年4月Intel公司又研制成功了处理能力较强的8位微处理器——Intel 8008。这些微处理器虽说还不是单片机,但从此拉开了研制单片机的序幕。 第二阶段(1974~1978年):初级单片机阶段。以Intel公司的MCS-48为代表。这个系列单片机内集成有8位CPU、并行I/O接口、8位定时器/计数器,寻址范围不大于4K,且无串行口。

16 第三阶段(1978~1983年):在这一阶段推出的单片机普遍带有串行口,有多级中断处理系统、16位定时器/计数器。片内RAM、ROM容量加大,且寻址范围可达64KB,有的片内还带有A/D转换器接口。这类单片机有Intel公司的MCS-51、Motorola公司的6801和Zilog公司的Z8等。这类单片机的应用领域极其广泛,这个系列的各类产品仍然是目前国内外产品的主流。其中MCS-51系列产品,以其优良的性能价格比,成为我国广大科技人员的首选。 第四阶段(1983年~现在):8位单片机巩固发展及16位单片机推出阶段。此阶段主要特征是一方面发展16位单片机及专用单片机;另一方面不断完善高档8位单片机,改善其结构,以满足不同的用户需要。

17 1.单片机的应用特性 (1)集成度高 MCS-51系列单片机代表产品为8051,8051内部包含4KB的ROM、128B的RAM、四个8位并行口、一个全双工串行口、两个16位定时器/计数器以及一个处理功能强大的中央处理器。 (2)系统结构简单 MCS-51系列单片机芯片内部采用模块化结构,增加或更换一个模块就能获得指令系统和引脚兼容的新产品。另一方面,MCS-51系列单片机具有64KB的外部程序存储器寻址能力和64KB的外部RAM和I/O口寻址能力。Intel公司标准的I/O接口电路和存储器电路都可以直接连到MCS-51系列单片机上以扩展系统功能,应用非常灵活。

18 (3)可靠性高 单片机产品和其他产品一样,出厂指标有军用品、工业品和商用品之分。其中军用品要求绝对可靠,在任何恶劣的环境下都能可靠工作,主要用于武器系统、航空器等方面。单片机属于工业品,能在常温下工作,不需要在温度恒定的机房内工作。由于单片机总线大多在芯片内部不易受干扰,而且单片机应用系统体积小,易于屏蔽,所以单片机的可靠性较高。 (4)处理功能强,速度快 MCS-51系列单片机指令系统中具有加、减、乘、除指令,各种逻辑运算和转移指令,还具有位操作功能。CPU时钟频率高达12MHz,单字节乘法和除法仅需要4μs,而且具有特殊的多机通信功能,可作为多机系统中的子系统。

19 2. 单片机的制造工艺 制造单片机的工艺只有两种:HMOS工艺和CHMOS工艺。
早期的MCS-51系列芯片都采用HMOS工艺,即高密度、短沟道MOS工艺。8051、8751、8031、8951等产品均属于HMOS工艺制造的产品。 CHMOS工艺是CMOS和HMOS的结合,除保持了HMOS工艺的高密度、高速度之外,还具有CMOS工艺低功耗的特点。例如HMOS工艺制造的8051芯片的功耗为630mW,而用CHMOS工艺制造的80C51芯片的功耗为120mW,这么低的功耗用一粒钮扣电池就可以工作。单片机型号中包含有“C”的产品就是指它的制造工艺是CHMOS工艺。 例如80C51,就是指用CHMOS工艺制造的8051。

20 3. MCS-51单片机系列产品 MCS-51是一个单片机系列产品,具有多种芯片型号。具体说,按其内部资源配置的不同,MCS-51可分为两个子系列和四种类型,见表1.1。 表1.1 MCS-51系列单片机 资源配置 子系列 片内ROM形式 片内ROM容量 片内RAM容量 定时器/计数器 中断源 ROM EPROM E2PROM MCS-51子系列 8031 8051 8751 8951 4KB 128B 2×16 5 MCS-52子系列 8032 8052 8752 8952 8KB 256B 3×16 6

21 MCS-51子系列包含4个产品,这4个产品具有不同的应用特性。
8051:单片机8051内部包含了4KB的ROM、128B的RAM、21个特殊功能寄存器、4个8位并行口、一个全双工串行口、两个16位定时器/计数器以及一个处理功能很强的中央处理器,是一台完整的微型计算机 8751:是以4KB的EPROM代替4KB ROM的8051。 8951:是以4KB的E2PROM(或Flash ROM)代替4KB ROM的8051。 8031:是内部无ROM的8051。单片机8031不构成完整计算机,必须外接EPROM作为程序存储器。 52子系列也包含4个产品,分别是51子系列的增强型。由于资源数量的增加,芯片的功能有所增强。片内ROM容量从4KB增加到8KB;RAM容量从128B增加到256B;定时器数目从2个增加到3个;中断源从5个增加到6个等。

22 4. 80C51单片机系列 80C51单片机系列是在MCS-51系列的基础上发展起来的。 最早推出80C51系列芯片的是Intel公司,并且作为MCS-51系列的一部分,按原MCS-51系列芯片的规则命名,例如80C51、80C31、87C51等(至于89C51,我们把它归入89系列单片机,将在下一节介绍)。 后来越来越多的公司生产80C51芯片,而且型号的命名已面目全非,功能上也做了不同程度的改进,如增加了A/D转换、高速I/O口等。有些还在总线结构上做了重大改进,出现了廉价的非总线型单片机芯片。但是万变不离其宗: CHMOS工艺芯片80C51/80C31/87C51/89C51的基本特征是低功耗、允许的电源电压波动范围较大(为5V±20%),并有三种功耗控制方式(增加了待机和掉电保护两种方式)。 习惯上,我们仍然把80C51系列作为MCS-51的子系列。

23 AT89系列单片机是ATMEL公司的8位Flash单片机系列。
这个系列单片机的最大特点是在片内含有Flash存储器,而其他方面和MCS-51没有太大的区别。该系列有着十分广泛的用途,特别是在便携式、省电和特殊信息保存的仪器和系统中显得更为有用。

24 AT89系列单片机的特点 (1)内含有Flash存储器
(2)和AT80C51插座兼容 AT89系列单片机的引脚和MCS-51系列单片机的引脚是一样的。只要用相同引脚的AT89系列单片机就可以取代MCS-51系列单片机。 (3)静态时钟方式 AT89系列单片机采用静态时钟方式,节省电能,这对于降低便携式产品的功耗十分有用。

25 2. AT89系列单片机的概况 AT89系列单片机共有7种型号,分别为AT89C51、AT89LV51、AT89C52、AT89LV52、AT89C2051、AT89C1051、AT89S8252。 其中AT89LV51、AT89LV52分别是AT89C51、AT89C52的低电压产品。最低电压可以低至2.7V。而AT89C2051、AT89C1051则是低档型的低电压产品。它们只有20条引脚,最低电压也为2.7V,见表1.2。

26 表1.2 AT89系列单片机概况 型 号 AT89C51 AT89C52 AT89C1051 AT89C2051 AT89S8252 Flash(KB) 4 8 1 2 片内RAM(B) 128 256 64 I/O(条) 32 15 定时器(个) 3 中断源(个) 6 9 串行接口(个) M加密/级 片内振荡器 EEPROM(KB)

27 1.单片机的应用 由于单片机具有可靠性高、体积小、价格低、易于产品化等特点,因而在智能仪器仪表、实时工业控制、智能终端、通信设备、导航系统、家用电器等自控领域获得广泛应用。例如: (1)智能仪器仪表 用单片机改造原有的测量、控制仪表,能促进仪表向数字化、智能化、多功能化、综合化、柔性化发展,如温度、压力、流量、浓度显示、控制仪表等。通过采用单片机软件编程技术,使长期以来测量仪表中的误差修正、线性化处理等难题迎刃而解。 (2)实时工业测控系统 用单片机可以构成各种工业控制系统、自适应系统、数据采集系统等。如温室人工气候控制、水闸自动控制、电镀生产线自动控制等。

28 (3)机电一体化产品 单片机与传统的机械产品结合,使传统机械产品结构简化、控制智能化。例如电传打字机的设计中由于采用了单片机,取代了近千个机械部件。 (4)家用电器 全自动洗衣机、智能冰箱、各类小家电都无一例外地采用了单片机。

29 2.单片机的应用特点: (1)控制系统在线应用 控制系统在线应用由于控制对象和单片机联系密切,所以对设计者提出了很高的要求。他们不但要熟练掌握单片机,还要了解控制对象,懂得传感技术,具有一定的控制理论知识等。 (2)软硬件结合 单片机应用系统的设计需要软、硬件统筹考虑。设计者不但要熟练掌握汇编语言的编程技术,而且还必须精通单片机硬件系统和指令系统。

30 (3)应用现场环境恶劣 应用现场的环境一般是比较恶劣的。电磁干扰、电源波动、高低温等因素都会影响系统工作的稳定。设计者必须根据特定的环境采取正确的办法才能解决。 (4)微控制技术 由于单片机具有高可靠性、超小型、低价格、容易产品化等特点,因而在需要嵌入式的控制系统里得到了广泛的应用,而且过去必须由模拟和数字电路来实现的大部分功能,现在可以通过软件(编程序)方法实现了。这种超小型的以软件取代硬件,并能提高系统性能的控制系统“软化”技术,称之为微控制技术。微控制技术是一种全新的概念,是对传统技术的一次革命。随着单片机应用的推广普及,微控制技术的发展必将带动产品的升级换代及产业升级。

31 习 题 1. 什么叫单片机?除了“单片机”之外,单片机还可以称为什么? 2. 单片机主要使用汇编语言,而编写汇编语言程序要求设计人员除了熟练掌握指令系统外,还必须精通什么? 、8751、8031单片机的主要区别是什么? 4. 与8051比较,80C51的最大特点是什么? 5. AT89系列单片机的最大优点是什么? 6. 单片机发展方向是什么?

32 2.1.1 MCS-51单片机的内部结构 1. 8位中央处理器(CPU)
(1)运算器电路 运算器电路是单片机的运算部件,用于实现算术和逻辑运算。图2.1中的ALU(算术逻辑单元)、ACC(累加器)、B寄存器、程序状态字和两个暂存寄存器等属于运算器电路。运算器电路以ALU为核心,基本的算术运算和逻辑运算均在其中进行,包括加、减、乘、除、增量、减量、十进制调整、比较等算术运算,与、或、非等逻辑运算,左、右移位和半字节交换等操作。运算和操作结果的状态由状态寄存器(PSW)保存。

33

34 (2)控制电路 控制电路是单片机的指挥控制部件,保证各部分能自动而协调地工作。图2.1中的PC(程序计数器)、PC加1寄存器、指令寄存器、指令译码器、定时和控制电路等均属于控制电路。 单片机执行指令是在控制电路的控制下进行的。首先从程序存储器中读出指令,送指令寄存器保存,然后送指令译码器进行译码,译码结果送定时控制逻辑电路,由定时控制逻辑电路产生各种定时信号和控制信号,再送到系统的各个部件进行相应的操作。这就是执行一条指令的全过程。 2. 内部程序存储器 内部程序存储器在图2.1中包括4KB/8KB的存储器(ROM或EPROM),对于8051、80C51内部共有4KB的掩膜ROM,用于存放程序和原始数据。

35 3. 内部数据存储器 内部数据存储器在图2.1中包括128B/256B的RAM和RAM地址锁存器等。实际上8051或80C51内部共有256个RAM单元,但后128单元被特殊功能寄存器SFR(也称专用寄存器)占用,供用户使用的只是前128个单元,用于存放可读写的数据。因此通常所说的内部数据存储器是指前128单元,简称“内部RAM”。 4. 并行的I/O口 MCS-51中共有4个8位的I/O口(P0、P1、P2、P3)以实现并行的输入输出。在图2.1中分别标出了4个并行的I/O口。

36 5. 定时器/计数器 出于控制应用的需要,MCS-51有2个(对8031/8051是2个)或3个(对8032/8052是3个)16位定时器/计数器,以实现定时或计数功能,并以定时或计数的结果对单片机进行控制。图2.1中定时器/计数器和中断、串行端口在一起。 6. 串行口 MCS-51有一个全双工UART(通用异步接收发器)的串行口,以实现单片机和其他数据设备之间的串行数据传送。该串行口功能较强,既可作为全双工UART异步通信收发器使用,又可以作为同步移位器使用。在图2.1中串行端口和定时器/计数器中断在一起。

37 8. 时钟电路 MCS-51单片机芯片内部有时钟电路,但石英晶体振荡器和微调电容需外接。在图2.1中,画出了外接的石英晶体振荡器和微调电容以及片内的反向放大器振荡电路。时钟电路为单片机产生时钟脉冲序列,典型的晶振频率为6MHz或12MHz。 9. 位处理器 单片机主要用于控制,需要有较强的位处理能力。位处理器又称布尔处理器。位处理器以状态寄存器中的进位标志C为累加位,可进行置位、复位、取反、等于“0”转移、等于“1”转移以及C与可寻址位之间的传送、逻辑与、逻辑或等位操作。位操作是通过运算器实现的,在图2.1中没有画出。

38 10. 总线 上述9个部件都通过片内单一总线连接。系统的地址信号、数据信号、控制信号都是通过总线传送的。总线结构减少了单片机的连线和引脚,提高了集成度和可靠性。

39 MCS-51单片机的信号引脚 HMOS制造工艺的MCS-51单片机都采用40引脚的双列直插封装(DIP方式),CHMOS制造工艺的80C51/80C31芯片除采用DIP方式外,还采用方形封装工艺。如图2.2所示。图2.2(a)、图2.2(b)分别是DIP方式和方形封装的引脚图,其中方形封装CHMOS芯片有44脚,但其中4只脚(标有NC的引脚1、12、23、34)是不使用的。

40

41 1. 主电源引脚Vcc和Vss 2. 外接晶体引脚XTAL1和XTAL2 下面将这40条引脚按功能分为四部分叙述其功能。
XTAL1(19脚):接外部晶体的一个引脚。在单片机内部,它是一个反相放大器的输入端,这个放大器构成了片内振荡器。当采用外部振荡器时,对HMOS单片机,此引脚应接地;对CHMOS单片机,此引脚作为驱动端。 XTAL2(18脚):接外部晶体管的另一个引脚。在单片机内部,接至上述振荡器的反相放大器的输出端。当采用外部振荡器时,对于HMOS单片机,此引脚应接外部振荡器的信号,即把外部振荡器的信号直接接到内部时钟发生器的输入端;对于CHMOS单片机,此引脚应悬浮。

42 3. 控制或其他电源复用引脚RST/VPD、ALE/PROG、PSEN、EA/VPP
RST/VPD(9脚):振荡器运行时,在此引脚上出现两个机器周期的高电平使单片机复位。建议在此引脚与Vss之间连接一个约8.2kΩ的下拉电阻,与Vcc引脚之间连接一个约10μF的电容,以保证可靠的复位(详见复位电路内容)。Vcc掉电期间,此引脚可接上备用电源,以保持内部RAM的数据不丢失。 ALE/ PROG(30脚):当访问外部存储器时,ALE(允许地址锁存)的输出用于锁存地址的低位字节。即使不访问外部存储器,ALE端仍然以不变的频率周期性地出现正脉冲信号,此频率为振荡器的1/6。因此,它可以用作对外输出的时钟,或用于定时。 对于EPROM型的单片机(如8751),在EPROM编程期间,此引脚用于输入编程脉冲。

43 PSEN(29脚):此引脚的输出是外部程序存储器的读选通信号。在从外部程序存储器取指令(或常数)期间,每个机器周期它二次有效。但在此期间,每当访问外部数据存储器时,这二次有效信号将不出现。它同样可以驱动(吸收或输出电流)8个LS型的TTL输入电路。 EA/VPP(31脚):当这引脚保持高电平时,访问内部程序存储器,但在PC(程序计数器)值超过0FFFH(对8051/8751)或1FFFH(对8052)时将自动转向执行外部程序存储器内的程序。当这引脚保持低电平时,则只访问外部程序存储器。 对于8031来说,无内部程序存储器,端口必须保持低电平,即接地,才能只选择外部程序存储器。对于EPROM型的单片机(如8751),在EPROM编程期间,此引脚也用于施加21V的编程电源(VPP)。

44 4. 输入/输出(I/O)引脚P0、P1、P2、P3(共32根)
P0口(39脚~32脚):是双向8位三态I/O口,在外接存储器时,与地址总线的低8位及数据总线复用,能以吸收电流的方式驱动8个LS型的TTL输入负载。 P1口(1脚~8脚):是准双向8位I/O口。由于这种接口输出没有高阻状态,输入也不能锁存,故不是真正的双向I/O口。P1口可以驱动(吸收或输出电流)4个LS型的TTL负载。对于8052、8032,P1.0引脚的第二功能为T2定时器/计数器的外部输入,P1.1引脚的第二功能为T2的外部控制端。对EPROM编程和程序验证期间,它接收低8位地址。

45 P2口(21脚~28脚):是准双向8位I/O口。在访问外部程序存储器时,它可以作为扩展电路高8位地址总线送出高8位地址。在对EPROM编程和程序验证期间,它接收高8位地址。P2口可以驱动(吸收或输出电流)4个LS型的TTL输入负载。 P3口(10脚~17脚):是准双向8位I/O口,在MCS-51中,这8个引脚还用于专门功能,是复用双功能口。P3口可以驱动(吸收或输出电流)4个LS型的TTL输入负载。作为第一功能使用时,为普通I/O口,功能和操作方法与P1口相同。作为第二功能使用时,各引脚的定义见表2.2。值得强调的是,P3口的每一条引脚均可独立定义为第一功能的输入输出或第二功能。

46 表2.1 P3口线的第二功能定义 口线 引脚 功能 P3.0 10 RxD(串行输入口) P3.1 11 TxD(串行输出口) P3.2 12 (外部中断0) P3.3 13 (外部中断1) P3.4 14 T0(定时器0外部输入) P3.5 15 T1(定时器1外部输入) P3.6 16 (外部数据存储器写脉冲) P3.7 17 (外部数据存储器读脉冲)

47 内部数据存储器低128单元 片内RAM(内部数据存储器)的地址范围是00H~FFH。内部数据存储器低128单元的地址范围是00H~7FH。分三个区。 (1)工作寄存器区 00H~1FH单元共32B,是4个通用工作寄存器组,每组含8个寄存器(R0~R7)。切换CPU的工作寄存器组,只要CPU执行一条单周期指令改变程序状态字PSW(特殊功能寄存器)的第3、4位,见表2.2。若程序中不需要4组工作寄存器,那么剩下的工作寄存器组所对应的单元也可以作一般的数据缓冲器使用。

48 表2.2 工作寄存器组的选择 PSW.4(RS1) PSW.3(RS0) 当前使用的工作寄存器组R0~R7 0组(00H~07H) 1
表2.2 工作寄存器组的选择 PSW.4(RS1) PSW.3(RS0) 当前使用的工作寄存器组R0~R7 0组(00H~07H) 1 1组(08H~0FH) 2组(10H~17H) 3组(18H~1FH)

49 (2)位寻址区 20H~2FH单元共16个字节。这16个RAM单元具有双重功能。它们既可以像普通RAM单元一样按字节存取,也可以单独存取,这就是位寻址。20H~2FH单元用作位寻址时,共有16×8=128位,每位分配了一个特定的地址,即00H~7FH,这些地址称为位地址,如图2.3所示。位地址在位寻址时使用。例如:把24H单元中最高位(位地址为27H)置位成1,则可以使用如下置位指令: SETB 27H ; 27H ←1,SETB为置位指令的操作码 位地址的另一种表示方法是采用字节地址和位地址结合的表示方法。位地址05H可以表示成20H.5。

50 (3)用户数据区 30~7FH总共有80个RAM单元,存放用户数据或作堆栈操作使用。中断系统中的堆栈一般都设在这一区域内,MCS-51对用户数据区中的每个RAM单元是按字节存取的。

51

52 内部数据存储器高128单元 在MCS-51系列单片机中,内部RAM的高128单元是供给特殊功能寄存器SFR(Special function register)使用的。所谓特殊功能寄存器是指有特殊用途的寄存器集合,也称专用寄存器。它们位于片内数据存储器之上,离散地分布在80H~FFH的地址空间范围内。 特殊功能寄存器的实际个数和单片机的型号有关:8051或8031的SFR有21个,8052的SFR有26个。 它们在80H~FFH的地址空间范围内,不为SFR占用的RAM单元实际并不存在,访问它们是没有意义的。表2.3列出了这些SFR的助记符号、名称和地址。

53 表2.3 特殊功能寄存器地址映像表 符号 名称 地址 P0# P0锁存器 80H P1# P1锁存器 90H SP 堆栈指针 81H
表2.3 特殊功能寄存器地址映像表 符号 名称 地址 P0# P0锁存器 80H P1# P1锁存器 90H SP 堆栈指针 81H SCON# 串行口控制寄存器 98H DPL 数据指针低位字节 82H SBUF 串行数据缓冲器 99H DPH 数据指针高位字节 83H P2# P2锁存器 A0H PCON 电源控制及波特率选择 87H IE# 中断允许寄存器 A8H TCON# 定时器/计数器控制寄存器 88H P3# P3锁存器 B0H TMOD 定时方式选择寄存器 89H IP# 中断优先级寄存器 B8H TL0 定时器/计数器0低位字节 8AH B# B寄存器 F0H TL1 定时器/计数器1低位字节 8BH PSW# 程序状态寄存器 D0H TH0 定时器/计数器0高位字节 8CH ACC# 累加器 E0H TH1 定时器/计数器1高位字节 8DH

54 1. 特殊功能寄存器 下面简单介绍SFR块中的部分寄存器,其他SFR寄存器将在有关章节中介绍。 (1)程序计数器PC
程序计数器PC用于存放下一条要执行的指令地址,是一个16位专用寄存器,可寻址范围为0~65535(64K)。PC在物理上是独立的,不属于SFR。 (2)累加器A 累加器A是一个最常用的专用寄存器,属于SFR,也称ACC。大部分单操作数指令的操作数取自累加器,很多双操作数指令的一个操作数取自累加器,加、减、乘、除算术运算指令的运算结果都存放在累加器A或A和B寄存器中。

55 (3)B寄存器 在乘除指令中,用到了B寄存器。乘除指令的两个操作数分别取自A和B,其结果存放在A和B寄存器中。例如除法指令中,被除数取自A,除数取自B,商数存放于A,余数存放于B。 (4)堆栈指针SP 堆栈指针SP是一个8位专用寄存器。它指示出堆栈顶部在内部RAM块中的位置。系统复位后,SP初始化为07H,使得堆栈事实上由08H单元开始。08H~1FH单元分别属于工作寄存器组1~3,在程序设计中用到这些区,最好把SP值改置为1FH或更大的值。MCS-51的堆栈是向上生成的,若SP=60H,CPU执行一条调用指令或响应中断后,PC进栈,PCL保护到61H,PCH保护到62H,SP=62H。

56 (5)数据指针DPTR 数据指针DPTR是一个16位的SFR,其高字节寄存器用DPH表示,低字节寄存器用DPL表示。DPTR可以作为一个16位的寄存器DPTR来用,也可以作为两个独立的8位寄存器DPH和DPL来用。 (6)程序状态字(PSW——Program status word) 程序状态字是一个8位的寄存器用于寄存指令执行的状态信息。其中有些位状态是根据指令执行结果,由硬件自动设置的,而有些位状态则是用软件方法设定的。PSW的位状态可以用专门的指令进行测试,也可以用指令读出。一些条件转移指令将根据PSW中有关位信息来进行程序转移。PSW的各位定义如下:

57 表2.4 PSW各位的定义 位 序 PSW.7 PSW.6 PSW.5 PSW.4 PSW.3 PSW.2 PSW.1 PSW.0 位标志
位 序 PSW.7 PSW.6 PSW.5 PSW.4 PSW.3 PSW.2 PSW.1 PSW.0 位标志 CY AC F0 RS1 RS0 OV / P

58 除PSW.1位保留未用外,对其余各位的定义及使用介绍如下:
① CY或C(PSW.7)——进位标志位。CY(或C)是PSW中最常用的标志位,其功能有二:一是存放算术运算的进位标志;二是在位操作中,作累加位使用。在位传送、位与、位或等操作中,都要使用进位标志位。 ② AC(PSW.6)——辅助进位标志位。在加减运算中,当有低4位向高4位进位或借位时,AC由硬件置位,否则AC位被清“0”。在进行十进制数运算时需要十进制调整,此时要用到AC位状态进行判断。 ③ F0(PSW.5)——用户标志位。这是一个由用户自定义的标志位,用户根据需要用软件方法置位或复位。例如用它来控制程序的转向。

59 ④ RS1和RS0(PSW. 4和PSW. 3)——寄存器组选择位。它用于设定当前通用寄存器的组号。通用寄存器共有4组,其对应关系见表2
⑤ OV(PSW.2)——溢出标志位。 在带符号数的加减运算中,OV=1表示加减运算结果超出了累加器A所能表示的符号数有效范围(-128~+127),因此运算结果是错误的。 在乘法运算中,OV=1表示乘积超过255,即乘积分别在寄存器B与A中;反之,OV=0表示乘积只在A中。 在除法运算中,OV=1表示除数为0,除法不能进行;反之OV=0,表示除数不为0,除法能正常进行。

60 ⑥ P(PSW.0)——奇偶标志位。其表明累加器A中1的个数的奇偶性,在每个指令周期由硬件根据A的内容对P位进行置位或复位,若1的个数为奇数,P=1,反之P=0。
(7)专用寄存器字节寻址 访问SFR块时,只能采用直接寻址方式。在操作过程中必须注意以下几点: ① 21个可字节寻址的专用寄存器是离散分布在128个单元中的。 ② 程序计数器PC是不可寻址的。PC不占据RAM,它在物理上是独立的。 ③ 对专用寄存器只能采用直接寻址方式。书写时,既可以使用寄存器符号,也可以使用寄存器单元地址。

61 (8)专用寄存器位寻址 课本16页:表2.3列出了可以进行位寻址的11个专用寄存器。下面详细介绍这11个可以进行位寻址的专用寄存器的位地址。表2.5列出了相关寄存器的位地址。表中所列全部专用寄存器可寻址的位共83位(8032/8052特有的T2CON除外)。这些位都是有专门用途的。这样,加上低128单元位寻址区的128位,在MCS-51的内部RAM中共有128+83=211个可寻址位。

62 2.2.3 堆栈 堆栈是一种数据结构。所谓堆栈就是只允许在其一端进行数据插入和数据删除操作的线性表。其结构如图2.4所示。
堆栈 堆栈是一种数据结构。所谓堆栈就是只允许在其一端进行数据插入和数据删除操作的线性表。其结构如图2.4所示。 图2.4 堆栈示意图

63 1. 堆栈的功能 2. 堆栈的开辟 堆栈是为了子程序调用和中断操作而设立的,其作用有两个:保护断点和保护现场。
早期的微型计算机多在主存储器中开辟堆栈,称为外堆栈。主要优点是容量大,可看作是无限的,但速度慢。另一类堆栈称为内堆栈。所谓内堆栈就是在CPU芯片的寄存器中开辟堆栈。MCS-51的堆栈就开辟在内部RAM中。内堆栈的优点是速度快,但堆栈的容量有限。这种限制反映在单片机上的表现就是:限制了高级语言的使用。因为在高级语言中,除了中断和子程序的调用外,参数的传递也是靠堆栈的操作来实现的。

64 3. 堆栈指示器 堆栈共有两种操作:进栈和出栈。
但不论是数据进栈还是出栈,都是对堆栈的栈顶单元进行的,即对堆栈栈顶单元的写和读操作。为了指示栈顶地址,所以要设置堆栈指示器SP。SP的内容就是堆栈栈顶的存储单元地址。 MCS-51单片机由于堆栈设在内部RAM上,因此SP是一个8位寄存器。实际上SP就是专用寄存器的一员。系统复位后,SP的内容为07H,但由于堆栈最好在内部RAM的30H~7FH单元中开辟,所以在程序设计时,应注意把SP值初始化为30H。SP的内容一旦确定,栈顶的位置就确定了。

65 4. 堆栈类型 5. 堆栈使用方法 向上生长型和向下生长型。MCS-51的堆栈是向上生长的。
① 调用子程序或中断时,返回地址(断点)自动进栈。程序返回时,断点再自动弹回PC。 ② 使用专用的堆栈操作指令,进行进出栈操作。保护现场(PUSH);恢复现场(POP)。

66 内部程序存储器 MCS-51单片机的程序计数器PC为16位,因此可以寻址的地址空间为64KB。8051和8751单片机内部有4KB字节ROM/EPROM程序存储器(0000H~0FFFH),1000H~FFFFH是外部扩展程序存储器地址空间。而8052单片机内部有8KB ROM程序存储器,同样可以扩展到64KB。在64KB程序存储器中,有6个地址单元具有特殊功能。 1. 程序计数器PC MCS-51单片机在复位后PC的内容为0000H,所以系统必须从0000H开始取指令,执行程序。因为0000H是系统的启动地址,所以用户在设计程序时,一般会在这一单元中存放一条绝对跳转指令,而主程序则从跳转到的新地址处开始存放。

67 2. 中断源 除0000H外,其余5个特殊功能单元分别对应6种中断源的中断服务子程序的入口地址,见表2.6。通常在程序设计时会在这些入口地址处都安放一条绝对跳转指令,而真正的中断服务子程序从转移地址开始安放。 表2.6 中断源入口地址 中断源 入口地址 外部中断0 0003H 定时器0溢出中断 000BH 外部中断1 0013H 定时器1溢出中断 001BH 串行口中断 0023H

68 MCS-51存储器的结构 物理上,MCS-51单片机有4个存储器空间:片内程序存储器、片外程序存储器、片内数据存储器、片外数据存储器。从用户使用的角度看,MCS-51单片机有3个存储器地址空间:片内外统一的64KB的程序存储器地址空间、片内数据存储器(其中128B的特殊功能寄存器地址空间仅有20几个字节是有实际定义的)、片外64KB数据存储器地址空间。在访问这3个不同的逻辑空间时应采用不同的指令形式。MCS-51单片机存储器的结构如图2.5所示。 如图2.5所示,MCS-51数据存储器与程序存储器全部64KB地址重叠,且数据存储器的片内外的低128B地址重叠。所以对片内外数据存储器的操作使用了不同的指令,这样就不会发生混乱。而程序存储器和数据存储器的区分是靠引脚PSEN、RD、WR、EA控制的。 另外,在片外数据存储器中,数据区与扩展的I/O口统一编址,因此,用户在应用系统设计时,所有的外围接口地址均占用外部RAM地址单元。

69 a)程序存储器 (b)内部数据存储器 (c)外部数据存储器
图2.5 MCS-51单片机存储器结构

70 如2.1.2所介绍的,MCS-51单片机有4个双向的8位I/O口P0~P3,实际上它们已经被归入特殊功能寄存器之列。P0口负载能力为8个TTL电路,P1、P2、P3口负载能力为4个TTL电路。在单片机中,口是一个集数据输入缓冲、数据输出驱动及锁存等多项功能于一体的I/O电路。4个口在电路结构上基本相同,但又各具特点,因此在功能和使用上各口之间有一定的差异。下面分别讨论4个双向的8位I/O口的电路及功能。

71 2.3.1 P0口 P0口的字节地址为80H,位地址为80H~87H。口的各位口线具有完全相同,但又相互独立的逻辑电路,如图2.6所示。

72 P0口逻辑电路的主要内容包括: ① 一个数据输出锁存器,用于进行数据位的锁存。 ② 两个三态输入缓冲器,分别用于锁存器数据和引脚数据输入的缓冲。 ③ 一个多路转接开关MUX,它的一个输入来自锁存器,另一个输入为“地址/数据”。输入转接由“控制”信号控制。之所以设置多路转接开关,是因为P0口既可以作为通用的I/O口进行数据的输入输出,又可以作为单片机系统的地址/数据线之间的接通转接。 ④ 数据输出的驱动和控制电路,由两只场效应管(FET)组成,上面的那只场效应管构成上拉电路。

73 在实际应用中,P0口大多数情况下都是作为单片机系统的地址/数据线使用。当传送地址或数据时,CPU发出控制信号,打开上面的与门,并使多路转接开关MUX处于内部地址/数据线与驱动场效应管栅极反向接通状态。这时的输出驱动电路由上下两只场效应管形成推拉式的电路结构,大大提高了负载能力。当输入数据时,数据信号直接从引脚通过输入缓冲器进入内部总线。

74 当P0口作为输入口(读)使用时,应区分读引脚和读端口(锁存器)两种情况。为此在口电路中有两个用于读入的三态缓冲器。所谓读引脚,就是读芯片引脚上的数据,也就是直接读外部数据,这时使用下面的三态缓冲器,由“读引脚”信号把三态缓冲器打开,引脚上的数据经三态缓冲器通过内部总线读进来。但要注意,必须先向电路的锁存器写入“1”,使FET截止,以避免锁存器为“0”状态时对引脚读入的干扰。而读端口则通过上面的三态缓冲器把锁存器Q端的状态读进来。 当P0口作为输出口(写)使用时,由锁存器和驱动电路构成数据输出通路。由于通路中已有输出锁存器,因此数据输出可以与外设直接连接,无需再加数据锁存电路。进行数据输出时,来自CPU的写脉冲加在D触发器的CP端,数据写入锁存器,并向端口引脚输出。但要注意,由于输出电路是漏极开路电路,必须外接上拉电阻才能有高电平输出。

75 P1口 P1口的地址为90H,位地址为90H~97H。P1口的口线逻辑电路如图2.7所示。P1口只能作为通用的I/O口使用,所以在电路结构上和P0口不同主要表现为:

76 ① 它只传送数据,所以不需要多路转接开关MUX。
② 因为只用来传送数据,因此输出电路中有上拉电阻,且上拉电阻和场效应管共同组成了输出驱动电路。 P1口作为输出口使用时,已能提供推拉电流负载,外电路无需再接上拉电阻。 P1口作为输入口使用时,应先向其锁存器写入“1”,使输出驱动电路的场效应管截止。

77 P2口 P2口的字节地址为0A0H,位地址为0A0H~0A7H。P2口的逻辑电路如图2.8所示。

78 在实际使用中,P2口用于为系统提供高位地址,但不作为数据线使用,所以P2口和P0口既有共同点,又有不同点。
共同点:在口电路中有一个多路转换开关MUX。用于口线作为通用的I/O口进行数据的输入输出和作为单片机系统的地址/数据线之间的接通转接。 不同点:P2口只作为高位地址线使用,不作为数据线使用,所以多路转换开关MUX的一个输入端不再是“地址/数据”,而是单一的“地址”。

79 P3口 P3口的字节地址为0B0H,位地址为0B0H~0B7H。P3口的逻辑电路如图2.9所示。

80 虽然P3口可以作为通用I/O口使用,但在实际使用中它的第二功能信号更为重要。为适应引脚信号第二功能的需要,在口电路中增加了第二功能控制逻辑。由于第二功能信号有输入和输出两类,因此我们分两种情况说明。

81 I/O口的读—修改—写操作 由图2.6~图2.9可见,每个I/O口均有两种读入方法,即读锁存器和读引脚,并有相应的指令。读锁存器指令是从锁存器中读取数据,进行处理,并把处理后的数据重新写入锁存器中,这类指令叫读—修改—写指令。例如在ANL、ORL、XRL;INC、DEC;DJNZ;MOV;CLR、SETB等指令中,当目的操作数为某一I/O口或某一I/O口的某一位时这些指令均为读—修改—写指令。 读引脚指令一般都是以I/O端口为原操作数的指令,执行读引脚指令时打开三态门输入口状态。例如读P1口的输入状态时,读引脚指令为: MOV A,P1

82 根据I/O口的结构及CPU的控制,当执行读引脚操作后,口锁存器的状态应与引脚的状态相同;但当给口锁存器写入某一状态后,相应的口引脚是否呈现锁存器状态与外电路的连接有关。例如用I/O口线驱动三极管的基极时,该口线的位锁存器写入“1”后使三极管导通,而三极管一旦导通后,基极电平为“0”。如果该口线无读引脚操作时,口锁存器与引脚的状态不一致。 执行改写锁存器数据的指令时,在该指令的最后一个时钟周期S6P2里将数据写入锁存器。由于输出缓冲器仅仅在每一个状态周期的相位1(P1)期间采样口锁存器,因而锁存器中的新数据在下一个状态周期的相位出现之前是不会出现在输出线上的。

83 I/O口的负载能力及接口要求 前面我们已经详细分析了I/O的逻辑电路。MCS-51单片机有4个双向的8位I/O口P0~P3,实际上它们已经被归入特殊功能寄存器之列。P0口为三态双向口, P1、P2、P3口为准双向口(用作输入时,口线被拉成高电平,故称为准双向口)。由于其电路结构和使用的功能和特点有所不同,因而负载能力及接口要求也有所区别。 P0口:输出驱动电路由于上下两只场效应管,形成推拉式的电路结构,因而负载能力较强,能以吸收电流的方式驱动8个LS型的TTL输入负载。在实际应用中,P0口经常作地址总线的低8位及数据总线复用口。在接口设计时,对于74LS系列、CD4000系列及一些大规模集成电路芯片(如8155、8255、AD574等)都可以直接接口;对于一些线性元件,特别是键盘、码盘及LED显示器等,应尽量加驱动部分。

84 P1口:从电路结构可知,P1口的负载能力不如P0口。能以吸收或输出电流的方式驱动4个LS型的TTL负载。在实际应用中,P1口经常用作I/O扩展口。在接口设计时,对于74LS系列、CD4000系列及一些大规模集成电路芯片(如8155、8255、MC14513等)都可以直接接口;对于一些线性元件,特别是键盘、码盘及LED显示器等,应尽量加驱动部分。 P2口:由电路结构可见,P2口的负载能力不如P0口,但和P1口一样。能以吸收或输出电流的方式驱动4个LS型的TTL负载。在实际应用中,P2口经常用作高8位地址和I/O口扩展的地址译码。在设计接口时,对于74LS系列、CD4000系列及一些大规模集成电路芯片(如74LS138、8243等)都可以直接接口。

85 P3口:由电路结构可见,P3口的负载能力不如P0口,但和P1、P2口一样,能以吸收或输出电流的方式驱动4个LS型的TTL负载。在实际应用中,P3口经常用作中断输入、串行通信口。在设计接口时,对于74LS系列、CD4000系列及一些大规模集成电路芯片(如74LS164、74LS165等)都可以直接接口。

86 时钟电路用于产生单片机工作所需要的时钟信号,单片机本身就是一个复杂的同步时序电路,为了保证同步工作方式的实现,电路应在惟一的时钟信号控制下严格地按时序进行工作。而时序所研究的则是指令执行中各信号之间的相互时间关系。

87 时钟电路 在介绍单片机引脚时,我们已经叙述过有关振荡器的概念。振荡电路产生的振荡脉冲,并不是时钟脉冲。这二者既有联系又有区别。在由多片单片机组成的系统中,为了各单片机之间时钟信号的同步,还引入公用外部脉冲信号作为各单片机的振荡脉冲。 1. 时钟信号的产生 XTAL1(19脚)是接外部晶体管的一个引脚。在单片机内部,它是一个反相放大器的输入端,这个放大器构成了片内振荡器。输出端为引脚XTAL2,在芯片的外部通过这两个引脚接晶体震荡器和微调电容,形成反馈电路,构成一个稳定的自激振荡器。如图2.10所示。

88

89 我们可以用示波器测出XTAL2上的波形。电路中的C1和C2一般取30pF左右,而晶体振荡器的频率范围通常是1
我们可以用示波器测出XTAL2上的波形。电路中的C1和C2一般取30pF左右,而晶体振荡器的频率范围通常是1.2~12MHz,晶体振荡器的频率越高,振荡频率就越高。 振荡电路产生的振荡脉冲并不是时钟信号,而是经过二分频后才作为系统的时钟信号。如图2.10所示。在二分频的基础上再三分频产生ALE信号(这就是前面介绍ALE时所说的“ALE是以晶振1/6的固定频率输出的正脉冲”)在二分频的基础上再六分频得到机器周期信号。

90 2. 引入外部脉冲信号 在由多片单片机组成的系统中,为了各单片机之间时钟信号的同步,应当引入惟一的公用外部脉冲信号作为各单片机的振荡脉冲。这时外部的脉冲信号是经XTAL2引脚注入如图2.11所示。对于80C51单片机,情况有所不同。外引脉冲信号需从XTAL1引脚注入而XTAL2引脚应悬浮。

91 时序定时单位 单片机执行指令是在时序电路的控制下一步一步进行的,人们通常以时序图的形式来表明相关信号的波形及出现的先后次序。为了说明信号的时间关系,需要定义定时单位。MCS-51时序的定时单位共有4个,从小到大依次是:拍节、状态、机器周期和指令周期。下面分别加以说明。 1、拍节与状态 把振荡脉冲的周期定义为拍节(用“P”表示)。振荡脉冲经过二分频后,就是单片机的时钟信号,把时钟信号的周期定义为状态(用“S”表示)。这样一个状态就包含二个拍节,其前半个周期对应的拍节叫拍节1(P1),后半个周期对应的拍节叫拍节2(P2)。

92 2. 机器周期 MCS-51采用同步控制方式,因此它有固定的机器周期。规定一个机器周期的宽度为6个状态,并依次表示为S1~S6。由于一个状态又包括二个拍节,因此一个机器周期总共有12个拍节,分别记作S1P1,S1P2,…,S6P2。由于一个机器周期共有12个振荡脉冲周期,因此机器周期就是振荡脉冲的十二分频。当振荡脉冲频率为12MHz时,一个机器周期为1μs,当振荡脉冲频率为6MHz时,一个机器周期为2μs。 3. 指令周期 指令周期是最大的时序定时单位。执行一条指令所需要的时间称为指令周期。指令周期以机器周期的数目来表示,MCS-51的指令周期根据指令不同,可包含有1~4个机器周期。图2.12表明了各种周期的相互关系。

93

94 典型指令时序 MCS-51共有111条指令,全部指令按其长度可分为单字节指令、双字节指令和三字节指令。执行这些指令所需要的机器周期数目是不同的,概括起来共有以下几种情况:单字节指令单机器周期和单字节指令双机器周期;双字节指令单机器周期和双字节指令双机器周期;三字节指令都是双机器周期;单字节的乘除指令为四机器周期。 图2.13所表示的是几种典型单机器周期和双机器周期指令的时序。图中的ALE信号是为地址锁存而定义的,该信号每有效一次对应单片机进行一次读指令操作。ALE信号以振荡脉冲1/6的频率出现,因此在一个机器周期中,ALE信号二次有效,第一次在S1P2和S2P1期间,第二次在S4P2和S5P1期间,有效宽度为一个状态。

95

96 现对几种典型单机器周期和双机器周期指令的时序作如下说明:
① 字节单周期指令(例如INC A):由于是单字节指令,因此只需进行一次读指令操作。当第二个ALE有效时,由于PC没有加1,所以读出的还是原指令,属于一次无效的操作。 ② 双字节单周期指令(例如ADD A,#data):这种情况下对应于ALE的二次读操作都是有效的,第一次是读指令操作码,第二次是读指令第二字节(本例中是立即数)。 ③ 单字节双周期指令(例如INC DPTR):两个机器周期共进行4次读指令操作,但后3次的读操作全是无效的。

97 ④ 单字节双周期指令(MOVX类指令):如前述每个机器周期内有二次读指令操作,但MOVX类指令情况有所不同。因为执行这类指令时,先在ROM读取指令,然后对外部RAM进行读/写操作。第一机器周期时,与其他指令一样,第一次读指令(操作码)有效,第二次读指令操作无效。第二机器周期时,进行外部RAM访问,此时与ALE无关,因此不产生读指令操作。 此外,还应说明,时序图中只表现了取指令操作的有关时序,而没有表现指令执行的内容。实际上,每条指令都有具体的数据操作,例如算术和逻辑操作在拍节1进行,片内寄存器对寄存器传送操作在拍节2进行等。由于数据操作种类繁多,不逐一列出。

98 在单片机应用系统工作时,除了进入系统正常的初始化之外,当由于程序运行出错或操作错误使系统处于死锁状态时,为摆脱困境,也需按复位键以重新启动。所以,系统的复位电路必须准确、可靠地工作。另外,单片机的复位状态与应用系统的复位状态又是密切相关的,因此,必须熟悉单片机的复位状态。

99 复位 单片机的复位都是靠外部电路实现的,在时钟电路工作后,只要在单片机的RST引脚上出现24个时钟振荡脉冲(2个机器周期)以上的高电平,单片机便实现初始化状态复位。为了保证应用系统可靠地复位,在设计复位电路时,通常使RST引脚保持10ms以上的高电平。只要RST保持高电平,则MCS-51单片机就循环复位。单片机的复位状态要注意以下几点: ① 复位是单片机的初始化操作。其主要功能是把PC初始化为0000H,使单片机从0000H单元开始执行。 ② 复位操作除了把PC初始化为0000H之外,还对一些特殊功能寄存器(专用寄存器)有影响,它们的复位状态见表2.7。 ③ 复位操作还对单片机的个别引脚信号有影响,例如把ALE和信号变为无效状态,即ALE=0,=1。但复位不影响单片机内部的RAM状态。

100 表2.7 单片机的复位状态 专用寄存器 复位状态 PC 0000H TMOD 00H ACC TCON B TL0 PSW TH0 SP 07H TL1 DPTR TH1 P0~P3 FFH SCON IP ××000000B SBUF 不定 IE 0×000000B PCON 0×××0000B

101 复位电路 从以上的叙述中,我们已经清楚复位电路的设计原则:在单片机的RST引脚上出现24个时钟振荡脉冲(2个机器周期)以上的高电平(为了保证应用系统可靠地复位,通常使RST引脚保持10ms以上的高电平)。根据这个原则,通常采用以下几种电路: (a)上电自动复位 (b)按键电平复位 (c)系统复位

102 (1)上电自动复位 如图2.14(a)所示,在通电瞬间,由于R·C电路充电过程中,RST端出现正脉冲,从而使单片机复位。C和R的值随时钟频率的变化而变化,可由实验调整。当采用6MHz时钟时,C为22μF,R为1kΩ时,便能可靠复位。 (2)按键电平复位 如图2.14(b)所示,按键电平复位是通过使复位端经电阻与VCC电源接通而实现的。 (3)系统复位 在实际应用系统中,为了保证复位电路可靠工作,常将RC电路接斯密特电路后再接入单片机复位端和外围电路复位端。这特别适合于应用现场干扰大、电压波动大的工作环境,并且,当系统有多个复位端时,能保证可靠地同步复位,如图2.14(c)所示。

103 MCS-51单片机共有复位、程序执行、单步执行、掉电保护、低功耗以及EPROM编程和校验等6种工作方式。对于HMOS工艺的单片机具有掉电保护方式。对于CHMOS工艺的单片机具有低功耗方式。下面分别介绍HMOS工艺的单片机的掉电保护方式和CHMOS工艺的单片机低功耗方式。

104 HMOS的掉电保护方式 单片机系统在运行过程中,如发生掉电故障,将会使系统数据丢失。其后果有时是非常严重的。为此,MCS-51单片机设置有掉电保护措施,进行掉电保护处理。其具体作法是:先把有用的数据转存,然后再启用备用电源维持供电。 (1)数据转存 所谓数据转存是指当电源发生故障时,应立即将系统的有用数据转存到内部RAM中。数据转存是通过中断服务程序完成的,即通常所说的“掉电中断”。 因为单片机电源端(Vcc)都接有滤波电容,掉电后电容储存的电能尚能维持有效电压达几个毫秒之久,足以完成一次掉电中断操作。为此应在单片机系统中设置一个电压检测电路,一旦检测到电源电压下降,立即通过INT0或INT1产生外部中断请求,中断响应后执行中断服务程序,把有用的数据送到RAM中保护起来。

105 (2)接通备用电源 为了保存转存后的有用数据,掉电后应给内部RAM供电。为此,系统应预先装有备用电源,并在掉电后立即接通备用电源。备用电源由单片机的RST/VPD引脚接入。为了在掉电后及时接通备用电源,系统中还需有备用电源与Vcc电源的自动切换电路。如图2.15所示。

106 切换电路由两个二极管组成。当电源电压Vcc高于RST/VPD引脚的备用电源电压时,D1导通,D2截止,内部RAM由Vcc电源供电。而当电源电压降至备用电源电压以下时,D2导通,D1截止,内部RAM由备用电源供电。这时单片机就进入掉电保护方式。 由于备用电源容量有限,为减少消耗,掉电后时钟电路和CPU皆停止工作,只有内部RAM单元和专用寄存器还在工作,以保存其内容。为此有人把备用电源提供的仅供单片机内部RAM和专用寄存器工作的最低消耗电流形象地称为“饥饿电流”。 当电源电压Vcc恢复时,RST/VPD引脚端的备用电压还应维持一段时间(约10ms),以便给其他电路从启动到稳定工作留出足够的过渡时间,然后才结束掉电保护状态。单片机开始正常工作。单片机恢复正常工作后的第一件事情是现场恢复,即将被保护的数据送回原处。

107 2.6.2 CHMOS的低功耗方式 80C51有两种低功耗方式,即待机方式和掉电保护方式。
待机方式和掉电保护方式都是由专用寄存器PCON(电源控制寄存器)的有关寄存器来控制的。PCON寄存器格式如表2.8所示: 表2.8 PCON寄存器格式 位序 B7 B6 B5 B4 B3 B2 B1 B0 位符号 SMOD / GF1 GF0 PD IDL

108 其中:SMOD 波特率倍增位,在串行通信时才使用;
GF0 通用标志位; GF1 通用标志位; PD 掉电方式位,PD=1,则进入掉电方式; IDL 待机方式位,IDL=1,则进入待机方式。 要想使单片机进入待机或掉电工作方式,只要执行一条能使IDL或PD位为“1”的指令就可以。

109 1. 待机方式 如果使用指令使PCON寄存器IDL位置“1”,则80C51即进入待机方式。这时振荡器仍然工作,并向中断逻辑、串行口和定时器/计数器电路提供时钟,但向CPU提供时钟的电路被阻断,因此CPU不能工作,与CPU有关的如SP、PC、PSW、ACC以及全部通用寄存器也被“冻结”在原状态。 在待机方式下,中断功能应继续保留,以便采用中断方法退出待机方式。为此,应引入一个外中断请求信号,在单片机响应中断的同时,PCON.0位被硬件自动清“0”,单片机就退出待机方式而进入正常工作方式。其实只要在中断服务程序中安排一条RETI指令,就可以使单片机恢复正常工作后返回断点继续执行程序。

110 2. 掉电保护方式 PCON寄存器PD位控制单片机进入掉电方式。因此对于像80C51这样的单片机,在检测到电源故障时,除了进行信息保护外,还应把PCON.1置“1”,使之进入掉电保护方式。此时单片机的一切工作都停止,只有内部RAM单元的内容被保存。 80C51单片机除进入掉电保护方式的方法与8051不同之外,还有备用电源由Vcc端引入的特点。Vcc正常后,硬件复位信号维持10ms即能退出掉电方式。

111 AT89系列单片机是美国ATMEL公司继承Intel公司80C31的核心技术并和自身先进的闪电存储器(Flash Memory)技术相结合而产生的Flash单片机系列。它是一种低功耗、高性能、内含4K/8K字节闪电存储器、用CHMOS工艺制造的8位单片机。其代表产品是AT89C51,典型的单片机有AT89C51、AT89C2051、AT89S8252等。其中AT89S8252属于高档产品,功能较强;AT89C51属于中档产品;AT89C2051只有20条引脚,属于低档产品。我们还是从其代表产品AT89C51入手来说明AT89单片机的硬件结构。

112 AT89C51和8051(或80C51)除存储器外,其他方面的结构几乎没有什么区别。其基本结构依然是CPU加上外围芯片的结构模式。一个8位的中央处理器(包括运算部件和控制部件);4KB/8KB的Flash存储器;128B/256B的数据存储器(RAM);32条I/O口线(四个8位口P0、P1、P2、P3);2个或3个(对8032/8052是3个)定时器/计数器;一个具有5个中断源、2个优先级的中断嵌套结构;用于多处理机通讯、I/O扩展或全双工UART(通用异步接收发器)的串行口;特殊功能寄存器(SFR);以及一个片内震荡器和时钟电路。这九个部件都是通过片内单一总线连接而成的。下面我们对这两种单片机进行比较,得出它们的异同点。

113 2.7.1 与MCS-51单片机的异同点 引脚和80C51完全兼容
既然AT89系列单片机的核心技术是80C31,并在80C31的基础上发展起来的,因此兼容、改进和增强将是我们对AT89系列单片机和MCS-51系列单片机进行比较的主要内容。 引脚和80C51完全兼容 AT89C51是一种低功耗、高性能,内含闪电存储器的8位单片机。这种器件以ATMEL公司高密度、不挥发存储技术制造,与工业标准MCS-51系列指令系统和引脚完全兼容。所以,当用AT89系列单片机取代80C51时,可以直接进行替换。这时,不管采用40脚还是44脚的产品,只要用相同引脚的AT89系列单片机取代80C51系列单片机即可。

114 2. 内部含有闪电存储器 89系列单片机提供的程序存储器是4KB/8KB的Flash存储器而MCS-51提供的程序存储器是4KB/8KB的只读存储器(ROM或EPROM)。这是二者最大的区别。AT89系列单片机由于内部含有闪电存储器,因而在系统开发过程中可以十分容易地进行程序修改和反复实验。同时,在系统工作过程中,能有效地保存一些数据信息,即使外界电源损坏也不影响信息的保存。 3. 静态时钟方式 AT89系列单片机是用静态逻辑来设计的,其工作频率可下降到0Hz,并提供两种可用软件来选择的省电方式——空闲方式和掉电方式。而80C51不是用静态逻辑来设计的,也就是说,若时钟频率太低,CPU就可能忘记刚刚进行的工作。

115 这是因为在电路中应用了一系列所谓动态节点,以寄生电容暂存信息。利用动态节点可以减少晶体管总数,从而减少芯片尺寸。这就是80C51的振荡脉冲频率只能≥1.2MHz的原因。
综上所述,AT89系列单片机和MCS-51有相同的核心技术及总体结构。指令系统和引脚完全兼容。不同的是AT89系列单片机内部含有4KB/8KB的闪电存储器,而且是用静态逻辑来设计的。而MCS-51不是用静态逻辑来设计的,而且片内不含闪电存储器,只有ROM或EPROM。

116 2.7.2 AT89C2051芯片的结构与信号引脚 1. AT89C2051芯片的内部结构
AT89C2051是带有2KB的Flash存储器、低功耗、高性能的8位单片机。这种器件以ATMEL公司高密度、不挥发存储技术制造,与工业标准MCS-51系列指令系统和引脚完全兼容。它为许多嵌入式的控制应用提供了高度灵活和低成本的解决办法。 1. AT89C2051芯片的内部结构 AT89C2051基本结构依然是CPU加上外围芯片的结构模式。提供以下标准功能:一个8位的中央处理器(包括运算部件和控制部件),2KB的Flash存储器,128B的数据存储器(RAM),15条I/O口线(2个8位口P1、P3),2个定时器/计数器,一个具有5个中断源、2个优先级的中断嵌套结构,用于多处理机通讯、I/O扩展或全双工UART(通用异步接收发器)的串行口,特殊功能寄存器(SFR),一个精密的模拟比较器以及一个片内震荡器和时钟电路。

117 此外AT89C2051是用可降到0频率的静态逻辑操作设计的,并支持两种可选的软件节电工作方式:空闲方式和掉电方式。它的结构框图如图2

118

119 2. 芯片的引脚功能说明 AT89C2051的引脚如图2.17所示。

120 Vcc:电源端。 GND:接地端。 P1口:8位双向I/O口。引脚P1.2~P1.7提供内部上拉电阻。P1.0和P1.1要求外部上拉电阻。P1.0和P1.1还分别作为片内精密模拟比较器的同相输入(AIN0)和反相输入(AIN1)。P1口输出缓冲器可吸收20mA的电流,并能直接驱动LED显示。这是一个了不起的进步,外围电路将因此而大大简化。当P1口引脚写入“1”时,可用作输入端。当引脚P1.2~P1.7用作输入端并被外部拉低时,将因内部的上拉电阻而输出电流。P1口还在 Flash编程和程序校验期间接收代码数据。

121 P3口:P3口的P3. 0~P3. 5、P3. 7是带有内部上拉电阻的7个双向I/O引脚。P3
P3口:P3口的P3.0~P3.5、P3.7是带有内部上拉电阻的7个双向I/O引脚。P3.6用于固定输入片内比较器的输出信号,并且作为通用I/O引脚而不可访问。P3口缓冲器可吸收20mA的电流。当P3口引脚写入“1”时,它们被内部上拉电阻拉高并可用作输入端。用作输入端时,被外部拉低的P3口引脚将因上拉电阻而输出电流。P3口还接收一些用于 Flash编程和程序校验的控制信号。 P3口还用于实现AT89C2051的各种功能,见表2.9。

122 表2.9 P3口的功能 口引脚 功能 P3.0 RXD(串行输入端口) P3.1 TXD(串行输出端口) P3.2 (外中断0) P3.3
(外中断1) P3.4 T0(定时器0外部输入) P3.5 T1(定时器1外部输入)

123 RST:复位输入。RST一旦变成高电平,所有的I/O引脚就复位到“1”。当振荡器正在运行时,持续给出RST引脚两个机器周期以上的高电平便可以完成复位。这和MCS-51相同。
XTAL1:作为振荡器反相放大器的输入和内部时钟发生器的输入。 XTAL2:作为振荡器反相放大器的输出。

124 习 题 单片机芯片包含哪些主要逻辑功能部件?各有什么主要功能? 2. MCS-51单片机的信号有何功能?在使用8031时的信号引脚应如何处理? 3. MCS-51单片机有哪些信号需要芯片引脚以第二功能的方式提供? 4. 内部RAM低128单元划分为哪3个主要部分?说明各部分的使用特点。 5. 如何认识8051或80C51存储器空间在物理结构上可划分为4个空间,而在逻辑上划分为3个空间? 单片机内部程序存储器和内部数据存储器的寻址范围各是多少?访问片外程序存储器和数据存储器时,各使用什么控制信号?

125 7. 程序计数器(PC)作为不可寻址寄存器,它有哪些特点?地址指针DPTR有哪些特点?与程序计数器有什么异同?
8. 堆栈有哪些功能?堆栈指示器(SP)的作用是什么?在程序设计时,为什么还要对SP重新赋值? 9. MCS-51单片机的4个I/O口在使用上有哪些分工和特点?试比较各口的特点。 10. 什么是指令周期、机器周期和时钟周期?当主频为12MHz时,一个机器周期等于多少微秒?执行一条最长指令需多少微秒? 11. 为什么说8051有很强的布尔(位)处理功能?共有多少单元可以位寻址?采用布尔处理有哪些优点? 12. 使单片机复位有几种方法?复位后机器的初始状态如何? 13. MCS-51单片机运行出错或程序进入死循环,如何摆脱困境?

126 C51有几种低功耗方式?如何实现 15. AT89C51和8051单片机相比有哪些提高? 16. AT89C2051在硬件资源配置和性能上有什么特点? 17. 单片机“面向控制”的应用特点,在硬件结构上有哪些体现?

127 指令格式 一台计算机的指令系统是指它所有的指令集合。MCS-51的指令系统共有111条指令,由42个助记符和7种寻址方式组合而成。 指令的表示方法称为指令格式,一条指令通常由操作码和操作数两部分组成。操作码规定指令进行什么操作,采用助记符表示;而操作数表示指令的操作对象,操作数可能是一个具体的数据,也可能是指出到哪里取得数据的地址或符号。根据指令的不同,可以有一个或多个操作数。汇编语言指令的基本形式是: 操作码助记符 目的操作数,源操作数

128 1. 一字节指令 操作码助记符与操作数分段书写,操作数中的目的操作数在前,源操作数在后,操作数之间用逗号分隔。
MCS-51的指令系统中,根据指令的长度有一字节、二字节和三字节三种指令。 1. 一字节指令 一字节指令只有一个字节,操作码中包含了操作数的信息。在两种情况下,其指令为一字节。 ① 操作数固定,无须附加的空间来指定即可完整明确地表示出指令的功能。 例如指令“INC DPTR”,其功能为数据指针加“1”,其指令码为:

129 ② 操作数在通用寄存器中,而寄存器编码只需3位二进制,故可以把寄存器编码与操作数“挤”在一个字节中,此时操作码占5位,操作数占3位。
例如指令“MOV A,Rn”,其功能为寄存器向累加器送数据,其指令码为: rrr 其中rrr为Rn的二进制编码。

130 2. 二字节指令 二字节指令包含两个字节,其中第一个字节为操作码,第二个字节为操作数。
例如立即数传送指令“MOV A,#data”,其中#data表示一个8位二进制操作数,占一个字节,称为立即数。指令码为: 立即数

131 3. 三字节指令 三字节指令包含三个字节,其中操作码占一个字节,操作数占两个字节,操作数既可为数据,也可是地址。
例如逻辑与操作指令“ANL direct,#data”,其功能是直接寻址单元内容与立即数进行与操作,指令格式为: 直接地址 立即数

132 3.1.2 指令系统的分类 从占用的存储空间上,MCS-51的指令可分为: ① 一字节指令,共49条; ② 二字节指令,共45条;
指令系统的分类 从占用的存储空间上,MCS-51的指令可分为: ① 一字节指令,共49条; ② 二字节指令,共45条; ③ 三字节指令,共17条。 从执行时间上,MCS-51的指令可分为: ① 单机器周期指令,共64条; ② 双机器周期指令,共45条; ③ 四机器周期指令,共2条,即乘、除指令。 从实现功能上,MCS-51的指令可分为下面5类: ① 数据传送类指令(29条); ② 算术运算类指令(24条); ③ 逻辑运算类指令及移位类指令(24条); ④ 控制转移类指令(17条); ⑤ 位操作类指令(17条)。

133 3.1.3 指令描述符号意义的说明 在指令描述中,使用了如下符号,首先对这些符号意义做简单说明。
指令描述符号意义的说明 在指令描述中,使用了如下符号,首先对这些符号意义做简单说明。 Rn——当前寄存器组的8个通用寄存器R0~R7,n=0~7。 Ri——可用作间接寻址的寄存器,只有R0、R1两个寄存器,所以 i=0,1。 direct——8位直接地址,用于寻址内部RAM的低128单元和专用寄存器。 #data——8位立即数。 #data16——16位立即数。 addr16——16位目的地址,只限于在LCALL和LJMP指令中使用。 addr11——11位目的地址,只限于在ACALL和AJMP指令中使用。

134 rel——补码表示的8位偏移量,用于相对转移指令中。
bit——内部RAM(包括专用寄存器)中的直接寻址位。 @——间接寻址寄存器的前缀标志。 /——加在位地址的前面,表示对该位状态取反。 (×)——某寄存器或某单元的内容。 ((×))——由×间接寻址的单元内容。 ← ——箭头左边的内容被箭头右边的内容所取代。

135 由于大多数指令执行时都需要使用操作数,因此存在怎样取得操作数的问题。所谓寻址就是寻找操作数的地址,而寻址方式就是通过确定操作数的位置(地址),把操作数提取出来的方法。
MCS-51指令系统共有7种寻址方式,下面分别予以介绍。

136 1. 寄存器寻址 寄存器寻址就是操作数在寄存器中,因此指定了寄存器就得到了操作数。寄存器寻址方式的指令以符号名称来表示寄存器。例如:
MOV A,R1 其功能是把寄存器R1中的内容传送到累加器A中,由于操作数在R1中,因此在指令中指定了R1,也就得到了操作数。 寄存器寻址的寻址范围包括: ① 通用寄存器组R0~R7,四组共32个寄存器。但寄存器寻址只能使用当前寄存器组。因此在使用本指令前,可通过对PSW寄存器中RS1、RS0位的状态设置,来选择当前寄存器组。 ② 部分专用寄存器。如累加器A、AB寄存器对、数据指针DPTR、累加位C。

137 2. 直接寻址 指令中直接给出操作数所在单元的地址。例如: MOV A,30H
其功能是把内部RAM 30H单元中的数据传送给累加器A,指令中30H就是操作数的直接地址,其寻址方式示意图如图3.1所示。

138 3. 寄存器间接寻址 直接寻址的寻址范围包括: ① 内部RAM的低128单元。在指令中直接以单元地址形式给出。
② 专用寄存器。专用寄存器除了直接以地址形式给出外,还可以以寄存器符号形式给出。应当指出,直接寻址是访问专用寄存器的惟一方法。 3. 寄存器间接寻址 寄存器间接寻址方式中,寄存器中存放的是操作数的地址,操作数是通过寄存器间接得到的,因此称为寄存器间接寻址。 MOV

139 假定R0中的内容为30H,则此指令的功能是以R0寄存器的内容30H为地址,把内部RAM 30单元中的内容送给累加器A,其示意图如图3

140 4. 立即寻址 寄存器间接寻址的寻址范围包括: ① 内部RAM低128单元。使用R0、R1作为寄存器间接寻址。
② 外部RAM 64KB。低256单元可使用R0R1、DPTR作为寄存器间接寻址,而其余单元只能使用DPTR作为寄存器间接寻址。 ③ 堆栈操作指令(PUSH和POP)也应算是寄存器间接寻址,即以堆栈指针(SP)作间接寄存器的间接寻址方式。 4. 立即寻址 立即寻址方式就是实际操作数作为指令的一部分,在指令中直接给出,取指令时,可在程序存储器中直接取得操作数。通常把出现在指令中的操作数称为立即数。 采用立即寻址方式的指令,在立即数前面加上立即寻址符“#”。例如: MOV A,#30H 其中30H就是立即数,此指令的功能是将30H赋给累加器A。

141 5. 变址寻址 MCS-51中除了一条指令需16位长的立即数外,都是8位的立即数,这条16位的立即寻址指令是:
MOV DPTR,#data16  指令的功能是将16位的立即数赋给数据指针DPTR寄存器。 5. 变址寻址 这种寻址方式用于访问程序存储器中的数据表格。它是以DPTR或PC作基址寄存器,以累加器A作变址寄存器,以两者内容之和形成16位数作为操作数地址,以达到访问数据表格的目的。例如: MOVC 其功能是把DPTR和A的内容相加得到的程序存储器中的地址单元的内容传送给累加器A。假如执行此指令前,A=30H,DPTR=22F1H,则该指令的操作示意图如图3.3所示。

142 变址寻址形成的操作数地址为22F1H+30H=2321H,而程序存储器ROM的2321H单元的内容为7FH,故该指令执行结果是A的内容7FH。

143 ① 变址寻址方式是专门针对程序存储器的寻址方式,寻址范围可达64KB。
② 变址寻址的指令只有3条: MOVC MOVC JMP @A+DPTR 其中前两条指令是程序存储器读指令,后一条是无条件转移指令。 ③ 尽管变址寻址方式较为复杂,但变址寻址的指令却都是一字节指令。

144 目的地址=转移指令地址+转移指令的字节数 + rel
6. 相对寻址 相对寻址方式是为实现程序的相对转移而设计。在这种寻址方式中,将程序计数器PC的当前值加上由指令给出的偏移量(rel),构成程序转移的目的地址。 这里应当注意,PC的当前值为该相对转移指令的下一条指令的地址,因此转移目的地址可用如下公式表示: 目的地址=转移指令地址+转移指令的字节数 + rel 相对偏移量是一个带符号的8位二进制补码数,范围为-128~+127。例如在程序存储器地址2000H处有一条相对寻址指令: JZ 40H

145 并且在执行此指令前累加器(ACC)=0,按指令的功能应发生相对转移。此指令为二字节指令,其目的地址为:2000H+2+40H=2042H,将它赋给PC,程序转移到2042H地址继续执行。其执行过程示意图如图3.4所示。 若偏移量为89H,则它是负数,为-77H,因此其目的地址为1F8BH。

146 7. 位寻址 MCS-51有位处理功能,可以对数据位进行操作,因此就有相应的位寻址方式。位寻址指令中可以直接使用位地址,例如:
MOV C,30H  其功能是把位地址30H中的值(状态)送累加位C。 位寻址的寻址范围包括: (1)内部RAM的位寻址区 内部RAM中单元地址为20H~2FH的16个单元128位,位地址为00H~7FH。 (2)专用寄存器的可寻址位 单元地址可被8整除的11个专用寄存器中各个有定义的位。

147 在MCS-51中,位地址的表示方式可采用下面几种形式:
① 直接使用位地址。例如PSW寄存器的位5的位地址为0D5H。 ② 单元地址加位数的表示方法。例如0D0H.5,表示字节单元地址0D0H(即PSW寄存器)的位5。 ③ 对可位寻址的专用寄存器可直接用寄存器名称加位数的方法。例如PSW.5表示PSW寄存器的位5。 ④ 使用位名称。在可位寻址的专用寄存器中,一些位是有符号名称的,例如PSW寄存器的位5是F0标志位,则可使用F0表示该位。 MCS-51指令系统的7种寻址方式,可以概括为表3.1。

148 表3.1 MCS-51寻址方式 寻址方式 寻址空间 寄存器寻址 R0~R7、A、AB、C、DPTR 直接寻址 内部RAM低128单元和专用寄存器 寄存器间接寻址 立即寻址 程序存储器ROM 变址寻址 相对寻址 程序存储器使用PC+偏移量rel作为操作数 位寻址 内部RAM和专用寄存器的位地址空间

149 由表3.1中可以看出: ① 内部数据存储器使用频繁,寻址方式较多,有寄存器寻址、直接寻址、寄存器间接寻址、位寻址。直接寻址是访问专用寄存器的惟一方法。 ② 对外部数据存储器,只能使用寄存器间接寻址。 ③ 对程序存储器可使用变址寻址、相对寻址和立即寻址。 ④ 在两个操作数的指令中,把左边操作数称为目的操作数,而右边操作数称为源操作数。前面所讲的各种寻址方式都是针对源操作数的。但实际上源操作数和目的操作数都有寻址问题,例如指令:  MOV 30H,R0  其源操作数是寄存器寻址方式,而目的操作数则是直接寻址方式,因此指令的功能是把按寄存器寻址取出的R0内容再以直接寻址方式存放于内部RAM的30H单元中。

150 数据传送类指令共有29条。这类指令的一般操作是把源操作数传送到目的操作数,指令执行后,源操作数不改变,目的操作数修改为源操作数。
源操作数可以采用寄存器寻址、寄存器间接寻址、直接寻址、立即寻址、变址寻址5种寻址方式。 目的操作数可以采用寄存器寻址、寄存器间接寻址、直接寻址3种寻址方式。

151 1. 内部RAM的数据传送指令 内部RAM的数据传送指令有16条,包括寄存器、累加器、专用寄存器、RAM单元之间的相互数据传送。
(1)立即数传送指令 立即数传送指令包括4条8位立即数传送和1条16位立即数传送指令。8位立即数传送指令完成把8位立即数传送到不同寻址方式所指定的内部RAM单元中。 MOV A,#data ;A←data MOV direct,#data ;direct←data MOV Rn,#data ;Rn←data ;(Ri)←data

152 MOV DPTR,#data16 ;DPTR←data16
16位立即数传送指令: MOV DPTR,#data16 ;DPTR←data16 该指令的功能是将立即数的高8位送DPH,立即数的低8位送DPL。这条指令是三字节指令,即操作码占一个字节,16位立即数占两个字节,其格式为: 1001 0000 立即数高8位 立即数低8位

153 例3.1 写出执行下列程序段后有关单元的内容。 MOV R1,#46H ;R1←46H ;(R1)←20H即46H←20H MOV A,#60H ;A←60H MOV 46H,#10H ;46H←10H 执行该程序段后(R1)=46H,(A)=60H,(46H)=10H

154 (2)内部RAM之间的数据传送指令 内部RAM之间的数据传送指令共有5条,使用直接寻址、 寄存器寻址、寄存器间接寻址方式。 MOV direct2,direct1 ;direct2←(direct1) MOV direct,Rn ;direct←(Rn) MOV Rn,direct ;Rn←(direct) MOV ;direct←((Ri)) ;(Ri)←(direct)

155 例3.2 分析下列指令组 MOV 50H,#12H MOV 30H,#20H MOV R0,30H ;R0←(30H)即R0←20H MOV 20H,50H ;20H←(50H)即20H←12H MOV ;90H←((R0))即90H←12H, ; 90H为P1口的地址,相当于将12H送至P1口。

156 (3)通过累加器的数据传送 与累加器有关的数据传送指令共有6条,实现累加器A与不同寻址方式的内部RAM单元之间的数据传送。 MOV A,Rn ;A←(Rn) MOV Rn,A ;Rn←(A) MOV A, direct ;A←(direct) MOV direct,A ;direct←(A) MOV ;A←((Ri)) MOV @Ri,A ;(Ri)←(A)

157 例3.3 将寄存器R7的内容送给R6,可用以下指令完成。
MOV A,R7 MOV R6,A MOV 40H,R7 MOV R6,40H 但不能用MOV R6,R7,因为没有此指令。

158 2. 外部RAM数据传送指令 对外部RAM单元只能使用寄存器间接寻址的方式,与累加器A之间进行数据传送。外部RAM数据传送指令有4条。
MOVX ;A←((DPTR)) MOVX @DPTR,A ;(DPTR)←(A) MOVX ;A←((Ri)) MOVX @Ri,A ;(Ri)←(A)

159 对外部RAM数据传送指令做如下说明: ① 外部RAM数据传送指令均为一字节指令。 ② 上述4条指令采用了不同的间址寄存器,前2条用DPTR作间址寄存器,因DPTR为16位地址指针,所以这两条指令可寻址外部RAM的整个64KB空间。后2条指令中的Ri代表R0、R1,作低8位地址指针,高8位地址由P2口中的内容提供。 ③ 外部RAM数据传送指令与内部RAM传送指令相比,在助记符中增加了“X”,“X”是代表外部的意思。 ④ 外部RAM的数据传送,只能通过累加器A进行。

160 例3.4 将外部RAM的2040H单元的内容传送到外部RAM 3000H单元,须执行下列指令。
MOV DPTR,#2040H MOVX MOV DPTR,#3000H

161 3. 程序存储器数据传送指令 程序存储器指令只有2条,其功能是从程序存储器中读出数据,送给累加器A。
  MOVC ;A←((A)+(DPTR)) MOVC ;A←((A)+(PC)) 对程序存储器指令作如下说明: ① 这2条指令都是一字节指令。 ② 2条指令都采用了变址寻址方式。但由于采用了不同的基址寄存器,因此寻址范围有所不同。对于前一条指令,因为采用DPTR作为基址寄存器,DPTR可以任意赋值,故这条指令寻址范围是整个程序存储器的64KB空间。对于后一条指令,因为采用PC作为基址寄存器,因此只能读出以当前MOVC指令为起始的256个地址单元之内的某一单元内容。 ③ 这2条指令主要用于查表操作。

162 例3.5 以查表方法把累加器A中的十六进制数转换为ASCII码,并送回累加器A中。其查表程序如下:
(1)采用“MOVC MOV DPTR,#TAB ;表的首地址作为基址 MOVC ;查表 RET TAB: DB 30H,31H,32H,33H,34H,35H DB 36H,37H,38H,39H,41H,42H, DB 43H,44H,45H,46H

163 (2)采用“MOVC 2000 INC A ;由于表格跳过RET指令 2001 MOVC ;查表 2002 RET 2003 TAB: DB 30H,31H,32H,33H,34H,35H,36H DB 37H,38H,39H,41H,42H,43H,44H DB 45H,46H

164 4. 数据交换指令 数据交换指令共有5条,完成累加器A和内部RAM单元之间的字节或半字节交换。 (1)整字节交换指令
XCH A,Rn ;(A)↔(Rn) XCH A,direct ;(A)↔(direct) XCH ;(A)↔((Ri))

165 (2)半字节交换指令 累加器A与内部RAM单元内容的低4位数据进行交换。 XCHD ;(A)3~0 ↔((Ri))3~0 (3)累加器高低半字节交换 SWAP A ;(A)7~4 ↔(A)3~0 例3.6 将30H单元的内容低4位与A中内容的低4位互换,然后将A的高4位存入20H的RAM单元的低4位,A的低4位存入20H单元的高4位。  MOV R0,#30H XCHD SWAP A MOV 20H,A

166 5. 堆栈操作指令 堆栈操作指令有进栈和出栈两种,因此相应有两条指令: (1)进栈指令
PUSH direct ;SP←(SP)+1,(SP)←(direct) 其功能是将内部RAM低128单元或专用寄存器的内容送栈顶单元。具体操作是:将栈指针SP加1,使它指向栈顶空单元,然后将直接地址direct单元的内容送入栈顶空单元。 (2)出栈指令 POP direct ;direct←((SP)),SP←(SP)-1

167 其功能是将栈顶单元内容取出送到内部RAM低128单元或专用寄存器中。具体操作是:将栈顶指针SP所指示的栈顶单元中的内容传送到直接地址direct中,然后将栈指针SP减1,使之指向新的栈顶单元。
堆栈操作指令通过堆栈指示器SP进行读写操作,因此它采用以SP为寄存器的间接寻址方式。系统SP是惟一的,所以在指令中把通过SP的间接寻址的操作数项隐含了,只标出直接寻址的操作数项。 例3.7 指令组 PUSH ACC POP PSW 可实现将A的内容送到PSW。 注意:不能写成“PUSH A”,因为“A”是寄存器,而堆栈指令必须用直接地址。

168 例3.8 将片外2000H单元的内容压入堆栈,然后弹出到25H单元中。可用如下指令完成:
MOV DPTR,#2000H MOVX MOV SP,#30H PUSH ACC POP 25H

169 6. 数据传送类指令小结 ① 对于不同的存储器空间采用不同的指令来访问,请注意MOV、MOVX、MOVC的区别。
② 数据传送指令一般不影响标志位,只有目的操作数为A的指令影响奇偶标志P位。 ③ MCS-51指令系统没有专用的输入输出指令,它采用数据传送指令来进行I/O操作。 ④ 数据传送类指令表见表3.2。

170 MCS-51的算术运算类指令共有24条,8种助记符,包括加、减、乘、除等各种运算。它都是针对8位无符号数的,如要进行带符号或多字节二进制数运算,则需编写程序,通过执行程序实现。
1. 加法指令 加法指令共有4条。加法运算指令的被加数总是在累加器A中,而另一个加数可以由不同寻址方式得到,其相加结果送回累加器A。 ADD A,Rn ;A←(A)+(Rn) ADD A,direct ;A←(A)+(direct) ADD ;A←(A)+((Ri)) ADD A,# data ;A←(A)+data

171 加法操作影响PSW中的状态位CY、AC、OV。
① 若位3有进位,则辅助进位标志位AC置“1”;反之,AC清“0”。 ② 若位7有进位,则进位标志位CY置“1”;反之,CY清“0”。 ③ 若位6、位7二者只有一位产生进位,认为溢出,OV置“1”;而二者同时产生进位或同时没有进位,将认为不溢出,OV清“0”。 溢出标志的状态,只有在符号数运算时才有意义。当两个符号数相加时,若OV=1,表示运算结果超出了累加器A所能表示的符号数有效范围(-128~+127),即产生了溢出,因此运算结果是错误的,否则若OV=0,则运算结果是正确的。

172 例如:(A)=49H, 执行“ADD A,# 6BH”指令:
+) 其结果(A)=0B4H,(AC)=1,(CY)=0,(OV)=1。若作为无符号数,结果是正确的;反之,49H和6BH是两个带符号数,由于溢出,表明运算结果是错误的,因为两个正数相加结果不可能得到负数。

173 例3.9 设(20H)=81H,(21H)=0AEH,求两数之和,并说明PSW相关位的内容。
MOV A,20H ADD A,21H ;(也可以写成ADD A,#0AEH) +) 指令执行结果为:(A)=2FH,(CY)=1,(AC)=0,(OV)=1

174 2. 带进位加法指令 带进位加法指令共有4条。它是将累加器A中的内容,不同寻址方式的加数以及进位标志位CY的状态相加,其运算结果送回累加器A。 ADDC A,Rn ;A←(A)+(Rn)+(CY) ADDC A,direct ;A←(A)+(direct)+(CY) ADDC ;A←(A)+((Ri)) +(CY) ADDC A,# data ;A←(A)+data+(CY) 带进位加法指令对PSW中的状态位CY、AC、OV的影响与前面讲的加法指令相同。 带进位加法指令主要用于多字节数的加法运算。

175 例3.10 设(A)=81H,(20H)=0AEH,(CY)=1,求三者之和,并说明PSW相关位的内容。
ADDC A,20H +) 指令执行结果为:(A)=30H,(CY)=1,(AC)=1,(OV)=1。

176 例3.11 有两个无符号双字节数,按低字节在前的顺序分别存放在内部RAM的30H、31H和40H、41H单元中,设(30H)=0AFH,(31H)=0AH,(40H)=90H,(41H)=2FH,求两数之和并存于30H、31H单元,同时说明PSW中相关位的内容。 MOV R0,#30H MOV A,40H ADD ;计算低字节之和 ;低字节和存入30H单元 MOV A,41H INC R0 ADDC ;计算高字节之和 ;高字节和存入31H单元

177 程序执行过程先计算低字节和: +) (CY)=1,(A)=3FH,(AC)=0,(OV)=1 再计算高字节和: +) (CY)=0,(A)=3AH,(AC)=1,(OV)=0 最后结果:(30H)=3FH,(31H)=3AH,(CY)=0,(AC)=1, (OV)=0

178 3. 带借位的减法指令 带进位减法指令共有4条。它是将累加器A中的内容减去不同寻址方式的减数以及进位标志位CY的状态,其差送回累加器A。
SUBB A,Rn ;A←(A)-(Rn)-(CY) SUBB A,direct ;A←(A)-(direct)-(CY) SUBB ;A←(A)-((Ri)) -(CY) SUBB A,# data ;A←(A)- data -(CY) 减法指令只有带借位减法指令,而没有不带借位减法指令。若进行不带借位减法运算,只需在带借位减法指令前用“CLR C”指令先把进位标志位清“0”即可。

179 ① 带借位减法操作影响PSW中的状态位CY、AC、OV。
② 若位3有借位,则辅助进位标志位AC置“1”,反之,AC清“0”。 ③ 若位7有借位,则进位标志位CY置“1”,反之,CY清“0”。 ④ 若位6、位7二者只有一位产生借位,认为溢出,OV置“1”;而二者同时产生借位或同时没有借位,将认为不溢出,OV清“0”。 同样,溢出标志的状态,只有在符号数运算时才有意义。当两个符号数相减时,若OV=1,表示运算结果超出了累加器A所能表示的符号数有效范围(-128~+127),即产生了溢出,因此运算结果是错误的,否则若OV=0,则运算结果是正确的。

180 例如:(A)=0C9H,(R2)=54H,(CY)=1,
执行 SUBB A,R2指令: -) 1 其结果(A)=74H,(AC)=0,(CY)=0,(OV)=1。若作为无符号数,则结果是正确的;反之,C9H和54H是两个带符号数,则由于溢出,表明运算结果是错误的,因为负数减正数其差不可能得到正数。

181 4. 加1指令 加1指令共有5条,其功能是对指定单元的内容进行加1操作。 INC A ;A←(A)+1 INC Rn ;Rn←(Rn)+1
INC A ;A←(A)+1 INC Rn ;Rn←(Rn)+1 INC direct ;direct ←(direct)+1 INC @Ri ;(Ri)←((Ri))+1 INC DPTR ;DPTR←(DPTR)+1

182 加1指令不影响程序状态字PSW。这5条指令中,前4条是对一个字节单元内容加1,最后一条是对16位的寄存器内容加1,这条指令在加1的过程中,若低8位有进位,则直接向高8位进位,而不对进位标志CY置“1”。 例3.12 (A)=0FFH,(R3)=0FH,(30H)=0F0H,(R1)=40H,(40H)=02H,执行如下指令: INC A INC R3 INC 30H INC @R1 其结果为:(A)=00H,(R3)=10H,(30H)=0F1H,(R1)=40H,(40H)=03H,不影响PSW的状态位。

183 5. 减1指令 减1指令共有4条,其功能是将指定单元的内容进行减1操作。 DEC A ;A←(A)-1 DEC Rn ;Rn←(Rn)-1
DEC A ;A←(A)-1 DEC Rn ;Rn←(Rn)-1 DEC direct ;direct ←(direct)-1 DEC @Ri ;(Ri)←((Ri))-1 与加1指令一样,减1指令不影响程序状态字PSW。请注意,在MCS-51指令系统中,没有对DPTR减1的指令。

184 例3.13 (A)=0FFH,(R7)=0FH,(30H)=0F0H,(R0)=40H,(40H)=00H,执行如下指令:
DEC A DEC R7 DEC 30H DEC @R0 其结果为:(A)=0FEH,(R7)=0EH,(30H)=0EFH,(R0)=40H,(40H)=FFH,不影响PSW的状态位。

185 6. 乘除指令 乘除指令各1条,完成2个8字节无符号整数的乘法或除法运算。乘除指令都是一字节指令,执行时需4个机器周期。 MUL AB
MUL AB DIV AB 乘除指令只对累加器A和寄存器B操作,都影响程序状态字PSW。

186 乘法指令是将A和B寄存器中的2个8位无符号整数进行相乘,结果为16位无符号数,高8位存于B中,低8位存于A中。若相乘结果大于255,也就是B的内容不为0时,溢出标志OV置“1”,否则置“0”。乘法指令执行后,CY进位标志总是被清“0”。例如(A)=4EH,(B)=5DH,执行指令 MUL AB 结果为:(B)=1CH,(A)=56H(即乘积为1C56H),(OV)=1,(CY)=0。

187 除法指令中,被除数在A中,除数在B中,两个数均为8位无符号整数。相除结果,商存于A,余数存于B。若除数为0,溢出标志OV置“1”,否则置“0”。除法指令执行后,CY进位标志总是被清“0”。例如(A)=11H,(B)=04H,执行指令 DIV AB 结果为:(A)=04H,(B)=01H,(OV)=0,(CY)=0。

188 7. 十进制调整指令 十进制调整指令是一条专用指令,用于对BCD码十进制数加法运算的结果进行修正。所谓BCD码是指用4位二进制数表示一位十进制数。其指令格式为: DA A 因相加结果在累加器A中,因此也就是对累加器A的内容进行修正。

189 下面简要说明为什么要使用DA A指令。 在计算机中十进制数字0~9一般用BCD码来表示,然而计算机在进行运算时,是按二进制规则进行的,对于4位二进制数有16种状态,对应16个数字,而十进制数只用其中的10种表示0~9,因此按二进制的规则运算就可能导致错误的结果。 例如:7+8=15 0111 +)1000 (非BCD码) +)0110 (+6后得到正确的BCD码) 由此可见第一次得到的1111不是BCD码,进行+6修正后得到个位数为5,并向高位产生进位1,从而得到正确的BCD码。

190 因此两个BCD码数进行相加时,必须由这条指令调整才能得到正确的BCD码。
这条指令的修正规则是: l           当A3~0>9或(AC)=1,则A←(A)+06H。 l           当A7~4>9或(CY)=1,则A←(A)+60H。 l           当A7~4=9而A3~0>9,则A←(A)+66H。 DA指令只影响进位标志CY。 例如:68+53=121 MOV A,#68H ADD A,#53H DA A

191 +) (A3~0>9,A7~4>9) +) (由DA A指令实现) 执行结果:(A)=21,(CY)=1。

192 8. 算术运算类指令小结 ① 算术运算类指令大多影响PSW,但应注意: 加1指令INC和减1指令DEC不影响标志位。
           乘除指令对标志位的影响有自己的特殊性。 ② 十进制调整指令只影响CY标志。 ③ 减法指令中只有带借位减法指令。 ④ 十进制调整指令只能调整BCD码数加法运算后的结果,BCD码数减法要转换为加法后再调整。 ⑤ 算术运算类指令表见表3.3。

193 1. 逻辑与运算指令 MCS-51的逻辑运算及移位类指令共有24条,9种助记符, 完成与、或、异或、清零、取反、左右移位等各种运算。
逻辑与运算指令共6条,其功能是对两个操作数所指出的内容进行按位逻辑与操作。 ANL A,Rn ;A←(A)∧(Rn) ANL ;A←(A)∧((Ri)) ANL A,#data ;A←(A)∧data ANL A,direct ;A←(A)∧(direct) ANL direct,A ;direct←(direct)∧(A) ANL direct,#data ;direct←(direct)∧data

194 其中前4条指令以累加器A为目的操作数,后2条是以直接地址单元为目的操作数。
例3.14 已知(A)=1FH,(30H)=83H,执行 ANL A,30H。 结果为:(A)=03H,(30H)=83H。

195 例3.15 将内部20H单元的低4位清0,高4位保持不变,已知(20H)=0C6H。
ANL 20H,#0F0H 结果为:(20H)=0C0H。

196 2. 逻辑或运算指令 逻辑或运算指令共6条,其功能是对两个操作数所指出的内容进行按位逻辑或操作。 ORL A,Rn ;A←(A)∨(Rn)
ORL A,Rn ;A←(A)∨(Rn) ORL ;A←(A)∨((Ri)) ORL A,#data ;A←(A)∨data ORL A,direct ;A←(A)∨(direct) ORL direct,A ;direct←(direct)∨(A) ORL direct,#data ;direct←(direct)∨data 其中前4条指令以累加器A为目的操作数,后2条是以直接地址单元为目的操作数。

197 例3.16 已知(A)=0B3H,(R4)=85H,执行 ORL A,R4。
结果为:(A)=0B7H,(R4)=85H。 例3.17 将20H单元的位7、位4、位2、位0置1,其余位保持不变,已知(20H)=02H。 ORL 20H,# B ;( B为二进制立即数也可写成95H) 结果为:(20H)=97H。

198 3. 逻辑异或运算指令 逻辑异或运算指令共6条,其功能是对两个操作数所指出的内容进行按位逻辑异或操作。其运算规则是:
0⊕0=0,1⊕1=0,0⊕1=1,1⊕0=1。 XRL A,Rn ;A←(A)⊕(Rn) XRL ;A←(A)⊕((Ri)) XRL A,#data ;A←(A)⊕ data XRL A,direct ;A←(A)⊕(direct) XRL direct,A ;direct←(direct)⊕(A) XRL direct,#data ;direct←(direct)⊕ data 其中前4条指令以累加器A为目的操作数,后2条是以直接地址单元为目的操作数。

199 例3.18 已知(A)=0B3H,(R0)=40H,(40H)=87H, 执行 XRL A,@R0。 10110011
结果为:(A)=34H,(R0)=40H,(40H)=87H。 例3.19 将30H单元的低4位取反,高4位保持不变,已知(30H)=6EH,执行 XRL 30H,#0FH。 结果为:(30H)=61H。

200 4. 累加器清零、取反指令 累加器清零指令1条,它是将A的内容清“0”。 CLR A ;A←0 累加器取反指令1条,它是将A的内容按位取反。
CLR A ;A←0 累加器取反指令1条,它是将A的内容按位取反。 CPL A ;A←(A) 例如(A)=27H,执行 CPL A指令后,A的内容为0D8H。

201 5. 移位指令 MCS-51的移位指令只能对累加器A进行移位,共有4条指令。 循环左移: RL A ;An+1←(An),A0←(A7)
循环右移: RR A ;An←(An+1),A7←(A0)

202 带进位循环左移: RLC A ;An+1←(An),CY←(A7),A0←(CY) 带进位循环右移: RRC A ;An←(An+1),A7←(CY),CY←(A0)

203 前2条指令是A的内容循环左移、右移一位,后2条指令是将A的内容和进位标志CY的状态一起循环左移、右移一位。左移一位相当于乘2,而右移一位相当于除2。
分析:A的内容乘6相当于A的内容乘4和A的内容乘2后相加。 实现程序如下: RL A ;乘2 MOV R1,A ;暂存 RL A ;原A的内容乘4 ADD A,R1

204 例3.21 将R2R3中的一个双字节数左移一位,最低位补零,最高位存CY中,假设R2中存放的是高字节,R3中为低字节。
CLR C MOV A,R3 RLC A ;低字节左移一位,位0补零,位7进入CY MOV R3,A MOV A,R2 RLC A ;高字节左移一位,低字节原位7,即CY ;状态进入位8,位15(最高位)进入CY MOV R2,A

205 6. 逻辑运算及移位指令小结 ① 逻辑运算的所有指令都是按位进行操作的。
② 逻辑与、或、异或运算三组指令各有6条,都采用了相同的寻址方式,4条是以A为目的操作数的,两条是以直接地址为目的操作数,这便于对内部RAM单元和专用寄存器进行逻辑运算。 ③ MCS-51没有求补指令,若进行求补操作,可按“取反加1”来进行。 ④ 逻辑运算及移位类指令一般不影响PSW,仅当目的操作数为A时对奇偶标志P位有影响,带进位的移位指令影响CY。 ⑤ 逻辑运算及移位指令表见表3.4。

206 MCS-51控制转移类指令共17条(不包括布尔变量控制转移指令),13种助记符,主要功能是控制程序转移到新的PC地址上。
1. 无条件转移指令 不规定条件的程序转移称之为无条件转移,共有6条指令。 (1)长转移指令 LJMP addr ;PC←addr16  本指令是将16位地址送给PC,从而实现程序的转移。因为操作码提供16位地址,所以可在64KB程序存储器范围内跳转。该指令为三字节指令,依次为操作码、高8位地址、低8位地址。

207 AJMP addr11 ;PC←(PC)+2,PC10~0←addr11 这是一条双字节的指令,其操作码为:
(2)绝对转移指令  AJMP addr11 ;PC←(PC)+2,PC10~0←addr11 这是一条双字节的指令,其操作码为: a10 a9 a a7 a6 a5 a4 a3 a2 a1 a0 其中a10~a0为指令提供的11位地址addr11。 这条指令的功能是:先将PC的内容加2,使PC指向该绝对转移指令的下一条指令,然后把addr11送入PC的低11位,PC的高5位保持不变,形成新的PC值,实现程序的转移。

208 例3.22 在程序存储器1880H地址单元中有绝对转移指令: 1880H AJMP 0397H
1880H AJMP 0397H 11位绝对转移地址为 B(397H),因此指令的操作码为: 程序计数器PC+2后的内容为 B(1882H),以11位绝对转移地址替换PC的低11位内容,最后形成的目的地址为: B=1B97H。即程序将转移到1B97H地址继续执行。

209 addr11是地址,最小值为000H,最大值为7FFH,因此绝对转移指令所能转移的最大范围为2KB,对于“1880H AJMP 0397H”指令,其转移范围为1800H~1FFFH。
(1)短转移指令  SJMP rel ;PC←(PC)+2+rel 该指令是双字节指令,其功能是:首先将PC的内容加2,再与rel相加后形成转移目的地址,其中rel是8位的补码表示的相对偏移量。该指令的转移范围为以本指令所在地址加2为基准,向后(低地址)转移128B,向前(高地址)转移127B。也就是说,转移范围为256B,称为短转移。

210 (2)变址寻址转移指令 JMP @A+DPTR ;PC←(A)+(DPTR) 这是一条一字节转移指令,转移的目的地址是有累加器A的内容和数据指针DPTR内容之和形成。 本指令常用于以跳转表实现的多分支转移。 例3.23 根据A的数值设计跳转表程序。

211 MOV DPTR MOV DPTR,#JTABLE JMP @A+DPTR JTABLE: AJMP PROG0 AJMP PROG1
MOV A,#data MOV DPTR MOV DPTR,#JTABLE JTABLE: AJMP PROG0 AJMP PROG1 ··· AJMP PROG2 当A=0时,程序转移到PROG0,当A=2时,程序转移到PROG1,…,由于AJMP指令是双字节指令,所以A中的内容必须是偶数。程序中以JTABLE符号地址开始的一段转移指令构成了跳转表。表中PROG0~PROG2分别为 各处理程序的入口地址。

212 2. 条件转移指令 条件转移指令是指当某种条件满足时,程序进行转移,否则程序将顺序执行。MCS-51所有条件转移指令都是采用相对寻址方式得到转移的目的地址。 (1)累加器判零条件转移指令 JZ rel ;(A)=0,PC←(PC)+2+rel ;(A)≠0,PC←(PC)+2 JNZ rel ;(A)≠0,PC←(PC)+2+rel ;(A)=0,PC←(PC)+2 这2条指令是双字节指令。

213 (2)数值比较转移指令 数值比较转移指令共有4条,它们的功能是把两个操作数进行比较,若二者不相等则转移,否则顺序执行。 CJNE A,#data,rel ;(A)≠data,转移 CJNE A,direct,rel ;(A)≠(direct),转移 CJNE Rn,#data,rel ;(Rn)≠data,转移 CJNE @Ri ,#data,rel ;((Ri))≠data,转移

214 这4条指令都是三字节指令,是MCS-51指令系统中仅有的4条3个操作数的指令。执行操作如下:
        若目的操作数=源操作数,则(CY)=0,PC←(PC)+3。        若目的操作数>源操作数,则(CY)=0,PC←(PC)+3+rel。        若目的操作数<源操作数,则(CY)=1,PC←(PC)+3+rel。 可见数值比较转移指令影响CY标志位。所以利用本组指令可以判别两数的大小。

215 (3)减1条件转移指令 这是一组把减1与条件转移两种功能结合在一起的指令,共2条。 DJNZ Rn,rel ;Rn←(Rn)-1 ;若(Rn)=0,则 PC←(PC) ;若(Rn)≠0,则PC←(PC)+2+rel DJNZ direct,rel ;direct←(direct)-1 ;若(direct) = 0,则PC←(PC)+3 ;若(direct)≠0,则PC←(PC)+3+rel 第一条指令是双字节指令,第二条指令是三字节指令。 这两条指令主要用于控制程序循环。如预先把寄存器或内部RAM单元赋值循环次数,利用减1条件转移指令,以减1后是否为0作为转移条件,即可实现按次数控制循环。

216 例3.24 将内部RAM中以20H单元开始的8个无符号数相加,结果送内部RAM的30H单元,设相加结果不超过255。
MOV R0,#20H ;数据块首地址送R0 MOV R3,#8 ;置计数初值 CLR A LOOP: ADD ;累加一次 INC R0 ;地址指针加1,指向下一个单元 DJNZ R3,LOOP ;R3减1,判断循环是否结束 MOV 30H,A ;存和

217 3. 子程序调用与返回指令 (1)长调用指令 LCALL addr16 这是一条三字节指令,完成下列操作:
LCALL addr16 这是一条三字节指令,完成下列操作:    PC的内容加3:PC←(PC)+3 PC的内容压入堆栈: SP←(SP)+1,(SP)←(PC7~0) SP←(SP)+1,(SP)←(PC15~8)        将16位地址送入地址PC: PC←addr16 长调用的子程序调用范围是64KB。

218 (2)绝对调用指令 ACALL addr11 本指令为双字节指令,指令操作码为: 其中a10 ~a0为指令提供的11位地址addr11。
ACALL addr11 本指令为双字节指令,指令操作码为: a10 a9 a a7 a6 a5 a4 a3 a2 a1 a0 其中a10 ~a0为指令提供的11位地址addr11。

219 本指令完成下列操作:            PC的内容加2: PC←(PC)+2           PC的内容压入堆栈: SP←(SP)+1,(SP)←(PC7~0) SP←(SP)+1,(SP)←(PC15~8)            将11位地址送入地址PC的低11位:PC10~0←addr11 与绝对调用指令AJMP一样,指令给出了11位地址,因此本指令的子程序调用范围是2KB。

220 (3)返回指令 返回指令共2条: RET ;子程序返回指令 RETI ;中断服务子程序返回指令 其功能只从堆栈中取出断点地址送给程序计数器PC,使程序在主程序断点处继续向下执行。因此本指令完成的操作如下: PC15~8←((SP)),SP←(SP)-1 PC7~0←((SP)),SP←(SP)-1

221 例3.25 (SP)=42H,(42H)=0EH,(41H)=32H,执行指令 RET
结果:(SP)=40H,(PC)=0E32H。 中断服务子程序返回指令除了完成上面的功能外,还要清除中断响应时被置位的优先级状态,开放较低级中断和恢复中断逻辑,使较低级中断申请可以被响应。

222 4. 空操作指令 NOP ;PC←(PC)+1 空操作指令也算是一条控制指令,即控制CPU不做任何操作,只消耗这条指令执行所需的一个机器周期时间。这条指令常用于程序的等待或延迟。 例3.26 编写一个延时0.1ms的子程序,假设晶振为6MHz。 一个机器周期为2μs,要运行50个机器周期。程序如下: DELAY:MOV R7,#16 ;置循环初值,本指令需1个机器周期 LOOP: NOP DJNZ R7,LOOP ;循环体3个机器周期,共执行48个机器周期 RET ;1个机器周期

223 5. 控制转移类指令小结 ① 3条无条件转移指令LJMP、AJMP、SJMP有不同的转移范围:LJMP指令可在64KB范围内转移,但该指令为三字节;AJMP指令的转移范围为2KB,指令长度为双字节;SJMP指令中给出8位的相对地址,转移范围为256B,指令长度为双字节。根据三条指令的特点可以找到各自的使用场合。 ② 子程序调用指令只有无条件转移指令,两条指令LCALL、ACALL的转移方式和范围同无条件转移的两条指令。 ③ 控制转移类指令中,除CJNE外都不影响PSW的状态。CJNE指令有别于其他条件转移指令,它不仅用于程序的转移,而且还可用于两个数值比较。 ④ 控制转移类指令表见表3.5。

224 布尔变量就是开关变量,它以“位”做为单位进行运算和操作。迎合控制应用需求,MCS-51具有较强的布尔处理能力。
MCS-51在硬件上设置了一个独立的布尔处理器,布尔处理器实际上是一个一位的微处理器,它以进位标志位CY作为累加位,以内部RAM位寻址区的各位和可位寻址的专用寄存器中的各位作为存储位。 MCS-51指令系统中有一个专门用于布尔变量操作的指令子集,共有17条指令,11个助记符,可以完成以布尔变量为对象的传送、运算、转移控制等操作,称为布尔变量操作指令,也称为位操作指令。

225 1. 位传送指令 位传送指令完成可寻址位与累加位CY之间互相传送内容,共有2条指令。 MOV C,bit ;CY←(bit)
MOV C,bit ;CY←(bit) MOV bit,C ;bit←(CY) 指令中的C就是CY,由于两个可寻址位之间没有直接的传送指令,因此若要完成这种传送,可以通过CY作为中介来实现。

226 例3.27 将20H位的内容传送到1AH位。 MOV F0,C MOV C,20H MOV 1AH,C MOV C,F0 此处F0是程序状态字PSW的用户标志位(PSW.5)。

227 2. 位置位/复位指令 对CY和位地址所指定的各位进行置位或复位的操作,共有4条指令。 (1)位复位指令 CLR C ;CY←0
CLR C ;CY←0 CLR bit ;bit←0 (2)位置位指令 SETB C ;CY←1 SETB bit ;bit←1

228 3. 位运算指令 位运算都是逻辑运算,有与、或、非三种,共6条指令。 ANL C,bit ;CY←(CY)∧(bit)
ANL C,bit ;CY←(CY)∧(bit) ANL C,/bit ;CY←(CY)∧(bit) ORL C,bit ;CY←(CY)∨(bit) ORL C,/bit ;CY←(CY)∨(bit) CPL C ;CY←(C) CPL bit ;bit←bit

229 “与”、“或”运算时,都是以累加位C作为目的操作数,位地址的内容为源操作数,逻辑运算结果仍送回C,“非”运算则对位地址的内容取反。
“与”、“或”各有一条指令是对bit位地址的内容取反,然后和C进行运算,应注意的是,这两条指令的执行并不影响bit位地址中的内容。

230 例3.28 将两个位地址20H、21H中的内容进行异或,结果放入位地址22H。
异或运算按公式Z=X⊕Y=(∧Y)∨(X∧)来进行。 MOV C,21H ANL C,/20H ;CY←(20H)∧(21H) MOV 22H,C MOV C,20H ANL C,/21H ;CY←(20H)∧(21H) ORL C,22H MOV 22H,C

231 4. 位控制转移指令 位控制转移指令就是以位的状态作为实现程序转移的判断条件。对这些指令分别说明: (1)以C状态为条件的转移指令
共2条指令: JC rel ;若(CY)=1,则转移PC←(PC)+2+ rel ;若(CY)=0,则PC←(PC)+2 JNC rel ;若(CY)=0,则转移PC←(PC)+2+ rel ;若(CY)=1,则PC←(PC)+2

232 (2)以位状态为条件的转移指令 JB bit,rel ;若(bit)=1,则转移PC←(PC)+3+ rel ;若(bit)=0,则PC←(PC)+3 JNB bit,rel ;若(bit)=0,则转移PC←(PC)+3+ rel ;若(bit)=1,则PC←(PC)+3 JBC bit,rel ;若(bit)=1,则转移PC←(PC)+3+ rel ;且bit←0,若(bit)=0,则PC←(PC)+3 JB和JBC的功能类似,不同的是,若满足转移条件,JB指令实现转移,而JBC指令在转移的同时还将bit位地址的内容清零。

233 例3.29 比较内部RAM中30H和40H中的两个无符号数的大小,将大数存入50H,小数存入51H单元中,若两数相等则F0位置“1”。
MOV A,30H CJNE A,40H,Q ;两数不等转移 SETB F ;两数相等F0置位 RET Q1: JC Q ;(CY)=1即(30H)<(40H)转移 MOV 50H,A ;存大数 MOV 51H,40H ;存小数 Q2: MOV 50H,40H MOV 51H,A

234 5. 布尔操作类指令小结 ① 这类指令中所使用的地址全部是位地址,不能与内部RAM字节地址混淆。
② 布尔操作指令和字节操作指令一样,有传送指令、运算指令,跳转指令和位置指令、复位指令。布尔累加器是CY,也称累加位。 ③ 这类指令中,除了涉及CY及PSW的有关位的操作外,不影响PSW。 ④ 布尔操作类指令表见表3.6。

235 习 题 1. MCS-51有几种寻址方式?各用于访问哪些存储空间?列出寻址范围。 2. 要访问专用寄存器和片外数据存储器,应采用什么寻址方式? 3. 什么是指令系统?并简述MCS-51指令系统的特点。 4.分析下面程序段的执行结果,写出有关单元的内容: MOV SP,#3AH MOV A,#20H MOV B,#30H PUSH ACC PUSH B POP ACC POP B

236 5. 已知(A)=35H,(R0)=6FH,(P1)=0FCH,(SP)=0C0H,试分别写出下列各条指令的执行结果:
(1)MOV R0,A (3)MOV A,#90H (4)MOV A,90H (5)MOV 80H,#81H (6)MOVX @R0,A (7)PUSH ACC (8)SWAP A (9)XCH A,R0

237 6. 已知(A)=78H,(B)=04H,(R1)=78H,(PSW)=80H,(78H)=0DDH,(80H)=6CH,试分别写出下列指令的执行结果和CY、AC的状态:
(1)ADD (2)ADDC A,78H (3)SUBB A,#77H (4)INC R1 (5)DEC 78H (6)MUL AB (7)DIV AB

238 7. 说明下列程序的功能: MOV R0,#data MOV RL A MOV R1,A ADD A,R1 MOV R0,A

239 8. 已知(A)=83H,(R0)=17H,(17H)=34H,写出执行下面的程序段后累加器A的内容:
ANL A,#17H ORL 17H,A XRL CPL A 9. 简单指令实现以下数据传送。 (1)片外RAM 3000H单元内容送片内RAM 30H单元。 (2)将程序存储器2000H单元内容送片外RAM 1000H单元。 (3)R6内容送R7。 (4)P1.0状态送F0。

240 10. 程序中所有使用SJMP的地方是否都可以用AJMP代替, 为什么?
11. 12. 请用位操作指令编写下面逻辑表达式值的程序: (1)F0=( 10H∨P1.0)∧(11H∨P1.1) (2)P1.5=ACC.2∧P2.7∨ACC.1∧P2.0 13. 已知当前PC值为2000H,请用两种方法将程序存储器20F0H中的内容送入累加器A中。 14. 试编程将片外RAM中的30H和31H单元的内容相加,将结果存入内部RAM 30H中,进位存入位地址00H中。

241 机器语言是计算机能够直接识别和执行的语言,但其指令代码的编写、调试和阅读都相当困难。基于机器语言存在的问题,人类发明了更接近于人类语言特征的指令—汇编语言来编写程序。
汇编语言是计算机系统提供给用户的最快、最有效的语言,也是能对硬件直接编程的语言。因此,对空间和时间要求很高的程序,或需要直接控制硬件的程序,一般都使用汇编语言进行程序设计。用汇编语言编写的程序称为汇编语言源程序。

242 4.1.1 汇编语言的特点 汇编语言是用助记符来表示机器语言的指令代码的。汇编语言具有如下特点:
汇编语言的特点 汇编语言是用助记符来表示机器语言的指令代码的。汇编语言具有如下特点: ① 助记符指令和机器指令一一对应。用汇编语言编写的程序效率高,占用存储空间小,运行速度快,且能编写出最优化的程序。 ② 汇编语言与计算机硬件设备密切相关。汇编语言程序能直接管理和控制硬件设备,直接访问存储器及接口电路,也能处理中断。 ③ 汇编语言编程比高级语言程序的编写和调试要困难。汇编语言是面向计算机的,汇编语言的程序设计人员必须对计算机硬件有相当深入的了解。 ④ 汇编语言缺乏通用性,程序不易移植。各种计算机都有自己的汇编语言,不同计算机的汇编语言之间不能通用。

243 4.1.2 汇编语言的语句格式 1. 标号 汇编语言源程序中的语句格式表示如下: [标号:] 操作码 [操作数] [;注释]
汇编语言的语句格式 汇编语言源程序中的语句格式表示如下: [标号:] 操作码 [操作数] [;注释] (Lable) (Opcode) (Operand) (Comment) 一条汇编语句由标号、操作码、操作数和注释四个部分所组成,其中方括号括起来的是可选择部分,根据需要而定。 1. 标号 标号是语句地址的标志符号,汇编语言程序的语句通过标号才能访问到该语句。对于标号的使用有以下规定: ① 标号由1~8个ASCII码字符组成,第一个字符必须是字母,其余字符可以是字母、数字和一些特定字符。 ② 不能使用汇编语言中已经定义的符号作为标号,如指令助 记符、伪指令、专用寄存器的符号名称等均不能用作标号。 ③ 标号后必须紧跟一个冒号。

244 ④ 同一个标号在一个程序中只能定义一次,不能重复定义。
⑤ 一条语句可以有标号,也可以没有标号,标号的有无取决于本程序中的其他语句是否需要访问这条语句。 下面给出一些常见的正确标号和错误标号,以加深理解。 正确的标号 错误的标号 LOOP: 1BT:(以数字开头) TABLE: LST+2:(“+”号不能在标号中出现) THLS2: BEGIN(无冒号) LT-1: MOV:(指令助记符)

245 2. 操作码 3. 操作数 操作码用于规定语句执行的操作,它是指令助记符或伪指令。操作码是汇编语言语句中惟一不可空缺的部分。
操作数是给指令的操作提供数据或地址,它与操作码之间用空格分隔。在一条指令中,操作数根据指令的不同,可以是空白或一至三个,若有两个以上操作数,各操作数之间用逗号分隔。

246 4. 注释 注释不属于语句的功能部分,它只是对语句的功能和性质进行解释说明,因此注释可有可无,不是必须的。注释用分号“;”开头,以下为注释内容。注释的长度不限,一行不够时可以换行接着书写,但换行时应注意在开头使用“;”号。 使用注释可以使程序结构清楚,可读性强,方便软件的维护、修改和扩充功能,因而一个完整的汇编语言程序应附有必要的注释。

247 汇编语言的伪指令 伪指令是指令系统之外的,是程序源发给汇编程序的指令。汇编程序在这些指令的指导下将汇编语言程序汇编,生成机器码。伪指令对程序本身的算法和流图控制没有作用,因此伪指令没有对应的机器语言代码。 下面介绍MCS-51汇编语言程序中常用的伪指令。 1. ORG 汇编起始地址命令 其功能是规定生成的机器语言程序代码的起始地址。 命令格式: [标号:] ORG 地址 其中标号是任选项,可以没有。地址项为16位二进制绝对地址。

248 2. END汇编终止命令 例如: ORG 1000H START: MOV A,#00H …
规定了这个程序的START标号所在的地址为1000H,机器码程序从1000H地址开始存放。 2. END汇编终止命令 其功能是终止源程序的汇编工作,在END之后的指令,汇编程序都不予处理。END是汇编语言程序的结束标志,一个程序只能有一个END命令。 命令格式: [标号:] END [表达式]

249 只有主程序模块才具有表达式项,且表达式的值等于该程序模块的入口地址。其他程序模块没有表达式项。
其中标号也是可选项,当源程序为主程序时,END伪指令可带标号,这个标号应是主程序第一条指令的符号地址。若源程序为子程序,则END伪指令不应带标号。例如: ORG 1000H START: MOV A,#00H END START

250 3. EQU赋值命令 其功能是将一个特定值赋给一个标号。赋值以后,标号值在整个程序中有效。 命令格式: 字符名称 EQU 表达式
这里的字符名称不同于标号,因此不加冒号。表达式可以是常数、地址、标号或表达式。其值为8位或16位二进制数。赋值以后的字符名称既可以作地址使用,也可以作立即数使用。 例如: YH EQU 7FH 把7FH的值赋给字符YH,在其后的编程中YH就代表7FH。

251 4. DB定义字节命令 功能是从指定的地址单元开始,定义若干个字节的数据。 命令格式: [标号:] DB 数据表
[标号:] DB 数据表 其中的标号是可选项,数据表是一字节数据或用逗号分隔开的一组字节数据,或用引号括起来的字符串。例如: CONST: DB 30H TBL: DB 0C0H,0F9H,0A4H DB 0B0H,99H,92H

252 第二条伪指令定义了一个常数表,该表的起始地址为TBL,表中数据按伪指令中数据的顺序排列。
又例如: DB “how old are you?”,“A”,“#” 把引号中的字符按ASCII码存于连续的ROM中。

253 5. DW 定义字命令 其功能是从指定的地址单元开始,定义若干个16位的数据字。 命令格式: [标号:] DW 字数据表
[标号:] DW 字数据表 一个数据字占两个字节。存放时,高8位在前(低地址),低8位在后(高地址)。例如: WTBL: DW H,279H,20H 按顺序存入12H,34H,02H,79H,00H,20H。

254 6. DS定义存储区命令 其功能为从指定地址开始保留若干个字节的存储单元。 命令格式: [标号:] DS 表达式
命令格式:  [标号:] DS 表达式  表达式的值决定了保留多少字节的存储单元。例如: BASE: DS 100 该语句将从BASE标号地址开始保留100个连续的存储单元。 又例如: ORG 8100 DS 08H 表示从8100H地址开始,保留8个连续的存储单元。

255 7. BIT位定义命令 其功能是给字符名称赋以位地址。 命令格式: 字符名称 BIT 位地址
字符名称 BIT 位地址 其中位地址可以是绝对地址,也可以是符号地址即位符号名称。例如: AQ BIT P1.7 把P1.7的位地址赋给变量AQ,在其后的编程中AQ就可 以作为P1.7使用。

256 顺序程序设计 顺序程序的执行没有流程转移,全部按照程序语句的先后次序执行。顺序程序是最基本的程序结构之一,也是最简单的结构。 例4.1 两个三字节无符号数相减,设被减数放在片内RAM30H开始的单元中,减数放在40H开始的单元中,低字节在低地址单元中,高字节在高地址单元中,求两数之差并存入40H开始的单元中,借位存放在位寻址区的00H位中。 MOV R0,#30H ;被加数的低字节地址 MOV R1,#40H ;加数的低字节地址 CLR C MOV SUBB ;低字节相减 ;存低字节相减结果

257 INC R0 INC R1 MOV SUBB ;中间字节带进位相减 ;存中间字节相减结果 SUBB ;高字节带进位相减 ;存高字节相减结果 MOV 00H,C ;借位送00H保存

258 例4.2 将R5、R4中双字节二进制数取补,结果仍放在R5、R4中。
DBCPL:MOV A,R ;取低字节 CPL A ;取反 ADD A,# ;加1 MOV R5,A ;存结果 MOV A,R ;取高字节 ADDC A,#00H ;加进位 MOV R4,A ;存结果

259 分支程序设计 程序的分支是通过条件转移指令实现的。根据条件对程序中的状态进行判断,满足条件则进行程序转移,否则按顺序执行。在MCS-51指令系统中,有多种条件转移指令,包括JZ、JNZ、CJNE、DJNZ以及位状态条件转移指令JC、JNC、JB、JNB、JBC等,使用这些指令,可以完成各种条件下的程序分支转移。 分支程序可分为单分支程序和多分支程序。 1. 单分支程序 单分支程序是只使用一次条件转移指令的分支程序。 例4.3 将一位十六进制数转换为ASCII码。设十六进制数在累加器A中,转换结果仍存在于A中。

260 转换算法:十六进制数的0至9,加30H即可转换为ASCII码,而0AH至0FH加37H才能转换为ASCII码。
ORG 1000H CJNE A,#0AH,NOEQ ;A的内容与0AH比较 NOEQ: JC LP1 ;(C)=1即(A)<0AH转移 ADD A,#37H ;(A)≥0AH,加37H AJMP HERE LP1: ADD A,#30H ;(A)< 0AH,加30H HERE: SJMP HERE

261 例4. 4 已知X、Y均为8位二进制数,分别存在R0、R1中,试编制能实现下列符12
例4.4 已知X、Y均为8位二进制数,分别存在R0、R1中,试编制能实现下列符12. 使用循环转移指令编写延时20ms、1s、1min的延时子程序。设单片机的晶振频率为6MHz。 +1 ,当X>0 Y= ,当X=0 -1 ,当X<0 程序流程框图如图4.1所示。

262 程序如下: ORG H MOV A,R0 CJNE A,#00H,MP1 ;若(R0)≠0跳转 MOV R1,#00H ;若(R0)=0,则0→R1 AJMP HERE ; MP1: JB ACC.7 MP2 ;最高位为1,表明(R0)<0,跳转 MOV R1,#01H ;否则1→R1 LJMP HERE MP2: MOV R1,#0FFH ;(R0)<0,则-1→R1,-1的补码为FFH HERE: SJMP HERE

263 2. 多分支程序 在多分支程序中,因为可能的分支会有N个,若采用多条CJNE指令逐次比较,程序的执行效率会降低很多,特别是分支较多时。这时,一般采用跳转表的方法,通过两次转移来实现。假定分支序号的最大值是n,则分支转移结构如图4.2所示。

264 例4.5 设内部RAM的30H单元有一个数,根据该数值的不同转移到不同的程序段进行处理,设数值的范围为0~10的无符号数。
程序如下:  MOV A,30H ;取数 RL A ;乘以2以适应跳转表 MOV DPTR,#JMPTAB ;跳转表的首地址 ;转向跳转表 JMPTAB: AJMP PROC00 ;转分支0 AJMP PROC01 ;转分支1 AJMP PROC10 ;转分支10 PROC00:  … PROC10:

265 使用跳转表最多可实现128路分支。由于AJMP指令的转移范围是2KB,因此分支处理程序的位置受到限制。若把跳转表中的AJMP指令改为LJMP指令,则分支程序可分布在整个64KB范围内,但要对分支数值进行乘3处理(LJMP是一个三字节指令,而AJMP是双字节指令)。 相应程序如下:  MOV A,30H ;取数 RL A ;乘2 ADD A,30H ;再加一次,实现乘3 MOV DPTR,#JMPTAB ;跳转表的首地址 ;转向跳转表 JMPTAB: LJMP PROC00 ;转分支0 LJMP PROC01 ;转分支1 LJMP PROC10 ;转分支10

266 上面的例子还可采用查表法来实现。与跳转表不同,这个表的内容不是跳转指令,而是地址的偏移量,即各分支处理程序的入口地址与表的基地址的差值,因此也称为差值表。
其程序如下: MOV A,30H ;取数 MOV DPTR,#BRTAB ;差值表的首地址 MOVC ;查表 ;转向跳转表 BRTAB: DB BR0-BRTAB ;差值表 DB BR1-BRTAB DB BR10-BRTAB BR0: …  BR10: 

267 这种方法的技巧性较强,但由于表内的差值只限于8位,使分支程序的入口地址的分布范围受到限制,并且只能实现少于255个分支。
例4.6 假定有三个分支程序段,各分支程序段的功能依次是从内部RAM取数,从外部RAM低256B范围取数,从外部RAM 64KB范围取数。并假定R0中存低8位地址,R1中存高8位地址,R3中存放分支序号值0~2。 MOV A,R3 ;分支序号值送A RL A ;乘以2以适应跳转表 MOV DPTR,#JMPTAB ;跳转表的首地址 ;转向跳转表

268 JMPTAB: AJMP PROC0 ;转分支0 AJMP PROC1 ;转分支1 AJMP PROC2 ;转分支2 PROC0: MOV ;从内部RAM取数 SJMP PROCE PROC1: MOVX ;从外部RAM低256B范围取数 PROC2: MOV DPL,R0 MOV DPH,R1 MOVX ;从外部RAM 64KB范围取数 PROCE: SJMP $

269 循环程序设计 循环是为了重复执行一个程序段。与高级语言不同,汇编语言中没有专用的循环指令,但可以使用条件转移指令通过判断来控制循环是继续还是结束。 通常循环结构的程序包含四个组成部分: ① 循环准备:设置循环次数、起始地址及结果初值等参数。 ② 循环体:循环程序的主体,是要求重复执行的部分。 ③ 循环修改:修改循环次数及有关变量参数等。 ④ 循环控制部分:根据循环结束条件来判断是否结束循环。

270 例4.7 将内部RAM的30H地址开始的80个数据,传送到外部RAM的2000H单元开始的区域。
ORG 2000H START:MOV R0,#30H ;源数据区首地址 MOV DPTR,#2000H ;目的数据区首地址 MOV R7,#80 ;循环次数 LOOP: MOV ;取数据 ;数据传送 INC R0 ;源地址加1 INC DPTR ;目的地址加1 DJNZ R7,LOOP ;循环控制 SJMP $ ;结束

271 例4.8 外部RAM之间的数据传送程序。 把外部RAM 2000H开始单元中的数据传送到外部RAM 3000H开始的单元中,数据个数在内部RAM的35H单元中。 ORG 1000H START: MOV DPTR,#2000H ;源数据区首地址 PUSH DPL ;源首址暂存堆栈 PUSH DPH MOV DPTR,#3000H ;目的数据区首地址 MOV R2,DPL ;目的首址暂存寄存器 MOV R3,DPH

272 LOOP: POP DPH ;取回源地址 POP DPL MOVX ;取出数据 INC DPTR ;源地址加1 PUSH DPL ;源地址暂存堆栈 PUSH DPH MOV DPL,R ;取回目的地址 MOV DPH,R3 ;目的地址加1 MOV R2,DPL ;目的地址暂存寄存器 MOV R3,DPH DJNZ 35H,LOOP ;没完,继续循环 SJMP $

273 此例中,由于访问外部RAM只有一对以DPTR寄存器作为间址方式的指令,完成累加器与外部RAM之间的数据传送,源地址指针和目的地址指针都必须使用DPTR,所以程序中将源地址和目的地址分别保护,分时占用DPTR来传送数据。 例4.9 已知在内部RAM中,有一长度不超过32B的字符串,首地址为data,该字符串以回车符“CR”作为结束标志。要求统计此字符串的长度并将其结果存入内部RAM 的length单元中。 程序流程框图如图4.3所示。

274

275 因回车符“CR”的ASCII值为0DH,假设data为20H,length为1FH,则程序如下:
CR EQU 0DH data EQU 20H length EQU 1FH ORG 1000H MOV R0,#data-1 ;字符串首地址减1 MOV R7,#0FFH ;长度初值为-1 CRLOP: INC R0 ;字符串地址加1 INC R7 ;长度加1 MOV ;取字符 CJNE A,#CR,CRLOP ;与“CR”比较相等时结束 MOV length,R7 ;存字符长度 SJMP $

276 4.2.4 子程序设计 调用子程序的程序称为主程序,主程序和子程序之间的调用关系如图4.4所示。
子程序设计 子程序结构是汇编语言中一种重要的程序结构。在一个程序中经常会碰到反复执行某程序段的情况,如果重新书写这个程序段,会使程序变得冗长而杂乱。对此,可以采用子程序结构,即把重复的程序段编写为一个子程序,通过主程序调用它。这样不但可以提高编制和调试程序的效率,而且可以缩短程序长度,从而节省程序存储空间,但并不节省程序运行的时间。 调用子程序的程序称为主程序,主程序和子程序之间的调用关系如图4.4所示。

277 1. 参数传递 在MCS-51中,完成子程序调用的指令为ACALL和LCALL,完成子程序返回的指令为RET。
在子程序调用时需要注意的两个问题: 1. 参数传递 在子程序结构中,参数的传递要靠程序设计者自己安排数据的存放和选择工作单元。子程序参数的传递一般可采用下面的方法。 (1)传递数据 将数据通过工作寄存器R0~R7或者累加器A来传送。其具体过程是:在调用子程序前把数据送入寄存器中,子程序就对这些寄存器中的数据进行操作,子程序执行后,结果仍由寄存器送回。

278 (2)传递地址 数据存放在数据存储器中,参数传递时只通过R0、R1、DPTR传递数据所存放的地址。调用结束时,结果就存放在数据存储器中,传送返回的也是寄存器中的地址。 (3) 通过堆栈传递参数 在调用前,先把要传送的参数压入堆栈,进入子程序后,再将堆栈中的参数弹出到工作寄存器或其他内部RAM单元。在弹出参数时,应注意栈顶的两个字节数据是断点地址,不应误认为传递的参数。在子程序返回之前,应保证该两个字节数据仍处在栈顶位置,以便正确返回主程序。

279 2. 现场保护 进入子程序后,应注意除了要处理的参数数据和要传递回主程序的参数之外,有关的内部RAM单元和工作寄存器的内容,以及各标志的状态都不应因调用子程序而改变,这就存在现场保护问题。 现场保护的方法是:在调用子程序前或一进入子程序,就将子程序中所使用的或会被改变内容的工作单元的内容压入堆栈;在子程序完成处理,将要返回前或一返回主程序后,就把堆栈中的数据弹出到原来的工作单元,恢复原来状态。对于所使用的工作寄存器的保护可用改变工作寄存器组的方法。

280 例4.10 用子程序实现多字节BCD码的加法运算。
设BCD十进制的两个加数分别放在内部RAM的30H单元、50H单元开始的区域,要求将和存放在30H开始的区域,数据长度均为8个字节。 子程序: MULTADD: CLR C ;清CY LOOP: MOV ;取被加数一个字节 ADDC ;与加数的一个字节相加 DA A ;十进制调整 ;暂存中间结果 INC R0 ;地址增1 INC R1 ;地址增1 DJNZ R2,LOOP ;次数减1,不为0转移 CLR A

281 ADDC A,#00H ;处理最高位进位 ;存进位 RET ;子程序返回 主程序:   ORG 2000H START: MOV R0,#30H ;被加数首地址 MOV R1,#50H ;加数首地址 MOV R2,#08H ;字节数 ACALL MULTADD ;调用子程序 SJMP $ 此例中,通过R0、R1传递数据所存放的地址和通过R2传递数据来实现参数传递。汇编语言子程序的设计,在很多情况下还会出现通过堆栈传递参数和现场保护问题,这里不再一一举例。

282 数制转换程序 在实际应用中,经常会遇到各种码制数据之间的相互转换问题。在单片机系统的输入、输出中,人们常常习惯使用十进制数;而在单片机内部数据存储和计算时,通常采用二进制数。因此经常需要作这两种进制数的转换程序。以下介绍二、十进制数之间的相互转换程序。 例 位二进制数转换为3位BCD数。 把累加器A中的8位无符号二进制整数(0~255)变换成3位BCD数字(双字节),百位数置于21H中,十位数和个位数合并置于20H中。

283 MOV B,#100 ;除数100,用以提取百为数 DIV AB MOV 21H,A MOV A,#10 ;除数10,用以提取十位数 XCH A,B SWAP A ADD A,B ;压缩BCD数字 MOV 20H,A

284 B=bm-1×2m-1+ bm-2×2m-2+……+b1×2+ b0
例 位二进制数转换为5位BCD数。 二进制数转换为BCD数除了采用例4.11的除法来实现外,还可以采用下面的方法。 一个m位二进制数可以展开为多项式: B=bm-1×2m-1+ bm-2×2m-2+……+b1×2+ b0 其中:bm-1、bm-2……b1、b0是二进制的各位值 B为该二进制数转换的十进制数即压缩BCD数 初值:B=0,i=m-1 循环体:B=B×2+ bi i=i-1 结束循环条件:i=0 该方法的转换算法如图4.5所示。

285

286 下面是使用这种方法实现的16位二进制数转换为5位BCD数的程序,该程序将BINDR地址开始的双字节二进制数转换为三字节压缩BCD数,存入BCDDR地址开始的单元中(低字节在前)。
BIN2BCD3: MOV R2,#16 ;计数器初值设置为二进制数位数 MOV R3,# ;BCD数单元长度 MOV R0,#BCDDR ;BCD数单元首地址 CLR A B0: ;BCD数单元清零 INC R0 DJNZ R3,B0

287 B1: MOV R3,# ;二进制数单元长度 MOV R0,#BINDR ;二进制数单元首地址 CLR A B3: MOV RLC A ;二进制数左移一位,最高位送CY INC R0 ;修改地址指针 DJNZ R3,B3 MOV R3,#3 MOV R0,#BCDDR B4: MOV ;BCD单元内容乘2加CY ADDC

288 DA A INC R0 DJNZ R3,B4 DJNZ R2,B2 RET

289 多字节无符号数的加减法运算 在MCS-51单片机指令系统中,设有单字节无符号数的加减指令:ADD、ADDC和SUBB。而在实际应用系统,时常需要进行多字节的算术运算。以下我们介绍多字节无符号数的加减法程序设计。 例4.13 编写四字节无符号数加法子程序,设被加数存放在内部RAM的33H、32H、31H、30H单元,加数放在43H、42H、41H、40H单元,结果将和存放在33H、32H、31H、30H单元中,最高位进位存放在34H单元中。数据高位存高地址。 解题分析:根据题意要求列出算式如下: (33H)(32H)(31H)(30H) + (43H)(42H)(41H)(40H) (34H)(33H)(32H)(31H)(30H)

290 由此算式可知,只要将各对应字节逐一相加即可。我们用循环结构程序解上述问题。
由此算式可知,只要将各对应字节逐一相加即可。我们用循环结构程序解上述问题。  DADD: MOV R0,#30H ;被加数低位地址 MOV R1,#40H ;加数低位地址 MOV R7,#04H ;加法次数 CLR C LOOP: MOV ADDC INC R0 INC R1 DJNZ R7,LOOP

291 CLR A ADDC A,#00H ;A←0+(CY)+0 RET DADD子程序完成2个四字节无符号数加法程序设计。首先,最低位的相加,只要使用不含进位的加法指令ADD即可,为避免入口时CY位状态对本程序的影响,在进行最低位加法运算前要先清CY 位;其次,最高位进位通过“ADDC A,#00H”指令获得,在ADDC指令执行前,先使A的内容为0,从而获得CY 位的值。

292 例4.14 编写N字节无符号数减法子程序。设被减数存放在内部RAM 30H单元开始的连续地址,减数放在以40H单元开始的连续地址,结果将差存放在30H单元开始的连续地址,借位存放在00H位地址中。数据高位存地址。 该题与上一题非常类似,除运算类型不同外,主要差别还表现在借位不是存放在一个字节单元内,而是一个位地址。 DSUB: MOV R0,#30H ;被减数低位地址 MOV R1,#40H ;减数低位地址 MOV R7,#N ;减法次数 CLR C LOOP: MOV SUBB

293 INC R0 INC R1 DJNZ R7,LOOP MOV 00H,C ;借位存放 RET

294 双字节的乘法运算 MCS-51内部设有单字节的乘法指令(MLU AB),对于单字节的乘法运算,只要通过一条指令即可完成,而对于多字节数的乘法,必须通过程序实现。 例4.15 编两个双字节无符号数的乘法运算程序,被乘数和乘数分别存放于内部RAM的R2、R3单元和R6、R7单元(其中R2、R6为高位字节),将积存放于R4、R5、R6、R7单元中。 根据题意可知:R4R5R6R7=R2R3×R6R7 由于乘数和被乘数都是双字节数,所以必须进行4次乘法运算,得到4个部分积,假定部分积的高字节以“H”表示,部分积的低字节以“L”表示,双字节无符号数的乘法运算过程如图4.6所示。

295

296 乘法程序如下:  DBMUL: MOV A,R3 MOV B,R7 MUL AB ;(R3)×(R7)(得第一次部分积) XCH A,R7 ;R7←(R3R7L),A←(R7) MOV R5,B ;R5←(R3R7H) MOV B,R2 MUL AB ;(R2)×(R7)(得第二次部分积) ADD A,R5 MOV R4,A ;R4←(R2R7L)+(R3R7H) CLR A ADDC A,B MOV R5,A ;R5←(R2R7H) +(R2R7L ;+R3R7H时产生的进位)

297 MOV A,R6 MOV B,R3 MUL AB ADD A,R4 XCH A,R6 ;R6←(R3R6L),A←(R6) XCH A,B ;B←(R6),A←(R3R6H) ADDC A,R5 MOV R5,A ;R5←(R3R6H) +(R3R6L+ R4时 ;产生的进位) MOV F0,C MOV A,R2 ADD A,R5

298 MOV R5,A ;R5←(R2R6L)+(R5) CLR A MOV ACC.0,C MOV C,F0 ADDC A,B MOV R4,A ;R4←(R2R6H)+(F0)+ ;(R2R6L+R5时产生的进位) RET 上面程序完成两个双字节无符号数的乘法运算。特别要注意的是,在运算过程中不能忘记对部分积相加产生进位时的处理。由于MCS-51单片机的除法指令也是单字节的,多字节的除法运算也必须以程序实现,这里不再举例。

299 软件定时程序 在单片机的应用系统中,常有定时进行某些处理的需要,如定时检测、定时扫描等。定时功能除利用可编程定时器定时外,当定时时间较短或系统实时性要求不高的情况下,可利用一些“哑指令”,通过执行这些哑指令的固有延时来实现软件定时的目的。 所谓“哑指令”,是指对单片机内部状态无影响的指令,不影响存储单元的内容,也不影响标志位的状态,只是起到调节机器周期的作用,如NOP指令。下面就使用NOP指令说明软件定时程序的设计。 1. 单循环软件定时

300 例如: DELAY: MOV R7,#TIME LOOP: NOP NOP DJNZ R7,LOOP RET

301 以上程序就是一个最简单的单循环程序。 NOP指令的机器周期为1;DJNZ指令的机器周期为2; MOV指令的机器周期为1;RET指令的机器周期为1。 因此执行这些指令总的机器周期数为:1+4×TIME+1,TIME为装入R7的一个立即数,取值范围由0~255变化。 当TIME=0时,由于DJNZ指令是先减1再判零的操作,因此,LOOP循环体执行了256次,总执行机器周期数为:1+4×256+1=1026; 当TIME=1时,LOOP循环体执行1次,总执行机器周期数为:1+4×1+1=6。 所以,当单片机使用6MHz的晶体振荡器时,上面程序最大延时为:1026×2=2052(µs),最小延时为6×2=12(µs)。 改变TIME的不同取值,可实现不同时间的软件定时。

302 2. 多循环软件定时 为了得到更长的软件定时,可以使用多个循环嵌套的方法。下面程序使用双重循环实现更长的定时时间。
总执行机器周期:1+[(1+4×TIME1)+2]×TIME2+1 当使用6MHz晶体振荡器时,最长定时时间为: {1+[(1+4×256)+2]×256+1}×2=(1+127×256+1)×2=65028(µs) DELAY: MOV R6,#TIME2 LOOP2: MOV R7,#TIME1 LOOP1: NOP NOP DJNZ R7,LOOP1 DJNZ R6,LOOP2 RET

303 3. 调整定时时间 上面两程序中除改变循环体执行次数,即改变TIME、TIME1、TIME2的值,可改变定时时间外,通过增减循环体内指令的数目也可改变定时时间。如在单循环定时程序循环体中,增加一条哑指令NOP,总执行机器周期数为:1+5×TIME。 另外,还可以通过改变调用一个基本延时程序的次数,来实现不同定时时间的要求。例如,利用调用一个5ms的软件定时程序DELAY,来实现10ms、30ms等时间的延时。 MOV R5,#02H LOP1: LCALL DELAY DJNZ R5,LOP1 MOV R5,#06H LOP2: LCALL DELAY DJNZ R5,LOP2

304 软件定时,只适合应用在短时间或实时性要求不高的场合。对于那些时间长的、实时性要求高的系统,需要采用可编程定时器定时的方式。详见第5章介绍。

305 查表程序 预先将数据以表格的形式存放在存储器中,然后使用程序将其读出来,这种程序称为查表程序。查表程序是单片机系统一种常用的程序,它可以完成数据补偿、计算、转换等功能。在MCS-51系统中使用“MOVC “MOVC 例4.16 表TAB1中存放一组ASCII码,试使用查表方法,将R2的内容(范围为0~0FH)转换为与其对应的ASCII码,并从P1口输出。 按照查表的思路,程序如下:

306 TB1: MOV A,R2 ADD A,#3 ;加MOVC指令到TAB1表之间的偏移量 MOVC MOV P1,A RET TAB1: DB 30H,31H,32H,33H DB 34H,35H,36H,37H DB 38H,39H,41H,42H DB 43H,44H,45H,46H  

307 例4.17 在一个单片机控制系统中,其输入值x与对应的输出值y的关系为y=f(x),假设对应于x的y值已经存在表中,x的取值范围为(0~255)。设x在R2中,查询结果y值存放于R2R3中,请编程查表程序。 解题分析:在本例中,对应于每个x,输出结果占用两个字节,所以必须先将x乘2,对查表地址进行修正。 程序如下: LTB2: MOV DPTR,#TAB2 MOV A,R2 CLR C RLC A ADD A,DPL

308 MOV DPH,A ;DPTR←(R2)×2+(DPTR)
MOV DPL,A CLR A ADDC A,DPH MOV DPH,A ;DPTR←(R2)×2+(DPTR) MOVC ;查第一字节 MOV R2,A INC DPTR MOVC ;查第二字节

309 MOV R3,A RET TAB2: DW 01A0H,5679H,81B0H ;y值表 … DW AC23H,C600H,E456H
表TAB2可以放于64K程序存储器空间的任何地方。

310 4.3.6 极值查找 极值查找就是在给定的数据区中找出最大值或最小值
极值查找 极值查找就是在给定的数据区中找出最大值或最小值 例4.18 在MCS-51单片机内部RAM 20H~27H单元中存放8个无符号数,编制一段程序找出其中的最大值并存入28H单元中。 解题分析:先把20H单元的内容给A,然后将21H单元的内容与A的内容进行比较,如果(21H)>(A),则将21H的内容送给A,然后和下一个数进行比较,依次类推,最后A中的内容必定是最大值。 程序流程如图4.7所示。

311

312 程序如下: MOV R0,#20H ;置数据存储区首单元地址 MOV R7,#07H ;置比较次数 MOV ;将20H单元的内容送A LOOP: INC R0 MOV ;取下一个数 CJNE A,B,NEXT NEXT: JNC NEXT1 ;若(A)<(B),则A←(B) MOV A,B NEXT1: DJNZ R7,LOOP MOV 28H,A SJMP $

313 4.3.7 数据检索 数据检索是在数据区中查找关键字的操作。将关键字与数据区中数据逐一进行比较,从而判断两者是否相等。
数据检索 数据检索是在数据区中查找关键字的操作。将关键字与数据区中数据逐一进行比较,从而判断两者是否相等。 例4.19 在MCS-51单片机内部RAM 20H~2FH地址的16个单元中,存放一批数据。试检索是否有与30H单元内容相等的数据,若检索成功,则将序号存入31H单元;否则将FFH存入31H单元。 解题分析:检索开始时将31H单元初始化为FFH,若检索成功,则将序号存入31H。程序运行结束后,若31H内容为FFH,则表示未检索到;否则即表示已检索到,且31H的内容即为序号。 程序设计如下:

314 MOV R0,#20H ;取数据区首地址 MOV R7,#10H ;取数据长度 MOV 31H,#0FFH ;31H初始化为FFH MOV R2,#00H ;序号初始化为00H LOOP2: MOV ;取数据区数据 CJNE A,30H,LOOP1 ;判断与关键字是否相等 ;不等转LOOP1 MOV 31H,R2 ;相等,则将R2中序号传送到 ;31H保存 SJMP $ ;完成等待 LOOP1: INC R0 ;不等,数据区地址加1 INC R2 ;序号加1 DJNZ R7,LOOP2 ;检索未完成转LOOP2 SJMP $ ;检索完成等待

315 数据排序 数据排序的算法很多,常用的有插入排序法、冒泡法、快速排序法、选择排序法等。现以冒泡法为例,说明数据升序排序算法及编程实现。 例4.20 编制一段程序,采用冒泡排序法,将8051的片内RAM 50H~57H的内容,以无符号数的形式从小到大进行排序,即程序运行后,50H单元的内容为最小,57H的内容为最大。 冒泡排序法是一种相邻数互换的排序方法,因其过程类似水中的气泡上浮,故称冒泡法。执行时从前向后进行相邻数的比较,若数据的大小次序与要求的顺序不符(也就是逆序),就将这两个数交换,否则为正序不互换。假设是升序排列,则通过这种相邻数互换的排序方法,使小的数向前移,大的数向后移,如此从前向后进行一次冒泡,就会把最大的数换到最后,再进行一次冒泡,就会把次大的数排到倒数第二的位置上。如此下去,直到排序完成。

316 假设原始数据有顺序为:50、38、7、13、59、44、78、22。 第一次冒泡的过程是: 50.38.7.13.59.44.78.22(逆序、互换) 38.50.7.13.59.44.78.22(逆序、互换) 38.7.50.13.59.44.78.12(逆序、互换) 38.7.13.50.59.44.78.22(正序、不互换) 38.7.13.50.59.44.78.22(逆序、互换) 38.7.13.50.44.59.78.22(正序、不互换) 38.7.13.50.44.59.78.22(逆序、互换) 38.7.13.50.44.59.22.78(第一次冒泡结束)

317 如此进行,各次冒泡的结果是: 第一次冒泡:38.7.13.50.44.59.22.78 第二次冒泡:7.13.38.44.50.22.59.78 第三次冒抱:7.13.38.44.22.50.59.78 第四次冒泡:7.13.38.22.44.50.59.78 第五次冒泡:7.13.22.38.44.50.59.78 第六次冒泡:7.13.22.38.44.50.59.78 第七次冒泡:7.13.22.38.44.50.59.78 可以看出,冒泡排序到第五次已实际完成。 针对上述冒泡排序过程,有两个问题需要说明:

318 ① 由于每次冒泡都是从前向后排定一个大数(假定升序),因此每次冒泡所需进行的比较次数都递减1。例如有n个数排序,则第一次冒泡需比较(n-1)次,第二次冒泡则需(n-2)次……,依次类推。但在实际编程时,有时为了简化程序,往往把各次的比较次数都固定为(n-1)次。尽管有许多重复操作也在所不惜。 ② 对于n个数排序,理论上,冒泡法应进行(n-1)次冒泡才能完成排序,但实际上并不需要这么多,如该例中,当进行到第五次时排序就完成了。判断排序是否完成的最简单方法是看各次冒泡中有无互换发生。如果有数据互换,说明排序还没完成,否则就表明已排序好了。为此,控制排序结束一般不使用计数方法,而使用设置互换标志的方法,以其状态表示在一次冒泡中有无数据互换。 冒泡排序算法程序流程如图4.8所示。

319

320 具体程序如下: SORT: MOV R0,#50H ;置数据存储区首单元地址 MOV R7,#07H ;置每次冒泡比较次数 CLR F ;交换标志清0 LOOP: MOV ;取前数 MOV 2BH,A ;存前数 INC R0 MOV ;取后数 CLR C SUBB ;前数减后数 JZ NEXT ;(A)=1,表明前数=后数,不互换

321 JC NEXT ;(CY)=1,表明前数<后数
;不互换 MOV @R0,2BH ;(CY)=0,前数>后数 ;前数存人后数位置 DEC R0 MOV @R0,2AH ;后数存入前数位置 INC R ;恢复R0值,准备下两次比较 SETB F ;置交换标志 NEXT: DJNZ R7,LOOP ;(R7)-1=0返回,进行下一次比较 JB F0,SORT ;(F0)=1返回,进行下一轮冒泡 RET ;(F0)=0,无交换,排序结束

322 习 题 1. 已知在内部RAM中有以array为首单元的数据区,依次存放单字节数组长度及数组内容,求这组数据的和,并将求和结果存入紧接数据区。 2. 编程实现将内部RAM 20H~22H单元的内容分别存放到外部RAM的str-4、str、str+4单元中。 3. 外部RAM从2000H到2100H有一个数据块,现要将它们传送到从3000H到3100H的区域,试编写有关程序。 4. 把长度为10H的字符串从以20H为首地址的内部RAM单元传送到以2000H为首地址的外部RAM单元,一直进行到遇见回车符CR或整个字符串传送完毕。 5. 编写8位BCD数加法的程序。设被加数存于内部RAM的30H~33H单元,加数存于40H~43H单元,相加结果存于30H~34H单元,数据按低字节在前的顺序排列。

323 6. 求8个数的平均值,这8个数以表格形式存放在从table开始的单元中。
7. 使用乘法指令,编写单字节数与双字节数相乘的程序。设被乘数在R2R3中,乘数在R4中,乘积存于R5R6R7中。 8. 求16位补码数的原码。16位补码数放在内部RAM的30H、31H单元中,转换结果仍放在原单元中。 9. 设40H单元有一个数,其范围是0~32,编写程序实现根据该单元的内容转入不同的程序入口SUB0、SUB1、…、SUB32。 10. 编写查表程序,实现查平方值。该要查表的数据值存于R7中,其范围为0~9,查得结果存于R6中。 11. 试编写程序,找出外部RAM 2000H~200FH数据区中的最小值,并存于R2中。

324 12. 使用循环转移指令编写延时20ms、1s、1min的延时子程序。设单片机的晶振频率为6MHz。
13. 设有一组无序排列的数据存于内部RAM区,其首地址存于R0中,数据区长度存于R7中,采用冒泡法编程将其按降序排列。 14. 从内部RAM 20H单元开始存放一组带符号数,字节个数存于1FH中,请统计出其中大于0、等于0和小于0的数的个数,并把统计结果分别存放one、two和three三个单元中。 15. 在3800H为首址的外部RAM单元中,存放着10个由ASCII码表示的0~9之间的数,试编写程序,将它们转换成十进制数,并存放到2000H~2004H单元之中。

325 单片机中断技术概述 1. 中断的基本概念 在我们的日常生活经常会遇到中断现象,例如:你在看书——电话铃响了——你在书上做个记号,走到电话旁——你拿起电话和对方通话——门铃响了——你让打电话的人稍等一下——你去开门,并在门旁与来访者交谈,谈话结束,关好门——回到电话机旁,拿起电话,继续通话——通话完毕,挂上电话——从作记号的地方继续看书。 这是一个很典型的中断现象。从看书到接电话,是一次中断过程,而从打电话到与门外来访者交谈,则是在中断过程中发生的又一次中断,即所谓中断嵌套。为什么会发生上述的中断现象呢?就是因为你在同一时刻,面对三项任务:看书、打电话和接待来访者。但一个人不能同时完成三项任务,因此你只好采用中断办法,穿插着去做。

326 这种现象同样也会出现在计算机中,因为通常计算机只有一个CPU。CPU在执行正常程序过程中,发生随机事件或特殊请求时,CPU就暂时中断正在执行的正常程序,而转去执行随机事件或特殊请求的处理程序。当处理完毕后,CPU再回到被暂时中断的程序,接着往下继续执行。这个过程称为程序中断。 程序中断与调用子程序相似,但却有本质的区别:调用子程序是事先知道某种需要,在程序中插入一条调用指令,它是预先安排好的。中断则是由外部原因随机产生的。一般程序中断由中断源向CPU提出中断请求,在一定的条件下,CPU响应中断请求后,程序就转至中断处理子程序,执行完中断处理程序后返回源程序,继续执行。中断过程如图5.1所示。

327

328 2. 中断的功能 中断是用以提高计算机效率的一种重要手段,它可以较好地发挥CPU的能力。中断技术主要有如下功能:
① 可以采用“分时”处理办法 使CPU与外设并行工作,从而大大提高CPU的使用效率。 由于许多外部设备速度很慢,无法与CPU进行直接的同步数据交换,因此可通过中断技术来实现CPU和外设的协调工作。在CPU执行程序过程中,如需进行数据输入/输出时,先启动外设,然后CPU继续执行程序。与此同时,外设在为数据输入/输出传送做准备。当准备完成后,外设发出中断请求,请求CPU暂停正在执行的程序,转去完成数据的输入/输出传送。传送结束后,CPU再返回继续执行源程序,而外设则为下次传送做准备。这种以中断方法完成的数据输入/输出操作,在宏观上看来似乎是CPU与外设同时工作。

329 ② 可以进行“实时”控制 此时外设可以处于主动地位,随时请求CPU进行处理操作。 所谓实时控制就是计算机能及时完成被控对象随机提出的任务,以便使被控对象能保持在最佳工作状态,达到预定的控制要求。在自动控制系统中,各种控制参数可能随机地在任何时刻向计算机发出请求,要求进行处理。对此,CPU必须做出快速响应和及时处理。这种实时处理功能只能靠中断技术才能实现。 ③ 对紧急事件进行中断处理 计算机在运行过程中,常常会发生一些事先无法预料的故障,如:硬件故障、电源掉电、运算错误、程序故障等。有了中断技术,计算机就能对这些故障及时发现并进行自动处理。状态正常后,计算机再继续执行程序。

330 中断源 向CPU发出中断请求的来源称之为中断源。MCS-51是一个多中断源的单片机,以80C51为例,有5个中断源,分别为外部中断2个、定时中断2个和串行中断1个。图5.2为中断系统输入端的示意图。

331

332 1. 外部中断、INT0、INT1 2. 定时中断T0、T1 3. 串行中断TI/RI
外部中断是由外部信号引起的。外部中断0和外部中断1的信号分别由P3.2和P3.3引脚输入。低电平或负跳变有效,由IT0和IT1设置,一旦输入信号有效,则将TCON中的IE0或IE1标志位置1,可向CPU申请中断。 2. 定时中断T0、T1 定时中断为定时器/计数器0和定时器/计数器1溢出中断,这属于内部中断。当定时器/计数器加1计数产生溢出时,则将TCON中的TF0、TF1标志位置1,向CPU申请中断。 3. 串行中断TI/RI 串行中断即为串行口的接收和发送中断。当串行口接收或发完一帧数据时,将TCON的RI或TI位置1,向CPU申请中断。

333 5.1.3 中断控制 1. 定时器控制寄存器TCON MCS-51单片机中断控制部分由4个专用寄存器组成,它们的功能分述如下:
中断控制 MCS-51单片机中断控制部分由4个专用寄存器组成,它们的功能分述如下: 1. 定时器控制寄存器TCON 该寄存器用于控制定时器的启、停及定时器的溢出标志和外部中断的触发方式及外部中断的请求标志。寄存器地址88H,位地址88H~8FH。寄存器的内容及位地址表示如下: 位地址 8FH 8EH 8DH 8CH 8BH 8AH 89H 88H 位符号 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0

334 这个寄存器既有定时器/计数器功能又有中断控制功能,其中与中断有关的控制位共有6位:
TF1和TF0:分别为定时器1和定时器0的计数溢出标志位。当定时器计数满产生溢出时,由硬件自动置1,并申请中断。转向中断服务程序后,由硬件自动清0。这两位也可作为程序查询的标志位,在查询方式下应由软件来清0。 IE1和IE0:分别为外部中断1和外部中断0的中断请求标志位。当CPU采样到(或)端出现有效中断请求时,IE1(或IE0)位由硬件置1,在中断响应完成后转向中断服务时,再由硬件自动清0。 IT1和IT0:分别为外部中断1和外部中断0的触发方式选择位。 IT1(IT0)=1 边沿触发方式,后沿负跳有效。 IT1(IT0)=0 电平触发方式,低电平有效。

335 2. 串行口控制寄存器SCON 该寄存器的地址98H,位地址98H~9FH。寄存器的内容及位地址表示如下: 其中与中断有关的控制位共2位:
9EH 9DH 9CH 9BH 9AH 99H 98H 位符号 SM0 SM1 SM2 REN TB8 RB8 TI RI 其中与中断有关的控制位共2位: TI:串行口发送中断请求标志位。当发送完一帧串行数据后,由硬件置1,在转向中断服务后,由软件清0。 RI:串行口接收中断请求标志位。当接收完一帧串行数据后,由硬件置1,在转向中断服务后,由软件清0。

336 3. 中断允许控制寄存器IE 串行中断由TI和RI的逻辑或得到。就是说,无论是发送标志还是接收标志,都会产生串行中断请求。
该寄存器的地址0A8H,位地址0A8H~0AFH。寄存器的内容及位地址表示如下: 位地址 0AFH 0AEH 0ADH 0ACH 0ABH 0AAH 0A9H 0A8H 位符号 EA / ES ET1 EX1 ET0 EX0 其中与中断有关的控制位共6位:

337 EA:中断总允许位。EA=1,CPU开放中断,而每个中断源的中断禁止或中断允许分别由各自的允许控制位确定。EA=0,CPU关中断,禁止一切中断。
ET1:定时器1中断允许位。ET1=1,允许定时器 1中断;ET1=0,禁止定时器1中断。 EX1:外部中断1允许位。EX1=1,允许外部中断1中断;EX1=0,禁止外部中断1中断。 ET0:定时器0中断允许位。ET0=1,允许定时器0中断;ET0=0,禁止定时器0中断。 EX0:外部中断0允许位。EX0=1,允许外部中断0中断; EX0=0,禁止外部中断0中断。

338 系统复位后,IE=00H,因此中断系统处于禁止状态,根据需要设置中断允许。例如:外中断0允许,则可使用字节操作指令:
MOV IE,#81H 也可使用位操作指令:  SETB EA SETB EX0 CPU在中断响应后不会自动关闭中断,所以在转入中断服务子程序后,应根据需要使用有关指令禁止中断,即以软件方式关闭中断。如关闭外中断0,则使用指令: CLR EX0

339 4. 中断优先级控制寄存器IP 其中: PS:串行口中断优先级定位。PS=1,串行口为高优先级,否则为低优先级。
MCS-51的中断分为2个优先级,每个中断源的优先级都可以通过中断优先级控制寄存器IP中的相应位来设定。IP寄存器的地址0B8H,位地址0B8H~0BFH。寄存器的内容及位地址表示如下: 位地址 0BFH 0BEH 0BDH 0BCH 0BBH 0BAH 0B9H 0B8H 位符号 / PS PT1 PX1 PT0 PX0 其中: PS:串行口中断优先级定位。PS=1,串行口为高优先级,否则为低优先级。

340 PT1:定时器1中断优先级定位。PT1=1,定时器1为高优先级,否则为低优先级。
PX1:外部中断1优先级定位。PX1=1,外部中断1为高优先级,否则为低优先级。 PT0:定时器0中断优先级定位。PT0=1,定时器0为高优先级,否则为低优先级。 PX0:外部中断0优先级定位。PX0=1,外部中断0为高优先级,否则为低优先级。 系统复位后,IP=00H,即所有中断源设置为低优先级中断。

341 5. 中断优先级控制规则 由于MCS-51具有2级优先级,因此它具备2级中断服务嵌套的功能,其中断优先级的控制规则如下:
① 低优先级中断请求不能打断高优先级的中断服务,但高优先级中断请求可以打断低优先级的中断服务,从而实现中断嵌套。 ② 如果一个中断请求已被响应,则同级的其他中断服务将被禁止,即同级不能嵌套。 ③ 如果同级的多个中断请求同时出现,则CPU将按自然优先级顺序确定该响应哪个中断请求,其自然优先级顺序为:

342 中断源 同级内的自然优先级 外部中断 最高级 定时器0中断 外部中断1 定时器1中断 串行口中断 最低级

343 为了实现中断优先级的控制规则,除了中断优先级控制器之外,还有两个不可寻址的优先级状态触发器。其中一个指示某高优先级的中断正在得到服务,所有后来的中断都被禁止。另一个触发器指示某低优先级的中断正在得到服务,所有同级的中断都被禁止,但允许高优先级的中断。此外,对于同级的多个中断请求查询的次序安排,也是通过专门的内部逻辑实现的。 综合以上介绍,8051单片机中断系统的结构如图5.3所示

344

345 中断处理过程 中断处理过程可分为三个阶段:即中断响应、中断服务和中断返回。由于各计算机系统的中断系统硬件结构不同,中断响应方式就有所不同。下面介绍MCS-51单片机的中断处理过程,其流程如图5.4所示。 1. 中断响应 (1)外部中断请求采样 对于外部中断,首先必须对外中断请求信号进行采样。而其他中断源的中断请求都发生在单片机芯片的内部,可以直接置位相应的中断请求标志位,因此不存在中断请求采样问题。

346

347 当外部中断为电平触发方式时,CPU在每一个机器周期的S5P2期间对和引脚进行采样。若测得为低电平,则认为有中断请求,将外部中断请求标志位IE0或IE1置1;若测得为高电平,则认为没有中断请求或中断请求已撤除,将IE0或IE1清0。 当外部中断为边沿触发方式。CPU在每一个机器周期的S5P2期间对和引脚进行采样,若在连续两个机器周期采样到先高后低的电平变化,则认为有中断请求,将IE0或IE1置1;否则认为没有中断请求,IE0或IE1继续为0。可见,为保证CPU在两个机器周期内检测到由高到低的负跳变,输入高电平和低电平的持续时间起码要保持12个振荡周期即一个机器周期的时间。

348 (2)中断查询与响应 中断查询是指CPU测试各中断请求标志位的状态,以确定有没有中断请求发生以及是哪一个中断请求。 在每一个机器周期的最后一个状态S6,按优先级顺序对中断请求标志位进行查询。如果查询到有标志位1,则表明有中断请求发生,接着就从下一个机器周期开始进行中断响应。 当中断请求被响应时,由硬件生成长调用指令(LCALL),将当前的PC值自动压栈保护,但PSW寄存器的内容不压栈,然后将对应的中断入口地址装入PC,程序转向中断服务子程序,处理被响应的中断。各中断源的入口地址如下:

349 中断源 入口地址 外部中断0 0003H 定时器0中断 000BH 外部中断1 0013H 定时器1中断 001BH 串行口中断 0023H

350 在使用时,通常在这些地址单元中存放一条绝对转移指令,使程序转移到用户安排的中断服务程序入口处。
然而中断响应是有条件的,并不是查询到的所有中断都被立即响应,当发生下列情况之一时,中断响应被封锁:          ①同级或高优先级的中断正在进行中。            ② 现在的机器周期还不是执行指令的最后一个机器周期,即正在执行的指令还没完成前不响应任何中断。            ③ 正在执行的是返回指令RET、RETI或是访问IE、IP的指令。按MCS-51中断系统的特性规定,在执行完这些指令之后,还应再继续执行一条指令,然后才能响应中断。 若存在上述任一种情况,中断查询结果被取销。否则,在紧接着的下一个机器周期,中断查询结果有效。

351 (3)中断响应的时间 所谓中断响应时间是指从查询中断请求标志位到转向中断区入口地址所需的机器周期数。 MCS-51单片机的最短中断响应时间是3个机器周期。由于中断请求标志查询占1个机器周期,当中断请求标志查询的机器周期恰好是指令的最后一个机器周期,在这个机器周期结束后,中断立即被响应,产生LCALL指令,而执行这条指令需2个机器周期。这样中断响应共经历3个机器周期。

352 中断响应最长时间是8个机器周期。当中断标志查询时,刚好是执行RET、RETI指令或访问IE、IP的指令,则需将当前指令执行完再继续执行一条指令后,才能进行中断响应。由于执行RET、RETI指令或访问IE、IP的指令最长需2个机器周期,而如果继续执行的指令又恰好是4个机器周期的MUL或DIV指令,再加上调用指令LCALL需的2个机器周期,这样中断响应共需8个机器周期。 一般情况下,中断响应时间在3~8个机器周期之间,但如果出现同级或高级中断正在响应或服务中需等待的时候,那么响应时间就无法计算了。

353 2. 中断服务 CPU响应中断结束后转入中断服务程序的入口。从中断服务子程序的第一条指令开始到返回指令为止,这个过程称为中断处理或中断服务。不同的中断源服务的内容及要求各不相同,其处理过程也就有所区别。一般情况下,中断处理包括两部分内容:现场保护和中断源服务。 现场通常有PSW、通用寄存器、专用寄存器等。如果在中断服务程序中要用这些寄存器,则在进入中断服务之前应将它们的内容保护起来称保护现场;同时在中断结束,执行RETI指令之前应恢复现场。 中断源服务是针对中断源的具体要求进行处理。 用户在编写中断服务程序时应注意以下几点:

354 ① 由于各中断区只有8个单元,一般情况下难以安排一个完整的中断服务子程序。因此一般在中断入口地址单元存放一条无条件转移指令,而转至存储器其他的任何空间去。
② 若要在执行当前中断程序时禁止更高优先级中断,应用软件关闭CPU中断,或屏蔽更高级中断源的中断,在中断返回前再开放中断。 ③ 在保护现场和恢复现场时,为了不使现场信息受到破坏或造成混乱,一般在此情况下,应关CPU中断,使CPU暂不响应新的中断请求。这样就要求在编写中断服务程序时,应注意在保护现场之前关中断,在保护现场之后若允许高优先级中断打断它,则应开中断。同时在恢复现场之前应关中断,恢复之后再开中断。

355 3. 中断返回 中断处理程序的最后一条指令是中断返回指令RETI。它的功能是将断点弹出送回PC中,使程序能返回到原来被中断的程序继续执行。

356 5.1.5 中断请求的撤销 1. 定时中断请求的撤销 2. 外部中断请求的撤销
中断请求的撤销 CPU响应某中断请求后,TCON和SCON中的中断请求标志应及时清除。否则会引起另一次中断。MCS-51各中断源请求撤销的方法各不相同。下面分别予以介绍。 1. 定时中断请求的撤销 CPU在响应定时中断后,就由硬件自动清除TF0或TF1标志位,即中断请求标志自动撤销,无需采取其他措施。 2. 外部中断请求的撤销 外部中断请求的撤销包括两项内容:中断标志位清0和外中断请求信号的撤销。 对于边沿触发方式的外部中断,CPU在响应中断后,由硬件自动将IE0或IE1标志位清0。而中断请求信号由于是脉冲信号,过后就销失,也可以说中断请求信号是自动撤销的。

357 对于电平触发方式的外部中断,CPU在响应中断后,由硬件自动将IE0或IE1标志位清0。但中断请求信号的低电平可能还继续存在,在以后机器周期采样时,又会把已清0的标志位重新置1。为此,要彻底解决电平方式外中断的撤销,除了标志位清0外,还需将在中断响应后把中断请求信号引脚从低电平强制改变为高电平。因此在MCS-51用户系统中,要增加如图5.5所示的外中断撤销电路。

358 由图可见,外部中断请求信号不直接加在(或)引脚上,而是经过非门加在D触发器的CP端。由于D端接地,当有外部中断请求时,D触发器置0使(或)有效,向CPU发出中断请求。CPU响应中断后,利用一根口线作为应答线,图中的P1.0接D触发器的直接置位SD端,因此只要P1.0输出一个负脉冲就可以使D触发器置1,从而撤销了低电平的中断请求信号。所需的负脉冲可通过在中断服务中增加如下两条指令得到: ORL P1,#01H ;P1.0输出高电平 ANL P1,#0FEH ;P1.0输出低电平 可见电平触发方式外部中断的撤销是通过软硬结合的方法来实现的。

359 3. 串行中断请求的撤销 CPU响应串行口中断后,硬件不能自动清除RI和TI标志位。因为在中断响应后,还需测试这两个标志位的状态,以判定是接收还是发送,然后才能清除。所以串行中断请求的撤销应使用软件方法,在中断服务程序中进行。

360 定时器/计数器的功能 51子系列单片机共有两个16位的定时器/计数器,简称定时器0和定时器1,分别用T0和T1表示。这两个定时器都具有定时和计数两种功能。 1. 定时功能 计数输入信号是内部时钟脉冲,每个机器周期使计数寄存器(如T0的TH0、TL0)的值增1。每个机器周期等于12个振荡周期,故计数速率为振荡频率的1/12。当采用12MHz晶体时,计数速率为1MHz,即每微秒计数器加1,这样不但可以根据计数器计算出定时时间,也可以反过来按定时时间的要求计算出计数器的预置值。

361 2. 计数功能 计数是对外部脉冲进行计数,计数脉冲来自相应的外部输入引脚T0或T1。当输入信号产生有1至0的跳变时,计数寄存器(如T0的TH0、TL0)的值增1。每个机器周期的S5P2期间,对外部输入进行采样。如在第一个周期中采得的值为1,而在下一个周期中采得的值为0,则在紧跟着的下一个周期的S3P1期间,计数值就增1。由于确认一次下跳变需要2个机器周期,即24个振荡周期,因此外部输入的计数脉冲的最高频率为振荡频率的1/24。对外部输入信号的占空比并没有什么限制,但为了确保某一给定的电平在变化之前至少采样一次,则这一电平至少要保持一个机器周期。故对输入信号的基本要求如图5.6所示,图中TCY为机器周期。

362 定时器0和定时器1有四种可供选择的工作方式:
方式0——13位定时器/计数器。 方式1——16位定时器/计数器。 方式2——自动重计数初值的8位定时器/计数器。 方式3——定时器0为两个独立的8位定时器/计数器。

363 5.2.2 定时器/计数器的控制寄存器 1. 方式控制寄存器TMOD
定时器/计数器的控制寄存器 定时器的功能、方式选择及中断设置是由软件对相应的专用寄存器TMOD和TCON及IE等的设置来实现的,计数初值也由软件设置于16位的计数寄存器TH0、TL0或TH1、TL1中。 1. 方式控制寄存器TMOD TMOD是一个专用寄存器,地址为89H,用于控制两个定时器/计数器的工作方式。但它是不可以位寻址的,只能用字节操作指令来改变。各位定义如下: 位 序 B7 B6 B5 B4 B3 B2 B1 B0 位符号 C/T M1 M0 GATE GATE 定时器 定时器0

364 从寄存器的位格式中可以看出,它的低半字节定义定时器/计数器0,高半字节定义定时器/计数器1,其中:
GATE:门控位 GATE=0 以运行控制位TR0(TR1)控制定时器启动。 GATE=1 以外中断请求信号(或)和运行控制位TR0(TR1)同时控制定时器启动。 C/T:定时方式或计数方式选择位。 C/T=0 定时工作方式。 C/T=1 计数工作方式。

365 2. 定时器控制寄存器TCON M1M0:工作方式选择 M1M0=00 方式0。 M1M0=01 方式1。 M1M0=10 方式2。
TF0(TF1):计数溢出标志位

366 当定时器计数满产生溢出时,由硬件自动置1。使用中断方式时,此位作为中断标志位,在转向中断服务程序后,由硬件自动清0;使用查询方式时,此位作状态位供查询,但应当注意在查询有效后应由软件及时将该位清0。
TR0(TR1):定时器运行控制位 TR0(TR1)=0 停止定时器/计数器工作。 TR0(TR1)=1 启动定时器/计数器工作。 该位以软件方法使其置1或清0。 TCON中的中断功能还应配合中断控制寄存器IE的设置来实现,IE的各位已在5.1.3节中说明。

367 定时工作方式0 方式0为13位定时器/计数器,计数寄存器由TH的全部8位和TL的低5位构成,TL的高3位不用。 1. 电路逻辑结构 定时器0在工作方式0的逻辑结构如图5.7所示。当TMOD中的C/T=0时为定时功能,此时对12分频的振荡脉冲做加法计数;当C/T=1时对引脚T0的输出脉冲做加法计数。不管是定时还是计数,当TL的低5位计数溢出时,向TH进位,而全部13位计数溢出时,则向计数溢出标志位TF0进位。 这里需要说明一下工作方式控制寄存器中的门控位(GATE)的功能。若GATE=0,则TH0+TL0是否计数取决于TR0的状态。因为这时GATE信号封锁了或门,使引脚信号无效,这时或门输出端的高电平状态却打开了与门。当TR0=1时,则接通模拟开关,使计数器进行加法计数;而当TR0=1时,则断开模拟开关,停止计数。

368 GATE=1,且TR0=1,则TH0+TL0是否计数取决于外引脚信号的状态。因为这时有关电路的或门和与门全部打开,计数脉冲的接通与断开仅由外引脚信号控制。当该信号为高电平时计数器工作;当该信号为低电平时计数器停止工作。这种情况可用于测量该信号的脉冲宽度。

369 2. 定时和计数的应用 方式0的计数器是13位结构,因而在完成计数功能时,其计数范围为1~8192(213)。由于进行加1计算,并在计数器计满溢出时将溢出中断标志TF0(TF1)置位,此时计数完成,所以计数初值计算为: 计数初值=213-N 其中N为要求的计数值。 在完成定时功能时,计数器对机器周期数进行加1计算,因此其定时时间的计算公式为: (213—计数初值)×机器周期 (213—计数初值)×振荡周期×12

370 如晶振频率为6MHz,则其定时时间的最小值和最大值分别为:
最小定时时间:(213 -(213 -1))×1/6×10-6×12 = 2(μs) 最大定时时间:(213 -0)×1/6×10-6×12 = 16384(μs) 应注意:在给计数寄存器TH0、TL0(或TH1、TL1)赋初值时,应将计算得的计数初值转换为二进制数,然后按其格式将低5位二进制置入TL0(或TL1)的相应位,而高8位则置入TH0(或TH1)中。 例5.1 现用T0作计数器,计算从引脚T0输入的脉冲个数,当计数值N为5000时结束,计算TH0、TL0的初值。 计数初值= =3192= B 所以 (TH0)=63H (TL0)=18H

371 例5.2 设单片机晶振频率fosc=6MHz,选用定时器1以方式0产生周期为1ms的方波,并由P1.0输出。以查询方式完成。
① 计算计数初值: 欲产生周期为1ms宽的方波,只需在P1.0端以500μs为周期交替输出高低电平即可实现,为此定时时间应为500μs。使用6MHz晶振,则每个机器周期为2μs。设待求的计数初值为X,则: (213-X)×2×10-6=500× 求解得:X=7942= B 转换为十六进制,高8位为F8H,即(TH1)=F8H。低5位为06H,因TL1的高3位未用,应填0,故(TL1)=06H。

372 ② TMOD寄存器的初始化: 为把定时器1设定为方式0,则M1M0=00;为实现定时功能,应使C/T=0;为实现定时器的运行控制,则GATE=0。定时器0不用,有关位设定为0。因此(TMOD)=00H。 ③ 由定时器控制寄存器TCON中的TR1位控制定时的启动和停止,TR1=1启动,TR0=0停止。 ④ 程序设计: ORG 0100H MOV TMOD,#00H ;设置T1工作方式 MOV TH1,#0F8H ;设置计数初值 MOV TL1,#06H ; MOV IE,#00H ;禁止中断

373 SETB TR1 ;启动定时 LOOP: JBC TF1,LOOP1 ;查询计数溢出 ;并对溢出标志位清0 AJMP LOOP
LOOP1:MOV TH1,#0F8H ;重新设置计数初值 MOV TL1,#06H ; CPL P1.0 ;输出取反 AJMP LOOP ;重复循环

374 定时工作方式1 方式1为16位定时器/计数器,计数寄存器由TH的全部8位和TL的全部8位构成。其逻辑结构和功能与方式0完全相同,所不同的只是组成计数寄存器的位数。 用作计数功能时,计数范围为1~65536(216)。计数初值的计算公式为: 计数初值=216-N 用作定时功能时,其定时时间的计算公式为: (216-计数初值)×机器周期 (216-计数初值)×振荡周期×12

375 如晶振频率为6MHz,则其定时时间的最小值和最大值分别为:
最小定时时间:(216 -(216-1))×1/6×10-6×12 = 2(μs) 最大定时时间:(216-0)×1/6×10-6×12 = (μs) ≈131(ms) 例5.3 用定时器1以方式1产生频率为50Hz的方波,由P1.0输出。以中断方式完成。设单片机晶振频率fosc=12MHz。 ① 计算计数初值 方波周期T=1/50=0.02s=20 ms,只要每隔10 ms P1.0引脚输出取反一次。因此定时时间为10 ms,计算计数初值X: (216-X)×1×10-6=10×10-3 求解得:X=55536=D8F0H (TH1)=D8H,(TL1)=F0H。

376 MAIN:MOV TMOD,#10H ;设置T1工作方式 MOV TH1,#0D8H ;设置计数初值 MOV TL1,#0F0H ;
② TMOD寄存器初始化:(TMOD)=10H ③ 程序设计: ORG 0000H AJMP MAIN ORG 001BH AJMP IN1P ORG 0100H MAIN:MOV TMOD,#10H ;设置T1工作方式 MOV TH1,#0D8H ;设置计数初值 MOV TL1,#0F0H ;

377 MOV IE,#88H ;允许中断 SETB TR1 ;启动定时 SJMP $ ;等待中断 中断服务程序:
IN1P: MOV TH1,#0D8H ;重新设置计数初值 MOV TL1,#0F0H ; CPL P1.0 ;输出取反 RETI ;中断返回

378 定时工作方式2 在方式0和方式1工作时,当完成一次计数后,下一次工作时应重新设置初值。这不但影响定时精度,而且也给程序设计带来不便。 方式2为可自动再装入的8位定时/计数器。该方式把高8位计数寄存器TH作为计数常数寄存器,用于预置并保存计数初值,而把低8位计数寄存器TL作为计数寄存器。当计数寄存器溢出时,自动又将计数常数寄存器TH的值再装入TL中,以进行下一次的计数工作。这样,方式2可以连续多次工作,直到有停止计数命令为止。 1. 电路逻辑结构

379 定时器0在工作方式2的逻辑结构如图5.8所示。初始化时,8位计数初值同时装入TL0和TH0中。当TL0计数溢出时,置位TF0,同时把保存在计数常数寄存器TH0中的计数初值自动装入TL0,然后TL0重新计数。如此重复不止。这不但省去了用户程序中的重装指令,而且也有利于提高定时精度。但这种工作方式下是8位计数结构,计数值有限,最大只能到255。

380 2. 定时和计数的应用 这种方式非常使用于循环定时或循环计数应用,例如用于产生固定脉宽的脉冲,此外还可以作为串行口的波特率发生器使用。
用作计数功能时,计数范围为1~255(28)。计数初值的计算公式为: 计数初值=28-N 用作定时功能时,其定时时间的计算公式为: (28-计数初值)×机器周期 (28-计数初值)×振荡周期×12

381 如晶振频率为6MHz,则其定时时间的最小值和最大值分别为:
最小定时时间:(28-(28-1))××10-6×12 = 2(μs) 最大定时时间:(28-0)××10-6×12 = 512(μs) 例5.4 用定时器1以工作方式2计数,要求每计满100次,将P1.0端取反。 ① 计算计数初值X: X=28-100=156 =9CH ② TMOD寄存器初始化: 为把定时器1设定为方式2,则M1M0=10;为实现计数功能,应使C/T=1;为实现定时器的运行控制,则GATE=0。定时器0不用,有关位设定为0。因此(TMOD)=60H。

382 LOOP: JBC TF1,LOOP1 ;查询计数溢出 ;并对溢出标志位清0 AJMP LOOP LOOP1: CPL P1.0 ;输出取反
③ 程序设计(查询方式): MOV TMOD,#60H ;设置T1工作方式 MOV TH1,#9CH ;设置计数初值 MOV TL1,#9CH ; MOV IE,#00H ;禁止中断 SETB TR1 ;启动定时 LOOP: JBC TF1,LOOP1 ;查询计数溢出 ;并对溢出标志位清0 AJMP LOOP LOOP1: CPL P1.0 ;输出取反 AJMP LOOP ;重复循环

383 例5.5 使用定时器0以工作方式2产生周期为200μs的连续方波,并由P1.0输出。已知晶振频率为fosc=6MHz。
① 计算计数初值X: (28-X)×2×10-6=100×10-6 求解得:X=206=CEH (TH1)=CEH,(TL1)=CEH。 ② TMOD寄存器初始化: M1M0=10; C/T=0; GATE=0。因此(TMOD)=02H。 ③ 程序设计(查询方式):

384 ORG 0100H MOV TMOD,#02H ;设置T0工作方式 MOV TH0,#0CEH ;设置计数初值 MOV TL0,#0CEH ; MOV IE,#00H ;禁止中断 SETB TR0 ;启动定时 LOOP: JBC TF0,LOOP1 ;查询计数溢出 ;并对溢出标志位清0 AJMP LOOP LOOP1: CPL P1.0 ;输出取反 AJMP LOOP ;重复循环

385 程序设计(中断方式): ORG 0000H AJMP MAIN ORG 000BH AJMP IN0P ORG 0100H MAIN: MOV TMOD,#02H ;设置T0工作方式 MOV TH0,#0CEH ;设置计数初值 MOV TL0,#0CEH ; SETB EA ;中断总允许 SETB ET0 ;定时器0允许中断 SETB TR0 ;启动定时 SJMP $ ;等待中断 

386 中断服务程序: IN0P: CPL P1.0 ;输出取反 RETI ;中断返回

387 定时工作方式3 工作方式3只使用于定时器T0,T0在该方式下被拆成两个独立的8位计数器TH0和TL0,图5.9为定时器0在工作方式3的逻辑结构。

388 从逻辑结构可以看到:8位定时/计数器TL0占用了原来T0的一些控制位和引脚,它们是引脚T0、以及控制位TR0、GATE、C/和溢出标志位TF0,该8位定时器的功能同方式0或方式1完全相同,既可作定时也可作计数。另一个8位定时器TH0只能完成定时功能,并使用了定时/计数器T1的控制启动位TR1和溢出标志位TF1。 由于TL0既能作定时器使用也能作计数器使用,而同时TH0又能作定时器使用,因此在工作方式3下,定时器/计数器0可以构成两个定时器或一个定时器和一个计数器。 当定时器T0已工作在工作方式3,则定时器T1只能工作在方式0、方式1或方式2下,因为它的控制启动位TR1和溢出标志位TF1已被定时器T0借用,其逻辑结构如图5.10所示。

389 (a)T1方式1(或0) (b)T1方式2

390 在这种情况下,T1通常是作为串行口的波特率发生器使用,以确定串行通信的速率。因为已没有计数溢出标志TF1可供使用,因此只能把计数溢出直接送给串行口。当作为波特率发生器使用时,只需设置好工作方式,定时器T1自动开始运行;若要停止工作,只需送入一个设置定时器1为方式3的控制字。因为定时器1不能在方式3下使用,如果硬把它设置为方式3,就停止工作。通常把定时器1设置为方式2作波特率发生器比较方便。

391 用定时器/计数器进行外部中断扩展 MCS-51单片机有2个外部中断请求输入端和,当在实际的应用中,若外部中断源有2个以上时,就需要扩充外部中断源。本节介绍利用定时器/计数器以计数方式实现外部中断的扩展。 在计数工作方式下,如果把计数初值设为满量程FFH,则一旦外部信号从计数器引脚输入一个负跳变信号,计数器加1产生溢出中断。从而可以转去处理该外部中断源的请求。因此我们可以把外部中断源作为边沿触发输入信号,接至定时器的T0(P3.4)或T1(P3.5)引脚上,该定时器的溢出中断标志及中断服务程序作为扩充外部中断源的标志和中断服务程序。例如以定时器0扩展一个外部中断,其初始化程序段为:

392 MOV TMOD,#06H ;设置定时器0为工作方式2,计数
MOV TH0,#0FFH ;设置计数初值 MOV TL0,#0FFH ; SETB EA ;中断总允许 SETB ET0 ;定时器0允许中断 SETB TR0 ;计数启动  例5.6 设某用户系统中已使用了2个外部中断源,并置定时器T1工作于方式2,作串行口波特率发生器用。现不但要求再增加一个外部中断源,而且由P1.0输出5kHz的方波。已知晶振频率为fosc=12MHz。

393 解题分析:为了不增加其他硬件开销,可设置T0工作于方式3,使TL0作为计数方式。把T0引脚作附加的外部中断输入端,TL0的计数初值为FFH,当检测到T0引脚由1至0的负跳变时,TL0立即产生溢出,申请中断,相当于边沿触发的外部中断源。 T0在工作方式3下,TH0可作8位的定时器,定时控制P1.0输出5kHz的方波信号。 TL0的计数初值为FFH; TH0的计数初值X为: 因为P1.0输出信号的频率为5kHz,故周期T=1/5000=200(μs) 所以用TH0定时100μs,由(28-X)×1×10-6=100×10-6 求得:X=156。 程序设计如下:

394 主程序: MOV TMOD,#27H ;设置T0方式3,计数 ;T1方式2,定时 MOV TL0,#0FFH ;设置TL0计数初值 MOV TH0,#156 ;设置TH0计数初值 MOV TH1,#data ;根据波特率要求设置常数data MOV TL1,#data ; MOV IE,#9FH ;开放全部中断 MOV TCON,#55H ;外中断0、1边沿触发,启动T0、T1 SJMP $

395 TL0溢出中断服务程序(由000BH转来): TL0INT: MOV TL0,#0FFH ;TL0重新赋初值 中断处理 RETI TH0溢出中断服务程序(由001BH转来): TH0INT: MOV TH0,#156 ;TH0重新赋初值 CPL P1.0 ;P1.0取反输出 串行口及外部中断0、1的中断服务程序在此不再一一列出。

396 本节通过几个例子,说明中断和定时器的应用,让读者进一步了解中断控制、定时器控制和中断服务程序的设计方法。
例5.7 利用两个定时器控制一个接P1.0的发光二极管亮1秒、暗1秒,周而复始。已知晶振频率为fosc=6MHz。 解题分析:两个定时器中一个用于定时,另一个用于计数。定时的时间到可以输出一个控制信号作为另一个定时器的计数脉冲。线路连接如图5.11所示。

397 设T0以工作方式1定时100ms,T1以工作方式2计数。当T0定时100 ms时,控制P1. 7输出取反,P1
设T0以工作方式1定时100ms,T1以工作方式2计数。当T0定时100 ms时,控制P1.7输出取反,P1.7输出周期为200ms的方波作为T1的计数脉冲,T1计数满溢出控制P1.0取反,所以当T1计满5次,P1.0输出的脉宽为1s的方波。 T0的计数初值: (216-X)×2×10-6=100×10-3 求解得:X=3CB0H。 T1的计数初值: =251=FBH。 TMOD寄存器初始化: T0:M1M0=01; C/T=0; GATE=0。 T1:M1M0=10; C/T=1; GATE=0。 因此(TMOD)=61H。

398 主程序:  ORG 0000H AJMP MAIN ORG 000BH ;T0中断服务程序入口 AJMP IT0P ORG 001BH ;T1中断服务程序入口 AJMP IT1P ORG 0100H MAIN: CLR P1.7 ;P1.7初态为低电平 MOV TMOD,#61H ;设置T0方式1定时 ;T1方式2计数 MOV TH1,#0FBH ;设置T1计数初值 MOV TL1,#0FBH

399 MOV TH0,#3CH ;设置T0计数初值 MOV TL0,#0B0H SETB EA ;中断总允许 SETB ET0 ;定时器0允许中断
SETB TR0 ;启动定时器0 SETB TR1 ;启动定时器1 SJMP $ ;等待中断

400 T0的中断服务程序: IT0P: MOV TH0,#3CH ;T0重新赋值 MOV TL0,#0B0H CPL P1.7 ;P1.7取反作T1的计数脉冲 RETI ;中断返回 T1的中断服务程序: IT1P: CPL P1.0 ;P1.0取反输出 RETI END

401 例5. 8 由P3. 4(T0)引脚输入一个频率小于0. 5kHz的低频脉冲信号,要求P3. 4每发生一次负跳变时,P1
例5.8 由P3.4(T0)引脚输入一个频率小于0.5kHz的低频脉冲信号,要求P3.4每发生一次负跳变时,P1.0输出一个500μs的同步负脉冲,同时P1.1输出一个1ms的同步正脉冲。已知晶振频率为fosc=6MHz。 解题分析:按题意画出输出信号的波形如图5.12所示。

402 设初态P1.0输出高电平,P1.1输出低电平。设T0以工作方式2计数,计数初值为FFH。当加在引脚T0上的外部脉冲产生由1至0的负跳变时,则使T0计数器加1 而产生溢出,进入中断服务程序。在中断服务程序中,T0改变为以工作方式2定时500μs,并且使P1.0输出低电平,P1.1输出高电平。当第一次定时500μs到时,定时器溢出后,使P1.0恢复为高电平,T0继续第二次500μs定时,产生溢出后,使P1.1恢复为低电平。然后T0又恢复对外部脉冲进行计数,如此循环。 500μs定时计数初值: (28-X)×2×10-6=500×10-6 求解得:X=06H。

403 主程序:  ORG 0000H AJMP MAIN ORG 000BH ;T0中断服务程序入口 AJMP IT0P ORG 0100H MAIN: MOV TMOD,#06H ;设置T0工作方式2,计数 MOV TH0,#0FFH ;设置T0计数初值 MOV TL0,#0FFH SETB EA ;中断总允许 SETB ET0 ;定时器0允许中断 SETB P1.0 ;P1.0初态为高电平

404 CLR P1.1 ;P1.1初态为低电平 SETB TR0 ;启动定时器0 SJMP $ ;等待中断  T0的中断服务程序:  IT0P: CLR TR0 ;关闭定时器0 MOV TMOD,#02H ;设置T0为方式2,定时 MOV TH0,#06H ;设置T0计数初值 MOV TL0,#06H MOV IE,#00H ;禁止中断 CLR P1.0 ;P1.0为低电平 SETB P1.1 ;P1.1为高电平

405 LOOP1: JBC TF0,LP1 ;第一个500μs到否
SJMP LOOP ;未到等待 LP1: SETB P ;到了P1.0变为高电平 LOOP2: JBC TF0,LP2 ;第二个500μs到否 SJMP LOOP2 LP2: CLR P1.1 ;到了P1.1变为低电平 CLR TR0 ;关闭定时器0 MOV TMOD,#06H ;T0重新设为方式2,计数 MOV TH0,#0FFH ;T0重新赋初值 MOV TL0,#0FFH MOV IE,#82H ;定时器0中断允许 SETB TR0 ;启动定时器0 RETI ;中断返回 END

406 习 题 1. MCS-51系列单片机有几个中断源,各中断源标志位是如何产生的,又如何清零的?CPU响应中断时,它们的中断矢量地址分别是多少? 2. MCS-51系列单片机的有几个中断优先级?如何设定? 3. 简述MCS-51单片机中断响应的过程。 4. MCS-51中断响应时间是否固定不变?为什么? 5. 试述8051单片机内部两个定时器/计数器的功能和四种工作方式。 6. 用定时器1以方式0作计数器,要求记1500个外部脉冲后溢出,请写出TMOD的内容及计算计数寄存器初值(TH1、TL1的内容)。 7. 设8031系统的晶振频率fosc=6MHz,要求用定时器0工作在方式1,定时时间为130ms,请写出TMOD的内容并计算计数寄存器初值。

407 8. 用T0以方式1产生频率为100KHz的等宽矩形波,假定晶振频率fosc=12MHz,请编程实现。
9. 有晶振频率fosc=6MHz的MCS-51单片机,使用定时器1以方式2在P1.0输出周期为400μs,占空比为10∶1的矩形脉冲,请编程实现。 10. 用定时器 T1进行外部事件计数,每计数1000个脉冲后,定时器T1转为定时工作方式,定时10ms后,又转为计数方式,如此循环不止。假定晶振频率fosc=6MHz,请使用方式1编程实现。 11. 有晶振频率fosc=12MHz的MCS-51单片机,使用定时器0在P1.0和P1.1分别输出周期为2ms和500μs的矩形脉冲,请编程实现。 12. 外部RAM中从BUFF开始有100个数据,要求每隔120ms向内部RAM的DATA开始的数据区传送10个数,用10次传送完毕,请使用定时器T0方式1编程实现。假定晶振频率fosc=6MHz。

408 6.1.1 MCS-51单片机系统总线 1. 单片机系统的扩展结构
单片机系统扩展通常采用总线结构形式,图6.1是典型的MCS-51单片机系统扩展结构。整个扩展系统以单片机为核心器件,通过系总线把各个扩展部件联系起来,扩展内容主要包括EPROM、RAM、I/O接口电路和其他数据转换接口电路等。因为各个部件的扩展是在单片机芯片之外进行的,因此通常把扩展的程序存储器称为外部程序存储器;而把扩展的数据存储器称为外部数据存储器。

409 图6.1 MCS-51单片机系统扩展结构

410 2. 单片机系统扩展总线的产生 单片机系统采用三总线结构。按其功能通常把系统总线分为三类,即地址总线、数据总线和控制总线。单片机系统三总线结构如图6.2所示

411 图6.2 单片机系统三总线结构

412 (1)地址总线(Address Bus 缩写为AB)
地址总线主要用于单片机送出的地址信号,以便对外部的存储器单元或I/O端口进行操作。地址总线是单向传送的,只能由单片机向外发送。在MCS-51单片机系统中,地址总线通常由P0口和P2口构成。地址总线的数量取决于外部要访问的存储器的容量,例如,对于n根地址线就可以实现对2n个单元进行连续编码,即可以对2n个存储单元进行访问,MCS-51单片机的地址线最多为16根,因此外部存储器最多可以扩展64KB个单元。 (2)数据总线(Data Bus,缩写为DB) 数据总线是用于在单片机与外部存储器之间或单片机与I/O端口之间传送数据的通道。单片机系统数据总线通常由P0口来构成,总线的宽度与单片机的字长是一致的:例如MCS-51单片机是8位字长,所以它的数据总线的位数也是8位的。数据总线是双向的,即它可以进行两个方向数据的传送。

413 (3)控制总线(Control Bus,缩写为CB)
控制总线实际上是一组控制信号线,它包括单片机发出的,以及外部设备送给单片机的信号线。对某一条控制信号线而言,它是单方向传送的,但是由不同方向的控制信号线组合成的控制总线则表现为双向传送性。系统扩展用的控制线有 ALE、 、 、 、 。 ALE:用于锁存P0口输出的低8位地址的锁存控制。通常,ALE接在锁存器的控制端,在P0口输出地址期间控制锁存器来锁存地址数据;ALE端输出的脉冲信号也可以作为单片机系统中其它芯片的时钟源。 :用于选择片内或片外程序存储器。当 =0时,单片机只能对外部程序存储器进行访问,当 =1时,单片机既能访问片内程序存储器,也能访问片外程序存储器:单片机依据程序地址来确定是对片内程序存储器进行访问,还是对片外程序存储器进行访问。因此,对片内无程序存储器的单片机,必须使接低电平。

414 :用于外部程序存储器的读选通控制。 :用于外部数据存储器的读选通控制。 :用于外部数据存储器的写选通控制。由于单片机系统采用了总线结构形式,因此大大减少了单片机系统中传输线的数目,从而提高了系统的可靠性,同时也增加了系统的灵活性。此外,总线结构的使用,也使得单片机系统的扩展易于实现。各种功能部件只要符合总线规范就可以很方便地接入单片机系统,实现单片机应用系统功能的扩展。

415 3. 地址锁存器 MCS-51单片机的P0口是地址线/数据线分时复用的,实现这一功能需要引入地址锁存器。常用的地址锁存器的芯片一般有两类:一类是8D触发器,如74LS273、7474LS377等,另一类是位锁存器,如74LS373、8282等。图6.3和表6.1、6.2分别给出了74LS273、74LS373的引脚和它们的逻辑功能状态。

416 图6.3 常用的地址锁存器

417 输 出 输 入 CLR CLK Di Qi 0 x x 1 1 1 1 0 1 0 x Q不变 表6.1 74LS273功能表
输 入 输 出 CLR CLK Di Qi x x 1 x Q不变 注:×表示无关;↑表示脉冲上升沿起作用

418 输 出 输 入 Di Qi 0 1 1 1 0 1 0 0 0 x Q不变 1 x x 高 阻 表6.2 74LS373功能表
输 入 输 出 Di Qi 1 x Q不变 x x 高 阻 注:×表示无关

419 74LS273内部由8个边沿触发的D触发器组成,在时钟信号的正跳变完成对输入信号的锁存。但MCS-51单片机中的ALE是高电平有效,而在ALE的后沿应完成地址锁存,因此应将ALE通过反向器后再加到锁存器的时钟端。注意74LS273是带清除端的,用作地址锁存时,应将清除端CLR接高电平。 74LS373是高电平触发选通,当使能端有效时,输出直接跟随输入变化,当使能端由高变低时,才将输入状态锁存直到下一次使能信号变高为止。因此在选用74LS373作单片机地址锁存时,可直接将单片机的ALE信号加到它们的使能端。

420 6.1.2 外部存储器的操作时序 1. 程序存储器的读操作时序 图6.4为单片机访问外部程序存储器的操作时序图,分析该图知:
外部存储器的操作时序 1. 程序存储器的读操作时序 图6.4为单片机访问外部程序存储器的操作时序图,分析该图知: ① 单片机的ALE是以固定的周期输出脉冲,在每个机器周期的S1P2~S2P1及S4P2~S5P1(S1P2是指状态周期S1的P2拍,S2P1是指状态周期S2的P1拍)时各输出一个脉冲,它可作为地址锁存器的锁存选通信号,每个机器周期输出2个ALE脉冲 ② 在每个机器周期的第一个ALE脉冲有效期间(高电平期间),CPU将把P0口输出的低8 位地址锁进地址锁存器中(ALE为地址锁存器的锁存选通信号),在此期间P2口输出的高8位地址始终保持有效。

421 ③ 当=0(有效)时系统将由P2口和P0口指定的外部程序存储器单元中的指令经P0口读入单片机中。
④ 若为双字节指令则将开始下一个指令字节的读取。其读取过程除CPU会自动修改P0口的地址使之指向下一个存储单元外,其余过程与读取第一字节的过程是相似的。若为单字节指令则第一个机器周期中的第二个ALE无效。系统将在下一个机器周期再开始下一条指令字节的读取操作。 ⑤ 在整个读取指令期间,、均处于无效状态。

422 图6.4 程序存储器的读操作时序

423 2. 数据存储器的读操作时序 图6.5为单片机访问外部数据存储器的操作时序图,分析该图可知:
① 第一个机器周期为单片机的取指令周期,其操作过程与前面所讲的对程序存储器的操作过程是完全相同的。 ② 第二个机器周期为单片机访问外部数据存储器的周期,此时ALE也是以固定的周期输出脉冲,在第二个机器周期的S1P2~S2P1 ALE脉冲有效期间,CPU将从P0口输出的外部数据存储器的低8位地址锁进地址锁存器中(ALE作为地址锁存器的锁存选通信号),在此期间P2口输出的高8位地址始终保持有效。 ③ 当=0时系统将由P2口和P0口指定的外部数据存储器单元中的数据经P0口读入单片机中。只要将改为,上述过程就是数据存储器的写操作时序。 ④ 在对外部数据存储器操作期间,一直处于无效状态。

424 图6.5 数据存储器的读操作时序

425 6.1.3 单片选的实现机对存储器片 1. 线选法 2. 译码法 MCS-51单片机实现片选的常用方法有两种:线选法和译码法。
单片选的实现机对存储器片 MCS-51单片机实现片选的常用方法有两种:线选法和译码法。 1. 线选法 线选法是直接利用单片机的I/O口线来实现的,通常是利用P2口中没有作为高位地址线使用的口线来实现,将某根P2口线连接至待片选芯片的端即可。这种方法的优点是易于实现,不需增添新的器件。缺点是因为I/O口的线的使用效率较低,单片机的一根I/O口线最多只能对两片外围芯片实现片选,另外还有可能使外部存储器地址出现重叠或不连续现象。 2. 译码法 译码法是利用单片机多余的I/O口线外加译码器来实现的。这种方法的优点是I/O口线的利用率较高。当采用3-8译码器时,利用3根I/O口线可以对8片外围芯片实现片选,而且地址通常是连续的,不会出现地址重叠现象,其主要缺点是需要增添译码器。

426 常用的译码器有: 74LS138为3-8译码器、74LS139为双2-4译码器。 74LS138有3个数据输入端,经过译码后在输出端产生8选1的片选信号,可以实现对8片外围芯片实现片选。 74LS138的引脚如图6.6(a)所示,其逻辑功能见表6.3。

427 (a)74LS (b)74LS139 图6.6 常用译码器

428 74LS139为双2-4译码器,其中含有两个完全独立的译码器,
每个译码器有2个输入端,经过译码后在输出端产生4选1的片选 信号,两个译码器一起作用时也可以实现对8片外围芯片实现片选。 74LS139的引脚如图6.6(b)所示,其逻辑功能见表6.4。

429 表 LS139功能表 输 入 端 输 出 端 B A Y Y Y Y3 x x

430 程序存储器概述 程序存储器又称为只读存储器ROM(Read Only Memory),它表示信息一旦写入芯片就不能随意更改,在程序运行时只能读出不能写入,即使掉电存储器芯片中的信息也不会丢失。程序存储器常见的类型有: 1. 掩膜ROM 其编程工作是由ROM制造厂家来完成的,即它是在ROM芯片生产厂家通过掩膜工艺来实现编程的。在大批量生产单片机应用系统的情况下,采用ROM芯片有利于降低成本。 2. 一次性可编程PROM 这种芯片的编程可由用户借助仿真机来进行,但只能进行次写入操作,一旦写入错误,芯片是不能再修改的。因此这种芯片使用起来很不方便。

431 3. 可重复擦写的EPROM 4. 电擦除可读、写E2PROM
这种芯片在5V工作电压下即可实现对芯片内程序的写入或擦除,故它既可作为程序存储器使用,又可作为数据存储器使用,所以愈来愈受到人们的关注。它的主要缺点是价格较贵、写入速度较慢。

432 6.2.2 常用程序存储器 1. EPROM (1)EPROM的型号及引脚
常用程序存储器 1. EPROM (1)EPROM的型号及引脚 常用EPROM芯片的型号有:2716(2KB)、2732(4KB)、2764(8KB)、27128(16KB)、27256(32KB)、27512(64KB)。在读方式时它们都采用单一的+5V电源供电,双列直插式封装。 图6.7给出常用EPROM芯片27128(16KB)和27512(64KB)的引脚图。

433 图6.7 两种常用EPROM的引脚图

434 各引脚的功能是: A0~Ai:地址输入线 (i=10~15,i=10对应2716,i=15对应27512)。 D0~D7:三态数据输出端。 :片选端,低电平有效。 :输出允许端。 :编程脉冲输入端。 VPP:编程电压输入端,不同型号的EPROM所加电压值不同。 VCC:电源端。 GND:接地端。

435 ① 读方式。一般系统中的EPROM都工作在这种工作方式下,进入这种工作方式的条件是使片选控制线和输出允许控制均处于有效状态。
27128共有五种工作方式,各种工作方式的基本情况见表6.5。表中VIL为TTL低电平,VIH为高电平,Vcc为+5V,Vpp*为EPROM编程电压,DOUT为数据输出,DIN为数据输入。 ① 读方式。一般系统中的EPROM都工作在这种工作方式下,进入这种工作方式的条件是使片选控制线和输出允许控制均处于有效状态。 ② 维持方式。当片选控制信号高电平(无效状态)时,芯片进入维持方式,这时输出处于高阻抗的悬浮状态,不占用系统数据线。 ③ 编程方式。此时需在编程电压输入端VPP加上符合规定的电压,在端输入编程脉冲,于是就可将程序写入到EPROM中。

436 ④ 编程校核方式。在编程电压输入端VPP加上符合规定的电压,再从芯片中读出已编程固化好的内容,并将其与刚才写入的内容进行比较,用来判断写入的内容是否正确。
⑤ 编程禁止方式。此时芯片的片选及输出允许端均处于无效状态,输出呈现高阻态。

437 DOUT DIN 表6.5 27128的工作方式选择 引脚 方式 Vpp 输 出 读 VIL Vcc VIH 维持 X 高 阻 编程
表 的工作方式选择 引脚 方式 Vpp 输 出 VIL Vcc VIH DOUT 维持 X 高 阻 编程 DIN 编程校核 编程禁止

438 2. E2PROM E2PROM是电可擦除、可编程的半导体存储器。在+5V电压下就可进行读写操作,对编程脉冲宽度一般也没有特殊的要求,也不需要专门的擦除器(如紫外线灯)。所以E2PROM实际上是一种特殊的可读可写的存储器,它既可作程序存储器使用,也可作数据存储器使用。把程序存储器E2PROM连在单片机系统总线上就可以进行在线改写。即使突然掉电E2PROM中的内容也不会丢失。 (1) E2PROM芯片的型号及引脚 常用E2PROM芯片的型号有:2817A(2KB)、2864A(8KB)。它们都采用单一的+5V电源供电,双列直插式封装。 E2PROM 2817A、2864A的引脚如图6.8所示。

439 各引脚功能是: A0~Ai:地址输入线,i=10(对2817A)、i=12(对2864A)。 D0~D7:双向三态数据输入输出线。 :写选通信号输入端,低电平有效。 :片选端,低电平有效。 :读选通信号输入端,低电平有效。 :擦、写完毕联络信号,在擦、写操作期间,脚为低 电平,当擦、写完毕时,脚为高电平。 Vcc:电源端。 GND:接地端。

440 图6.8 两种常用的E2PROM引脚图

441 (2)E2PROM的工作方式 2817A共有三种工作方式,各种工作方式的基本情况见表6.6。

442 引 脚 工作方式 输入/输出 VIL VIH 高 阻 DOUT 维持 X 字节写入 VOL DIN 字节擦除 字节写入前自动擦除

443 ① 读方式。一般系统中的E2PROM都工作在这种工作方式下,进入这种工作方式的条件是使片选控制端和读选通信号输入端均处于有效状态,内部数据缓冲器被打开,此时可对E2PROM进行读操作。
② 写方式。当2817A接收到从CPU发来的地址、数据和写控制信号后,便启动内部电路对该地址单元进行写操作,此时RDY/输出低电平。大约16ms后写操作完成,即一个字节写操作完成,此时RDY/输出高电平。2817A在写入一个字节之前会自动地擦除该单元的内容。 ③ 维持方式。当片选控制端为高电平(无效状态)时,2817A进入低功耗的维持方式,这时输出端处于高阻抗的悬浮状态,E2PROM芯片电流从140mA降至维持电流60mA。

444 程序存储器的扩展举例 1. 单片程序存储器扩展 当单片机片内无程序存储器或片内程序存储器的容量不够用时要进行程序存储器的扩展。在进行系统扩展时主要依据系统程序的容量来选择存储器容量,当然还要留有一定的余量。事实上2716、2732等小容量的程序存储器已经很少有人使用了,人们更愿意使用27128(16KB)、27256(32KB)、27512(64KB)等容量较大的程序存储器,因为容量的大小对存储器价格的影响较小,却给使用者日后系统的修改、扩充带来了很大的便利。 例 与27128的接口电路。 扩展电路如图6.9所示。

445 图 与27128的接口电路

446 由于系统中只有一片外围芯片,故片选端CE直接接地; 27128的输出允许端OE接单片机的PSEN; 对8031而言,其EA端必须接地;
8031的ALE作为74LS373的锁存选通信号; P0.0~P0.7经地址锁存器74LS373为27128提供低8位的地址线; P0.0~P0.7还与27128的D0~D7相连,为27128提供8位数据通道; P2.0~P2.5为27128提供高6位的地址线。 当P0.0~P0.7和P2.0~P2.5的值由全0变化至全1时,27128的地址线A0~A13也跟着作相应的变化, 即:最低地址:A15A14A13A12A11A10A9A8A7A6A5A4A3A2A1A0=×× )。 最高地址: (A15A14A13A12A11A10A9A8A7A6A5A4A3A2A1A0=×× )。

447 由于P2.7、P2.6的状态与该芯片的寻址无关,所以P2.7、P2.6可任意状态“×”。于是就可得到相应的地址范围:
0000H~3FFFH 或 4000H~7FFFH 或 8000H~0BFFFH 或 0C000H~0FFFFH 这四个地址范围指向的是程序存储器的同一个地址空间,之所以会出现四个地址范围是因为8031单片机的P2.6、P2.7未使用而引起的,这就是所谓的地址重叠现象。

448 例 与27512的接口电路。 扩展电路如图6.10所示。该电路接线与图6.9的区别有两点:其一是再增加2根地址线,即它共使用了16根地址线;其二是采用了74LS273作为地址锁存器,该锁存器的工作情况与74LS373的区别是采用低电平作为地址锁存器的选通信号。 由电路接线可知,P0.0~P0.7及P2.0~P2.7全部16根地址线都用上了,可寻址的范围达216=64KB,其地址范围是:0000H~0FFFFH。从而用一片程序存储器实现了64KB的扩展,且没有地址重叠现象。

449 图 与27512的接口电路

450 例 与2864A的接口电路。 由于E2PROM具有电擦除、编程的特性,因而得到了广泛地应用。 图6.11是2864A的扩展电路。由图6.11可见,其接线情况与EPROM的接线完全类似,虽然系统中只有一片外围芯片,片选端可直接接地,但考虑到一般情况,这里还是将片选端接P2.7,由P2.7来完成对2864A的片选; 2864A的输出允许端 接 ; 对8031而言,其 端必须接地; ALE作为74LS373的锁存选通信号; P0.0~P0.7经地址锁存器74LS373为2864A提供低8位的地址; P0.0~P0.7还与2864A的D0~D7相连,为2864A提供8位数据通道; P2.0~P2.4为2864A提供高5位的地址。

451 由电路接线可知,2864A的地址范围是: 0000H~1FFFH 或 2000H~3FFFH 或 4000H~5FFFH 或 6000H~7FFFH 造成地址重叠现象的原因是因为当前系统中P2.5、P2.6未使用而引起的。

452 图 与2864A的接口电路

453 2. 多片程序存储器的扩展电路 例如使用四片27128芯片扩展程序存储器系统,扩展电路如图6.12所示。 由于系统中有四片EPROM芯片,故各片的片选信号可由2-4译码器74LS139的输出信号Y0Y1Y2Y3分别提供;8031的喷PSEN同时接在四片27128的输出允许OE端,但由于译码器的作用使得任何时候都只有一片EPROM被选中,故任一时刻PSEN只对其中一片EPROM起作用。 对8031而言,其EA端必须接地;ALE则作为74LS273的锁存选通信号;P0.0~P0.7经地址锁存器74LS373同时为四片27128提供低8位的地址、P0.0~P0.7还同时与四片27128的D0~D7相连,为27128提供8位数据通道;P2.0~P2.5同时为四片27128提供高6位的地址;P2.6和P2.7作为2-4译码器74LS139的输入信号。

454 图 扩展多片EPROM的接口电路

455 由电路接线可知: 当P2.6、P2.7=00H时选中了27128①,此时P0.0~P0.7、P2.0~P2.5从全0变化至全1时可得27128①的地址范围是0000H~3FFFH; 当P2.6、P2.7=01H时选中了27128②,当P0.0~P0.7、P2.0~P2.5从全0变化至全1时,可得27128②的地址范围是4000H~7FFFH; 同理可知当P2.6、P2.7=10H时选中了27128③,其相应的地址范围是为8000H~0BFFFH; 当P2.6、P2.7=11H时选中了27128④,相应的地址范围是:为0C000H~0FFFFH。这里用四片27128实现了外扩64KB的外部程序存储器。

456 数据存储器概述 存储器是单片机系统中使用最多的外扩芯片,对MCS-51单片机而言,由于程序存储器与数据存储器在物理空间上的各自独立性,使得两者的扩展方法略有不同。 数据存储器又称为随机存储器(Random Access Memory)简称RAM,它用于存放可随机读、写的数据,与程序存储器最大的区别是掉电后其中的信息将立即消失。按半导体制作工艺,RAM可分为MOS型和双极型两种,MOS型的RAM集成度高、功耗低、价格也较便宜,但工作速度较慢。而双极型的特点则正好与MOS型的相反。在单片机应用系统中大多数是MOS型数据存储器,它们的输入输出信号能与TTL电路兼容,这给系统扩展中信号线的连接带来了很大的便利。 8031单片机内部有128B的用户RAM区,CPU对内部RAM有丰富的操作指令。但是在用于实时数据采集和处理中,仅靠片内提供的128B的数据存储器往往不够用,必须扩展外部数据存储器。常用的有静态数据存储器SRAM和动态数据存储器DRAM。这里主要讨论静态RAM与MCS-51单片机的接口情况。

457 常用数据存储器 1. RAM芯片的型号及引脚 常用RAM芯片的型号有:6116(2KB)、6264(8KB)、62128(16KB)、62256(32KB)。 它们都采用单一的+5V电源供电,双列直插式封装。这里给出常用的RAM芯片6264、62256的引脚图,如图6.13所示,各引脚功能如下: A0~Ai:地址输入端(i=10~14)。 D0~D7:双向三态数据端。 :片选信号输入端,低电平有效。 :读选通信号输入线,低电平有效。 :写允许信号输入线,低电平有效。 VCC:电源端。 GND:接地端。

458 图6.13 数据存储器引脚图

459 2. RAM的工作方式 6264共有四种工作方式,分别为读、写、禁止输出和选 中工作方式,见表6.7。

460 表 的工作方式选择 引 脚 方 式 CS 输 出 VIL VIH DOUT DIN 禁止 高 阻 未选中 X 掉电

461 6264芯片还具有掉电保护功能。这是由于6264芯片设有一个CS引脚,通常情况下接+5V电源,当掉电时,电压下降到小于或等于2V过程中,CS引脚立刻变为低电平使RAM中的数据保持,因此在Vcc=2V时,6264芯片就进入数据保护状态。根据这一特点,在电源掉电检测和切换电路的控制下,当检测到电源电压下降到小于芯片最低工作电压时,将6264切换到由锂电池提供电源的状态,从而实现了掉电时的数据保护功能。

462 6.3.3 数据存储器扩展举例 1. 采用线选法扩展三片6264的电路 MOVX A,@Ri ;(i=0、1)
数据存储器扩展举例 在编程时要注意到,单片机是利用MOV类指令来访问单片机片内数据存储器;利用MOVX类指令实现对外部数据储器的访问操作。单片机访问外部数据存储器的指令有以下四条: MOVX ;(i=0、1) MOVX @Ri,A ;(i=0、1) MOVX MOVX @DPTR,A 其中前两条指令是以单片机P2口的内容为外部数据存储器隐含地提供高8位地址,而Ri则为外部数据存储器提供低8位地址。 1. 采用线选法扩展三片6264的电路 数据存储器的扩展电路如图6.14所示。

463 图6.14 采用线选法扩展3片6264的电路

464 由于系统中有三片6264 RAM芯片,这里采用线选法对各片数据存储器进行片选,各片的片选信号分别由8031单片机的P2.5、P2.6和P2.7提供;
8031的 同时接在三片6264读选通输入线 端; 8031的 同时接在三片6264写允许输入线 端; 8031的P0.0~P0.7经地址锁存器74LS373同时为三片6264提供低8位的地址、P0.0~P0.7还同时与三片6264的D0~D7相连,为6264提供8位数据通道; P2.0~P2.4同时为三片6264提供高5位的地址。 根据电路接线图,当8031单片机的I/O引脚P2.5、P2.6和 P2.7按表6.8给出的数值变化时,将分别选中三片数据存储器,各片数据存储器的地址范围见表6.8

465 表 的地址分配表 P2.7 P P2.5 选中芯片 地 址 范 围 存储容量 6264(1) C000--DFFFH 8K 6264(2) A000--BFFFH 6264(3) FFFH

466 2. 译码法扩展四片62128的电路 用译码法扩展数据存储器的电路如图6.15所示

467 图6.15 用译码法扩展四片62128的电路

468 ② 8031的分别同时接在四片62128读选通端,8031的分别同时接在四片62128写允许端;
① 系统中四片62128 RAM芯片的片选信号由2-4译码器74LS139的输出信号提供。8031单片机的P2.6和P2.7为74LS139提供译码输入信号; ② 8031的分别同时接在四片62128读选通端,8031的分别同时接在四片62128写允许端; ③ 8031的P0.0~P0.7经地址锁存器74LS373同时为四片62128提供低8位的地址、P0.0~P0.7还同时与四片62128的D0~D7相连,为62128提供8位数据通道; ④ P2.0~P2.5同时为四片62128提供高6位的地址。单片机为系统提供了14根地址线,可直接寻址的地址范围是214=16KB。四片数据存储器共可提供4×16KB=64KB的空间。 当8031单片机的I/O引脚P2.6和P2.7从00H变化至11H时,2-4译码器 74LS139的输出端Y0~Y3将依次输出0(低电平信号),从而分别选中四片数据存储器。各片数据存储器62128的地址分配表见表6.9。

469 表6.9 62128的地址分配表 P2.7 P2.6 2-4译码器输出 选中的芯片 地 址 范 围 存储容量 0 0 Y0 IC1
表 的地址分配表 P2.7 P2.6 2-4译码器输出 选中的芯片 地 址 范 围 存储容量 Y0 IC1 FFFH 16K Y1 FFFH Y2 IC2 8000--BFFFH Y3 IC3 C000--FFFFH

470 因为E2PROM既可作程序存储器使用,又可作数据存储器 使用,故可以用一块E2PROM同时完成程序和数据存储器的存储
功能。其接线电路如图6.16所示。 图 同时作为程序存储器和数据存储器使用

471 ③ 8031的接在2864的写允许 端,当它有效时就可以将数据写入2864芯片中。
电路与前面介绍的存储器的扩展电路在接线上没有太大的区别。 ① 8031的P2.7为2864提供片选信号。 ② 8031的 和 作为与门74LS08的两个输入端,74LS08的输出接在2864的读允许 端,表示 和 两控制信号中任一个信号有效时均会产生对2864的读选通信号,从而实现既可读出2864芯片中的程序,也可读出2864芯片中的数据。 ③ 8031的接在2864的写允许 端,当它有效时就可以将数据写入2864芯片中。 ④ 8031的P0.0~P0.7经地址锁存器74LS373为2864提供低8位的地址、P0.0~P0.7还同时与2864的D0~D7相连,为2864提供8位数据通道。 ⑤ 8031的P2.0~P2.4为2864提供高5位的地址。 其地址范围是: 0000H~1FFFH或2000H~3FFFH 或4000H~5FFFH或6000H~7FFFH。

472 ③ 采用E2PROM时,既可以直接与单片机的数据总线相连,也可以通过扩展的I/O接口与单片机的数据总路线相连。
① E2PROM同时作为程序存储器和数据存储器时,要注意地址、控制信号及操作命令的正确使用,可用 实现对E2PROM中的程序进行读选通的控制信号;用 和 完成对E2PROM中的数据进行读、写选通的控制信号。 ② 由于E2PROM的擦、写时间较长(相对RAM而言),在应用中要设法满足擦、写时间的要求。例如,可利用中断、延时或查询的方法来满足芯片擦、写时间(一般的写入时间为9~15ms)的要求。 ③ 采用E2PROM时,既可以直接与单片机的数据总线相连,也可以通过扩展的I/O接口与单片机的数据总路线相连。 ④ E2PROM同时作为程序存储器和数据存储器时要注意存储范围的正确划分,要事先设定哪一存储空间是作为程序存储器使用的,哪一存储空间是作为数据存储器使用的,在使用过程中不能随意改变存储空间的大小,以免在存储器的使用过程中出错。

473 R1:欲传送目的数据区(2864A)首地址的低8位; P2:欲传送目的数据区(2864A)首地址的高8位;
DPTR:欲传送源数据区的首地址; WR0: MOVX ;从源数据区取出数据 ;将数据写入2864A中 LCALL DELAY ;调用延时10ms子程序 INC DPTR ;指向下一个源数据单元 INC R ;目的存储区低位地址加1

474 CJNE R1,#00,NEXT ;低位地址未满则转移
INC P ;否则高位地址加1 NEXT: DJNZ R0,WR ;未写完则继续写下一个字节 RET

475 习 题 1. MCS-51单片机与外部扩展的存储器相连时,为何低8位地址信号需通过地址锁存器,而高8位不需通过地址锁存器? 2. 请简述MCS-51单片机系统的三总线分别由哪些引线所组成。 3. 在MCS-51扩展系统中,程序存储器和数据存储器共用16位地址线和8 位数据线,为什么在对两个存储器空间进行操作时不会发生冲突? 4. 执行“MOVX A, @DPTR”指令和执行“MOVC 5. 执行MOVX指令和执行MOV类指令有什么区别? 6. 说明EPROM的常见型号,画出2764和27256的逻辑图,注明其地址,数据线,说明 和 各有什么用途。

476 7. 说明MCS-51系列单片机的程序存储器和数据存储器从使用角度看有什么不同。
8. 利用8031芯片,外接一片EPROM,型号为2764;外接一片RAM,型号为6264;试画出电路图,可用线选法进行片选。要写出各片芯片的地址范围。 9. 利用8031单片机,外接一片2764和一片数据存储器6264,已知 的地址范围为0~1FFFH,6264地址范围为4000H~5FFFH,试用74LS138译码器译码,画出电路图。 10. 利用74LS138设计一个译码电路,分别选中8片2764,且列出各芯片所占的地址空间范围。

477 在讲述I/O口扩展之前,我们首先介绍直接利用单片机芯片本身的I/O口,实现一些简单的数据输入输出传送。下面以开关状态和发光二极管驱动为例进行说明。
例7.1 数据的无条件传送。 从P1.3~P1.0输入开关状态,再经过P1.7~P1.4输出去驱动发光二极管,使发光二极管显示开关的状态。电路连接如图7.1所示。实现一次开关状态输入输出的程序流程图如图7.2所示。

478

479 例7.2 中断方式的数据传送。 与上述同样的开关状态输入/输出,但使用中断方法实现。由外电路产生外部中断请求0,脉冲边沿触发,电路连接如图7.3所示。 在中断请求电路中有开关K,每扳动一次开关,就产生一个外部中断请求。经P1.3~P1.0读入开关状态,取反后再由P1.7~P1.4输出,驱动相应的发光二极管。主程序流程如图7.4所示。

480

481 开关状态输入/输出由中断服务程序完成,则完整的程序清单为:
主程序: ORG 0000H START: AJMP MAIN ORG 0003H AJMP EXTR ORG 0030H MAIN: SETB IT0 ;脉冲边沿触发 SETB EX0 ;外部中断允许 SETB EA ;总中断允许 HERE: AJMP HERE ;等待中断

482 中断服务子程序: EXTR: MOV A,#0FH MOV P1,A ;熄灭发光二极管 ;低4位处于读状态 MOV A,P ;输入开关状态 CPL A ;状态取反 ANL A,#0FH ;屏蔽A的高字节 SWAP A ;A高低字节交换 MOV P1,A ;开关状态输出 RETI ;中断返回  程序中使用MOV指令而不使用MOVX指令,因为是对P1口操作,属内部RAM访问。

483 为什么需要I/O接口电路 尽管单片机有多个I/O口,但数据、控制、地址三大总线一般要占用三个口,加上外部内存、人机联系、信号采集也需要多个I/O口,这样单片机应用系统设计中不可避免地要进行I/O口的扩展。另外虽然单片机芯片内部集成了计算机基本功能部件,但很多情况下并不能满足应用系统的要求,在片外必须连接相应的外围芯片。

484 单片机I/O控制方式 在单片机中,为了实现数据的输入/输出传送,通常使用3种控制方式。即无条件传送方式、查询方式和中断方式,以下分别介绍。 1. 无条件传送方式 无条件传送也称为同步程序传送。只有那些一直为数据I/O传送作好准备的设备,才能使用无条件传送方式。因为在进行I/O操作时,不需要测试设备的状态,可以根据需要随时进行数据传送操作。无条件传送的接口电路如图7.5所示。 无条件传送适用于以下两类设备的数据输入/输出: ① 具有常驻的或变化缓慢的数据信号的设备。例如:机械开关、指示灯、发光二极管、数码管等。可以认为它们随时为数据输入/输出处于“准备好”状态。 ② 工作速度非常快,足以和单片机同步工作的设备。例如数/模转换(DAC),由于它是并行工作的,速度很快,因此单片机可以随时向其传送数据,进行数/模转换。

485

486 2. 查询方式 查询方式又称条件传送方式,即数据的传送是有条件的。在I/O操作之前,要先检测设备的状态,以了解设备是否以为数据输入/输出做好了准备,只有在确认设备已“准备好”的情况下,单片机才能执行数据输入/输出操作。通常把以程序方法对外设状态的检测称之为“查询”,所以就把这种有条件的传送方式称之为查询方式。查询的流程如图7.6所示。 为了实现查询方式的数据输入/输出传送,需要有接口电路提供设备状态,并以软件方法进行状态测试。因此这是一种软硬件方法结合的数据传送方式。 程序查询方式,电路简单,查询软件也不复杂,而且通用性强,因此适用于各种设备的数据输入/输出传送。但是查询过程对单片机来说毕竟是一个无用的开销,因此查询方式只能使用于单道作业、规模比较小的单片机系统。

487

488 3. 中断方式 中断方式又称程序中断方式,他与查询方式的主要区别在于如何知道设备是否为数据传送做好了准备,查询方式是单片机的主动形式,而中断方式则是单片机等待通知(中断请求)的被动形式。 采用中断方式进行数据传送时,当设备为数据传送作好准备之后,就向单片机发出中断请求(相当于通知单片机)。单片机接受到中断请求之后,即做出响应,暂停正在执行的源程序,而转去为设备的数据输入/输出服务。待服务完成之后,程序返回,单片机再继续执行被中断的源程序。使用程序中断方式进行I/O数据传送的过程可用图7.7来说明。

489

490 每当设备的准备工作就绪,可以和单片机进行数据传送时,即发出中断请求(图中①)。使单片机暂定源程序的执行,并做出中断响应(图中②)。然后执行I/O操作,通过接口电路进行单片机与设备之间的数据传送(图中③)。当I/O操作结束之后,程序返回,单片机继续执行被中断的源程序。 可见使用中断方式进行数据的输入/输出操作,是以设备的主动请求,单片机及时响应而开始的,停止正在执行的源程序,转去执行一个实现I/O操作的中断服务程序而开始的。但由于单片机速度很快,因此从宏观上看中断方式的I/O数据传送,其情形犹如单片机一边执行这源程序,一边又和设备进行着数据输入/输出操作,好像单片机和设备处于并行工作状态一样。

491 中断这种并行工作方式大大提高了单片机系统的效率,所以在单片机中被广泛采用。但中断请求是一种随机事件,为实现程序中断,对单片机系统的硬件和软件都有较高的要求。此外,由于在中断处理时常需现场保护和现场恢复,这对单片机应用来说仍是一项较大的无用开销。

492 单片机的I/O扩展规模应根据需要确定,我们暂且从最简单的开始,即使用中小规模集成电路芯片实现的单片机I/O口扩展。

493 7.3.1 简单输入接口的扩展 1. 简单输入接口扩展的典型电路芯片
简单输入接口的扩展 由于MCS-51的数据总线是一种公用的总线,不可以被独占,这就要求所有接在上面的芯片必须具有“三态”,因此扩展实际上输入接口就是要找一个能够控制的、具有三态输出的芯片。当输入设备被选通时,它使输入设备的数据线和单片机的数据总线直接接通:当输入设备没有选通时,它隔离数据源和数据总线(即三态缓冲器为高阻抗状态)。 1. 简单输入接口扩展的典型电路芯片 如果输入的数据可以保持比较长的时间(比如键盘),简单输入接口扩展通常使用的典型芯片为74LS244,由该芯片构成三态数据缓冲器。图7.8是74LS244芯片的引脚示意图。

494 74LS244内部共有两个四位三态缓冲器,分别以1G和2G作为它们的选通工作信号。当1G和2G都为低电平时,输入端A和输出端Y状态相同;当1G和2G为高电平时,输出呈高阻态。

495 2. 简单输入接口的扩展方法 图7.9是采用74LS244芯片进行简单输入接口扩展的连接图,图7.10是读I/O口的时序。由图7.10中可以看出,当P2.7和同为低电平时,74LS244才能将输入端的数据送到MCS-51的P0口。其中P2.7决定了74LS244的地址为:0××× ×××× ×××× ××××,其中“×”代表任意电平。这样一来,就有很多地址都可以访问这片芯片,从0000H~7FFFH共32KB地址都可以访问这片芯片,这就是用线选法所带来的副作用。通常,我们选择其中的最高位地址作为该芯片的地址来写程序,即该芯片的地址是7FFFH。注意,这仅是一种习惯,并不是规定,你完全可以用0000H作为该芯片的地址。

496

497 确定了地址之后,接口的输入操作程序如下: 
MOV DPTR,#7FFFH MOVX MOVX类指令是MCS-51单片机专用于对外部RAM进行操作的指令,由于外部I/O与外部RAM是同一接口,所以也使用这条指令对外部I/O进行操作。一旦执行到MOVX类指令,单片机就会在或(根据输入还是输出指令)引脚产生一个下降沿,这个下降沿的波形与P2.7相或,在或门的输出口也产生一个下降沿,这个下降沿使得74LS244的输入与输出接通,输入设备的数据可以被MCS-51单片机从总线上读取。 74LS244是不带锁存的,如果输入设备提供的数据时间比较短,就要用带锁存的芯片进行扩展,如74LS373等,可参考其他一些单片机教程。

498 7.3.2 简单输出接口的扩展 1. 简单输出接口扩展的典型电路芯片
简单输出接口的扩展 单片机的数据总线是为各个芯片服务的,不可能为一个输出而保持一种状态(如LED要点亮1s时间,这一秒里数据总线的状态可能已变化了几十万次了),因此,输出接口的主要功能是进行数据保持(即数据锁存),简单输出接口的扩展实际上就是扩展锁存器。 1. 简单输出接口扩展的典型电路芯片 简单输出接口扩展通常用74LS377芯片。该芯片是一个带允许端的8D锁存器,芯片引脚排列如图7.11所示,表7.1是该芯片的真值表。

499 图7.11中相关引脚的功能如下: D0~D7:8位数据输入端。 Q0~Q7:8位数据输出端。 G:使能控制端。 CLK:时钟信号,上升沿锁存数据。

500 表 LS377真值表 CLK D Q 1 × Q0

501 2. 简单输出接口扩展方法 图7.12是利用74LS377进行简单输出接口的扩展的电路。图中,由于74LS377的G端与P2.7口相连,所以它的地址是:0XXX XXXX XXXX XXXXB,如果把“X”全置1的话,就是 B即7FFFH。

502 由于MCS-51的与74LS377的CLK端相连,当信号由低变高时,数据总线上的数据正是输出的数据,而此时P2
由于MCS-51的与74LS377的CLK端相连,当信号由低变高时,数据总线上的数据正是输出的数据,而此时P2.7也正输出低电平,有m效,因此,数据就被锁存。有关程序如下: MOV DPTR,#7FFFH ;地址 MOV A,#DATA ;DATA为要送出的数据 MOVX @DPTR,A ;P0口数据被74LS377锁存

503 A的结构和引脚

504 图7.13所示为8255A的内部结构框图和引脚图,下面介绍它的组成部分。
(1)三个8位的I/O接口:A口、B口、C口 A口具有一个8位数据输出锁存器/缓冲器和一个8位数据输入锁存器,可编程为8位输入/输出或双向寄存器。 B口具有一个8位数据输出锁存器/缓冲器和一个8位数据输入缓冲器(不锁存),可编程为8位输入或输出寄存器,但不能双向输入/输出。 C口具有一个8位数据输出锁存器/缓冲器和一个8位数据输入缓冲器(不锁存),C口可分作两个4位口使用。它除了作为输入/输出口外,还可以作为A口、B口选通方式工作时的状态控制信号。

505 (2)读/写控制逻辑 读/写控制逻辑的功能用于管理所有的数据、控制字或状态字的传送。它接收来自CPU的地址信息及一些控制信号来控制各个口的工作状态,这些控制信号有: :片选信号端,低电平有效。 :读选通信号端,低电平有效。 :写选通信号端,低电平有效。 RESET:复位信号端,高电平有效。 A1、A0(端口选择信号):它们与、信号配合用来选择端口及内部控制寄存器,并控制信息传送的方向,见表7.2。

506 表 A端口选择及功能 A1 A0 操 作 × × × × A口 → 数据总线 B口 → 数据总线 C口 → 数据总线 数据总线 → A口 数据总线 → B口 数据总线 → C口 数据总线 → 控制寄存器 数据总线为高阻态 非法状态

507 (3)A组和B组的控制电路 这是两组根据CPU命令控制8255A工作方式的电路。每组控制电路从读、写控制逻辑接收各种命令,从内部数据总线接收控制字(指令),并发出适当的命令到相应的端口。 A组控制电路控制A口及C口的高4位。 B组控制电路控制B口及C口的低4位。 (4)数据总线缓冲器 这是一个双向三态的8位缓冲器,用于与系统的数据总线直接相连,以实现CPU和8255A间传送信息。

508 7.4.2 8255A的控制字及其工作方式 1. 8255A的工作方式选择 8255A有3种工作方式,即方式0、方式1和方式2。
如图7.14所示。 (1)方式0(基本输入/输出方式) 这种工作方式不需要任何选通信号。A口、B口及C口的高4位和低4位都可以设定为输入或输出。作为输出口时,输出的数据被锁存;作为输入口时,输入数据不锁存。

509

510 (2)方式1(选通输入/输出方式) 在这种工作方式下,A、B、C三个口分为两组:A组包括A口和C口的高4位,A口可由编程设定为输入口或输出口,C口的高4位用来作为输入/输出操作的控制和同步信号;B组包括B口和C口的低4位,B口同样可由编程设定为输入口或输出口,C口的低4位用来作为输入/输出操作的控制和同步信号。A口和B口的输入数据或输出数据都被锁存。 (3)方式2(双向总线方式) 在这种工作方式下,A口为8位双向总线口,C口的PC3~PC7用来作为输入/输出的同步控制信号。在这种情况下,B口和PC0~PC2只能编程为方式0或方式1工作。

511 端口C在方式1和方式2时,8255A内部规定的联络信号见表7.3。
方式1 方式2 输 入 输 出 PC7 PC6 PC5 PC4 PC3 PC2 PC1 PC0 I/O IBFA INTRA IBFB INTRB ×

512 用于输入的联络信号有: (Strode)选通脉冲输入,低电平有效。当外设送来 信号时,输入数据装入8255A的锁存器。 IBF(Input Buffer Full)输入缓冲器满,高电平有效。表示数据已装入锁存器,可作为送出的状态信号。 INTR(Interrupt)中断请求信号,高电平有效。在IBF为高、 为高时才有效,用来向CPU请求中断服务。 输入操作过程中,当外设的数据准备好后,发出 =0的信号,输入数据装入8255A的锁存器,装满后使IBF=1,CPU可以查询这个状态信息,用来决定是否接收8255A的数据。或者当 重新变为高时,INTR有效,向CPU发出中断请求。CPU在中断服务程序中接收8255A的数据,并使INTR=0。

513 用于输出的联络信号有: (Acknowledge)响应信号输入,低电平有效。当外设取走并处理完8255A的数据后发出的响应信号。 (Output Buffer Full)输出缓冲满信号,低电平有效。当CPU把数据送入8255A锁存器后有效,这个输出的低电平用来通知外设开始接收数据。 INTR(Interrupt)中断请求信号,高电平有效。在外设处理完一组数据后, 变低,并且当 变高,然后在 又变高后使INTR有效,申请中断进入下一次输出过程。 用户可以通过软件对C口的相应位进行置位/复位来控制8255A的开中断或关中断。

514 A的控制字 8255A有两种控制字,即控制A口、B口、C口工作方式的方式控制字和控制C口各位的置位/复位控制字。两种控制写入的控制寄存器相同,只是用D7位来区分是哪一种控制字。D7=1为工作方式控制字;D7=0为C口置位/复位控制字。两种控制字的格式和定义如图7.15所示。 例如,将B8H( B)写入控制寄存器后,则8255A设置A口为方式1输入,B口为方式0输出,C口高4位为方式1输入,C口低4位为方式0输出。 例如,将0BH( B)写入控制寄存器后,则8255A的PC5置1。

515

516 7.4.3 8255A的应用 1. 8255A与MCS-51单片机的连接 8255A与MCS-51单片机的连接如图7.16所示。
图中的8255A的片选信号CS及端口地址选择线A1、A0分别由8051的P0.7、P0.1、P0.0经74LS373锁存后提供;8255A的RD、WR分别接8031的RD、WR;8255A的D0~D7接8051的P0.0~P0.7。该电路中8255A的A口、B口、C口以及控制口的地址分别为FF7CH、FF7DH、FF7EH和FF7FH。

517

518 2. 初始化编程举例 例7.3 要求8255A各端口为下列工作状态,试编写初始化程序。 A口——方式1输入 B口——方式0输出
C口高4位——方式1输入 C口低4位——方式0输出 根据图7.16中的连接方式,控制口的地址为FF7FH,而工作方式控制字应为B8H,故初始化编程如下: MOV DPTR,#0FF7FH MOV A,#0B8H ;控制字送入控制口

519 例7.4 若要求通过PC5向外输出一个正脉冲信号,则编程如下:
MOV DPTR,#0FF7FH ;控制字送控制口 MOV A,#0BH MOVX @DPTR,A ;对PC5置1 ACALL DELAY ;延时 DEC A MOVX @DPTR,A ;对PC5置0

520 的结构和引脚 Intel 8155是一种多功能的可编程接口芯片,它具有3个可编程I/O端口(A口和B口是8位,C口是6位)、1个可编程14位定时器/计数器和256B的RAM,能方便地进行I/O扩展和RAM扩展,其组成框图及引脚如图7.17所示。 8155为40脚双列直插式封装,其引脚的功能及特点说明如下:

521

522 RESET:复位端,高电平有效。当RESET端加入5μs左右宽的正脉冲时,8155初始化复位,把A口、B口、C口均初始化为输入方式。
AD0~AD7:三态地址数据总线。采用分时方法区分地址及数据信息。通常与MCS-51单片机的P0口相连。其地址码可以是8155中RAM单元地址或I/O口地址。地址信息由ALE的下降沿锁存到8155的地址锁存器中,与RD和WR信号配合输入或输出数据。 :片选信号端,低电平有效。它与地址信息一起由ALE信号的下降沿锁存到8155的锁存器中。

523 :RAM和I/O接口选择端。 =0时,选中8155的片内RAM,AD0~AD7为RAM地址(00H~FFH); =1时,选中8155片内3个I/O接口以及命令/状态寄存器和定时器/计数器。AD0~AD7为I/O接口地址,见表7.4。 AD7~AD0 A7 A6 A5 A4 A3 A2 A1 A0 选中的寄存器 × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × 命令/状态寄存器 A口(PA0~PA7) B口(PB0~PB7) C口(PC0~PC5) 定时器/计数器低8位寄存器 定时器/计数器高6位寄存器及输出波形方式(2位)

524 :读选通信号端,低电平有效。当 =0、 =0时,将8155片内RAM单元或I/O接口的内容传送到AD0~AD7总线上。
:写选通信号端,低电平有效。当 =0、 =0时,将CPU输出送到AD0~AD7总线上的信息写到片内RAM单元或I/O接口中。 ALE:地址锁存允许信号端。ALE信号的下降沿将AD0~AD7总线上的地址信息和 及 的状态信息都锁存到8155内部锁存器中。 PA7~PA0:A口通用输入/输出线。它由命令寄存器中的控制字来决定输入/输出。 PB7~PB0:B口通用输入/输出线。它由命令寄存器中的控制字来决定输入/输出。

525 PC5~PC0:可用编程的方法来决定C口作为通用输入/输出线或作A口、B口数据传送的控制应答联络线。
TIMER IN:定时器/计数器脉冲输入端。 TIMER OUT:定时器/计数器矩形脉冲或方波输出端(取决于工作方式)。 Vcc:+5V电源端。 Vss:接地端。

526 的控制字及其工作方式 1. 命令字的格式及功能 8155的I/O接口工作方式选择是通过对8155内部寄存器送命令来实现的,命令寄存器由8位锁存器组成,只能写入、不能读出。命令字每位的定义如图7.18所示。 由图7.18可知,A口、B口都是8位通用输入输出口,主要用于数据的I/O传送,它们都是数据口,因此只有输入输出两种工作方式。而C口则为6位口,它既可以作为数据口用于数据I/O传送,也可以作为控制口,用于传送控制信号和状态信号,对A口、B口的I/O操作进行控制。因此C口共有四种工作方式,即:输入方式、输出方式、A口选通方式、A口和B口选通方式。

527

528 1. 状态字的格式及功能 8155的状态寄存器口地址和命令寄存器相同。与命令字相反,状态字寄存器只能读出、不能写入,其格式及定义如图7.19所示。 AINTR:A口中断请求信号,高电平有效。 ABF:B口缓冲器信号,高电平有效。 :A口选通信号,低电平有效。 BINTR:B口中断请求信号,高电平有效。 BBF:B口缓冲器满信号,高电平有效。 :B口选通信号,低电平有效。

529

530 2. 定时器/计数器 8155内部的可编程定时器/计数器是一个14位的减法计数器,可用来定时或对外部事件计数。当TIMER IN端接外部脉冲时为计数方式,接系统时钟为定时方式,计满溢出时由TIMEOUT端输出矩形脉冲或方波。定时器/计数器低位字节寄存器的地址为×××××100B,高位字节寄存器地址为×××××101B,其格式如图7.20所示。 启动定时器/计数器前,首先应装入定时器/计数器的初值,因为是14位减法计数器,故计数初值的值可在0001H~0000H(4000H)之间选择,而相应的计数长度为1次~4000次。其低8位值应装入定时器/计数器的低位字节,高6位值应装入定时器/计数器高位字节,然后再装入命令字并启动定时器/计数器。定时器/计数器高位字节中的高两位M2、M1用来定义输出方式,如图7.21所示。

531 图7.20 定时器/计数器寄存器格式

532 图 定时器/计数器输出波形的定义

533 的应用 1. MCS-51单片机与8155接口 8155可以直接与MCS-51单片机连接,不需任何外加逻辑电路。图7.21所示为8051与8155的基本连接方法。

534 由于8155片内有锁存器,所以,P0口输出的低8位地址不需另加锁存器,直接与8155的AD0~AD7相连,既作为低8位地址总线,又作为数据总线,利用8051的ALE信号的下降沿锁存P0送出的地址信息。片选信号和选择信号分别接P2.7和P2.0,根据表7.4可知8155口的地址编码如下: RAM字节地址 7E00H~7EFFH 命令/状态寄存器 7F00H A口地址 7F01H B口地址 7F02H C口地址 7F03H 定时器/计数器低8位 7F04H 定时器/计数器高6位 7F05H

535 2. 初始化编程举例 例7.5 若要求8155的A口、B口作为基本输出口,C口作为基本输入口,不要求中断请求不启动定时器,则命令字应为03H。可编程如下: MOV DPTR,#7F00H MOV A,#03H MOVX @DPTR,A 例7.6 若A口定义为基本输入方式,B口定义为基本输出方式,对输入脉冲进行15分频后输出。

536 解题分析:因对输入脉冲进行15分频输出是连续方波,所以计数初值的高8位为: 即40H,低8位为 即0FH。因A口为基本输入方式,B口为基本输出方式并立即启动计数,故命令字为 即C2H。 编程如下: MOV DPTR,#7F04H MOV A,#0FH MOVX @DPTR,A INC DPTR MOV A,#40H MOV DPTR,#7F00H MOV A,#0C2H MOVX @DPTR,A

537 例7.7 若要将立即数6BH写入8155 RAM的31H单元,则编程如下:
MOV A,#6BH MOV DPTR,#7E31H MOVX @DPTR,A

538 习 题 1. 在单片机中控制I/O操作有几种方法?试说明各种方法的特点? 2. 试编址对8255A的初始化,使A口按工作方式0输入,B口按工作方式1输出,C口高4位按方式0输出,C口低4位按方式1输入。 3. 按图7.22编写程序,将8155 RAM单元全部清0。 有哪几种工作方式?怎样进行选择? 5. 在一个8051单片机系统中,扩展了一片8155,试画出它们的接口连线图,要求写出将8051片内RAM中的20H~7FH单元内容写入8155 RAM的第一单元开始的空间中的程序。 6. 试编写对8155的初始化,使A口为选通输出,B口为基本输入,C口为控制联络信号端,并启动定时器/计数器按工作方式1定时工作,输出周期为1ms的方波。定时器计数脉冲频率为单片机的振荡频率48分频后引入, fosc=6MHz。

539 拨码盘是单片机系统输入数据的一种廉价、可靠的办法,在需要少量输入参数的情况下,使用拨码输入较为可靠方便。拨码盘种类很多,常用的是十进制输入、BCD码输出的BCD拨码盘,我们以此为例介绍它的结构和应用。

540 BCD拨码盘的结构 每片拨盘具有十个位置,每个位置都有相应的数字显示,代表拨码输入的0~9十个数字,单片BCD拨码盘的外形引脚如图8.1所示。单片拨码盘可代表一位十进制数,需要几位十进制数可选择几位BCD拨码盘来拼接。 图8.1 十进制输入拨盘组

541 BCD拨码盘后面有5个接点,其中A为输入控制线,另外4根是BCD码输出的信号线。当拨码盘拨到不同位置时,输入控制线A则分别与4根BCD输出线中的某根或某几根接通,其接通的BCD码输出线状态正好与拨码盘指示的十进制数相一致。表8.1为BCD拨码盘的输入输出状态表。 表8.1中输出状态为1时,表示该输出线与A相接,例如,当拨码盘拨至“5”时,4、1脚为1,表示4、1脚与A接通。当控制端A接+5V时,4、1脚输出高电平,8、2脚输出低电平,这时拨码盘输出的BCD码为正逻辑;当控制端A接地时,4、1脚输出低电平,8、2脚输出高电平,这时拨码盘输出的BCD码为负逻辑。

542 表8.1 BCD码拨盘的输入输出状态表 拨盘输入 输出状态 8 4 2 1 3 5 6 7 9

543 8.1.2 BCD拨码盘的接口方法 1. 单片BCD拨码盘与单片机的接口
单片BCD拨码盘可以与任何一个4位I/O口或扩展I/O口相连,图8.2所示是8031通过P1.3~P1.0与BCD拨码盘的接口电路。为了防止输出端在不与控制端A相连时电平不确定,通常将8、4、2、1输出端通过电阻拉低。 图 与BCD拨码盘的接口电路

544 2. 多片BCD码拨盘与单片机的接口 若要输入多位十进制数,则将多位BCD拨码盘拼接起来,这时拨码盘的控制线A就不能与+5V或地直接相连,而是分别与I/O口线相连。这些I/O口线作为BCD拨码盘的片选信号,同时,为了减少I/O口占用数量,将多位拨码盘的相同输出线通过与非门与单片机的I/O口相连。图8.3所示为4位BCD拨码盘与8051的接口电路,4位BCD拨码盘的8、4、2、1脚分别经过4个与非门与P1.3~P1.0相连。P1.7~P1.4分别与千、百、十、个位BCD拨码盘的控制端相连,当某位选中时,该位的控制线A置0,其他3位控制线置1。

545 图 位BCD码拨盘与8051的接口电路

546 例如,当选中百位输出时,使P1. 6=0,P1. 7=P1. 5=P1
例如,当选中百位输出时,使P1.6=0,P1.7=P1.5=P1.4=1,这时四个与非门所有与其他位连接的输入端均为1,四个与非门输出的状态完全取决于百位BCD拨码盘的输出状态。 说明:P1口输入的高4位是位控信号,低4位为BCD码,因此要取得BCD码,必须将读入数据的高4位进行屏蔽。低4位BCD码按千位、百位、十位、个位依次存放在8031片内RAM的60H~63H单元的低4位。程序清单如下: MOV R1,#60H ;存放单元首地址 MOV R2,#7FH ;BCD码位控初值 MOV R7,#04H ;BCD码个数

547 LOOP: MOV A,R2 MOV P1,A ;送BCD位控制字 MOV A,P1 ;读入BCD码 ANL A,#0FH ;屏蔽高4位 MOV @R1,A ;送存储单元 INC R1 ;指向下个存储单元 MOV A,R2 RR A ;位控右移一位 MOV R2,A DJNZ R7,LOOP ;4位BCD码读完否?未完返回 RET

548 键盘是计算机不可缺少的输入设备,用户可通过键盘向单片机系统输入指令和数据等,是实现人机对话的枢纽。本章将详细介绍单片机与键盘的有关接口电路。

549 8.2.1 键盘的工作原理 1. 按键开关的抖动问题 键盘是由若干按压式或触摸式开关组成的开关矩阵,如0~9数字键及功能键等。
键盘的工作原理 键盘是由若干按压式或触摸式开关组成的开关矩阵,如0~9数字键及功能键等。 1. 按键开关的抖动问题 单片机中应用系统中的按键或键盘一般是由机械触点构成的,如图8.4所示。 图8.4 按键

550 当开关S未被按下时,P1. 7输入为高电平,S闭合后,P1
当开关S未被按下时,P1.7输入为高电平,S闭合后,P1.7输入为低电平。但由于机械触点的弹性作用及电压突跳等原因,在触点闭合与断开的瞬间,会出现电压抖动,如图8.5所示波形。抖动时间长短与开关的机械特性有关,一般为5~10ms。这种抖动对于人来说是感觉不到的,但对计算机来说,则是完全可以感应到的,因为单片机处理的速度是在微秒级。在实际工作中,按键有时灵,有时不灵,实际上可能是这个因素引起的,你只按了一次按键,可是计算机却已执行了好几次任务。按键的稳定闭合期,由操作人员的按键动作所决定,一般为十分之几秒到几秒不等。 图8.5 按键闭合和断开时的抖动

551 2. 去抖动处理 为了能够使CPU能正确地读出与按键相连的P1.7口的状态,并对每一次按键只作一次键输入处理,就必须去除抖动影响。常用的去抖动方法有两种:硬件方法和软件方法。在按键数目少的情况下可采用硬件方法,如图8.6所示。 在按键数目较多的情况下一般采用软件延时的方法,即在单片机获得P1.7口为低的信息后,不是立即认定S已被按下,而是延时10~20ms时间后再次检测P1.7口,如果仍为低,说明S键的确按下了,避开了按键按下时的抖动时间。并且在检测到按键释放后(P1.7为高)再延时10~20ms,消除后沿的抖动,然后再对键值处理。当然,实际应用中,对按键的要求也是千差万别,要根据不同的需要来编制处理程序。

552 3. 按键的识别 按键的识别指找出被按下的键盘,一个完整的键盘识别程序主要包含以下几个步骤: ① 键盘扫描,测试是否有键按下。
图8.6 硬件去抖动电路 3. 按键的识别 按键的识别指找出被按下的键盘,一个完整的键盘识别程序主要包含以下几个步骤: ① 键盘扫描,测试是否有键按下。

553 4. 键功能的实现 ② 确定有键按下后,延时去抖动(指无硬件去抖动电路时)。 ③ 键识别,确定按键的物理位置。 ④ 计算闭合键的键码。
⑤ 等待键释放,保证键的一次闭合仅进行一次处理,避免多键、串键及去抖动。 4. 键功能的实现 当所设置的功能键或数字键按下时,单片机应用系统应完成该键所设定的功能。从执行角度来看,在确定按键后,将键号送入A累加器,然后通过散转指令转入执行该键的功能程序。 我们可以通过图8.7所示的软件流程图简单说明按键识别、键功能实现的过程。

554 图8.7 按键识别处理流程图

555 键盘可分为编码式键盘和非编码式键盘,编码式键盘由硬件方法产生编码,由于要提供较多的硬件,价格较贵。而非编码键盘是由软件方法产生编码,硬件接口简单,使用灵活,因此被广泛应用于单片机系统中,本教材主要讨论非编码键盘。非编码键盘,可分为独立式键盘和行列式键盘两大类,下面我们主要介绍这两种键盘的接口及其软件实现方法。

556 独立式按键及其接口程序 1. 独立式按键接口 独立式按键是指直接用I/O口线构成的单个按键电路,如图8.8所示。每个独立式按键单独占有一根I/O口线,每根I/O口线上的按键工作状态不会影响其他I/O口线上的工作状态。 (a)查询方式

557 (b)中断方式 图8.8 独立式按键电路

558 通常按键输入都采用低电平有效,图中上拉电阻保证了按键断开时,I/O口有确定的高电平。如I/O口内部有上拉电阻时,外电路可以不配置上拉电阻。
图8.8中(a)为查询方式的独立式按键电路,通过I/O口连接,将每个按键的一端接到单片机的I/O口,另一端接地,这是最简单的方法。图中3个按键分别与P1.2~P1.0相连。对于这种按键程序可以采用不断查询的方法,功能就是:检测是否有键闭合,如有键闭合,则P1.2~P1.0有一只引脚为低电平,否则全为高电平;然后延时去抖动,判断键号并转入相应的键处理程序。 图中(b)为采用中断方式的独立式按键电路。各个按键都接到一个与门上,当有任何一个按键按下时,都会使与门输出为低电平,从而引起单片机的中断,它的优点在于不用在主程序中反复查询按键,而等到有键按下,单片机才去执行相应的键处理程序。 通常按键输入都采用低电平有效,图中上拉电阻保证了按键断开时,I/O口有确定的高电平。如I/O口内部有上拉电阻时,外电路可以不配置上拉电阻。

559 2. 独立式按键的软件实现 我们以查询方式(a)为例介绍其软件实现方法,流程图如图8.7所示,为简便说明起见,我们暂不考虑软件去抖动措施,其程序实现清单如下:  START: MOV A,#0FFH ;置输入方式 MOV P1,A LOOP: MOV A,P1 ;读入键盘状态 ANL A,#07H CJNE A,#07H,L0 ;是否有键按下? SJMP LOOP ;无键按下等待 L0: … ;延时去抖动(省略),确实有键按下 MOV DPTR,#TAB ;送跳转表首地址

560 CPL A ;输入取反 RL A ;乘2,得表偏移量 L1: … ;调用延时程序,键释放(省略) JMP @A+DPTR TAB: AJMP PRO0 ;入口地址表 AJMP PRO1 AJMP PRO2  PRO0: … LJMP START ;0号键执行完返回 PRO1: … LJMP START ;1号键执行完返回 PRO2: … LJMP START ;2号键执行完返回

561 独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一根I/O口线,在按键数量较多时,浪费较大,此一般适用于按键数量不多的情况。

562 8.2.3 行列式键盘(也称矩阵式键盘)及接口 1. 行列式键盘工作原理
行列式键盘(也称矩阵式键盘)及接口 1. 行列式键盘工作原理 在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,如图8.9所示行列式键盘,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,本来一个端口(如P1口)最多只有8个按键,现在就可以构成4×4=16个按键,比它直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显。由此可见,在需要的键数比较多时,可采用行列式法来做键盘。 行列式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,图8.9所示接口电路由8051的P1口高、低4位构成4×4行列矩阵键盘。键盘的列线一端通过电阻接正电源,另一端接单片机的输入口线;行线的一端接单片机的输出口线,另一端悬空。故P1.7~P1.4作为键盘扫描输出口线;P1.3~P1.0为键盘的输入口线。

563 图8.9 键盘接口电路

564 为判定是否有键按下,所有的输出口向行线输出低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。结合图8.9所示,检测的方法是P1.4~P1.7输出全“0”,读取P1.0~P1.3的状态,若P1.0~P1.3为全“1”,则无键闭合,否则有键闭合。 然后判断按键的位置,如果有键按下,被按键处的行线和列线被接通,使穿过闭合键的那条列线变为低电平。方法是对键盘的行线进行扫描。P1.4~P1.7按下述4种组合依次输出: P P P P

565 然后测试行线状态中是否有低电平。在每组行输出时读取P1. 0~P1
行列式键盘接口电路除了可以直接利用I/O口组成外,也可以采用多种锁存器和可编程并行I/O接口芯片组成。例如用8255、8155等可编程芯片构成。 8155扩展I/O口组成的行列式键盘接口电路如图8.10所示。图中行线PC0~PC3通过4个上拉电阻接+5V,处于输入状态;列线PA0~PA7为输出状态。键设置在行、列线交点上,行列线分别连接到按键开关的两端。

566 图 扩展I/O口组成的行列式键盘接口电路

567 2. 行列式键盘的接口及其软件设计 行列式键盘的工作方式有编程扫描方式和中断扫描方式两种。 (1)编程扫描方式
用“行扫描法”,又称为逐行(或列)扫描查询法,确定行列式键盘上何键被按下,这是一种最常用的按键识别方法,识别步骤同上。 结合图8.10中所示键盘,程序分析如下: 首先在主程序中对8155进行初始化,设置PA口为基本输出口,PB口为基本输入口,则命令字为01H。根据上图可知命令口地址为0100H,PA口地址为0101H,PB口地址为0102H。 查询有无按键按下的子程序KS清单如下:

568 KS: MOV DPTR, #010H MOV A,#00H ;A口送00H MOV DPTR,#0102H ;送B口地址 MOVX ;读B口 CPL A ;A取反,无键按下,则(A)=0 ;有键闭合,则(A)≠0 ANL A,#0FH ;屏蔽A高4位 RET 键码的计算: 8×4键盘的键码见表8.2,键码=行号+列号。

569 键盘扫描程序流程图如图8.7所示,程序清单如下(其中DIR为6ms延时子程序,略):
表8.2 键码表 第0列 第1列 第2列 第7列 第0行 00H 01H 02H 07H 第1行 08H 09H 0AH 0FH 第2行 10H 11H 12H 17H 第3行 18H 19H 1AH 1FH 键盘扫描程序流程图如图8.7所示,程序清单如下(其中DIR为6ms延时子程序,略):

570 KEY: ACALL KS ;调用KS子程序,判是否有键按下
JNZ K1 ;有键按下,转K1 ACALL DIR ;无键按下,调延时子程序 AJMP KEY ;重新调用KS子程序 K1: ACALL DIR ;二次调用延时子程序,去抖动 ACALL DIR ACALL KS ;重新调用KS子程序 JNZ K2 ;确实有键闭合 AJMP KEY ;误读键返回 K2: MOV DPTR,#0100H ;送命令字口地址 MOV A,#01H MOVX @DPTR,A MOV R2,#0FEH ;扫描初值送R2 MOV R4,#00H ;扫描列号送R4

571 K3: MOV DPTR,#0101H ;送A口地址 MOV A,R2 MOVX @DPTR,A ;扫描值送A口 MOV DPTR,# 0102H ;送B口地址 MOVX ;读B口 JB ACC.0,L1 ;第一行无键闭合,转L1 MOV A,#00H ;读第一行行值 AJMP LK L1: JB ACC.1,L2 ;第二行无键闭合,转L2 MOV A,#08H ;读第二行行值 L2: JB ACC.2,L3 ;第三行无键闭合,转L3 MOV A,#10H ;读第三行行值

572 L3: JB ACC.3,NEXT ;第四行无键闭合,转NEXT MOV A,#18H ;读第四行行值 LK: ADD A,R4 ;计算键码 PUSH ACC ;A保护进栈 K4: ACALL DIR ;调延时子程序 ACALL KS ;调用KS子程序 JNZ K4 ;有键按下,转K4 POP ACC ;若键起,则键码送A RET 

573 NEXT: INC R4 ;扫描列号加1 MOV A,R2 JNB ACC.7,KEY1 ;扫描完否 RL A ;循环左移一位 MOV R2,A AJMP K3 ;进行下一行扫描 KEY1: AJMP KEY

574 (2)中断扫描方式 单片机在工作时,有时并不经常需要键输入,CPU则经常处于空扫描状态,为了进一步提高CPU效率,可以采用中断扫描工作方式。图8.11所示是中断扫描方式的键盘接口电路,按键输入经与非门后与中断口相连,CPU可以执行其他的任务,而不用重复调用键盘扫描程序。当键盘上有任一键按下时,均可向CPU申请中断,CPU响应中断请求后,在中断服务程序中扫描键盘判按键的行、列值以形成键号值。其中断服务程序和上面的程序类似,进入键盘扫描程序应加入保护现场和恢复现场的操作,返回指令为RETI。

575 图8.11 中断扫描方式的键盘接口电路

576 显示器是单片机应用系统不可缺少的外部输出设备,比如显示系统运行的结果,监视单片机的运行状态等等。显示器的种类很多,有数码管(LED)显示器、液晶(LCD)显示器和CRT显示器等。由于数码管显示器(发光二极管)具有显示清晰、亮度高、使用电压低、寿命长的特点,常用来显示各种数字或符号,因此在单片机系统中得到了广泛应用。本节先介绍LED显示器工作原理及其与单片机的接口。

577 LED显示器的结构 LED(Light Emitting Diode)是发光二极管的缩写,通常所说的LED显示器是由七个发光二极管组成,按“日”字形排列,也称七段LED显示器,其管脚排列如图8.12(a)所示。此外,显示器中还有一个圆点型发光二极管,表示小数点,图中以dp表示。 LED显示器有共阴和共阳两种接法。所有发光二极管的阳极连在一起称共阳极接法,阴极连在一起称为共阴极接法,分别如图8.12(b)(c)所示,图中R是限流电阻。 当选用共阴极的LED显示器时,所有发光二极管的阴极连在一起接地,当某个发光二极管的阳极加入高电平时,对应的二极管点亮;加入低电平时,对应的二极管熄灭。

578 (a)符号与引脚 (b)共阴极 (c)共阳极
图8.12 七段LED显示器

579 为了在七段LED显示器上显示不同的数字或字符,首先要把数字或字符转换成相应的段码,字符数据字与LED段码各代码位的对应关系如下:
dp g f e d c b a 电路接法不同,七段LED显示器形成的段码也不同,见表8.3。

580 表8.3 七段LED的段码表 显示字符 段码 (共阴) (共阳) 3FH C0H 9 6FH 90H 1 06H F9H A 77H 88H 2 5BH A4H B 7CH 83H 3 4FH B0H C 39H C6H 4 66H 99H D 5EH A1H 5 6DH 92H E 79H 86H 6 7DH 82H F 71H 8EH 7 07H F8H 00H FFH 8 7FH 80H

581 8.3.2 LED显示器的工作方式 在单片机应用系统中,发光二极管LED显示器常用两种驱动方式:静态显示驱动和动态显示驱动。
所谓静态显示驱动,就是给要点亮的LED通以恒定的电流,即每一位LED显示器各引脚都要占用单独的具有锁存功能的I/O接口。单片机只需要把要显示的字形段码发送到接口电路并保持不变即可,如果要显示新的数据,再发送新的字形段码。因此,使用这种方法单片机中CPU的开销小,但这种驱动方法需要寄存器、译码器等硬件设备,当需要显示的位数增加时,所需的器件和连线也相应增加,成本也增加。 而所谓动态显示驱动就是给欲点亮的LED通以脉冲电流,即采用分时的方法,轮流控制各个显示器的COM端,使各个显示器轮流点亮,这时LED的亮度就是通断的平均亮度。

582 在轮流点亮扫描过程中,每位显示器的点亮时间是极为短暂的(约1ms),但由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位显示器并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感。但为保证足够的亮度,通过LED的脉冲电流应数倍于其额定电流值。动态显示驱动电路是单片机应用中最常用的显示方式。

583 8.3.3 LED显示器的接口电路 1. LED静态显示接口电路
LED显示器工作在静态显示方式时,可将共阴极或共阳极连在一起接地或+5V;每位LED显示器的段选信号线与一个8位的并行口相连,如图8.13所示。由于每一位LED显示器的段码由不同的8位输出口控制,故在同一时间里每一位显示的字符可以各不相同。另外,该电路中的每一位LED显示器可独立显示,只要该位段选信号线上的数据保持不变,该位就能保持相应的显示字符;或者采用硬件译码器译码实现。 由于这种电路LED显示器各引脚需占用单独的I/O接口电路,故在位数较多时往往 采用动态显示方式。

584 图8.13 LED静态显示电路 2. LED动态显示接口电路 动态显示接口电路是把所有显示器的8个笔划段的同名端连在一起,而每一个显示器的公共极COM是各自独立地受I/O线控制。CPU向字段输出口送出字形码时,所有显示器接收到相同的字形码,但究竟是哪个显示器亮,则取决于COM端,我们可以通过程序控制哪一位显示。

585 图 位LED动态显示接口电路

586 DISP: MOV DPTR,#7F00H ;指向8155控制口 MOV A,#0DH ;8155初始化 MOVX @DPTR,A
图8.14所示是6位LED动态显示器接口电路,采用8155芯片作为单片机应用系统扩展的I/O口。8155的PA口作为LED的字形输出口,为提高显示亮度,采用8路反相驱动器74LS244驱动;PC口作为LED的位选控制口,采用共阳极的LED显示器,由于8段全亮时位控线的驱动电流较大,采用6路反相驱动器74LS06以提高驱动能力。显示器从最右边的一位LED开始点亮,因此扫描初值为01H;欲显示的数据分别存放在单片机8031内RAM的30~35H,假设8155的口地址为7F00~7F05H。显示程序清单如下: DISP: MOV DPTR,#7F00H ;指向8155控制口 MOV A,#0DH ;8155初始化 MOVX @DPTR,A

587 LOOP: MOV DPTR,#7F03H ;指向8155位控口地址 MOV A,R7 ;位控码初值 MOVX @DPTR,A
MOV R7,#01H ;从右边第1位显示器开始 MOV R1,#30H ;显示缓冲区首地址送R1 LOOP: MOV DPTR,#7F03H ;指向8155位控口地址 MOV A,R7 ;位控码初值 MOV DPTR,#7F01H ;指向8155段控口地址 MOV ;取待显示数据 MOV DPTR,#TAB ;取字形段码表首地址 MOVX ;查表获取得字形段码 ACALL DELAY ;延时1ms INC R1 ;指针指向一缓冲单元 MOV A,R7 JB A CC.5,RETURN ;判是否到最高位?到返回 RL A ;不到,左移一位

588 MOV R7 ,A AJMP LOOP ;继续扫描 RETURN: RET TAB: DB 0COH,0F9H,0A4H,0B0H,99H
DB 92H,82H,0F8H,80H,90H DB H,83H,0C6H,0A1H,86H DB 8EH,0BFH,8CH,0FFH DELAY: … ;延时程序略

589 从上面的例子中可以看出,动态扫描显示必须由CPU不断地调用显示程序,才能保证持续不断的显示。在实际的工作中,当然不可能只显示数字,这样在两次调用显示程序之间的时间间隔就不一定了,如果时间间隔比较长,就会使显示不连续,因此比程序不太实用。我们可以借助于定时器,定时时间一到,产生中断,点亮一个数码管,然后马上返回,这个数码管就会一直亮到下一次定时时间到,而不用调用延时程序了,这段时间可以留给主程序干其他的事。到下一次定时时间到再显示下一个数码管,这样可以少占用CPU的时间了。改进的程序编写同学们可以自行讨论。

590 LCD显示器的结构 LCD(Liquid Crystal Diodes)是液晶显示器的简称,由于具有体积小、重量轻、功耗低、寿命长、价格低等优点,常应用于便携式仪表或低功耗应用系统中,如手表、数字仪表、通信产品、家用电器等领域。 液晶显示器件的结构如图8.15所示,这种LCD是一种被动式显示器,它本身并不发光,只是调节光的亮度。 图8.15 常用的液晶显示器件结构示意图

591 其基本原理是根据液晶的扭曲——向列效应原理制成的。当外部入射光通过偏振片后形成偏振光,该偏振光通过平行排列的液晶材料后被旋转900,再通过与上偏振片垂直的下偏振片,被反射板反射回来,呈透明状态;当上、下电极加上一定的电压后,电极部分的液晶分子转成垂直排列,失去旋光性,从上偏振片入射的偏振光不被旋转,光无法通过下偏振片返回,因而呈黑色。这样所得到光暗对比的现象,叫做扭转式向列场效应,简称TNFE(twisted nematic field effect)。在电子产品中所用的液晶显示器,几乎都是用扭转式向列场效应原理所制成的。 液晶显示器分很多种类,按显示方式可分为段式、行点阵式和全点阵式。段式与数码管类似,行点阵式一般是英文字符,全点阵式可显示任何信息,如汉字、图形、图表等。在这里我们主要介绍段式LCD显示器。

592 8.4.2 LCD显示器的工作方式 LCD显示器的驱动方式一般有静态驱动和动态驱动两种方式,我们以静态驱动为例介绍其工作原理。
由于LCD的电化学特性,LCD的驱动一般采用交流驱动,通过异或门把控制信号和显示频率信号合并为交变的笔段驱动信号,使笔段波形与公用波形同相或反相,见表8.4。图8.16为基本的LCD驱动电路和工作波形,其中A为显示频率信号,C为显示控制信号。当LCD字段上两个电极的电压相位相同时,两电极的相对电压为零,该字段不显示;当此字段上两个电极为交替变化的电压时,两电极的相对电压为两倍幅值方波电压,该字段呈黑色显示,如图8.16所示波形。

593 表8.4 真值表 A C B 1 图8.16. 静态驱动电路原理及波形图

594 七段LCD显示器的电极a~g配置与LED显示器引脚a~g相同,七段译码器完成从BCD码到七段段选的译码,其真值表及数字显示如表8
七段LCD显示器的电极a~g配置与LED显示器引脚a~g相同,七段译码器完成从BCD码到七段段选的译码,其真值表及数字显示如表8.5所示。对于一位LCD的显示可使用七段译码器实现,如图8.17所示。 表8.5 七段LCD译码及数字显示 A B C D a b c d e f g 数字显示 1 2 3 4 5 6 7 8 9

595 静态驱动方式LCD每个显示器的每个字段都要引出电极,所有显示器的公共电极连在一起后引出。所有的段都有独立的驱动电路,与LED静态显示方式一样,显示位数越多,引出线也越多,相应的驱动电路也越多,故适用于显示位数较少的场合。 图8.17 一位LCD显示

596 LCD显示器的接口电路 图8.18所示是静态驱动方式的四位LCD静态显示的接口电路,采用MC14543译码驱动器,将输入的BCD码转换为7段码输出。PH为方波信号输入,由外部方波振荡器产生。LD为内部锁存器选通端,高电平,允许输入BCD码;低电平锁存数据。BI为消隐控制,高电平消隐,即输出端a~g输出信号的相位与PH端相同。

597 图8.18 LCD静态显示电路

598 设显示缓冲区为8031内部RAM的30H~33H四个单元依次存放有4位已分离的BCD码,显示子程序清单如下:
DISP: CLR A MOV P1,A ;熄灭显示器 MOV R0,#30H ;指向显示缓冲区首地址 MOV R1,#10H ;设定位控 DISP1: MOV ;取显示数据 ANL A,#0FH ;屏蔽高4位 ORL A,R1 ;段控+位控 MOV P1,A ;输出 ACALL DELAY ;延时 ANL P1,#0FH ;位控重置,均不选中 INC R0 ;指向下一显示缓冲区

599 MOV A,R1 ;送位控 RL A MOV R1,A JNB ACC.0,DISP1 ;4位显示完否 RET LCD的动态驱动原理与控制较为复杂,由于篇幅的限制,这里不进行详细叙述,大家可以参考相关资料与书籍。在实际动态驱动应用中,通常都是使用专用的IC芯片,如MC145000和MC145001等,或直接采用具有动态LCD驱动接口的单片机。采用专用的IC芯片一般较为昂贵,且通用性不好,而使用具有动态LCD驱动接口的单片机则需具有针对相应单片机的开发系统或开发手段。

600 本章8.2节提到键盘分非编码键盘和编码键盘,并主要介绍了非编码键盘的工作原理及接口程序设计。非编码键盘虽然硬件接口简单,但是要占用CPU时间较多,为了克服这一缺点,出现了一些专供键盘及显示器接口使用的可编程接口芯片,如Intel 8279等芯片。本节就以Intel 8279芯片为例介绍它的工作原理及使用方法。

601 的内部结构及工作原理 Intel 8279是一种通用的可编程序的键盘、显示接口器件,它能够完成键盘输入和显示控制两种功能。其内部结构如图8.19所示,根据8279的结构框图,下面分别介绍各部分的功能及工作原理。 1. 键盘/传感器部分 键盘部分提供的扫描方式可以和具有64个按键的矩阵键盘相连接,能不断扫描键盘,自动消除键盘的抖动,自动识别按键,能对多键同时按下提供保护功能。

602 图 内部结构框图

603 (1)FIFO/传感器RAM及其状态 FIFO/传感器RAM是一个双重功能的8×8 RAM。在键盘或选通工作方式时,它是FIFO存储器。每次新的输入都顺序写入到RAM单元,而每次读出时,总是按输入的顺序,将最先输入的数据读出。FIFO状态寄存器用来存放FIFO RAM的工作状态。例如:RAM是满还是空;其中存有多少字符;是否操作出错等等。当FIFO存储器不空时,状态逻辑将产生IRQ=1信号,向CPU申请中断。 在传感器矩阵方式时,这个存储器又叫传感器RAM。它存放着传感器矩阵中每一个传感器的状态。在此方式中,若检索出传感器的变化,IRQ信号便变为高电平,向CPU请求中断。

604 (2)控制与定时寄存器及定时控制 控制与定时寄存器用于寄存键盘及显示的工作方式,以及由CPU编程的其他操作方式。定时控制包括基本的计数链。首级计数器是一个可编程的N级计数器,N可在2~31之间由软件控制,以便从外部时钟CLK得到内部所需要的100kHz时钟信号。然后经过分频为键盘提供适当的逐行扫描频率和显示的扫描时间。 (3)扫描计数器 扫描计数器有两种工作方式。按编码方式工作时,计数器作二进制计数。四位计数状态从扫描线SL0~SL3输出,经外部译码器译码后,为键盘和显示器提供扫描线。按译码方式工作时,扫描计数器的最低两位被译码后,从SL0~SL3输出。

605 2. 显示器部分 (4)回复缓冲器、键盘消抖及控制 来自RL0~RL7的8根返回输入线的回复信号,由回复缓冲器缓冲并储存。
在键盘工作方式中,这些线被接到键盘矩阵的列线。在逐行扫描时,返回输入线用来搜索一行中闭合的键。当某一键闭合时,去抖动电路就被置位,延时等待100ms之后,再检测该键是否仍然闭合。若闭合,则该键的地址和附加的位移、控制状态一起形成键盘数据被送入8279内部的FIFO存储器,其数据格式详见下文数据寄存器格式。 2. 显示器部分 显示部分为LED及其他显示器提供了按扫描方式工作的显示接口,最多可以显示16位的字符或数字。它除了以上所述的与键盘共用部分电路以外,还包括以下两部分:

606 (1)显示RAM和显示地址寄存器 显示RAM用来存储显示数据。该区具有16个字节,也就是最多可以存储16个字节的显示信息。显示地址寄存器用来存储由CPU进行读/写的显示RAM的地址,它可以由命令设定,也可以设置成每次读出或写入之后自动递增。 (2)输入/输出控制及数据缓冲器 数据缓冲器是双向缓冲器,用于传送CPU和8279之间的命令或数据。I/O控制是CPU对8279的控制,有4条引线。是8279的片选信号,低有效;、为来自CPU的读写控制信号;A0用于区别信息的特征,当A0=1时,表示传送的是命令或状态字,当A0=0时,表示传送的是数据。

607 8.5.2 8279的引脚与功能 1. 与CPU的引脚 8279采用40引脚封装,其引脚配置及功能如图8.20所示。
的引脚与功能 8279采用40引脚封装,其引脚配置及功能如图8.20所示。 1. 与CPU的引脚 DB7~DB0:数据总线(双向、三态总线)。 CLK:外时钟输入端。 RESET:复位信号,高电平有效。 复位时默认状态:16个字符显示——左入; 编码扫描键盘——双键锁定;程序时钟编程设定为31。 :片选信号,低电平有效。 A0:区分信息的特征位。 A0=0时,输入/输出信息为数据; A0=1时,输入信息为命令,输出信息为状态。

608 图 引脚图

609 2. 与键盘接口的引脚 IRQ:中断请求信号,高电平有效。
、 :读、写信号,低电平有效。 IRQ:中断请求信号,高电平有效。 在键盘工作方式中,当FIFO/传感器RAM存有数据时,该信号有效;CPU每次从RAM读出数据时,IRQ就变为低电平;若RAM中仍有数据,则IRQ再次恢复为高电平。在传感器工作方式中,当检测出传感器状态变化时,IRQ就出现高电平。 2. 与键盘接口的引脚 SL0~SL3:扫描输出线。 RL0~RL7:键扫描返回输入线。 SHIFT:换档信号输入线,高电平有效。 该信号线用来扩充键开关的功能,可以用作键盘的上、下档功能键。在传感器方式和选通方式中,SHIFT无效。

610 CNTL/ :控制/选通输入线,高电平有效。
在键盘工作方式时,作为控制功能键使用。在选通方式时,该信号的上升沿可以将来自RL0~RL7的数据存入FIFO存储器,在传感器方式无效。 3. 与显示器接口的引脚 OUTA0~OUTA3:A组显示信号输出线。 OUTB0~OUTB3:B组显示信号输出线。 :消隐输出线,低电平有效。 该输出信号在数字切换显示或使用显示消隐命令时,将显示消隐。

611 的寄存器 1. 命令寄存器 8279的命令寄存器为8位寄存器,我们以D7~D0表示它的各位,其中高3位(D7、D6、D5)是命令的特征位,不同的状态组合代表着不同的命令。8279共有8条命令: (1)键盘/显示方式设置命令(D7D6D5=000) 此命令用于设置键盘与显示器的工作方式,各位定义如下: D7 D6 D5 D4 D3 D2 D1 D0 D K

612 DD两位用来设定显示方式: 个字符显示——左入(指在显示时,显示字符是从左面向右面移动)。 个字符显示——左入。 个字符显示——右入(指在显示时,显示字符从右面向左面移动)。 个字符显示——右入。 KKK三位用来设定键盘工作方式: 000: 编码扫描键盘,双键锁定。 001: 码扫描键盘,双键锁定。 010: 编码扫描键盘,N键轮回。 011: 译码扫描键盘,N键轮回。

613 其中,双键锁定指为两键同时按下提供保护;N键轮回为N键同时按下提供保护,根据发现它们的次序,依次将它们的状态送入FIFO RAM。
100: 编码扫描传感器矩阵。 101: 译码扫描传感器矩阵。 110: 选通输入,编码显示扫描。 111: 选通输入,译码显示扫描。 其中,双键锁定指为两键同时按下提供保护;N键轮回为N键同时按下提供保护,根据发现它们的次序,依次将它们的状态送入FIFO RAM。 (2)时钟编程命令(D7D6D5=001) D7 D6 D5 D4 D3 D2 D1 D0 1 P

614 (3)读FIFO/传感器RAM命令(D7D6D5=010)
将来自CLK的外部时钟进行PPPPP分频(2-31),用以产生100KHz的频率信号作为8279的内部时钟。例如:CLK为2MHz,要想得到100KHz的时钟信号,分频系数=2 MHz/100KHz=20,转换成二进制数为10100。 (3)读FIFO/传感器RAM命令(D7D6D5=010) D7 D6 D5 D4 D3 D2 D1 D0 1 AI X A AAA为FIFO RAM的地址;AI为自动增量特征位,若AI=1,则每次读出传感器RAM后,地址将自动增量(加1),使地址指针指向顺序的下一个存储单元;X没有意义。在键盘扫描工作方式中,由于读出操作严格按照先入先出的顺序,因此这条命令与之无关。

615 AAAA为显示RAM存储单元的地址;AI为自动增量特征位,AI=1,表示每次读出后,地址自动加1,指向下一个地址,否则不变。
(4)读显示RAM命令(D7D6D5=011) D7 D6 D5 D4 D3 D2 D1 D0 1 AI A AAAA为显示RAM存储单元的地址;AI为自动增量特征位,AI=1,表示每次读出后,地址自动加1,指向下一个地址,否则不变。 (5)写显示RAM命令(D7D6D5=100) D7 D6 D5 D4 D3 D2 D1 D0 1 AI A 与前面命令字位相同。

616 BLA和BLB位是消隐特征位。若为1,则对应组的显示输出被熄灭;若为0,则恢复显示。
(6)显示禁止写入/消隐命令(D7D6D5=101) D7 D6 D5 D4 D3 D2 D1 D0 1 X IWA IWB BLA BLB IWA和IWB分别用来屏蔽A组和B组显示RAM。例如,当A组的掩蔽位D3=1时,A组的显示RAM禁止写入。目的是为了给其中一个四位显示器输入数据,而又不影响另一个四位显示器而采取的掩蔽措施。 BLA和BLB位是消隐特征位。若为1,则对应组的显示输出被熄灭;若为0,则恢复显示。

617 该命令字用来清除FIFO RAM和显示RAM。D4D3D2三位(CD)用来设定清除显示RAM的方式。其意义见表8.6。
1 CD CF CA 该命令字用来清除FIFO RAM和显示RAM。D4D3D2三位(CD)用来设定清除显示RAM的方式。其意义见表8.6。

618 D1(CF)位用来清空FIFO存储器,并使中断IRQ复位。同时,传感器RAM的读出地址也被清0。
表8.6 清除命令 D4 D3 D2 清除方式 1 × 将显示RAM全部清“0” 将显示RAM置20H(即A组=0010 B组=0000) 将显示RAM全部置1 不清除(若CA=1,则D3、D2仍有效) D1(CF)位用来清空FIFO存储器,并使中断IRQ复位。同时,传感器RAM的读出地址也被清0。 D0(CA)位是总清的特征位,它兼有CD和CF的联合有效。在CA=1时,对显示RAM的清除方式由D3D2的编码决定。 清除显示RAM大约需要100μs的时间。在此期间,FIFO状态字的最高位Du=1,表示显示无效,CPU不能向显示RAM写入数据。

619 (8)结束中断/错误方式设置命令(D7D6D5=111)
E X 若在传感器工作方式,每当传感器状态出现变化时,扫描检测电路即将其状态写入传感器RAM,并启动中断逻辑,使IRQ变高,向CPU请求中断;并且禁止写入传感器RAM。当E=1时,此命令用来结束传感器RAM的中断请求。 若8279被设定为键盘扫描N键轮回方式,如果发现有多个键被同时按下,则FIFO状态字中的错误特征位S/E将置位,并产生中断请求信号和阻止写入FIFO RAM。

620 2. 状态寄存器 8279的状态寄存器为8位寄存器,主要用于键盘和选通工作方式,以指示FIFO RAM中的字符数是否有错误发生,其字位意义如下: D7 D6 D5 D4 D3 D2 D1 D0 Du S/E O U F N Du:Du=1显示无效位,当显示RAM由于清除显示或全清除命令尚未完成时,D7 应置“1”,这时对显示RAM的写操作无效。 S/E:传感器信号结束/错误特征码,用于传感器输入方式,几个传感器同时闭合时置“1”。

621 3. 数据寄存器 O:O=1表示出现溢出错误。 U:U=1表示出现不足错误。 F:F=1表示FIFO RAM已满。
NNN:其值为FIFO RAM中数据的个数。 3. 数据寄存器 这里的数据寄存器指FIFO RAM中最前面的那个单元,其内容为被按键的信息,通过读它而把键信息输入单片机,以进一步处理,其数据格式为 : D7 D6 D5 D4 D3 D2 D1 D0 控制 移位 扫描 返回

622 控制CNTL和位移(D7和D6)的状态由两个独立的附加开关决定,而扫描(D5、D4、D3)和返回(D2、D1、D0)则是被按键的位置数据。D5、D4、D3三位来自扫描计数器,是按键的行编码,而D2、D1、D0三位则是来自列计数器,它们是根据返回输入信号而确定的列编码。 在传感器矩阵方式中,返回输入线的内容直接被送往相应的传感器RAM(即FIFO存储器)。在选通输入方式时,返回输入线的内容在CNTL/线的脉冲上升沿时,被送入FIFO存储器。

623 的接口应用 图8.21所示为8279实现键盘-显示器接口框图。 图8.21 用8279实现键盘-显示器接口框图

624 8279显示器最大配置为16位显示,段选线由B0~B3、A0~A3提供;位选线由扫描线SL0~SL3经4-16译码器提供。通过4-16译码器对选通码进行译码后轮流选通各位显示器。这些操作都是由8279自动进行的。 8279键盘最大配置为8×8。设扫描线为行线,查询线为列线,扫描线由SL0~SL2通过3-8译码器提供,接入键盘行线;查询线由返回输入线RL0~RL7提供,接入键盘列线,用来读取键盘的状态。当发现有键闭合则等待10ms,去抖动后再检测按键是否仍然闭合,若仍闭合,则把被按键码选通输入8279内部的FIFO存储器,同时IRQ输出高电平,申请中断。单片机收到中断请求后,则转到键盘服务程序,从FIFO中读取按键读数。 信号线可用来控制译码器,实现显示器的消隐。

625 图8.22 单片机8051与8279的接口电路

626 图8.22是单片机8051与8279的接口电路。 8279外接3×8键盘和8位共阴极LED显示器,左端输入;采用编码扫描键盘,双键互锁。8279的IRQ经反相由 引入单片机,单片机晶振为12MHz,8279的命令口地址为7FFFH,数据口地址位BFFFH。8279的初始化程序分析如下: ① 要先清除显示RAM和FIFO RAM,使用第7条命令。 D4=1,清显示RAM;D1=1,清全部RAM; 对应位: ,命令字为D1H。 ② 设置键盘/显示器工作方式,使用第1条命令。 对应位: ,命令字为00H。 ③ 设置分频系数,使用第2条命令。 ALE频率为12 MHz/6=2 MHz 2MHz/100kHz=20;对应位: ,命令字为34H。

627 初始化程序清单如下: SETB EX ;允许外部中断0中断 MOV DPTR,#7FFFH MOV A,#D1H ;清除显示RAM和FIFO RAM MOV A,#00H ;设置键盘/显示器工作方式 MOV A,#34H ;设置分频系数 SETB EA ;开中断

628 显示器更新程序清单如下: DISP: MOV DPTR,#7FFFH MOV A,#90H ;写显示RAM命令给8279 MOVX @DPTR, A MOV R7,#08H ;显示8位数 MOV R1,#DIS0 ;显示缓冲区首地址送R1 MOV DPTR #0BFFFH ;指向数据口 LOOP: MOV ;取待显示数据 ADD A, # ;加偏移量 MOVC ;查表获取得字形段码 MOVX @DPTR,A ;显示

629 INC R1 ;指针下移一位 ;准备取下一个待显示数 DJNZ R7,LOOP ;直到8个数据全显示完 RET
TAB: DB 3FH,06H,5BH,4FH,66H,6DH DB 7DH,07H,7FH,6FH,77H DB 7CH,39H,5EH,79H,71H,00H

630 键输入中断服务程序如下: KEY: PUSH PSW PUSH DPL PUSH DPH PUSH ACC PUSH B MOV DPTR #7FFFH ;读FIFO状态字 MOVX ANL A,#0FH JZ PK ;判FIFO中是否有数据 MOV A,#40H ;读FIFO命令 MOVX @DPTR,A

631 MOVX A,@DPTR ;读数据 MOV R2,A ;计算键号(下略) … PK: POP B POP ACC POP DPH
MOV DPTR #0BFFFH MOVX ;读数据 MOV R2,A ;计算键号(下略) PK: POP B POP ACC POP DPH POP DPL POP PSW RETI 

632 习 题 1. 试说明键盘的工作原理。 2. 在读键时,为什么要进行延时去抖动?延时去抖动的时间一般为多长?如何解决? 3. 如何判断键是否释放? 4. 按键识别包括哪几方面?试画出其软件实现流程图。 5. 有一4×8行列式键盘,以8155为接口,PA口为输出口,接键盘列线,PB口为输入口,PB3~PB0接键盘的4条行线。 (1)完成8155与8031的硬件连接图,并根据连接图写出8155 PA口、PB口的地址; (2)试编写8155的初始化程序和快速按键扫描程序。

633 6. 试设计一个用8155与32个键盘连接的接口电路,并编写程序,要求用8155定时器定时,每隔2s读一次键盘,并将其读入的键值存入8155片内RAM 30H开始的单元中。
7. 试编写如图8.11所示采用中断扫描方式的键盘接口电路的程序。 8. LED显示器有几种工作方式?试对它们进行分析比较。 9. 试画出利用串行口扩展6位静态LED显示接口电路图,并编写LED显示程序。 10. 一个单片机8031与8279的接口电路,8279外接3×8键盘和8位共阴极LED显示器,采用编码扫描键盘、双键互锁方式,显示器置左端进入方式;8279内部时钟信号频率100kHz,晶振12MHz;假设命令口地址为7FFFH,采用中断方式,试编写一段初始化程序。

634 计算机与外界的数据交换称为通信,可分为并行通信和串行通信两种基本方式。
并行通信是指各个数据位同时进行传送的数据通信方式。因此有多少个数据位,就需要多少根数据线,在计算机内部数据通常采用并行通信方式;在计算机系统中,CPU与存储器之间也采用并行数据传送。并行数据传送速度快、效率高,但传送距离近,通常只适合30米距离内的数据传送。 串行数据传送按位顺序进行,最少只需要一根传输线即可完成。因此,传送速度慢、效率低,但传送距离远,而且可使用现有的通信通道(如电话线、各种网络等),故在集散控制系统等远距离通信中使用很广。 根据同步时钟提供的不同,串行通信可分为异步串行(或称为串行异步)和同步串行两种通信方式。在单片机中使用大都是串行异步通信,因此本章仅介绍串行异步通信方式。

635 异步串行通信的字符格式 异步串行通信以字符为单位,一个字符一个字符地在通信线路上传送。异步传送时,各个字符可以是连续传送,也可以断续传送,这完全由发送方根据需要来决定。而且在异步传送时,同步时钟并不传送到接收方,即双方各用自己的时钟源来控制发送和接收。 由于字符的发送是随机进行的,对接收方来讲必须要有一个判别何时有字符送到,即何时是一个字符开始的问题。因此,在异步串行通信时,对传送的字符必须要规定一个格式,异步串行通信字符格式如图9.1所示。 图9.1 异步串行通信字符格式

636 ① 起始位:space状态,占用一位,用来表示一个新字符的开始。
在图9.1的格式标准中,传送信息的两种状态分别以space和mark标志。其中“mark” ,译为“标号”,对应为逻辑“1”状态。在发送方不发送字符时,数据线应保持mark状态。space为“空格”状态,对应为逻辑“0”状态。由图9.1可知,异步串行通信的每个字符由四部分组成,分别是:起始位、数据位、奇偶校验位和停止位。 ① 起始位:space状态,占用一位,用来表示一个新字符的开始。 ② 数据位:起始位后面紧接着的就是数据位,根据具体格式的不同,它可以是5位、6位、7位或8位。各数据位传送顺序是:低位在前,高位在后。 ③ 奇偶校验位:奇偶校验位紧跟数据位之后,用于校验数据传送的正确性。奇偶校验位可选择为3种方式:偶校验、奇校验和无校验位。

637 所谓奇校验,就是使各数据位加校验位含有奇数个“1”的校验方式。例如,某异步串行通信含有8位数据位,采用奇校验方式,若传送16进制数34H,则校验位应为“0”;若传送16进制数30H,则校验位应为“1”。 偶校验,则是使各数据位加校验位含有偶数个“1”的校验方式。上例中若采用偶校验方式,传送16进制数34H,则校验位应为“1”;若传送16进制数30H,则校验位应为“0”。 在串行通信时,使用奇偶校验位,能在一定程度上保证串行通信数据的可靠性。 ④ 停止位:停止位在字符格式的最后部分,对应为mark状态,表示一个字符传送的结束。根据具体格式的不同,可占用1位、1.5位或2位。若接收方接收到停止位时,就表明这一字符已接收完毕。同时,也为接收下一字符做好准备——只要接收到space状态,就是新字符的起始位。若停止位后不传送新字符,则通信数据线维持为mark状态。

638 从起始位开始到停止位结束是一字符的全部内容,也被称为“一帧”。帧是一个字符的完整通信格式,因此还把串行通信的字符格式称为“帧格式”。
例9.1 某异步串行通信的字符格式为1位起始位、8位数据位和2位停止位,并采用奇校验方式。请画出传送字符“T”的ASCII码的帧格式。 解题分析:字符“T”的ASCII码为54H,即二进制数为 B,含有奇数个(3个)“1”,因此校验位应为“0”,在画“T”的字符格式时还要注意8个数据位的传送次序。因此,字符“T”的ASCII码的帧格式如图9.2所示。 图9.2 字符T的ASCII码帧格式

639 异步串行通信的传送速率 异步串行通信的传送速率用于表示数据传送的快慢。在串行通信中,以每秒钟传送二进制的位数来表示,也称之为波特率(baud rate),单位为位/秒(b/s)或波特(baud)。波特率既反映了串行通信的速率,也反映了对传输通道的要求,波特率越高,要求传输通道的频带也越宽。在异步通信时,波特率为每秒传送的字符个数和每字符所含二进制位数的乘积。例如,某异步串行通信每秒传送的速率为120个字符/秒,而该异步串行通信的字符格式为10位(1位起始位,7位数据位,1位偶校验位和1位停止位),则该串行通信的波特率为: 120字符/秒×10位/字符=1200位/秒=1200波特

640 9.1.3 异步串行通信的信号形式 1. 近程通信 2. 远程通信 虽然都是串行通信,但近程串行通信和远程串行通信的信号形式却不同。
异步串行通信的信号形式 虽然都是串行通信,但近程串行通信和远程串行通信的信号形式却不同。 1. 近程通信 近程通信采用数字信号直接传送方式,也就是说,在传送过程中,不改变信号的波形和频率,这种数据传送方式也称为基带传送方式。在基带传送时,常采用的一种标准就是RS-232C标准。 2. 远程通信 在远程通信时,可采用专用的通信电缆,但处于经济考虑也常使用电话线作为传输线。若直接传送数字信号,会发生信号畸变。因此要使用调制器将数字信号转换为模拟信号。

641 (例如,将数字信号“1”调制成2400Hz的正弦波信号,将数字信号“0”调制成1200Hz的正弦波信号)送到传输线上;在接收方,再通过解调器将接收到的交变模拟信号还原为数字信号,送到接收方,如图9.3所示。 图9.3 具有MODEM设备的远距离通信连接

642 9.1.4 异步串行通信的数据通路形式 1. 单工形式(Simplex)
异步串行通信的数据通路形式 根据同一时刻串行通信的数据方向,异步串行通信可分为以下三种数据通路形式: 1. 单工形式(Simplex) 在单工方式下,数据的传送是单向的。通信双方中,一方固定为发送方,另一方固定为接收方。如图9.4所示。在单工方式下,通信双方只需一根数据线进行数据传送。 图9.4 单工形式

643 2. 全双工形式(Full-duplex) 在全双工方式下,数据的传送是双向的,且可以同时接收和发送数据,如图9.5所示。在全双工方式下,通信双方需两根数据线进行数据传送。 图9.5 全双工形式

644 3. 半双工形式(Half-duplex) 在半双工方式下,数据的传送也是双向的,但与全双工方式不同的是:任何时刻只能由其中一方进行发送,而另一方接收。如图9.6所示。因此,在半双工方式下,通信双方既可以使用一条数据线,也可以使用两条数据线。 图9.6 半双工形式 MCS-51单片机的串行口是一个全双工的串行口,其字符格式为:1位起始位、8位数据位、1位停止位和1位或0位校验位。具体功能和结构参见9.3节。

645 RS-232C总线标准 RS-232C是美国电子工业协会(EIA,Electronic Industry Association)推荐的串行通信总线标准,其全称为“使用二进制进行交换的数据终端设备(DTE,data terminal equipment)和数据通信设备(DCE,data communication equipment)之间的接口标准”。当前几乎所有计算机都使用符合RS-232C传输协议的串行通信接口。 1. RS-232C连接器 RS-232C接口通向外部的连接器(插针和插座)是一种标准的25针D型连接器。图9.7是这种插座的外形及其引脚编号。目前,绝大多数计算机采用9针D型连接器。

646 2. RS-232C的引脚定义 RS-232C标准定义了25条信号线,使用25个引脚的D型连接器,各信号引脚定义见表9.1。

647 表9.1 标准25针“D”型连接器引脚定义 引脚 定 义 1 保护地(PG) 14 辅助通道发送数据 2 发送数据(TXD) 15 发送时钟(TXC) 3 接收数据(RXD) 16 辅助通道接收数据 4 请求发送(RTS) 17 接收时钟(RXC) 5 清除发送(CTS) 18 未定义 6 数据通信设备就绪(DSR) 19 辅助通道请求发送 7 信号地(SG) 20 数据终端设备准备好(DTR) 8 接收线路信号检测(DCD) 21 信号质量检测 9 保留用于测试 22 振铃指示 10 23 数据速率选择 11 24 发送信号定时 12 辅助通道接收线信号检测 25 13 辅助通道清除发送

648 大多数计算机使用9针D型连接器与外界进行串行通信,9针D型连接器与25针D型连接器在引脚定义的顺序上有所不同,使用时一定要注意。微机串行口9针D型连接器信号说明见表9.2。

649 表9.2 微机串行口9针D型连接器信号说明 引脚 信号名称 简称 方向 信号功能 1 接收线路信号检测 DCD DTE← DCE已接收到远程信号 2 接收数据 RXD DTE接收串行数据 3 发送数据 TXD →DCE DTE发送串行数据 4 数据终端就绪 DTR DTE准备就绪 5 信号地 6 数据传送设备就绪 DSR DCE准备就绪 7 请求发送 RTS DTE请求切换到发送方式 8 清除发送 CTS DCE已切换到准备接收(清楚发送) 9 振铃指示 RI 通知DTE,通信线路已通

650 3. RS-232C主要信号引脚说明 RS-232C串行通信标准中的许多信号是为通信业务联系或信息控制而定义的。在计算机串行通信中主要使用如下信号: (1)串行通信基本信号引脚 TXD:发送数据引脚,输出。数据传送时,数据位由该引脚发出;不发送数据时,该引脚维持逻辑“1”,mark状态。 RXD:接收数据引脚,输入。发送器发出的数据位由该引脚进入接收器。 SG和PG:信号地和保护地。 (2)与MODEM通信控制信号引脚 RTS:请求发送引脚,输出。用于通知MODEM,计算机请求发送数据。

651 CTS:清除发送引脚,输入。它是MODEM对计算机发出的RTS信号的响应。
DSR:数据通信设备准备就绪信号,输入。用于通知计算机,MODEM准备就绪。 DTR:数据终端设备准备就绪信号,输出。用于通知MODEM,计算机准备就绪,可以通信。 RI:振铃信号指示引脚,输入。用于通知计算机有来自电话网的信号。 DCD:接收线路信号检测引脚,输入。用于通知计算机,MODEM与电话线另一端的MODEM已建立联系。 (3)时钟信号引脚 RXC:接收时钟。 TXC:发送时钟

652 4. 电气特性 由于RS-232C接口标准的接收器和发送器之间有公共信号地,不可能使用双端信号(差分信号),只能传送单端信号,这样,共模噪声就会耦合到系统中。传输距离越长,干扰越严重。因此,为了可靠地传输信息,不得不增加信号幅度。RS-232C标准规定,采用负逻辑EIA电平,逻辑“1”电平为-3V~-15V,逻辑“0”电平为+3V~+15V;传输距离在15m之内;数据传输速率局限在20kb/s以下,其传输速率主要有:50、75、110、150、300、600、1200、2400、4800、9600、19200b/s。RS-232C的其他电气特性标准见表9.3。

653 表9.3 RS-232C的电气特性标准 带3kΩ~7kΩ时驱动器的输出电平为: 逻辑1:-3V~-15V,逻辑0:+3V~+15V 不带负载时驱动器的输出电平 -25V~+25V 驱动器开路时的输出阻抗 >300Ω 输出短路电流 <0.5A 驱动器转换速率 <30V/μs 接收器最大承受电压 ±25V 接收器输入阻抗 3kΩ~7kΩ 最大电容负载 2500pF

654 5. RS-232C总线接口的几种连接方式 利用RS-232C标准,可以实现具有该标准接口的设备之间的连接。近距离的通信可不通过电话线路,直接将最基本的串行通信引脚相连即可,如图9.8所示,与MODEM控制有关引脚可以不接;或将控制线和自身的状态线连接起来,如图9.9所示。 图9.8 近距离通信的RS-232C信号连接a 图9.9 近距离通信的RS-232C信号连接b

655 数据终端设备,如计算机,通过RS-232C标准与数据通信设备DCE,如MODEM连接起来,再通过电话线与远程的设备进行串行通信。具有MODEM设备的远距离通信连接如图9.3所示。
由RS-232C标准的电气特性可知,RS-232C的逻辑电平与TTL逻辑电平不兼容,而微型计算机通过串行接口芯片送出的和能接收的都是TTL电平的数字信号。因此必须进行电平转换。Motorola公司制造的MC1488就是将TTL电平转换为RS-232C电平的比较简单的集成电路芯片;而MC1489则是将RS-232C电平转换为TTL电平的转换器芯片。采用MC1488和MC1489可实现TTL和RS-232C电平的相互转换。硬件连接如图9.10所示。

656 图9.10 TTL和RS-232C电平相互转换电路 由于MC1488须外接正、负电源,应用时可能会带来一些不便。现在已有一些新型的、使用更加方便的转换芯片,如Motorola公司的MC145407或MAXIM公司生产的MAX系列RS-232C收发器MAX211、MAX213E、MAX241E芯片等,均采用单+5V电源供电,在一片芯片内部集成了多个收发器,既可将RS-232C电平转换为TTL电平,亦可将TTL电平转换为RS-232C电平,使用十分方便。详细硬件连接见有关参考书籍。

657 串行接口电路 串行数据通信的主要技术问题是:数据转换和数据传送。数据传送主要解决传送中的标准、格式及工作方式等问题,这些内容已在前面论述过了。数据转换指的是数据的串并转换。因为在计算机中使用的数据都是并行数据,因此在发送端,要将并行数据转换为串行数据,再进行发送;而在接收端,则应将接收到的串行数据转换为并行数据,再送到接收计算机。 数据转换由串行接口电路实现,这种电路也被称为通用异步接收发送器(UART,Universal Asynchronous Receiver/Transmitter)。从原理上说,一个通用异步接收发送器UART应包括发送器电路、接收器电路及其相应控制电路,其主要功能是:

658 1. 数据的串行化/反串行化处理 所谓串行化处理就是把并行数据格式转换为串行数据格式,即按帧格式要求插入起始位、校验位、停止位等信息,与各数据位组成位串,然后进行发送。 反串行化处理就是将接收到的位串按帧的格式滤除格式位,保留数据位,并把各串行数据位转换为并行数据的过程。 数据的串行化和反串行化由串行口通用异步接收发器UART完成。 2. 错误检测 为了检查数据通信过程是否正确,串行口通用异步接收发器UART在完成数据的串行化和反串行化功能时,还进行错误检测,可检测的错误包括帧错、奇偶错、溢出错等。 Intel 8250、8251、62550就是典型的通用异步接收发送器,它们用于微机的异步串行通信控制,MCS-51单片机的通用异步接收发送器UART集成在芯片内部。

659 MCS-51单片机的串行口是全双工的串行口,而且其异步通用接收发送器也已集成在芯片内部,作为单片机的组成部分。它既可以实现串行异步通信,也可作为同步移位寄存器使用。深入了解单片机串行口的结构,对用户来说非常重要。

660 MCS-51串行口结构 MCS-51的串行口主要由发送缓冲寄存器、接收缓冲寄存器、输入移位寄存器和移位时钟等几部分组成,51单片机串行口基本结构如图9.11所示。 图 单片机串行口基本结构

661 发送缓冲寄存器SBUF存放将要发送的数据,只能写入,不能读出;接收缓冲寄存器SBUF存放接收到的数据,它只能读出,不能写入。因此这两个物理上完全独立的缓冲寄存器共用一个地址99H。在第2章的专用寄存器一览表中已经列出。 当数据由单片机内部总线传送到发送SBUF时,即启动一帧数据的串行发送过程。发送SBUF将并行数据转换成串行数据,并自动插入格式位,在移位时钟信号的作用下,将串行二进制信息由TXD(P3.1)引脚按设定的波特率一位一位地发送出去。发送完毕,TXD引脚呈高电平,mark状态,并置TI标志位为“1”,表示一帧数据发送完毕。

662 当RXD(P3.0)引脚由高电平变为低电平时,表示一帧数据的接收已经开始。输入移位寄存器在移位时钟的作用下,自动滤除格式信息,将串行二进制数据一位一位地接收进来,接收完毕,将串行数据转换为并行数据传送到接收SBUF中,并置RI标志位为“1”,表示一帧数据接收完毕。 MCS-51串行口的接收缓冲寄存器之前还有一级移位寄存器,从而构成串行接收的双缓冲结构,用以在一定程度上避免在数据接收过程中出现的帧重叠错误,即在一帧数据到来时,上一帧数据还未被读走。

663 9.2.2 串行通信控制寄存器 1. 串行口控制寄存器SCON 在51单片机中,与串行通信有关的控制寄存器如下:
串行通信控制寄存器 在51单片机中,与串行通信有关的控制寄存器如下: 1. 串行口控制寄存器SCON SCON寄存器是MCS-51单片机的一个可寻址的专用寄存器,用于串行数据通信的控制,其字节地址为98H,位地址为98H~9FH。SCON寄存器内容及位地址表示如下: 位地址 9FH 9EH 9DH 9CH 9BH 9AH 99H 98H 位符号 SM0 SM1 SM2 REN TB8 RB8 TI RI

664 SCON各位功能: SM0、SM1:串行口工作方式选择位。当SM0、SM1=00~11时,决定了串行口的四种工作方式,分别为串行工作方式0、串行工作方式1、串行工作方式2和串行工作方式3。 SM2:多机通信控制位。仅当串行口工作于方式2或方式3时,该位才有意义。 当串行口工作于方式2或方式3接收时,若SM2=1,则只有当接收到第9数据位(RB8)=1时,才将前8位数据送入SBUF中,并置RI=1产生中断请求;否则将接收到的8位数据丢弃。而当SM2=0时,不管接收的第9数据位为“0”或为“1”,都将前8位数据送入接收缓冲SBUF,并使RI=1产生中断。 当串行口工作于方式0时,SM2一定要为“0”。 REN:接收允许控制。REN位用于对串行数据的接收控制。当REN位设置为“1”时,允许串行口接收;当REN位设为“0”时,禁止串行口接收。

665 TB8:发送的第9数据位。串行口工作于方式2或3时,TB8的内容是将要发送的第9数据位,其值由用户软件设置。在双机通信时,TB8位常作为奇偶校验位用;在多机通信时,常以TB8位的状态作为表示发送机发送的是地址帧还是数据帧,一般地:TB8=0,发送的前8位数据为数据帧;TB8=1,其为地址帧。 RB8:接收的第9数据位。串行口工作于方式2或3时,RB8存放接收到第9位数据。也就是说,发送机发送的第9位数据TB8被接收机接收后,存放于接收机的SCON寄存器的RB8位中。 TI:发送中断标志。发送完一帧数据,硬件自动置TI=1。该位可供软件查询或申请中断。与其他四个中断标志位不同,TI位必须要由软件清“0”。

666 RI:接收中断标志。接收完一帧数据,硬件自动置RI=1。该位可供软件查询或申请中断。与其他四个中断标志位不同,RI位必须要由软件清“0”。
例如:某用户使用指令“MOV SCON,#50H”,则表示:设置51串行口工作于方式1,允许接收方式。 2. 电源控制寄存器PCON PCON寄存器专为CHMOS单片机的电源控制而设置,其单元字节地址为87H,不可寻址。PCON寄存器各位内容如下: 位 序 B7 B6 B5 B4 B3 B2 B1 B0 位符号 smod / GF1 GF0 PD IDL

667 3. 中断允许寄存器IE PD和IDL:是CHMOS单片机用于进入低功耗方式的控制位,在第2章中已介绍过这两位的应用。
GF1和GF0:用户使用的一般标志位。 smod:串行口波特率倍增位,当smod=1时,串行口波特率增加1倍。系统复位时,smod=0。 PCON寄存器的B6、B5、B4位未定义。 3. 中断允许寄存器IE 中断允许寄存器IE,是MCS-51单片机中实现是否开放某中断源中断的控制寄存器,在第5章中已做过介绍。IE寄存器是可寻址的寄存器,其字节地址为0A8H,位地址由0A8H~0AFH,IE寄存器各位定义如下:

668 位地址 0AFH 0AEH 0ADH 0ACH 0ABH 0AAH 0A9H 0A8H 位符号 EA / ES ET1 EX1 EX0 其中与串行口有关的是ES位。当ES=0时,禁止串行口的中断;当ES=1时,表示允许串行口中断。EX0、ET0、EX1、ET1分别表示对外中断0、定时器/计数器0、外中断1、定时器/计数器1个中断源的中断允许控制,EA是中断总允许控制位,详见本书第5章介绍。 4. 中断优先级控制寄存器IP 中断优先级控制寄存器IP,用于设置51单片机中5个中断源优先级别的高低,在本书第5章中已做过介绍。IP寄存器是可寻址的寄存器,其字节地址为0B8H,位地址为0B8H~0BFH,IP寄存器各位定义如下:

669 位地址 0BFH 0BEH 0BDH 0BCH 0BBH 0BAH 0B9H 0B8H 位符号 / PS PT1 PX1 PT0 PX0 其中与串行口有关的是PS位,当PS=0时,表示串行口中断处于低优先级别;当PS=1时,表示串行口中断处于高优先级别。PX0、PT0、PX1、PT1分别控制外中断0、定时器/计数器0、外中断1、定时器/计数器1中断源的中断优先级别,详见本书第5章介绍。 以上四个寄存器与串行通信有关。如要设置MCS-51单片机串行口工作于方式1,允许接收,允许串行口中断,并使串行口中断处于高优先级别。可使用下面3条指令完成: MOV SCON,#50H MOV IP,#10H MOV IE,#90H

670 MCS-51单片机的串行口有4种工作方式,可通过设置串行口控制寄存器SCON的SM0、SM1位的状态,进入不同的工作方式。下面分别介绍各种工作方式。

671 9.3.1 串行工作方式0 当设置SCON寄存器的SM0、SM1位为00时,51单片机串行口将进入工作方式0。
串行工作方式0 当设置SCON寄存器的SM0、SM1位为00时,51单片机串行口将进入工作方式0。 在方式0下,串行口作为同步移位寄存器使用,其主要特点是:以RXD(P3.0)引脚接收或发送数据,TXD(P3.1)引脚发送同步移位时钟。数据的接收和发送以8位为一帧,低位在前,高位在后。其格式为: 串行口工作于方式0时,其波特率是固定的,仅与单片机所接的晶体振荡频率有关,为晶体振荡频率的1/12。也就是说,当单片机使用的晶体振荡器频率fosc为12MHz时,则波特率为1Mb/s,即每秒钟传送1兆位。

672 1. 数据的发送、接收过程 当数据写入串行口发送缓冲器后,在移位时钟TXD控制下,由低位到高位按一定波特率将数据从RXD引脚传送出去,发送完毕,硬件自动使SCON的TI位置1。此时,若配以串入并出移位寄存器,如CD4094、74LS164等芯片,即可以将RXD引脚送出的串行数据重新转换为并行数据,实际上也就是把串行口当并行输出口用了。 同理,若将并入串出移位寄存器(如CD4014或74LS165等芯片)的输出连接到单片机的RXD引脚,当串行口工作于方式0接收时,即可以接收到CD4014或74LS165输入端的并行数据。此时,相当于把串行口当并行输入口用了。详细硬件连接如图9.12所示。

673 图 与CD4014的连接 2. 串入并出移位寄存器CD4094芯片介绍 CD4094是8级串入并出移位寄存器,其功能是将串行输入的8位二进制数据转换为8位并行数据输出。移位寄存器的各级带有数据锁存器,受引脚STB控制;并且每一级锁存器带有三态输出,受引脚OE控制。CD4094的内部原理结构如图9.13所示,CD409引脚排列如图9.14所示。

674 图9.14 CD4094引脚图 图9.13 CD4094的内部原理结构

675 (1)引脚介绍 DATA:串行输入数据端。 CLK:移位时钟输入端。 Q0~Q3、Q4~Q7:并行数据输出端,其中Q7输出第1个由DATA引脚输入的串行数据D0,Q0出第8个由DATA引脚输入的串行数据D7。 STB:锁存器控制信号。当STB=1时,锁存器通。 OE:三态缓冲输出控制。当OE=1时,三态控制门打开。只有当STB=1且OE=1时,移位输出q0~q7才到达引脚Q0~Q7端。 Qs:级连输出引脚。在CLK上升沿输出q7数据,用于多个CD4094的连接。 Qs′:级连输出。在CLK下降沿输出q7数据,比Qs早半个时钟输出。

676 (2)功能介绍 CD4094的8级移位寄存器主要由8个D触发器构成,每一级移位寄存器的输出端又被输入到后一级移位寄存器的输入端。因此,最先由DATA引脚输入的串行数据D0在第一个CLK上升沿被输出到第一级D触发器的q0端,若此时STB=1,OE=1,则Q0=q0;在第二个时钟CLK的上升沿,DATA引脚输入的第二位串行数据D1被移位到第一级D触发器的q0端,原先q0端的数据被移位带第二级D触发器的q1端输出端……依次类推,由DATA输入的第八位串行数据在8个时钟的作用下最后被输出到q0输出端。STB、OE分别是锁存器和三态门的控制端,只有当STB=OE=1时,Qn=qn(n=0~7)。为防止在数据移位过程中Q端状态随q的不断变化,实际应用时,常常使在移位过程STB=0,即使Q端保持不变,而在移位完成后,使STB=1,则Q端获得q端移位后的状态。CD4094的工作逻辑真值表见表9.4。

677 表9.4 CD4094的工作逻辑真值表 CLK OE STB Q1…Q7 Qs Qs′ × 高阻 1 q0~q7移位,Q0~Q7不变 不变 Q0~Q7=q0~q7 qs qs′ D0Q0Q1Q2Q3Q4 Q5Q6 Q7

678 因此,MCS-51串行口工作于方式0时,与CD4094配合构成八位并行输出口的硬件连接如图9.15所示。

679 3.应用举例 例9.2 如图9.16所示,使用CD4094控制8个发光二极管。试利用它的串入并出功能,将发光二极管从左到右依次点亮,并反复循环。 图9.16 CD4094驱动LED硬件连接图

680 解题分析: 由硬件连接可知,要使某一个发光二极管点亮,必须使驱动该发光二极管的CD4094并行输出端输出高电平。 又由CD4094功能可知,串行口RXD端最先送出的数据位D0经8个同步时钟后将到达Q7引脚,而最后输出的D7位将到达Q0引脚。 因此,要点亮Q0对应的发光二极管,串行口应送出80H,要点亮Q1对应的发光二极管,串行口应送出40H,…,要点亮Q7所对应的发光二极管,串行口应送出01H。所以,要实现将发光二极管由左到右依次循环点亮,只需使串行口依次循环送出80H→40H→20H→10H→08H→04H→02H→01H即可。串行口数据传送时,为避免CD4094并行输出端Q0~Q7的不断变化而使发光二极管闪烁,在使传送时,P1.0=0(即STB=0);每次串行口数据传送完毕,即SCON的TI位为1时,使P1.0=1(即STB=1),Q0~Q7输出控制相应发光二极管点亮。

681 使用查询方式完成上述功能的参考程序如下:
MOV SCON,#00H ;设置串行口工作于方式0 CLR ES ;不允许串行口中断 MOV A,#80H ;A←将控制点亮Q0对应的 ;发光二极管的数据 LOOP: CLR P1.0 ;串行传送时 ;切断与并行输出口的连接 MOV SBUF,A ;串行传送 JNB TI,$ ;等待串行传送完毕 CLR TI ;清发送标志 SETB P1.0 ;串行传送完毕 ;选通并行输出

682 ACALL DELAY ;状态维持 RR A ;选择点亮下一发光 ;二极管的数据 LJMP LOOP ;继续串行传送 在上述程序中,有几点要特别注意:首先,SCON的SM2位一定要为“0”;其次,若使用中断方法编上面功能的程序,也不能忘记软件清TI位;第三,DELAY是一延时子程序,主要使某一发光管的点亮维持一段时间,以降低显示扫描频率,若没有这条调用延时指令,程序执行后,看起来8只发光二极管像同时被点亮一样了。

683 9.3.2 串行工作方式1 当设置SCON寄存器的SM0、SM1位为01时,51单片机串行口将进入工作方式1。
串行工作方式1 当设置SCON寄存器的SM0、SM1位为01时,51单片机串行口将进入工作方式1。 在方式1下,串行口是10位为一帧的异步串行通信方式,主要包括:1位起始位、8位数据位和1位停止位。其主要特点是:以RXD(P3.0)引脚接收数据,TXD(P3.1)引脚发送数据;数据位的接收和发送为低位在前,高位在后。格式为:

684 1. 数据的串行发送、接收过程 当数据写入串行口发送缓冲寄存器SBUF后,硬件自动添加起始位和停止位,与8个数据位组成10位完整的帧格式,在设定波特率的作用下,由TXD引脚一位一位地发送出去。发送完毕,硬件自动使TI位为“1”。通知单片机发送下一个字符。 当SCON寄存器的REN位设置为“1”时,即表示允许串行口接收。若采样到RXD引脚由“1”到“0”的跳变时,就认定是一帧数据的起始位了。串行口将随后的8位数据移入移位寄存器,并转换为并行数据,在接收到停止位后,将并行数据送入接收SBUF,再置RI位为“1”,表示一帧数据接收完毕,通知单片机从接收SBUF取字符。

685 2. 波特率计算 串行口工作于方式0时,其波特率是固定的;但在方式1下,波特率是可变的,与定时器/计数器1的溢出率有关。以定时器/计数器1工作于方式2,即8位重装计数初值方式,作为串行口工作于方式1时的波特率发生器,所产生的波特率为: 其中smod为电源控制寄存器PCON的最高位,即波特率倍增位。 当定时器/计数器1工作于方式2定时方式时,是对内部机器周期计数,若设置计数初值为X,那么定时器/计数器1的溢出周期为:

686 溢出率为溢出周期的倒数,则波特率为: 使用定时器/计数器1工作于方式2作为波特率发生器,是因为该方式具有自动重装计数初值功能,可避免因反复重装计数初值而带来的定时误差,使波特率更加稳定。而在实际应用时,总是先确定波特率,再计算定时器/计数器1的的计数初值,按上式,可推得计数初值为:

687 例9.3 51单片机以方式1进行串行数据通信,波特率为1200b/s。若晶体振荡频率fosc为6MHz,试确定定时器/计数器1的计数初值。
解题分析:串行口工作于方式1时的波特率由定时器/计数器1的溢出率决定,计数初值为: 式中晶体振荡频率fosc=6MHz,波特率=1200b/s已由题中给出,设smod位为“0”,可得计数初值

688 因此,通过下面指令可以对单片机的串行通信进行初始化,包括串行口的工作方式和波特率设置: 
MOV SCON,#50H ;串行口工作于方式1,允许接收 MOV PCON,#00H ;smod=0,波特率不倍增 MOV TMOD,#20H ;定时器/计数器1工作于 ;方式2定时方式 MOV TH1,#0F3H ;定时器/计数器1得计数初值 ;为F3H MOV TL1,#0F3H SETB TR1 ;启动定时器/计数器1工作 ;开始提供1200波特率 MOV IE,#00H ;不允许中断 MOV IP,#00H

689 通过以上对定时器/计数器1的计数初值计算可以知道,设定计数初值为F3H只能提供近视于1200b/s的波特率。要想提供精确的波特率,以利于串行通信双方进行可靠的数据交换,必须使用其他频率的晶体振荡器。实际应用中,常常使用 MHz频率的晶体振荡器,提供出1200b/s、2400b/s、4800b/s、9600b/s等多种常用串行通信波特率。 3. 应用举例 例9.4 假定甲乙两单片机使用晶体振荡器频率为 MHz,以方式1进行串行数据通信,通信波特率为9600b/s。甲机发送数据,先发数据区首末地址,再发数据区数据。甲机要发送的数据存放于内部RAM的40H~4FH单元中;乙机接收,并把接收到的数据块首末地址及其数据存放于外RAM 5000H开始的单元中。试编写甲乙两机的串行通信程序。

690 解题分析: ① 要使甲乙两机能进行串行通信,必须使两机发送、接收的帧格式和波特率完全一致,也就是要使两单片机均工作于方式1,9600b/s。甲机发送,SCON=40H;乙机接收,SCON=50H。 设定时器/计数器1工作于方式2计数初值为X时,提供9600b/s的波特率,令smod=0,则初值: ② 甲机发送数据区首末地址和数据区的16个数据,发送程序如下: 甲机发送主程序:

691 ORG 0000H AJMP MAIN ;复位后从MAIN执行程序 ORG 0023H AJMP TRANS ;串行口中断服务程序入口 ORG 0030H MAIN: MOV SCON,#40H ;甲机工作于方式1不允许接收 MOV PCON,#00H ;smod=0 MOV TMOD,#20H ;定时器/计数器1工作于方式2 MOV TH1,#0FDH ;定时器/计数器1计数初值为FDH MOV TL1,#0FDH MOV IE,#00H ;不允许中断

692 MOV IP,#00H SETB TR1 ;启动定时器/计数器1工作 MOV SBUF,#40H ;发数据区首地址40H JNB TI,$ ;未发送完等待 CLR TI ;清TI标志 MOV IE,#90H ;允许串行口中断 MOV SBUF,#4FH ;发数据区末地址4FH MOV R0,#40H ;R0←数据区首地址 MOV R7,#10H ;R7←要传送的数据个数 CLR GF0 ;GF0为传送完毕控制位 ; GF0=0,串行数据未传完 SJMP $ ;等待发送中断

693 甲机中断服务程序: TRANS: JB GF0,TRANS0 ;若传送完,转TRANS0 CLR TI ;未传送完,清TI标志 MOV ;A←数据区数据 MOV SBUF,A ;发送数据 INC R0 ;指向数据区下一地址 DJNZ R7,TRANS0 ;发送个数减1 ;若非0转TRANS0 SETB GF0 ;发送个数减1为0时 ; 置GF0位 TRANS0:RETI ;中断返回

694 ③ 乙机接收数据区地址及其数据,程序如下:
乙机接收主程序:  ORG 0000H AJMP MAIN ;复位后从MAIN执行程序 ORG 0023H AJMP RESV ;串行口中断服务程序入口 ORG 0030H MAIN: MOV DPTR,#5000H ;DPTR←接收数据区首地址 MOV SCON,#50H ;甲机工作于方式1允许接收 MOV PCON,#00H ;smod=0 MOV TMOD,#20H ;定时器/计数器1工作于方式2

695 MOV TH1,#0FDH ;定时器/计数器1 ;计数初值为FDH MOV TL1,#0FDH MOV IE,#00H ;不允许中断
MOV IP,#00H SETB TR1 ;启动定时器/计数器1工作 JNB RI,$ ;等待接收完 CLR RI ;清RI标志 MOV A,SBUF ;A←接收数据 ;A存外RAM INC DPTR ;外部RAM地址加1 JNB RI,$ ;未接收完,等待 MOV A,SBUF ;A←接收部数据

696 上面分别以查询和中断两种不同方式进行了串行通信的数据发送和接收程序设计,注意体会对TI、RI位的不同使用。
;A存外部RAM INC DPTR ;外部RAM地址加1 MOV IE,#90H ;允许串行口中断 SJMP $ ;等待下一字符接收中断 乙机中断服务程序:  RESV: CLR RI ;清RI标志 MOV A,SBUF ;A←接收数据 INC DPTR ;外部RAM地址加1 RETI ;中断返回 上面分别以查询和中断两种不同方式进行了串行通信的数据发送和接收程序设计,注意体会对TI、RI位的不同使用。

697 9.3.3 串行工作方式2 当设置SCON寄存器的SM0、SM1位为10时,51单片机串行口将进入工作方式2。
串行工作方式2 当设置SCON寄存器的SM0、SM1位为10时,51单片机串行口将进入工作方式2。 在方式2下,串行口是11位为一帧的异步串行通信方式,主要包括:1位起始位、9位数据位和1位停止位。其主要特点是:以RXD(P3.0)引脚接收数据,TXD(P3.1)引脚发送数据;数据位的接收和发送为低位在前,高位在后。格式为:

698 1. 数据的串行发送、接收过程 在数据发送前,使用位操作指令“SETB TB8”或“CLR TB8”先将第9位数据D8准备好,再由向发送SBUF写入数据的指令启动数据的串行发送过程。串行口按一定波特率发完1个起始位、8个数据位后,按次序将D8(即TB8)和停止位也从RXD引脚发出。发送完毕,置TI位为“1”。因此,方式2的发送过程除含有第9数据位D8(即TB8)外,其余过程同方式1。 方式2的接收过程也与方式1相似,所不同的只在第9位数据D8的接收上。串行口将前8位数据传送到接收SBUF,当接收到第9位数据D8时,硬件自动将该位传送到接收机的RB8。 第9数据位TB8、RB8可作串行通信的奇偶校验位用,也可作为多机通信时的地址、数据帧辨别用。详细例子见后述。

699 而当PCON寄存的smod位为“1”时,波特率为:
2. 波特率计算 串行口工作于方式2时的波特率是固定的,为 : 当PCON寄存的smod位为“0”时,波特率为: 而当PCON寄存的smod位为“1”时,波特率为: 3. 应用举例 例9.5 假定甲乙两单片机以方式2进行串行数据通信,第9数据位做奇偶校验用,且采用奇校验方式。甲机要发送的数据存放于内部RAM的40H单元;乙机接收,并在校验正确后把数据存放于内部RAM 50H单元中。试编写甲机发送和乙机接收的程序段。

700 解题分析: 甲机发送,除发送数据外还发送校验位,如何获得校验位状态是发送程序要解决的主要问题。当将发送单元40H的内容传到累加器A时,A中含“1”的位的个数会影响PSW寄存器中的P位。当A中含奇数个“1”时,P位为“1”,否则P位为“0”。如果A中有奇数个“1”,只有TB8为“0”才可能达到奇校验;反之,TB8应为“1”。因此,TB8的状态与P位的状态正好相反。只要使奇校验位TB8=即可。 乙机接收,只有当校验正确后才将接收到的数据传送到内RAM的50H。如何校验接收数据的正确性是接收程序要解决的重要问题。发送机发送的校验位TB8将到达接收机的RB8位;发送的数据将到达接收机的接收SBUF。当把接收到的SBUF数据传到累加器A时,A中含“1”的个数会影响接收机PSW寄存器的P位。只要判别接收机的RB8位与P位是否相等即可完成以奇校验方式检查接收数据的正确性。

701 判别两个位是否相等的方法很多,下面程序采用检查“两位异或结果为0”的方法来检查位的相等。即检查:
下面是甲乙两机发送接收的参考程序段。 甲机发送程序段: MOV A,40H ;A←要发送的数据 MOV C,P ;计算要发送的数据中含“1” ;的个数 CPL C MOV TB8,C ;确定奇校验位并传送到 ;TB8 MOV SBUF,A ;发送数据 JNB TI,$ ;未发送完等待 CLR TI ;清TI标志 SJMP $

702 乙机接收程序:  LOOP: JNB RI,$ ;未接收完一帧等待 CLR RI ;清RI标志 MOV A,SBUF ;A←接收数据 MOV C,RB8 ;C←校验位 ANL C,/P ; JC LOOP ;C=P,校验位错丢失接收数据 MOV C,RB8 CPL C ANL C,P MOV 50H,A ;校验位相等,50H←A SJMP $

703 串行通信过程用于保证通信双方数据交换的可靠性的方法很多,如累加和校验,CRC冗余校验等,奇偶校验只是其中最简单、最常用的方式之一,它只能在一定程度上说明数据通信的正确性。

704 9.3.4 串行工作方式3 当设置SCON寄存器的SM0、SM1位为11时,51单片机串行口将进入工作方式3。
串行工作方式3 当设置SCON寄存器的SM0、SM1位为11时,51单片机串行口将进入工作方式3。 在方式3下,串行口是以11位为一帧的异步串行通信方式,主要包括:1位起始位、9位数据位、1位停止位,其通信过程与方式2完全相同,所不同的是通信波特率。在方式2下,通信波特率固定为两种: 而方式3的通信波特率由定时器/计数器1的溢出率决定,与方式1相同,是可变的。详细内容请参照9.4.2节和9.4.3节。 总之,通过设定串行口控制寄存器SCON的SM0、SM1位的状态,可进入四种不同的工作方式。对比四种不同工作方式,总结串行口的工作特点见表9.5。

705 表9.5 MCS-51单片机串行口四种工作方式比较 工作方式 功能 帧格式 RXD、TXD引脚作用 波特率 方式0 同步移位寄存器 8位
方式1 通用异步接收发送器 10位 RXD接收数据 TXD发送数据 方式2 11位 方式3

706 9.4.1 多机通信基本原理 利用单片机串行口工作于方式2、方式3可实现多机通信。
多机通信基本原理 利用单片机串行口工作于方式2、方式3可实现多机通信。 在单片机串行口控制器SCON中,设有多机通信控制SM2位。当串行口以方式2或3接收时,若SM2=1,则必须接收到第9数据位(RB8)=1时,才将前8位数据送入接收SBUF中,并置RI=1;否则将接收到的8位数据丢弃。而当SM2=0时,不管接收的第9数据位为“0”或为“1”,都将前8位数据送入接收SBUF,并使RI=1。利用这一特性,便可实现主机与多个从机之间的串行通信。 设主机与多个从机如图9.17所示连接进行串行通信,若距离较近,直接以TTL电平通信。各从机有不同的地址。主机用第9数据位TB8进行地址/数据帧辨别。若TB8=0,表示发送的数据帧;若TB8=1,表示发送的是地址帧。

707 图9.17 多机通信硬件连接图

708 9.4.2 多机通信的程序设计 1. 多机通信的过程 ① 首先各从机编地址。
多机通信的程序设计 1. 多机通信的过程 ① 首先各从机编地址。 ② 设置主、从机工作于方式2或3,相同波特率,允许接收,并使各从机SM2位为“1”,准备接收地址帧。 ③ 主机使TB8=1,发地址帧,即呼叫从机地址。 ④ 各从机因SM2位为“1”,接收到的RB8为“1”而使RI=1接收到地址,并在各自对RI=1的处理程序中判别是否被寻址,若是则清本从机的SM2位,否则维持SM2位为“1”不变。 ⑤ 主机使TB8=0,发送数据。 ⑥ 只有被呼叫的从机由于SM2=0产生接收中断RI=1,接收主机发送的数据信息。其余从机由于SM2=1,而接收到RB8=0而丢失接收数据,不产生接收中断。 ⑦ 主机数据发送完毕,再发送一特殊信息(复位命令),原被寻址的从机执行该命令,恢复其SM2=1。等待接收下一地址帧。

709 2. 通信协议的约定 要保证通信的可靠和有条不紊,主、从机相互通信时,必须要有严格的通信协议。一般通信协议都有通用标准,协议较完善,但很复杂。这里为了说明MCS-51单片机多机通信程序设计的基本原理,仅介绍几条最基本的条款。 ① 规定系统中从机容量数及地址编号。 ② 规定对所有从机都起作用的控制命令,即复位命令,命令所有从机恢复SM2=1的状态。 ③ 设定主、从机数据通信的长度和校验方式。 ④ 制定主机发送的有效控制命令代码,其余即为非法代码。从机接收到命令代码后必须先进行命令代码的合法性检查,检查合法后才执行主机发出的命令。 ⑤ 设置从机工作状态字,说明从机目前状态。如:从机是否准备好,从机接收数据是否正常等。 详细多机通信程序设计略。

710 简单应用举例 例9.6 某多机分布式系统,其中一个8051系统为主机,16个8051应用系统为从机,硬件连接如图9.17所示。主机要呼叫的从机地址存放于R2中,发送的命令存放于R3中,复位命令存放在R4中。从机接收到主机呼叫本机地址后,应答本机地址(从机本机地址存放于各从机的R1寄存器中),并执行主机随后发送的命令。试编写主、从机以串行工作方式3,4800波特进行通信的程序段。主、从机使用fosc= MHz的晶体振荡器。 解题分析:主、从机的通信程序应包括串行口的初始化程序和串行通信过程程序。 ① 初始化程序包括对SCON寄存器的设置和通信波特率的设置,与前几例相似。 主机既可发送,又可接收,因此主机SCON=0D0H,从机除发送、接收外,开始时必须使SM2=1,所以从机SCON=FFH。

711 设定时器/计数器1工作于方式2计数初值为X时,提供4800b/s的波特率,令smod=0,则初值:
② 主机使第9数据位D8(即TB8)为1,发呼叫从机地址。当从机应答地址相符时,使第9数据位D8(即TB8)为1,发命令;否则发复位命令,恢复所有从机SM2=1。主机发送程序如下: MAIN: MOV SCON,#0D0H ;主机工作于方式3允许接收 MOV PCON,#00H ;smod=0 MOV TMOD,#20H ;定时器/计数器1工作于 ;方式2

712 MOV TH1,#0FAH ;定时器/计数器1 ;计数初值为FDH MOV TL1,#0FAH MOV IE,#00H ;不允许中断 MOV IP,#00H SETB TR1 ;启动定时器/计数器1工作 LOOP: MOV A,R4 ;取复位命令 SETB TB8 ; MOV SBUF,A ;发送复位命令 JNB TI,$ CLR TI MOV A,R2 ;取呼叫的从机地址 MOV SBUF,A ;发送呼叫从机地址

713 JNB TI,$ CLR TI JNB RI,$ CLR RI MOV A,SBUF ;取应答地址 CJNE A,R2,LOOP ;应答地址与呼叫地址不 ;符转LOOP CLR TB8 MOV A,R3 ;取命令 MOV SBUF,A SJMP $

714 ③ 从机初始化后,等待接收呼叫地址。若呼叫的地址与本从机一致,发应答地址信号,并使本从机SM2=0,准备接收主机随后发送的数据。从机通信程序如下:
MAIN: MOV SCON,#0F0H ;从机工作于方式3允许 ;接收,Sm2=1 MOV PCON,#00H ;smod=0 MOV TMOD,#20H ;从机定时器/计数器1 ;工作于方式2 MOV TH1,#0FAH ;从机定时器/计数器1 ;计数初值为FAH MOV TL1,#0FAH MOV IE,#00H ;从机不允许中断 MOV IP,#00H

715 SETB TR1 ;启动从机定时器/ ;计数器1工作 LOOP1: JNB RI,$ ;等待接收 CLR RI MOV A,SBUF ;取接收的主机呼叫地址 CJNE A,R1,LOOP1 ;本机地址与呼叫地址 ;不符,转LOOP1 CLR SM2 ;使呼叫从机Sm2=0 MOV A,R1 ;取本机地址 SETB TB8 MOV SBUF,A ;应答本机地址 JNB TI,$ ;等待发送完毕 CLR TI

716 JNB RI,$ ;等待接收主机命令 CLR RI MOV A,SBUF ;取命令 MOV DPTR,#MLTAB ;取命令表首址 RL A MLTAB:AJMP ML0 ;命令处理0 AJMP ML1 ;命令处理1 AJMP MLN ;命令处理n 上面程序完成多机通信的简单设计。在许多应用系统中,多机通信所涉及的协议比上例所述要完善的多,当然也复杂的多。

717 习 题 1. 计算机的数据传送方式分为并行数据传送和串行数据传送,其中串行数据传送又分为哪两种?对硬件的要求哪一种更低些? 2. 异步串行数据通信有几种数据通路形式?各有什么特点? 3. 异步串行数据通信的帧格式由哪四部分构成?其状态如何? 4. 根据MCS-51串行口的结构图9.11,说明数据发送和接收的过程,并说明接收部分采用双缓冲结构的意义。 5. 假定异步串行通信的字符格式为一位起始位、8位数据位、2位停止位以及奇校验方式,请画出传送字符“A”的ASCII码帧格式。 6. 某异步串行通信帧格式为1位起始位、8位数据位、1位停止位、无校验位,已知通信双方以960b/s的波特率交换数据,问每秒能传送多少个字符?

718 7. MCS-51串行口共有几种工作方式?试说明在不同工作方式时其功能、帧格式、波特率有什么不同。
8. 使51串行口工作于方式0,驱动8个LED,硬件连接如图9.16所示。试修改例9.2程序,使完成LED由两边向中间点亮,又由中间向两边点亮的控制过程。 9. 两8051串行口按方式1以4800波特率进行串行数据通信。甲机发送其内部RAM 50H~5FH单元中的内容,乙机接收,并将接收到的数据存放到其外部RAM的1000H~100FH单元中。试以查询和中断两种不同方式进行编程。已知单片机的晶体振荡频率为 MHz。

719 10. 两单片机串行口按方式3以9600波特率进行串行数据通信,并采用偶校验方式。甲机发送其外部RAM 5000H~500FH单元中的内容,乙机接收,并校验正确后将接收到的数据存放到其内部RAM的40H~4FH单元中。先画程序框图再编程。单片机的晶体振荡频率为 MHz。 

720 10.1 A/D及D/A转换器的性能指标 无论是分析或设计模数转换(ADC)和数模转换(DAC)的接口电路,还是选用ADC或DAC芯片,都会涉及到与之相关的性能指标。因此,弄清楚一些常用的性能指标对正确地使用数模转换器(DAC)和模数转换器(ADC)是很重要的。 1. 分辨率 分辨率是指转换器所能分辨的被测量的最小值。对DAC来说分辨率反映了输出模拟电压最小变化量;对ADC来说,分辨率表示输出数字量变化一个相邻数码所需要输入模拟电压的最小变化量。如果数字量的位数为n,实际上分辨率就等于1/2n满刻度值。分辨率高低通常用转换器的位数来表示:如8位、10位、12位等。例如:具有12位分辨率的ADC能够分辨出满刻度的1/212。一个满刻度值为10V的12位ADC能够分辨输入模拟电压的最小变化值为2.4mV。

721 2. 精度 3. 量程(满刻度范围) 精度是指转换的结果相对于实际的偏差,精度有两种表示方法。
① 绝对精度:用最低位(LSB)的倍数来表示,如±(1/2)LSB 或±1LSB。 ② 相对精度:用绝对精度除以满量程值的百分数来表示,如±0.05%等。一般来说,不考虑其他转换误差时,转换精度即为其分辨率的大小,故要获得高精度的转换结果,首先要保证选择具有足够分辨率的转换器。 3. 量程(满刻度范围) 量程是指输入模拟电压变化范围,即其最大和最小模拟量之差。应当指出A/D、D/A转换器的输出是不会达到满刻度值的。例如某D/A输出的范围是0~10V,那么10V就是名义上的满刻度值,当D/A为8位分辨率的转换器时,其最大输出为255/256×10=9.961V,而对于12位分辨率的转换器时,其最大输出为4095/4096×10=9.9975V。

722 4. 线性度误差 线性误差是指实际转换特性曲线与理想曲线特性(通过两端的直线)之间的最大偏差,并以该偏差相对于满量程的百分数度量。在转换器电路设计中,一般都要求线性误差不大于±(1/2)LSB。 5. 转换速率 完成一次A/D转换的时间叫转换时间,转换速率则是转换时间的倒数。当转换时间为200ns,则其转换速率为5MHz。 6. 建立时间 D/A转换器的转换速率用建立时间来描述,是指当输入数字量变化后,输出模拟量稳定到相应数值的范围内所经历的时间。一般而言,D/A的转换时间比A/D要短得多。

723 下面介绍几种典型的D/A转换器的工作原理以及它们与单片机系统的接口电路。
D/A转换器是单片机应用系统输出通道中的一个重要环节,因为大多数的执行机构只能接受模拟量,所以单片机输出的数字量只有经过D/A转换后才能被执行机构所接受。 各种型号的D/A转换器芯片较多,从结构上看D/A芯片分为两类:一类是自身带锁存器的;另一类是自身不带锁存器的。对于自身不带锁存器的D/A转换器在与单片机连接时要另加锁存器,而对于自身带锁存器的D/A转换器可直接与单片机相连接。 下面介绍几种典型的D/A转换器的工作原理以及它们与单片机系统的接口电路。

724 10.2.1 DAC0832及其与单片机接口电路 DAC0832的性能介绍 分辨率:8位,即输入数字量的最大位数是8位; 转换时间:1μs;
目前集成电路已将精密的权电阻、模拟开关、数据锁存器,甚至包括基准电源和运算放大器都做在同一芯片上,而且信号电平与8位或16位的微处理器兼容,故只要用少量外围元件就可构成完整的D/A转换电路。美国国家半导体公司生产的DAC0830系列产品包括DAC0830、DAC0831、DAC0832,它们之间完全可以相互代换。这类DAC芯片是具有两个输入寄存器的8位DAC,它能直接与MCS-51单片机相连接。 DAC0832的性能介绍 分辨率:8位,即输入数字量的最大位数是8位; 转换时间:1μs; 线性误差:2%FSR(满量程); 有两种工作方式:双缓冲器方式和单缓冲器方式; 输入数字信号与TTL电平兼容;

725 2. DAC0832的引脚 只需在满量程下调整其线性度; 单一电源供电:+5~+15V; 低功耗:20mW。图10.1 DAC0832的引脚

726 DI0~DI7:8位数据输入端。 ILE:输入数据锁存器的锁存允许信号,高电平有效。 :片选输入信号,低电平有效。 :数据输入寄存器的写选通信号,当 、ILE、 同时有效时,DI0~DI7的数据被送至输入寄存器。 :数据传送控制信号,低电平有效。 :8位DAC寄存器的写选通信号, 、 同时有效时寄存器中的数据送至D/A转换器进行D/A转换。 VREF:基准电源输入端,-10~+10V之间。 RFB:反馈信号输入端,反馈电阻在芯片内部。 IOUT1、IOUT2:转换电流输出端。 电流IOUT1和IOUT2之和为常数, IOUT1、IOUT2随DAC寄存器的内容作线性变化。 Vcc:电源输入端。 AGND:模拟信号地。 DGND:数字信号地。

727 3. DAC0832的逻辑结构 DAC0832的逻辑结构如图10.2所示。它是由两2个8位寄存器和1个8位D/A转换器组成。D/A转换器采用T形解码网络,2个8位寄存器分别为输入寄存器和DAC寄存器。 图10.2 DAC0832的逻辑结构

728 图中 、 是两个寄存器的控制信号,当 =1时,寄存器输出随输入变化;当 =0时,数据锁存在寄存器中,而不再随数据总线上的数据变化而变化。
图中 、 是两个寄存器的控制信号,当 =1时,寄存器输出随输入变化;当 =0时,数据锁存在寄存器中,而不再随数据总线上的数据变化而变化。 当ILE端为高电平, 与 同时为低电平时,使得: =1,输入寄存器的输出随数据总线上的数据而变化; 当 变为高电平时,输入寄存器便将输入数据锁存。 当 与 同时为低电平时,使得 =1,DAC寄存器的输出随其寄存器的输入而变化, 变为高电平时输入寄存器的数据被锁存在该寄存器中。 所以通过相应的控制信号可以使DAC0832工作于单缓冲器工作方式和双缓冲器工作方式。

729 4. DAC0832与8031的接口电路 DAC0832是电流输出型的D/A转换器,而在单片机系统中通常需要电压信号,因此要将D/A转换器输出的电流信号转换成电压信号,其转换电路主要由运算放大器实现。 (1)单缓冲器方式接口 若系统中只有一路模拟量输出,或虽有几路模拟量输出,但它们不要求同步输出时均可采用单缓冲器方式。

730 图10.3 DAC0832单缓冲方式的接口电路

731 图10. 3为一路模拟量输出时DAC0832和8031的接口电路。输入寄存器的片选信号 和数据传送控制信号 都与地址选择线P2
图10.3为一路模拟量输出时DAC0832和8031的接口电路。输入寄存器的片选信号 和数据传送控制信号 都与地址选择线P2.7相连,两级寄存器的写信号都由8031的 端控制。当地址线选择好0832后,只要输出 控制信号,0832就能一步完成数字量的输入锁存和D/A转换输出。 采用图10.3的电路编写不同的程序可以产生各种不同的输出波形,例如执行下面程序后,运算放大器的输出端可得到一个在一定时间范围内输出幅度递增一定幅值的锯齿波。 在本例中,每隔1ms输出幅度的增长为10个数字单位。当累加器A的值为0FFH后自动地重新开始新的循环。

732 ORG 2000H START: MOV DPTR,#7FFFH MOV A,#00H MOV R1,#0FFH LOOP: MOVX @DPTR,A ACALL DELAY ;调用延时子程序 DJNZ R1,NEXT SJMP START NEXT: ADD A,# ;每次幅度增长为10个数字单位 SJMP LOOP DELAY: MOV 20H,# ;延时1ms的子程序 AIN: NOP NOP DJNZ 20H,AIN RET

733 图10.4 DAC0832双缓冲同步方式的接口电路

734 (2)双缓冲器同步方式接口 对于多路模拟量的同步输出,必须采用双缓冲器同步方式。由于一路模拟量输出就需一片DAC0832,因此几路模拟量输出就需要几片DAC0832,通常将这种系统称为多路模拟量同步输出系统。图10.4为两路模拟量同步输出系统。 图中1#0832输入寄存器的片选信号是P2.5,地址为0DFFFH,2#0832输入寄存器的片选信号是P2.6,地址为0BFFFH。1#0832和2#0832的ADC寄存器传送控制信号同时由一个片选信号P2.7控制,因此地址均7FFFH,当选通ADC寄存器时,各自输入寄存器中的数据可以同时进入各自的ADC寄存器以达到同时转换,然后同时输出的目的。 两片DAC0832的输出分别接图形显示器的X轴和Y轴偏转放大器的输入端,从而使得两片DAC0832有输出时会在图形显示器上输出相应的图形。转换程序如下:

735 ORG 2100H MOV DPTR,#0DFFFH ;1# DAC0832的地址 MOV A,#XX ;X坐标轴的数据#XX送累加器A中 MOVX @DPTR,A ;转换数据#XX写入1# DAC0832输入寄存器 MOV DPTR,#0BFFFH ;2# DAC0832的地址 MOV A,#YY ;Y坐标轴的数据#YY送累加器A中 MOVX @DPTR,A ;转换数据#YY写入2# DAC0832输入寄存器 MOV DPTR,#7FFFH ;1#、2# DAC0832的地址 MOVX @DPTR,A ;将1#、2# DAC0832中待转换的数据同时写 ;入各自的DAC0832的D/A转换器, ;并同时开始进行D/A转换 RET

736 10.2.2 DAC1020及其与单片机接口电路 1. DAC1020系列芯片特性
DAC1020系列和DAC1220系列D/A转换器芯片是美国国家半导体公司生产的。这两个系列的主要区别是DAC1020为10位D/A转换(送至转换器的数字量的最多位数是10位),DAC1220为12位D/A转换器。它们的主要特性如下: ① 分辨率:10位或12位; ② 电流建立时间:典型值为500ns; ③ 只需要调整零点和满量程就可以确定其线性度; ④ 单一电源供电:+5~+15V; ⑤ 采用固定或可变的基准电压; ⑥ 功耗低,在15V时的典型功耗值为10mW; ⑦ 可直接与DTL、TTL及CMOS电路接口。

737 2. DAC1020与DAC1220的引脚 DAC1020系列产品包括DAC1020、DAC1021及DAC1022,它们可以直接代换AD公司生产的AD7520和AD7530,其引脚如图10.5(a)所示。 DAC1220系列产品包括DAC1220、DAC1221及DAC1222,它们可以直接代换AD公司生产的AD7521和AD7531,其引脚如图10.5(b)所示。

738 (a)DAC1020引脚 (b)DAC1220引脚 图10.5 DAC1020与DAC1220引脚

739 DAC1020与DAC1220 各引脚的功能如下: A1~Ai:i=10时对应DAC1020系列,i=12时对应DAC1220系列,它们是D/A转换器的数据输入端。 VREF:D/A转换器的基准电源输入端。 RFE:反馈信号输入端。 IOUT1、IOUT2:D/A转换器的转换电流输出端。 Vcc:电源输入端。 GND:接地端。

740 3. DAC1020与8031的接口电路 因为DAC1020内部不带锁存器,故要通过I/O接口才能与8031单片机相连接,其接口电路如图10.6 所示。由于8031的字长是8位的,因此8031要经过两次操作才能把一个完整的10位数据送到DAC1020。为了保证10位数据能够同时送入DAC1020,以避免输出电压波形出现毛刺现象,DAC1020必须工作在双缓冲器方式下。DAC1020也是电流输出型的器件,也就是说经DAC1020转换后输出的是电流量,故通常要利用运算放大器来将其转换成相应的电压信号。 8031先把高2位数据送至74LS74(U1),然后再把低8位数据送至74LS377,与此同时将74LS377的片选信号也加到了74LS74(U2)的时钟信号端,从而将一个完整的10位数据同时加到DAC1020的数据输入端。下面是DAC1020完成一次数模转换的程序清单

741 图10.6 DAC1020与8031的接口电路

742 ORG H MOV DPTR,#7FFFH ;74LS74(U1)的地址 MOV A,#XX ;高二位数据“XX” MOVX @DPTR,A ;高二位数据“XX”存入 74LS74(U1) MOV DPTR,#0BFFFH ;指向74LS373及74LS74(U2) MOV A,#DATA ;低8位数据“DATA”存入A中 MOVX @DPTR,A ;高二位数据“XX”及低8位数据“DATA” RET ;同时送DAC1020中进行数模转换

743 在单片机的实时控制和智能化仪器、仪表应用系统中,常常需要将温度、压力、流量、速度等检测到的模拟量转换成数字量才能被单片机所接受并进行相应的处理。然后再将处理结果的数字量经D/A转换器转换成模拟量输出,实现对监控对象的温度、压力、流量、速度等参数进行控制、调整的目的。 A/D转换器根据其工作原理的不同大致可分为:逐次逼近型A/D转换器、串联方式A/D转换器、双积分型A/D转换器以及V/F式A/D转换器等类型。下面主要介绍双积分型A/D转换器和逐次逼近型A/D转换器的工作原理。

744 10.3.1 5G14433A/D转换器及其与单片机的接口 1. 双积分型A/D转换器的工作原理
双积分型A/D转换器的主要优点是转换精度高,抗干扰性能好,价格便宜,但转换速度较慢。它是一种间接A/D转换技术,首先将模拟电压转换成积分时间,然后用数字脉冲计时方法转换成计数脉冲数,最后将此代表模拟输入电压大小的脉冲数转换成二进制或BCD码输出,因此双积分式A/D转换器转换时间较长,一般要大于40~50ms。其工作原理如图10.7所示。

745 图10.7 双积分型A/D转换器工作示意图

746 图中给出Vx1、Vx2两种输入电压的情况。其工作原理为:
先对待转换的输入模拟电压Vx进行固定时间的第一次积分,然后转向标准电压进行固定斜率的第二次反向积分,直至积分输出至零。对应标准电压积分的时间T正比于模拟输入电压Vx,待转换的输入电压Vx愈大,则反向积分时间愈长,在此期间对高频率标准时钟脉冲进行计数的时间就愈长,于是得到对应输入模拟电压的数字量也就愈大。 2. 5G14433的结构和引脚 5G14433是上海元件五厂生产的三位半A/D转换器,它由多路电子开关、积分器、比较器和控制逻辑等部件组成,是一种双积分型的A/D转换器。具有精度高(精度相当于11位二进制数)、抗干扰性能好等优点。其缺点是转换速度相对较慢,转换速度约为1~10次/秒。主要用于对转换速度要求不高的场合,如温度控制系统。5G14433A/D转换器与国外产品MC14433完全相同,可以互相代换。

747 图 G14433逻辑框图

748 5G14433A/D转换器的逻辑框图如图10.8所示。主要外接器件是时钟振荡器外接电阻RC、外接失调补偿电容C0和外接积分阻容元件R1、C1。
模拟电路部分由基准电压、模拟电压输入部分。模拟电压输入量程为199.9mV或199.9V两挡。基准电压相应为200mV或2V数字电路部分由逻辑控制、BCD码及输出锁存器、多路开关、时钟以及极性判别、溢出检测等电路组成。5G14433采用了字位动态扫描BCD码输出方式,即千、百、十、个各位BCD码轮流地在Q3~Q0端输出,同时,在DS1~DS4端出现同步字位选通信号。 5G14433的引脚如图10.9所示。 各引脚功能如下: VAG:被测电压VX和基准电压VR的接地端。 VREF:外接基准电压输入端。 VX:被测电压输入端。

749 图 G14433引脚图

750 R1、R1/C1、C1:外接积分阻容元件端,其中R1/C1为R1及C1的公共接地端。外接元件的典型值为:
当量程为2V时,C1=0.1µF,R1=470kΩ; 当量程为200mV时,C1=0.1µF,R1=27kΩ; C01、C02:外接失调补偿电容C0端,C0的典型值为C0=0.1µF。 DU:更新转换结果输出端。当DU与EOC直接相接时,每次A/D转换结束就马上开始下一次的A/D转换。 CLK1和CLK0:外接时钟频率调节电阻Rc端,Rc的典型值为470kΩ,时钟频率随Rc的增大而下降。 VEE:模拟部分负电源接入端。 Vss:公共接地端。 VDD:电源接入端。

751 EOC:A/D转换结束输出标志,EOC为一个宽度为0.5个时钟周期的正脉冲。
:过量程状态信号输出端,当 为低电平时,表示当前为过量程状态。 DS1~DS4:分别是个、十、百、千位的选通信号输出端。这四个选通脉冲均为18个时钟周期的正脉冲,它们之间的间隔为2个时钟周期。 Q3~Q0:转换结果输出线(以BCD码的形式输出),动态地输出个、十、百、千位值。 当DS4有效时:Q4~Q0输出的是个位的值; 当DS3有效时:Q4~Q0输出的是十位的值; 当DS2有效时:Q4~Q0输出的是百位的值; 当DS1有效时:Q4~Q0输出除了表示千位数的0或1外,还表示了转换结果的正负极、输入信号的欠量程还是过量程。其规定见表10.1。

752 表 G14433千位输出状态表 DS1 Q3 Q2 Q1 Q0 输 出 结 果 1 X 千位数为0 千位数为1 输出结果为正 输出结果为负 输入信号过量程 输入信号欠量程

753 3. 5G14433A/D转换器与8031的接口电路 由于5G14433的输出是动态的,所以单片机必须通过并行接口与5G14433连接。它可以通过并行I/O接口芯片(如8155、8255等)接至单片机,也可以直接接至8031的P1口。图10.10是5G14433与8031单片机直接接口电路。图中5G1403为5G14433提供精密基准电压,5G14433的转换结束标志EOC的输出同时接DU和外部中断引脚(P3.3),信号送给DU作为下一次A/D转换的起始控制信号。8031以中断方式读取A/D转换结果,并以图10.11所示的格式存入8031单片机片内20H起始的片内RAM区中,程序清单如下: ORG H MAIN: SETB IT ;选择边沿触发方式 MOV IE, #84H ;中断允许 PINT1: MOV A, P ;读入P1口的内容

754 图 G14433与8031接口电路 图10.11 结果存放格式

755 JNB ACC.4,PINT1 ;ACC.4=0则循环等待 JB ACC.0,ERR ;ACC.0=1,转量程出错处理
JB ACC.2,PL1 ;ACC.2=1,表示结果为正 SETB 07H ;负数,符号位置1,07H为符号位地址 AJMP PL2 PL1: CLR 07H PL2: JB ACC.3 , PL3 ;ACC.3=1表示千位值为0 SETB 04H AJMP PL4 PL3: CLR 04H PL4: MOV A,P1 JNB ACC.5,PL4 ;等待百位数 MOV R0,#20H XCHD ;读入百位值,并存入20H的低4位 PL5: MOV A, P1

756 JNB ACC.6,PL5 SWAP A INC R0 MOV @R0,A PL6: MOV A,P1 JNB ACC.7,PL6 XCHD RETI ERR: SETB 10H ;置量程出错标志 RETI ;返回 5G14433外接的积分元件R1、C1的大小和时钟频率有关,在实际应用中要加以调整,以得到正确的量程和线性度,积分电容也宜选用聚丙烯电容器。

757 图 ADC0809内部结构图

758 10.3.2 ADC0809及其与单片机的接口 1. 逐次逼近型A/D转换器的工作原理
逐次逼近法A/D转换又称为逐次比较法A/D转换。它由D/A转换环节、比较环节和控制逻辑等几个部分组成。图10.12是逐次逼近法A/D转换器的电路原理图。其转换原理为:A/D转换器将一待转换的模拟输入电压UIN与一个预先设定的电压Ui(预设的电压由逐次逼近型A/D转换器中的D/A转换器的输出获得)相比较,根据预设的电压Ui是大于还是小于待转换的模拟输入电压UIN来决定是当前转换的数字量是“0”还是“1”,据此逐位进行比较,以便使转换结果(相应的数字量)逐渐与模拟输入电压相对应的数字量接近。

759 图 逐次逼近式A/D转换器原理示意图

760 “预设的电压”值的算法如下:使逐次逼近型A/D转换器中D/A转换器的各位二进制数从最高位起依次置1,每变化一位就得到一个预设的电压Ui,并使之与待转换的模拟输入电压UIN进行比较:若模拟输入电压UIN小于预设的电压Ui,则使比较器中相应的位为零;若模拟输入信号UIN大于预设的电压Ui,则使比较器中相应的位输出为1。无论哪种情况,均应继续比较下一位,直到最低位为止。此时,逐次逼近型A/D转换器中D/A转换器的数字输入即为对应模拟输入信号的数字量。将此数字量输出就完成了A/D转换过程。 常用的逐次逼近法A/D转换器件有:ADC0809、ADC0816、ADC1210、AD754等。这里主要将介绍ADC0809的接口电路。

761 2. ADC0809的内部结构 ADC0809是8路模拟量输入8位数字量输出的、逐次逼近型A/D转换芯片,采用CMOS工艺。其内部结构如图10.13所示。ADC0809由+5V电源供电;片内带有锁存功能及8路 模拟多路开关,可对8路0~5V的输入模拟电压信号分时进行转换,完成一次转换约需100μs;片内具有多路开关的地址译码器和锁存电路、高阻抗斩波器及稳定的比较器,256R电阻T型网络和树状电子开关以及逐次逼近寄存器。输出具有TTL三态锁存缓冲器,可直接接到单片机数据总线上;通过适当的外接电路,ADC0809可对0~5V的双极性模拟信号进行转换。

762 图 ADC0809内部结构图

763 3. ADC0809的引脚 ADC0809是28脚双列直式封装,引脚如图10.14所示。 图 ADC0809引脚图

764 D0~D7:8位数字量输出引脚,通常接单片机系统的数据线。
各引脚功能如下: D0~D7:8位数字量输出引脚,通常接单片机系统的数据线。 IN0~IN7:8路模拟输入引脚,通常接被测模拟电压,电压范围0~5V。对变化速度较快的模拟量,输入前应增加采样保持电路。 Vcc:电源端。 GND:接地端。 REF(+):参考电压正端。 REF(-):参考电压负端。 START:A/D转换启动信号输入端。 ALE:地址锁存允许信号输入端,对应ALE上升沿将A、B、C的地址状态锁进锁存器中。 EOC:转换结束信号输出引脚,开始转换时为低电平,当转换结束时为高电平。用以打开三态数据输出锁存器,以便向单片机输出转换结果,OE=0时输出数据线呈高阻态。

765 A、B、C地址输入线,经译码后可选通IN0~IN7的8个通道中的1个通道进行A/D转换。A、B、C的输入与被选通的通道的关系见表10.2。
CLK:时钟信号输入端,通常使用频率为500kHz的时钟信号。 A、B、C地址输入线,经译码后可选通IN0~IN7的8个通道中的1个通道进行A/D转换。A、B、C的输入与被选通的通道的关系见表10.2。 表10.2 A、B、C的输入与被选通的通道的关系 C B A 被选中的通道 IN0 1 IN1 IN2 IN3 IN4 IN5 IN6 IN7

766 4. ADC0809与8031的接口 (1)以查询方式实现与8031的接口
ADC0809与8031单片机的接口如图10.15所示。由于ADC0809片内无时钟,可利用8031提供的地址锁存选通信号ALE引脚上输出的频率作为ADC0809的时钟信号,该引脚上输出的频率是8031单片机时钟频率的1/6。 若单片机已选通IN0~IN7中的一个通路。P2.7作为片选信号,在启动A/D转换时,由单片机的写信号和P2.7控制ADC的地址锁存和转换,由于ALE和START连在一起,因此ADC0809在锁存通道地址的同时,启动并行转换。在读取转换结束时,用低电平的读信号和P2.7脚经一级或非门后,产生的正脉冲作为OE信号,用以打开三态输出锁存器。由图10.15可知,ALE与START信号由 和P2.7信号相或产生,而OE信号由 和P2.7相或产生。

767 图 ADC0809与8031的接口电路

768 由以上分析可知:在软件编写时,应使P2.7=0;A0、A1、A2给出被选择的模拟通道的地址;执行一条输出指令的同时也启动了A/D转换。
下面的程序是采用软件延时的方法,分别对8路模拟信号轮流采样一次,并依次把结果转储到数据存储区的采样转换程序。 MAIN:MOV R1,#data ;置数据区首地址 MOV DPTR,#7FF8H ;P2.7=0,且指向通道0 MOV R7, #08H ;置通道数 LOOP:MOV @DPTR,A ;启动A/D转换 MOV R6,#15H ;软件延时,等待转换结束 DLAY:NOP NOP DJNZ R6, DLAY

769 MOVX ;读取转换结果 MOV @R1,A ;转储 INC DPTR ;指向下一个通道 INC R ;修改数据区指针 DJNZ R7,LOOP ;8个通道全采样完了吗 (2)以中断方式与8031单片机的接口 ADC0809与8031的中断方式接口电路如图10.15中0809的EOC脚经过一非门连接到8031的外部中断引脚。采用中断方式可大大节省CPU的时间,当转换结束时,EOC发出一个脉冲向单片机提出中断申请,单片机响应中断请求,由外部中断INT1的中断服务程序读取A/D转换结果,并启动下一个A/D转换,外部中断1采用边沿触发方式。

770 下面是ADC0809与8031的以中断方式完成对8路模拟量输入的巡回检测系统的程序清单,采样到的数据依次存放在外部数据存储器70H~77H单元中,其数据采样的初始化程序和中断服务程序如下:
MOV R0,#70H ;数据存储区首地址 MOV R2,#08H ;8路待测模拟量 SETB IT ;设置为边沿触发方式 SETB EA ;中断允许 SETB EX ;允许外部中断INT1中断 MOV DPTR,#7FF8H ;A/D转换器地址,并指向通道0 LOOP: MOVX @DPTR , A ;启动A/D转换 HERE: SJMP HERE ;等待中断

771 中断服务程序: MOVX ;采样数据 MOVX @R0, A ;存放数据 INC DPTR ;指向下一个模拟通道 INC R ;指向下一个存储区单元 RETI

772 习 题 1. 设计一个D/A转换电路,DAC0832通过系统I/O扩展接口8255与单片机系统连接。要求DAC0832工作在单缓冲器方式下。试画出电路图,并编写程序,使DAC0832输出一个正向锯齿波。 2. 怎样的D/A转换器能直接与单片机连接?为什么?在什么情况下DAC0832必须工作在双缓冲器方式? 3. 在一个8031单片机应用系统中,8031以中断方式通过并行接口读取A/D转换器件5G14433的转换结果。试画出有关电路,并编写读取A/D转换结果的中断服务子程序。 4. 试比较A/D转换器ADC0809与5G14433的转换原理。它们的转换输出结果有什么不同? 5. 在一个晶振频率为12MHz的8031系统中接有2片D/A转换芯片:DAC0832,已知它们的地址分别为7FFFH和0BFFFH,0832的输出信号送示波器。请画出DAC0832工作于双缓冲器方式下的逻辑电路图。

773 6. 请设计一个电路:8031单片机以中断方式通过并行I/O接口芯片74LS244读取A/D转换器5G14433的转换结果。要求画出电路连接图,并编写读取A/D转换结果的中断服务子程序。
7. 设计一个A/D转换电路,利用0809A/D转换芯片与8031单片机连接。要求0809的通道地址选择线来自于地址总线的低8位。采用查询方式进行数据采集,每隔0.5ms检测一个通道,8个通道循环检测,共检测10遍再结束。采集到的数据存入系统外部数据存储器某连续存储单元中。

774 典型的单片机应用系统 单片机应用系统是以单片机为核心的应用系统,“应用”一词的含义是指用于完成某项具体的工作任务,在工业控制过程中单片机应用系统常用于完成各种工业过程的测控任务。 一个典型单片机应用系统的硬件组成如图11.1所示。图中的I/O接口可由8155H、8255A等I/O接口芯片构成;输入输出设备主要指键盘、显示器及打印机等。

775 图11.1 典型的单片机应用系统

776 11.1.2 单片机应用系统设计的一般步骤 完成一个单片机应用系统的开发设计大致要经历以下几个步骤:
单片机应用系统设计的一般步骤 完成一个单片机应用系统的开发设计大致要经历以下几个步骤: ① 提出目标课题:明确要解决的问题,给出相关参数、性能要求。 ② 进行可行性论证:从技术角度分析“课题”的先进性、可靠性及通用性。查阅国内外有关资料;从经济角度分析“课题”的市场需求、成本大小、所需元件的供应情况及产品的销售情况。 ③ 确定系统的总体方案:系统的总体方案的好坏将直接影响整个开发系统的成本和功能,总体方案的设计大体上可从以下几个方面考虑:根据“课题”的性能要求,提出合理可行的技术指标并选择合适的机型:选择MCS-51系列还是选用其他系列的单片机。确定系统硬、软件的功能,因为有些功能既可以由硬件来实现,也可以由软件来完成;确定系统的硬件框图和软件框图;大致确定系统的开发周期。

777 ④ 着手进行系统硬件电路及软件程序的理论设计,在这一过程中主要考虑满足系统硬件、软件的基本的功能要求。
⑤ 借助于仿真机对系统的硬、软件进行仿真调试,以鉴定理论设计的正确性。 ⑥ 安装系统的硬件电路,并将调试通过的系统程序固化到程序存储器中。 ⑦ 对实际的单片机应用系统作进一步的实物调试,完全通过后则交付使用,从而完成单片机应用系统的开发。

778 11.2.1 硬件电路的组成及设计原则 1.单片机硬件电路的组成 2. 单片机硬件电路设计的一般原则
硬件电路的组成及设计原则 1.单片机硬件电路的组成 单片机的硬件主要由单片机的最小系统及相关的功能模块组成,最小系统包括单片机、程序存储器、数据存储器、晶振电路、复位电路、电源及I/O接口等各部分;各功能模块的多少要视具体的系统而定,常用的功能模块有:用于对单片机本身进行控制的人机通道模块,它包括键盘输入模块、显示器模块及打印机模块等,用于与测控对象进行信息交流的输入输出通道,它包括用于采样的传感器模块和A/D转换模块、用于完成控制任务的D/A转换模块和执行机构模块,另外还有用于与它计算机系统交换信息的通信接口模块等。 2. 单片机硬件电路设计的一般原则

779 ① 硬件电路的设计应在满足系统功能要求的前提下,追求尽可能高的配置/应用比,当然在考虑到二次开发的方便,可以在系统硬件资源的利用上留有一定的余地,如目前EPROM容量越来越大,一般选用2764以上的EPROM,它们都是28脚,以后要扩容就很方便。8031内部RAM不多,当要增加软件数据处理功能时,往往觉得RAM容量不足,这就要求系统配置外部RAM,如6264、62256等。 ② 优先选择自己熟悉的机型,同时兼顾单片机性能及技术的发展情况。 ③ 尽可能地选用典型的电路,为单片机系统的标准化、模块化设计打下良好的基础。

780 ④ 设计中要兼顾硬、软件功能的合理使用。单片机和数字电路本质的区别,就是它具有功能较强的软件系统,在系统硬件的设计过程中要考虑相应软件的编写和程序运行效率等问题。某些功能可以用软件实现,如可以用软件中断来代替硬件中断、用软件滤波来代替硬件滤波等。硬件多了不但增加成本,而且也会提高系统的故障率,因此在系统工作速度能满足测控对象要求的前提下,以软代硬的设计思想是值得提倡的。 ⑤ 工艺设计:包括机箱、面板、配线、接插件等。设计中必须考虑到安装、调试、维修的方便。另外,硬件抗干扰措施也必须在硬件设计时一并考虑进去。

781 单片机应用系统的可靠性设计 随着单片机的应用深入到各个领域,对单片机应用系统的可靠性也提出了越来越高的要求。特别是对于工业控制、交通管理等实时控制系统来说,最基本最重要的指标是系统的可靠性。因为这些系统一旦出现故障,将可能造成严重的后果。单片机应用系统的可靠性通常是指在规定的条件下(如温度、振动、电磁干扰等)及规定的时间内单片机应完成规定功能的能力。提高系统可靠性的主要措施有: ① 精选元器件,提高元器件的质量。 ② 采用抗干扰措施,提高系统对恶劣环境的适应能力。 ③ 采用容错技术,使系统能及时地自动地恢复或发出报警。 ④ 采用冗余技术,以确保系统的正常运行。 下面从硬、软件两个角度来简要介绍一下系统的可靠性设计的相关内容。

782 1. 硬件可靠性设计 硬件可靠性设计主要从以下几个方面去进行: (1)提高元器件的可靠性
① 精选元器件,选用合格的电子元件,并进行严格的测试、筛选和老化处理。 ② 选用优质的接插件,设计合理的工艺结构。 ③ 设计系统技术参数时(如负载能力)要留有一定的余地。 ④ 提高印刷电路板和系统组装的质量。 (2)硬件抗干扰措施 用于工业过程控制的单片机应用系统,由于其工作环境较为恶劣、易受干扰,从而影响系统的可靠性和正确性,甚至使得系统控制失灵,故在系统设计中必须考虑抗干扰方面的设计。常用的硬件抗干扰措施有:

783 要消除因电源而带来的干扰,首先要选择一个纹波小,稳压性能好且高频特性良好的电源电路。
① 电源抗干扰技术。电源本身就是单片机系统中一个主要的干扰源。一方面电网电压和频率的波动会引入一些干扰信号;另一方面在单片机控制系统中,大量的数字信号是工作在高频状态下的,这又很容易诱发电源内部的干扰信号;同时电源也是系统内各种干扰成分相互耦合的一个重要途径,因此消除因电源而带来的干扰也是消除单片机系统干扰的一个主要方面。 要消除因电源而带来的干扰,首先要选择一个纹波小,稳压性能好且高频特性良好的电源电路。 ② 配备合适的接地系统。常用的接地类型有:数字地、模拟地、机壳地、屏蔽地;对于工作频率小于1MHz单片机系统电路可采用单点接地技术,对频率大于10MHz单片机系统电路则宜采用多点接地技术。 ③ 安装滤波器。对电网中的高次谐波成份可安装低通滤波器,对系统中的分布电容、电感,一方面可尽量避免走平行线,另一方面要尽量缩短走线距离。

784 ④ 接入去耦电容。在电路中接入一些去耦电容可减少因电源耦合的干扰。常用的方法是在电源输入端跨接10~100μF的电解电容,也可以在电路中适当的位置对地间接入0.01μF的陶瓷电容器。如遇印刷电路板空隙小装不下时,可每4~10个芯片安装一个1~10μF的限噪声电容器,这种电容器的高频阻抗特别小,在500KHz~20MHz范围内的阻抗小于1Ω,而且漏电流很小(0.5μA以下)。 (3)I/O通道中接入干扰的抑制措施 I/O通道是连接单片机和外部设备之间的一个桥梁,也是引入干扰的一个重要途径。抑制I/O通道中干扰的主要措施有:隔离技术、双绞线传输及阻抗匹配等。

785 ① 隔离技术。目前常用的方法是对A/D、D/A变换前后的模拟信号进行隔离。方案之一,是采用隔离型放大器来完成对模拟信号的隔离。但所选用的隔离型放大器必须满足A/D、D/A变换精度和线性度的要求,故这种方法对隔离型放大器的精度要求较高,由此带来的问题是成本的提高;方案之二,在I/O接口与A/D、D/A转换器之间进行隔离,也就是俗称数字隔离。 常用的方法是在I/O接口与A/D、D/A之间增设锁存器,对I/O信号进行隔离,换言之,无论是单片机输入信号还是输出信号均须经过锁存器才能与外设接通,锁存器在这里起到了隔离的作用,这种方法的优点是方便、可靠、廉价且不影响A/D、D/A转换的精度和线性度,最大的缺点是工作速度较低;方案之三,在I/O接口与A/D、D/A之间接入廉价的光电耦合隔离器件,这种方式的隔离效果较好,是一种应用较为广泛的隔离方法,其最大转换速度约为每秒3000~5000个点,对于一般的工业测控对象(如温度、湿度、压力等)已能满足要求。

786 ② 远距离传输时引入干扰的抑制。现代控制系统中,被测控的对象与单片机控制系统之间往往有较长的距离,要克服由于远距离传输带来的电磁场干扰主要可从以下几个方面采取措施:首先一定要把模拟信号线、数字信号线以及电源线分开,尽量避免并行敷设,若无法分开时也要保持一定的距离;其次信号线要尽量采用双绞线或屏蔽线,而且一定要把屏蔽层良好地接地;第三,信号线的敷设要尽量远离大功率的设备、大容量的变压器,以防止电磁干扰的侵入;第四,对长距离传输线,为了减少信号失真,还要注意阻抗的匹配问题;在总线传输系统中,为了把单片机系统与现场隔离,以抑制干扰的影响,也可采用光电隔离的I/O接口技术。 ③ WatchDog电路。在单片机系统程序的执行过程中,经常会由于各种干扰因素而导致单片机的“死机”现象,直接按下系统的复位按钮是最简单的克服“死机”的方法;但对于无人在现场的场合,“看门狗”技术为克服这种现象提供了强有力的手段。WatchDog(看门狗)电路的核心器件是一个计数器,当单片机处于正常工作状态下时,单片机会定时地对计数器发出清零命令,从而使计数器始终不会计满,也就没有复位脉冲输出,保证单片机不会进入复位状态。

787 ② 软件抗干扰措施。软件抗干扰是单片机系统自身的防御措施,这点将在后面再作介绍。
当单片机处于非正常工作状态下时,单片机对计数器的清零命令也同时消失了,于是计数器计满后会向单片机的复位端发出一个复位脉冲,使得单片机进入复位状态,从而克服了“死机”现象。通常为计数器设置的延时时间为10ms左右。 (4)其他的抗干扰措施 ① 掉电保护措施。除上面讲到的单片机系统外部的抗干扰措施外,在单片机内部也可以采取一些抗干扰措施。采用掉电保护措施可避免因突然掉电而使单片机系统工作数据的丢失。通常可用锂电池作为系统RAM的掉电保护备用电源。 ② 软件抗干扰措施。软件抗干扰是单片机系统自身的防御措施,这点将在后面再作介绍。 ③ 采用设备冗余技术。对某些特别重要的场合,可采用两套设备同时投入,一套处于正常工作状态,另一套处于备用工作状态。当前一套设备发行故障时,第二套设备自动地投入运行,从而保证系统的可靠工作。

788 2. 软件可靠性设计 软件可靠性设计主要内容有软件滤波、软件陷阱和软件信息冗余。单片机系统在噪声环境中运行时,除了采用合适的硬件抗干扰措施外,还可以利用软件的方法来增强系统的抗干扰能力。软件抗干扰的方法很多,本节叙述数字滤波技术及CPU的抗干扰方法。 (1)数字滤波技术 所谓的数字滤波,就是通过一定的计算程序,对采样信号进行数据处理,以消除各种干扰信号的一种抗干扰方法。中值滤波、算术平均值滤波以及加权平均值滤波等都是常用的数字滤波方法,下面以中值滤波为例介绍数字滤波的实现方法。对于其他一些滤波方法请读者参阅有关书籍。

789 所谓中值滤波是对某一参数连续采样n次(通常使n=3~5),然后取出这n次采样的中间值作为本次采样的数据。中值滤波的作用是去掉由于偶然因素引起的数据波动。对变化速度较慢的被测信号中值滤波的效果是较好的,对快速变化的被测信号,不宜采用中值滤波方法。下面的程序是对8位A/D转换器的输出信号进行5次采样后的(5次采样的数据已存于单片机片内RAM 70H~74H单元中)数据取出中间值,然后将其存于单片机的累加器A中: ORG 1000H START: MOV R2,#70H MOV R3,#71H LOOP: ACALL SUB INC R2 INC R3 CJNE R3,#75H, LOOP

790 MOV A, 72H LOP: SJMP LOP SUB: MOV A, R2 MOV R0, A MOV A ,R3 MOV R1,A MOV SUB1: CLR C SUBB MOV JC SUB2 XCH MOV @R0,A

791 SUB2: INC R1 CJNE R1,#75H,SUB1 RET

792 (2)CPU的抗干扰方法 ① 软件陷阱。单片机程序是一步一步地顺序执行的,但有时也会出现这样的情况:当某条指令执行完后,程序计数器PC本应加2 去执行下一条指令,但由于某种干扰因素使得程序计数器PC实际上加了3(或加1),这样将会造成其后程序的操作码和操作数的混淆,从而造成一系列的错误。为了防止这种情况发生,可以在软件中设立软件陷阱。软件陷阱是利用程序指令顺序执行的特点来捕获程序,并将程序自动地引向一个正确的执行序列中。 软件陷阱的具体做法是:在正常的程序中每隔一些指令(通常为十几条指令即可)连续写上3~5条NOP指令,这样当程序出现失控时,只要失控指令进入这些NOP指令组成的陷阱中,就会被捕获,在连续执行几个空操作后,就会使程序自动恢复正常序列。这种方法虽然浪费了一些存储单元和CPU的机时,但却可以防止程序出现“跑飞”现象。

793 ② 用软件来实现WatchDog的功能。利用单片机本身的定时器,配上一定的程序也可以实现WatchDog的功能。当程序因某种原因处“死机”状态时,软件WatchDog也可以发出复位信号,从而使单片机复位,回到正常的工作状态。这种方法对于程序因在某处“死循环”而造成的“死机”现象是有效的。这种方法的缺点是要占用单片机内部的资源。 ③ 软件信息冗余技术。所谓信息冗余,就是在传输的有效信息上附加一些冗余信息,使系统具有检错、纠错能力。单片机系统中常用的信息冗余技术有:奇偶校验、累加和校验以及循环码校验。

794 奇偶校验方法是在一组传送信息代码上附加一位奇偶校验位,该奇偶校验位的值反映了传送信息代码的奇偶性,接收方通过对附加奇偶校验位的分析可以推知所传送信息的正确性。累加和校验是在传送一组传送信息后,再附加传送这一组信息的累加和,接收方通过对这一组累加和的分析,可以发现所传送数据中的错误 循环码校验是在发送数据时按一定的规则(例如X2+X4+X8)产生循环冗余码,并将其附加在数据后面一起发送。接收方按同样的规则根据接收到的数据产生循环冗余码,并将其与接收到的循环冗余码进行比较,以检验接收数据的正确性。循环码校验的检错能力高于累加和校验。

795 11.2.3 单片机应用系统的保密性设计 1. 硬件保密性设计
单片机应用系统的保密性设计 单片机系统的保密性设计是单片机系统设计的一个重要的组成部分。保密性设计的常用方法有硬件保密性设计、软件保密性设计两种方法。 1. 硬件保密性设计 (1)可编程逻辑器件实现保密性设计 可编程逻辑器件具有功能强、应用灵活、保密性好等优点。通过对可编程逻辑器件进行编程产生各种功能的逻辑电路可以为单片机应用系统加密。特别是Intel公司生产的紫外线擦除可编程逻辑器件EPLD,如果将系统中关键性电路固化到EPLD中,一旦加密就无法轻易被解密。 (2)利用单片机内部的保密位实现保密性设计 MCS-51系列中的8751H单片机片内含有一位加密位,一旦对该位进行加密性编程,就无法读出单片机内部的程序。但单片机内部的程序仍可被正常执行。只有对单片机内部的程序进行擦除操作后,才能再一次对8751H进行编程。

796 2. 软件保密性设计 软件保密性设计技术主要是对汇编语言进行加密。可按某一算法在程序模块之间插入两个加密字节,采用这种方法后,用一般的反汇编程序将无法得到系统实际的运行程序。 在固化过程中实现加密,加密的方法是让目标程序根据不同的地址区域按一定的规则编码后再固化到EPROM中,这样做之后直接从EPROM读出的信息是杂乱无章的,从而实现了程序加密的目的。

797 在完成了单片机系统理论设计的工作后,便进入了应用系统调试的工作阶段。调试工作是借助于仿真机来进行的。所谓“仿真机”是一个相对用户来说具有“透明性”和“可控性”的单片机系统,它可用来模拟代替用户的目标单片机系统。用户在仿真机上运行目标程序,就像在目标单片机系统上运行程序一样,因此仿真机上反映出来的问题就是用户目标单片机系统的问题。用户可以通过仿真机模拟目标系统的运行来发现并修改系统硬、软件可能存在的问题。相对不同类型的仿真机,用户系统的调试步骤略有区别,这里只介绍系统调试的一般方法。

798 11.3.1 单片机应用系统中常见的故障 1. 单片机应用系统常见的硬件故障 (1)常见逻辑故障
单片机应用系统中常见的故障 1. 单片机应用系统常见的硬件故障 (1)常见逻辑故障 单片机应用系统硬件电路的故障是由于设计错误或安装过程中的失误所造成的。这类故障主要有:错线、开路、短路及相位错等几种,其中短路是最常见的故障。因为单片机系统往往要求体积小,因此造成印刷板布线密度较高,加上加工工艺等因素就很容易产生短路现象。开路则常常是由于接插件的接触不良、有虚焊等因素引起,这一类的故障有时是很难检查出来的。错线故障主要是设计不正确引起的。

799 (2)元器件失效故障 造成元器件失效的原因有三个方面。其一是元器件本身的质量不好引起的;其二是由于设计不合理(如电流太小、耐压值过低等)等因素造成元器件在安装过程中的损坏;第三是由于设计或组装错误引起的,如电容、二极管、三极管及某些集成电路因极性错误造成的损坏。 (3)可靠性差 造成系统工作不可靠的原因主要有:元器件在安装之前没有经过筛选,故工作时间稍长后就可能出现工作不可靠现象;接插件接触不良是造成系统时好时坏的主要原因,在选用插座时尤其要注意到插座的质量问题;电源不稳定引起的系统工作不可靠。可能的原因是电源本身各元件的质量不好或电源设计的负载能力不足等因素引起的。

800 2.单片机应用系统中常见软件的错误类型 (1)程序失控
在程序的执行过程中出现程序“跑飞”或在某处“死循环”而引起的“死机”现象是一种程序失控。造成这类错误的可能的原因有:程序转移或调用过程中转移地址计算错误引起;进栈、出栈的次序搞反或堆栈溢出引起;由于各种干扰因素引起。 (2)中断错误 中断不响应。错误的原因可能是中断控制寄存器(IE、IP)的设置不正确,使得CPU没有开中断,也可能是中断入口地址出错,或者是中断源本身有错误,根本就没发中断请求信号。循环响应中断。CPU不断地响应中断,故不能正常地执行主程序。造成这类错误的原因可能是中断服务子程序中没有设置清除中断标志的指令;中断源不断地发出错误的中断申请。 (3)输入输出错误 输入输出操作失控,根本不动作。错误的原因可能是输入输出程序的地址出错、片选出错;也可能是由于硬件故障引起的。

801 11.3.2 单片机应用系统的仿真调试 1. 在仿真机上的初步调试
单片机应用系统的仿真调试 单片机应用系统的调试大致分为两个阶段:在仿真机上初步调试;在用户样机上联机调试。 1. 在仿真机上的初步调试 这是在单片机理论设计完成后进行的工作内容,目的是检验系统理论设计结果大致的正确性。有许多故障都是在仿真机上进行初步仿真调试的过程中被发现的。 在仿真机上的初步调试工作主要是针对软件部分来进行的,硬件部分通常是利用仿真机上的发光二极管的亮与黑来反映单片机输出信号的正确与否。软件调试可采用单步执行、设置断点分段执行及连续运行几种方式来进行。通常一开始可根据系统的各个模块设置断点分段执行目标程序。若某一模块执行结果是正确的,则可进入下一个模块的调试。若该模块执行结果出现错误,则可用单步执行的方法进一步对该模块进行调试,直至找到错误点为止。 当用户程序在仿真机上初步调试通过后,就可以着手组装用户样机。

802 2. 在用户样机上联机调试 对在用户样机上调试通常又可以分两步进行:用户样机的静态调试和用户样机的动态调试。 (1)用户样机的静态调试
静态调试的第一步是在单片机不加电压的前提下,用万用表等工具,根据硬件电路的逻辑关系,检查样机系统连线是否正确,特别要注意检查电源的连接状态,看是否会有短路和极性接错、检查电路中各元件的极性是否正确。 第二步是加电后检查各插件引脚上的电位是否正常,尤其应注意检查样机单片机插座上各点电位的高低。若发现有异常电位值,则要仔细查找原因,以免在和仿真机联机运行时损坏仿真机。

803 (2)用户样机的在线动态联机调试 在对用户样机的静态调试中已经排除了一些明显的错误。用户样机的在线动态联机调试则可进一步检验用户样机的正确性。此时用户的目标程序还是在仿真机中,硬件电路则是在用户样机中,此时除单片机是利用仿真机中的单片机外,其余的部分都是实际系统了。若此时运行用户目标程序还是能通过,则说明用户单片机系统已经完全调试通过。若还有问题则要根据实际问题逐个排除。在此过程中要注意分析问题是来自硬件电路,还是来自软件程序,以便采取正确的纠错方法。 当在线联机调试通过后就可以借助于仿真机将调试通过的用户程序固化到EPROM中。至此单片机应用系统的开发设计工作基本完成。

804 习 题 1. 请写出单片机应用系统开发的一般步骤。 2. 一个典型的单片机应用系统主要包含哪几部分? 3. 请简述单片机应用系统可靠性设计主要包含哪些内容? 4. 在单片机应用系统的开发设计过程中为什么通常都要经过仿真调试阶段。 5. 试举例说明在单片机应用系统中硬件、软件的配合问题,并比较各自的优、缺点。 6. 请简述工业控制中常见的干扰源及相应的解决措施。 7. 请简述单片机应用系统调试的步骤。 8. 试设计一个单片机温度控制系统:该系统可以对8路温度进行巡回检测、数据处理(采用中值滤波)、要有上、下限报警。已知温度测量范围为0~1200℃。要求: (1)画出系统电气原理图。 (2)画出主程序及各个子程序的流程图。

805 前 言 近年来计算机技术发展日新月异,单片机由于其功能强、体积 小、价格低、稳定性好等优点,应用领域不断扩大,目前在计算机外
前 言 近年来计算机技术发展日新月异,单片机由于其功能强、体积 小、价格低、稳定性好等优点,应用领域不断扩大,目前在计算机外 部设备、通信、智能仪表、过程控制、家用电器、航空航天系统等各个 领域得到广泛应用。 目前世界上有许多公司都生产单片机,但以MCS-51为核心的单片机MCS-51系列、AT89系列等仍是主流单片机,也是广大工程技术人员首选的机型。本书以MCS-51单片机为背景系统介绍单片机的结构、工作原理、扩展、接口技术、中断系统和各功能部件的组成及应用。为了体现高职高专培养生产、建设、服务、管理第一线应用型人才的目标,本书在内容选取上注重应用,通过大量的例子把在工程中广泛应用的知识、技术讲透,以达到触类旁通、举一反三的目的;在内容组织上注重高职高专学生的特点,力求循序渐进、深入浅出。 全书共分11章,第1章为单片机概述;第2章介绍MCS-51单片机结构; 第3、4章介绍单片机的指令系统和汇编语言的程序设计;第5~10章 分别介绍单片机的中断技术、定时器/计数器、外部扩展、接口 技术和串行通信技术等;第11章介绍单片机应用系统设 计开发的步骤、方法及其抗干扰技

806 编委会名单 主任:俞瑞钊 副主任:陈庆章 周必水 刘加海 委员 (以姓氏笔画为序) 秘书长:熊盛新
副主任:陈庆章 周必水 刘加海 委员 (以姓氏笔画为序) 王 雷 王筱慧 方 程 方锦明 卢菊洪 代绍庆 吕何新 朱 炜 刘向荣 江爱民 江锦祥 孙光第 李天真 李永平 李良财 李明钧 李益明 余根墀 汪志达 沈凤池 沈安衢 张 元 张学辉 张锦祥 张德发 陈月波 陈晓燕 邵应珍 范剑波 欧阳江林 周国民 周建阳 赵小明 胡海影 秦学礼 徐文杰 凌 彦 曹哲新 戚海燕 龚祥国 章剑林 蒋黎红 董方武 鲁俊生 谢 川 谢晓飞 楼 丰 楼程伟 鞠洪尧 秘书长:熊盛新

807 注意事项 1.本软件用PowerPoint制作而成,播放亦在其状态下进 行,为了更好地使用该软件,使用者需掌握PowerPoint的基本
操作原理和方法。 2.本软件内容丰富、新颖,突破传统教学模式,在多媒体教室使用时,使用者应注意这一变化,改变教学方法,充分发挥其功效。同时也应注意本软件仍是一教学辅助工具,授课时应与讲授相结合使其更好地为教学服务。 3.本软件内容完整,自成体系,对于使用者的不同情况,用本软件授课时,可补充所需内容,链入其它媒体信息,或同其它软(如CS ChemDraw等)共同使用,以达到多媒体辅助教学的良好效果。  4.多媒体教学信息量大,传递速度快,用本软件授课时,应 熟悉播放程序,注意控制播放速度,要使观看者有充足的思 考时间。


Download ppt "《单片机原理与应用》电子教案 第1章 单片机概述 第2章 单片机的硬件结构 第3章 MCS-51单片机指令系统"

Similar presentations


Ads by Google