MCS-51 系列单片机原理与接口技术
李玉峰 倪虹霞 编著
人民邮电出版社
内容提要
全书共分为 11 章,深入浅出地介绍了 MCS-51 系列单片机的原理与接口技术。 本书的特点是深入浅出、循序渐进,适合初学者自学或学校教学;强调实用,实例详实;
每一章后均附有习题,附录中附有参考答案,便于检验读者理解程度。 本书既可作为各大高校教授单片机的教材,也可以作为工程技术人员以及单片机爱好者
的自学用书。
MCS-51 系列单片机原理与接口技术 编 著 李玉峰 倪虹霞
责任编辑 刘 浩
人民邮电出版社出版发行 北京市崇文区夕照寺街 14 号
邮编 100061 电子函件 [email protected]
网址 http://www.ptpress.com.cn
读者热线 010-67194092
北京汉魂图文设计有限公司制作
北京顺义振华印刷厂印刷
新华书店总店北京发行所经销
开本:787×1092 1/16
印张:16
字数:385 千字 2004 年 5 月第 1 版
印数:1— 000 册 2004 年 5 月北京第 1 次印刷
ISBN 7-115-12272-5/TP·3972
定价: .00 元
本书如有印装质量问题,请与本社联系 电话:(010)67129223
前 言 单片机其体积小、重量轻、灵活性强并且价格比较低,因此在工业(机、电、化、轻纺
等)和民用家电等各方面得到了广泛应用。 本书以国内用得最普及的8位单片机MCS-51为例详细地介绍单片机的基本原理和应用。
本书深入浅出,强调实用,每一章后均附有习题,并在附录中附有参考答案,便于初学者学
习、理解单片机开发的基本技术。 全书共分为 11 章,详细地介绍了 MCS-51 系列单片机的原理及接口技术,各章主要内容
简介如下。 第 1 章介绍单片机的基本知识、发展现状以及应用领域等; 第 2 章介绍 MCS-51 单片机的基本结构、工作方式以及工作时序等,该章是学习 MCS-51
系列单片机的基础; 第 3 章介绍 MCS-51 系列单片机的基本指令以及寻址方式等; 第 4 章介绍汇编语言程序设计的一般方法; 第 5 章介绍中断系统的基本原理、MCS-51 系列单片机的中断系统及其应用; 第 6~7 章介绍 MCS-51 单片机内置定时器/计数器和串行口的具体应用; 第 8 章介绍当前一些比较常用的存储器芯片及其使用方法; 第 9 章介绍一些典型的 I/O 扩展电路; 第 10 章介绍 D/A、A/D 原理以及与 MCS-51 之间的接口技术; 第 11 章介绍应用系统设计开发的一般流程以及单片机系统开发的工具。 单片机技术发展迅速,加之作者水平有限,书中难免存在一些缺点与不足,请读者不吝
赐教(可发 E_mail 至 [email protected])。 编者
2004 年 5 月
目目 录录
第 1 章 单片机概述.....................................................................................................1
1.1 什么是单片机 ........................................................................................................... 1 1.2 单片机的特点 ........................................................................................................... 1 1.3 单片机的应用 ........................................................................................................... 2 1.4 单片机的历史 ........................................................................................................... 2 1.5 8 位单片机的主要生产厂家和机型 ........................................................................ 3 1.6 单片机的最新发展 ................................................................................................... 4 1.7 MCS-51 系列单片机 ................................................................................................ 5 1.8 习题 ........................................................................................................................... 7
第 2 章 MCS-51 系列单片机的基本结构 .....................................................................8
2.1 MCS-51 单片机的外部引脚及功能 ........................................................................ 8 2.1.1 主电源及时钟引脚 ........................................................................................ 9 2.1.2 控制引脚 ........................................................................................................ 9 2.1.3 输入/输出引脚 ............................................................................................. 10
2.2 MCS-51 单片机的内部结构 .................................................................................. 11 2.2.1 MCS-51 单片机微处理器(CPU)............................................................ 11 2.2.2 MCS-51 单片机的存储器结构 ................................................................... 15 2.2.3 I/O 端口........................................................................................................ 21 2.2.4 定时器/计数器 ............................................................................................. 25 2.2.5 中断系统 ...................................................................................................... 25 2.2.6 布尔(位)处理器 ...................................................................................... 25
2.3 MCS-51 单片机的工作方式 .................................................................................. 26 2.3.1 复位方式 ...................................................................................................... 26 2.3.2 程序执行方式 .............................................................................................. 27 2.3.3 省电工作方式 .............................................................................................. 28 2.3.4 EPROM 的编程和校验方式 ....................................................................... 28
2.4 MCS-51 单片机的时钟电路 .................................................................................. 30 2.5 MCS-51 单片机的工作时序 .................................................................................. 30
2.5.1 机器周期和指令周期 .................................................................................. 31 2.5.2 MCS-51 单片机指令的取指/执行时序 ...................................................... 31 2.5.3 访问片外 ROM/RAM 的指令时序 ............................................................. 33 2.5.4 读/写片外 RAM 指令时序 .......................................................................... 34
2.6 习题 ......................................................................................................................... 34
MCS-51 系列单片机原理与接口技术
·2·
第 3 章 指令系统 ......................................................................................................35
3.1 MCS-51 单片机的指令系统 .................................................................................. 35 3.1.1 基本概念 ...................................................................................................... 35 3.1.2 指令分类 ...................................................................................................... 35 3.1.3 指令格式 ...................................................................................................... 36 3.1.4 指令系统中符号说明 .................................................................................. 36 3.1.5 单片机执行指令的过程 .............................................................................. 37
3.2 指令系统的寻址方式 ............................................................................................. 37 3.2.1 立即寻址 ...................................................................................................... 37 3.2.2 寄存器寻址 .................................................................................................. 38 3.2.3 直接寻址 ...................................................................................................... 38 3.2.4 寄存器间接寻址 .......................................................................................... 38 3.2.5 基址寄存器加变址寄存器间接寻址 .......................................................... 39 3.2.6 相对寻址 ...................................................................................................... 39 3.2.7 位寻址 .......................................................................................................... 39
3.3 指令系统详解 ......................................................................................................... 40 3.3.1 数据传递类指令 .......................................................................................... 40 3.3.2 算术运算类指令 .......................................................................................... 43 3.3.3 逻辑运算类指令 .......................................................................................... 46 3.3.4 控制转移类指令 .......................................................................................... 48 3.3.5 布尔变量操作类指令 .................................................................................. 50
3.4 习题 ......................................................................................................................... 52
第 4 章 汇编语言程序设计 ........................................................................................53
4.1 汇编语言概述 ......................................................................................................... 53 4.1.1 汇编语言的优点 .......................................................................................... 53 4.1.2 汇编语言程序设计的过程 .......................................................................... 53 4.1.3 程序质量 ...................................................................................................... 54
4.2 MCS-51 汇编语言 .................................................................................................. 55 4.2.1 汇编语言程序的格式 .................................................................................. 55 4.2.2 MCS-51 伪指令 ........................................................................................... 56
4.3 汇编程序设计 ......................................................................................................... 58 4.3.1 顺序结构程序设计 ...................................................................................... 58 4.3.2 分支程序设计 .............................................................................................. 59 4.3.3 散转程序设计 .............................................................................................. 61 4.3.4 循环程序设计 .............................................................................................. 63 4.3.5 查表程序设计 .............................................................................................. 67 4.3.6 子程序设计 .................................................................................................. 68
4.4 汇编语言实用程序设计 ......................................................................................... 71 4.4.1 数码转换类程序 .......................................................................................... 71
目录
·3·
4.4.2 查找与排序 .................................................................................................. 74 4.5 习题 ......................................................................................................................... 76
第 5 章 中断系统原理与应用 .............................................................................................. 77
5.1 中断系统概述 ......................................................................................................... 77 5.1.1 中断系统基本概念 ...................................................................................... 77 5.1.2 中断的主要功能 .......................................................................................... 78
5.2 MCS-51 中断系统的结构 ...................................................................................... 79 5.3 中断请求源 ............................................................................................................. 79 5.4 中断控制 ................................................................................................................. 81
5.4.1 中断允许寄存器 IE ..................................................................................... 81 5.4.2 中断优先级寄存器 IP.................................................................................. 82
5.5 中断响应过程 ......................................................................................................... 84 5.5.1 中断响应 ...................................................................................................... 84 5.5.2 中断返回 ...................................................................................................... 85
5.6 外部中断的响应时间 ............................................................................................. 85 5.7 外部中断的触发方式选择 ..................................................................................... 86
5.7.1 电平触发方式 .............................................................................................. 86 5.7.2 跳沿触发方式 .............................................................................................. 86
5.8 中断请求的撤消 ..................................................................................................... 86 5.9 中断服务程序的设计 ............................................................................................. 87 5.10 多个外部中断源系统设计 ................................................................................... 90
5.10.1 定时器/计数器作为外部中断源的使用方法 ........................................... 90 5.10.2 中断和查询结合的方法 ............................................................................ 91 5.10.3 用优先权编码器扩展外部中断源 ............................................................ 92
5.11 中断编程实例 ....................................................................................................... 94 5.12 习题 ....................................................................................................................... 96
第 6 章 定时器/计数器 ..............................................................................................97
6.1 定时器/计数器概述 ................................................................................................ 97 6.1.1 定时器/计数器结构 ..................................................................................... 97 6.1.2 定时器/计数器的初始化 ............................................................................. 99 6.1.3 定时器/计数器的工作方式 ....................................................................... 101
6.2 定时器/计数器综合应用举例 .............................................................................. 106 6.2.1 门控位 GATE 的应用 ................................................................................ 106 6.2.2 运行中读定时器/计数器 ........................................................................... 108 6.2.3 实时时钟的设计 ........................................................................................ 109
6.3 习题 ....................................................................................................................... 111
第 7 章 串行口 ........................................................................................................ 112
7.1 串行通信的基本概念 ........................................................................................... 112
MCS-51 系列单片机原理与接口技术
·4·
7.1.1 通信数据的传输方式 ................................................................................ 112 7.1.2 串行通信的两种基本通信方式 ................................................................ 113 7.1.3 串行通信数据的传送速率 ........................................................................ 114
7.2 串行口的工作方式 ............................................................................................... 114 7.2.1 方式 0 ......................................................................................................... 115 7.2.2 方式 1 ......................................................................................................... 116 7.2.3 方式 2 ......................................................................................................... 117 7.2.4 方式 3 ......................................................................................................... 118
7.3 波特率的设计 ....................................................................................................... 118 7.3.1 定时器的溢出率计算 ................................................................................ 119 7.3.2 串行口工作方式 1 和 3 的波特率设计 .................................................... 120
7.4 串行口的多机通信 ............................................................................................... 120 7.5 串行口编程和应用 ............................................................................................... 122
7.5.1 串行口发送和接收数据 ............................................................................ 122 7.5.2 双机通信 .................................................................................................... 123
7.6 习题 ....................................................................................................................... 128
第 8 章 MCS-51 单片机的存储器扩展 .................................................................... 129
8.1 外部程序存储器设计 ........................................................................................... 129 8.1.1 扩展程序存储器的接口设计 .................................................................... 129 8.1.2 2732 与 8031 的接口电路设计 ................................................................. 131 8.1.3 外扩 8KBEPROM 的 8031 系统 ............................................................... 134 8.1.4 扩展 16KB 的接口电路............................................................................. 136
8.2 外部数据存储器设计 ........................................................................................... 138 8.2.1 扩展 2KBRAM 的接口电路...................................................................... 140 8.2.2 扩展 8KBRAM 的接口电路...................................................................... 141 8.2.3 扩展 16KBRAM 和 16KBEPROM 的接口电路 ...................................... 143
8.3 习题 ....................................................................................................................... 144
第 9 章 I/O 接口扩展设计及应用............................................................................. 145
9.1 可编程并行 I/O 接口芯片 8255A........................................................................ 145 9.1.1 8255A 芯片简介 ........................................................................................ 145 9.1.2 8031 单片机和 8255A 的接口设计 .......................................................... 152
9.2 MCS-51 与可编程 RAM/IO 芯片 8155H 的接口 ............................................... 155 9.2.1 8155H 芯片介绍 ........................................................................................ 155 9.2.2 MCS-51 与 8155H 的接口设计................................................................. 160
9.3 用 74LSTTL 电路扩展并行 I/O 口 ...................................................................... 162 9.3.1 用 74LS377 扩展 8 位并行输出口............................................................ 162 9.3.2 用 74LS373 扩展 8 位并行输入口............................................................ 163 9.3.3 用三态门扩展 8 位并行输入口 ................................................................ 163 9.3.4 采用 74LSTTL 的 I/O 接口扩展应用举例 ............................................... 164
目录
·5·
9.4 LED 显示电路 ...................................................................................................... 165 9.4.1 LED 显示器结构及原理 ........................................................................... 165 9.4.2 LED 显示接口 ........................................................................................... 167 9.4.3 键盘接口 .................................................................................................... 170 9.4.4 可编程键盘/显示接口 8279 ...................................................................... 173 9.4.5 MCS-51 与 8279 的连接设计 ................................................................... 181
9.5 习题 ....................................................................................................................... 185
第 10 章 MCS-51 与 D/A、A/D 的接口设计 ............................................................ 186
10.1 D/A 转换器 ......................................................................................................... 186 10.1.1 概述 .......................................................................................................... 186 10.1.2 主要技术指标 .......................................................................................... 187
10.2 MCS-51 单片机与 8 位 D/A 转换器接口技术.................................................. 187 10.2.1 DAC0832 的技术指标............................................................................. 188 10.2.2 DAC0832 的结构及原理......................................................................... 188 10.2.3 DAC0832 管脚功能................................................................................. 189 10.2.4 8 位 D/A 转换器 ...................................................................................... 190 10.2.5 D/A 转换器的输出方式 .......................................................................... 192
10.3 MCS-51 单片机与 12 位 D/A 转换器接口技术................................................ 194 10.3.1 DAC1210 的技术指标............................................................................. 195 10.3.2 DAC1210 的结构与原理......................................................................... 195 10.3.3 8031 与 DAC1210 转换器接口技术 ....................................................... 197
10.4 D/A 转换器接口技术举例 ................................................................................. 199 10.4.1 单极性输出接口系统设计 ...................................................................... 199 10.4.2 双极性输出接口系统设计 ...................................................................... 200 10.4.3 双路 D/A 同步控制系统设计 ................................................................. 203
10.5 A/D 转换器 ......................................................................................................... 204 10.5.1 双积分 A/D 转换器原理 ......................................................................... 204 10.5.2 逐位逼近式 A/D 转换器原理 ................................................................. 205 10.5.3 描述 A/D 转换器的性能参数 ................................................................. 205
10.6 MCS-51 单片机与 8 位 A/D 转换器接口技术.................................................. 206 10.6.1 ADC0808/0809 的主要功能特点............................................................ 206 10.6.2 ADC0808/0809 的组成及工作原理........................................................ 206 10.6.3 ADC0808/0809 管脚功能........................................................................ 207 10.6.4 8031 与 ADC0808/0809 接口设计.......................................................... 208
10.7 MCS-51 单片机与 12 位 A/D 转换器接口技术................................................ 212 10.7.1 AD574 的技术指标 ................................................................................. 213 10.7.2 AD574 结构及工作原理 ......................................................................... 213 10.7.3 AD574 转换器的应用 ............................................................................. 215 10.7.4 AD574 与单片机的接口及程序设计 ..................................................... 216
MCS-51 系列单片机原理与接口技术
·6·
10.8 习题 ..................................................................................................................... 217
第 11 章 应用系统设计与开发 ................................................................................ 218
11.1 应用系统设计 ..................................................................................................... 218 11.1.1 总体设计 .................................................................................................. 218 11.1.2 应用系统的硬件电路设计 ...................................................................... 218 11.1.3 应用系统的软件设计 .............................................................................. 220 11.1.4 调试与固化 .............................................................................................. 220 11.1.5 程序固化 .................................................................................................. 221 11.1.6 硬件抗干扰措施 ...................................................................................... 221 11.1.7 软件的抗干扰设计 .................................................................................. 223
11.2 单片机开发系统开发工具 ................................................................................. 224 11.2.1 单片机开发系统的构成 .......................................................................... 224 11.2.2 单片机开发系统的功能 .......................................................................... 225 11.2.3 单片机开发器介绍 .................................................................................. 226
11.3 习题 ..................................................................................................................... 226
附录 A MCS-51 系列单片机指令表......................................................................... 227
附录 B 习题答案..................................................................................................... 233
第第 11 章章 单单片片机机概概述述
单片微型计算机(以下简称单片机)是微型计算机发展中的一个重要分支,其发展十分
迅速。单片机由于具有高可靠性、集成度高、价格低廉和容易产品化等特点,因此在智能仪
器仪表、工业实时控制、智能终端、通信设备、医疗器械、汽车电器和家用电器等领域得到
了广泛的应用。
1.1 什么是单片机
单片机又称单片微控制器,它把一个计算机系统集成到一块芯片上,其主要包括微处理
器(CPU)、存储器(随机访问存储器 RAM、只读存储器 ROM)和各种输入/输出接口(包
括定时器/计数器、并行 I/O 接口、串行口、A/D 转换器以及脉冲宽度调制(PWM,Pulse Width Modulation)等)。
相对于微型计算机,单片机扩展了各种功能,如 A/D、PWM、计数器的捕获/比较逻辑/高速 I/O 口、WDT 等,突破了微型计算机的传统内容,所以更准确地反映其本质的称呼应该
是微控制器。单片机主要用于嵌入式应用,故又被称为嵌入式微控制器(embedded microcontroller)。国际上常把单片机称为微控制器(MCU,Micro Controller Unit),而国内则
比较习惯称为“单片机”。
1.2 单片机的特点
1.集成度高 单片机把 CPU、RAM、ROM、I/O 接口以及定时器/计数器都集成在一个芯片上,和常
规的计算机系统相比,它具有体积小,集成度高的特点。 如 MCS-51 系列单片机,其时钟频率可达 12MHz,具有 16 位的定时器/计数器和 4 个并
行 I/O 接口,此外还提供有串行接口。 2.存储量大 采用 16 位地址总线的 8 位单片机可寻址外部 64KB 数据存储器和 64KB 程序存储器。此
外,大部分单片机还有片上 RAM(一般为 128~256B)和内部 ROM(一般为 2~4KB),在
大多数情况下,内部存储器就已经足够了,从而减少了器件的使用数量,降低了成本。 3.性能高、速度快 为了提高速度和执行效率,单片机使用 RISC 体系结构、并行流水线操作和 DSP 等设计
技术,指令运行速度大幅提高。一般单片机的时钟频率可以达到 12MHz。
MCS-51 系列单片机原理与接口技术
·2·
4.抗干扰性强 单片机的各种功能部件都集成在一块芯片上,特别是存储器也集成在芯片内部,因此单
片机布线短,大都在芯片内部传送数据,因此不易受到外部的干扰,增强了抗干扰能力,系
统运行更加可靠。 5.指令丰富 单片机一般都有传送指令、逻辑运算指令、转移指令和加、减运算指令、位操作指
令。
1.3 单片机的应用
(1)家用电器领域 洗衣机、电冰箱、空调、微波炉、电饭煲、电视机、录像机及其他视频音像设备的控制
器中已普遍采用单片机扩展电路取代传统的控制电路。 (2)办公自动化领域 一台 PC 可以嵌入 10 个单片机系统,如键盘、鼠标、显示器、CD-ROM、声卡、打印机、
软/硬盘驱动器和调制解调器等。 现代办公室中所使用的大量通信、信息产品,如绘图仪、复印机、电话、传真机及考勤
机等,多数都采用了单片机控制系统。 (3)工业自动化领域的应用 在工业自动化领域,如工业过程控制、过程检测、工业控制器及机电一体化控制系统等,
单片机系统主要用来实现信号的检测、数据的采集以及应用对象的控制。这些系统除一些小
型工控机外,许多都是以单片机为核心的单机或多机网络系统。 (4)智能仪器仪表与智能传感器领域 目前各种变送器、电器测量仪表普遍采用单片机应用系统代替传统的测量系统,使测量
系统具有各种智能化功能,如存储、数据处理、查找、判断、联网和语音功能等。 (5)汽车电子与航空航天电子系统 通常在这些电子系统中的集中显示系统、动力检测控制系统、自动驾驶系统、通信系统
以及运行监视器(黑匣子)等,都要构成冗余的网络系统。
1.4 单片机的历史
1971 年微处理器的研制成功后不久,就出现了单片机。单片机根据其基本操作处理的位
数可以分为:1 位单片机、4 位单片机、8 位单片机、16 位单片机和 32 位单片机。 早的单片机是 1 位的。其发展历史基本上可以分为以下 4 个阶段:
1.单片机初级阶段(1974~1976 年) 因工艺限制,早期的单片机普遍采用双片的形式,功能比较简单。例如仙童公司生产的
F8 单片机,实际上只包含 8 位 CPU、64B RAM 和 2 个并行口。因此还需加一块 3851(由 1KB
第 1 章 单片机概述
·3·
ROM、定时器/计数器和 2 个并行 I/O 构成)才能组成一台完整的计算机。 2.低性能单片机阶段(1976~1978 年) 此阶段的代表为 Intel 公司制造的 MCS-48 单片机,这种单片机内集成了 8 位 CPU、并行
I/O 口,8 位定时器/计数器和 RAM、ROM 等,其不足之处是无串行口,中断处理比较简单,
片内 RAM 和 ROM 容量较小,且寻址范围不大于 4KB。 3.高性能单片机阶段(1978~现在) 此阶段推出的单片机普遍带有串行口,多极中断系统,16 位定时器/计数器,片内 ROM、
RAM 容量加大,且寻址范围可达 64KB,有的片内还有 A/D 转换器。这类单片机的典型代表
是:Intel 公司的 MCS-51 系列、Motorola 公司的 6801 和 Zilog 公司的 Z8 等。这类单片机的
性价比高,因此仍被广泛应用,是目前应用比较广泛的单片机。 4.8 位单片机巩固发展以及 16 位、32 位单片机推出阶段(1982~现在) 此阶段的主要特征是,一方面发展 16 位单片机、32 位单片机及专用型单片机;另一方
面不断完善高档 8 位单片机,改善其结构,以满足不同的用户需求。16 位单片机的典型产品
如 Intel 公司生产的 MCS-96 系列单片机,其集成度已达 120 000 管子/片,主频为 12MHz,片内 RAM 为 232B,ROM 为 8KB,中断处理为 8 级,而且片内带有多通道 10 位 A/D 转换
器和高速输入/输出部件(HIS/HSO),实时处理能力很强。32 位单片机除了具有更高的集成
度外,其主频可达 20MHz,数据处理速度比 16 位单片机快了许多,性能比 8 位、16 位单片
机更加优越。
1.5 8 位单片机的主要生产厂家和机型
自 20 世纪 80 年代以来,单片机产品如雨后春笋般大量涌现。GI 公司、Rochwell 公司、
Intel 公司、Zilog 公司、Motorola 公司、NEC 公司等世界上几大计算机公司都纷纷推出自己
的单片机系列。据统计,现在市场上的单片机产品有 50 多个系列,数百个品种。 目前世界上较为著名的 8 位单片机的生产厂家和主要机型如下。 美国 Intel 公司:MCS-51 系列及其增强型系列 美国 Motorola 公司:6801 系列和 6805 系列 美国 Atmel 公司:89C51 系列 美国 Zilog 公司:Z8 系列及 SUPER8 美国 Fairchild 公司:F8 系列和 3870 系列 美国 Rockwell 公司:6500/1 系列 美国 TI(德克萨司仪器仪表)公司:TMS7000 系列 NS(美国国家半导体)公司:NS8070 系列 美国 RCA(无线电)公司:CDP1800 系列 日本松下(National)公司:MN6800 系列 日本 NEC(电气)公司:(COM87((PD7800))系列 日本 HITACHI(日立)公司:HD6301/HD63L05/HD6305 荷兰 PHILIPS(菲力浦)公司:8×C552 系列
MCS-51 系列单片机原理与接口技术
·4·
虽然单片机的品种很多,但在我国使用 多的还是 Intel 公司的 MCS-51 系列单片机。
MCS-51 系列单片机是在 MCS-48 系列的基础上于 20 世纪 80 年代初发展起来的,虽然它仍
然是 8 位的单片机,但它品种齐全、兼容性强、性能价格比高。且软硬件应用设计资料丰富,
已为广大工程技术人员所熟悉,因此在我国得到了广泛的应用。
1.6 单片机的最新发展
为了满足不同的用户要求、提高单片机的技术性能,各公司竞相推出能满足不同需要的
产品。其改进主要体现在以下几个方面。 1.CPU 的改进 (1)采用双 CPU 结构,以提高处理能力。 (2)增加数据总线宽度,单片机内部采用 16 位数据总线,其数据处理能力明显优于一
般 8 位单片机。 (3)采用流水线结构。指令以队列形式出现在 CPU 中,且具有很快的运算速度。尤其适
合于做数字信号处理用,例如 TMS320 系列数字信号处理机。 (4)串行总线结构。菲利浦公司开发了一种新型总线——IIC 总线(Inter—ICbus,也称
I2C 总线)。该总线是用 3 条数据线代替现行的 8 位数据总线,从而大大地减少了单片机引线,
降低了单片机的成本。目前许多公司都在积极的开发此类产品。 2.存储器的改进 (1)增加存储容量:新型单片机片内 ROM 一般可达 4K~8KB,RAM 为 256B。有的单
片机片内 ROM 容量可达 128KB。 (2)片内 EPROM 采用 E2PROM 或闪速(Flash)存储器:片内 EPROM 由于需要高压编
程写入,紫外线擦抹给用户带来不便。E2PROM 或闪速存储器,能在+5V 电压下读写,不需
紫外线擦抹,既具有静态 RAM 读写操作的简便,又具有在掉电时数据不会丢失的优点。 由于闪速存储器中数据写入后能永久保持,因此,有的单片机将它们作为片内 RAM 使
用,甚至有的单片机将闪速存储器用做片内通用寄存器。 (3)程序保密化:一般 EPROM 中的程序很容易被复制。为防止复制,某些公司开始采
用 KEPROM(KeyedacessEPROM)编程写入,有的则对片内 EPROM 或 EEPROM 加锁。加
锁后,用户无法读取其中的程序。若要去读,必须抹去 EEPROM 中的信息,这就达到了程
序保密的目的。 3.片内 I/O 的改进 单片机有较多的并行口,以满足外围设备、芯片扩展的需要。单片机配有串行口,以满
足多机通信的要求。 (1)增加并行口的驱动能力。这样可减少外部驱动芯片。有的单片机能直接输出大电流
和高电压,以便能直接驱动 LED 和 VFD(荧光显示器)。 (2)增加 I/O 口的逻辑控制功能。大部分单片机的 I/O 口都能进行逻辑操作。高档单片
机的位处理系统能够对 I/O 口进行位寻址及位操作,大大加强了 I/O 口线控制的灵活性。 (3)有些单片机设置了一些特殊的串行接口功能,为构成网络化系统提供了方便条件。
第 1 章 单片机概述
·5·
4.外围电路内装化 早期的单片机采用 PMOS 工艺,接着由 PMOS 发展到 NMOS 工艺。目前高档单片机已
基本上采用了具有高性能的 HMOS 和 CMOS 工艺。随着半导体技术的发展,单片机的集成
度不断提高,把众多的外围功能器件都集成在片内。除了一般必须具有的 ROM、RAM、定
时器/计数器和中断系统外,为了适应检测、控制等更高的要求,有些单片机还集成有 A/D 转
换器、D/A 转换器、DMA 控制器、中断控制器、锁相环、频率合成器、字符发生器、声音
发生器、CRT 控制器和译码驱动器等。 随着集成电路技术及工艺的不断发展,装入片内的外围电路也可以是大规模的。把所需
的外围电路全部装入单片机内,使系统单片化是目前单片机发展趋势之一。 5.低功耗和供电范围加宽 8 位单片机中有一半的产品已 CMOS 化。CMOS 芯片的单片机本身具有功耗小的优点,
而且为了充分发挥低功耗的特点,这类单片机普遍配置有 Wait 和 Stop 两种工作方式。例如,
采用CHMOS工艺的MCS-51系列单片机80C51BH/80C31BH/87C51在正常运行(5V,12MHz)时,工作电流为 16mA,同样条件下在 Wait 方式工作时,工作电流则为 3.7mA,而在 Stop方式(2V)工作时,工作电流仅为 50μA。
对于 NMOS 工艺的单片机工作电源,一般为 4.5~5.5V,采用 CMOS 工艺的单片机,工
作电压范围可展宽至 3~6V。 随着科技的发展,单片机将向多功能、高性能、高速度、低电压、低功耗、低价格、外
围电路内装化以及片内存储器容量增加和 Flash 存储器化方向发展。但其位数不一定会继续
增加,尽管现在已经有了 32 位单片机,但使用得并不多。此外,专用化也是单片机的一个发
展方向,针对单一用途的专用单片机将会越来越多。
1.7 MCS-51 系列单片机
MCS 是 Intel 公司的注册商标。凡 Intel 公司生产的以 8051 为核心单元的其他派生单片
机都可以称为 MCS-51 系列,有时简称为 51 系列。MCS-51 系列单片机包括 3 个基本型 8031、8051、8751 和对应的低功耗型 801231、80C51、87C51。
20 世纪 80 年代中期以后,Intel 公司以专利转让的形式把 8051 内核技术转让给许多半导
体芯片生产厂家,如 ATMEL、PHILIPS、ANALOGDEVICES、DALLAS 等。这些厂家生产
的芯片是 MCS-51 系列的兼容产品,准确地说是与 MCS-51 指令系统兼容的单片机。这些兼
容机与 8051 的系统结构(主要是指令系统)相同,采用 CMOS 工艺,因而,常用 80C51 系
列来称呼所有具有 8051 指令系统的单片机。但是,这些公司生产的以 8051 为核心的其他派
生单片机却不能称为 MCS-51 系列,只能称为 8051 系列。也就是说,MCS-51 系列是专指 Intel公司生产的以 8051 为核心单元的单片机,而 8051 系列泛指所有公司(也包括 Intel 公司)生
产的以 8051 为核心单元的所有单片机。 MCS-51 系列及 80C51 单片机有多种品种。它们的引脚及指令系统相互兼容,主要在内
部结构上有些区别。目前使用的 MCS-51 系列单片机及其兼容产品通常分成以下几类:
MCS-51 系列单片机原理与接口技术
·6·
1.基本型(典型产品:8031/8051/8751) 8031 内部包括一个 8 位 CPU、128B RAM,21 个特殊功能寄存器(SFR)、4 个 8 位并行
I/O 口、1 个全双工串行口,2 个 16 位定时器计数器。片内无程序存储器,需外扩 EPROM 芯
片。 8051 以 8031 为基础,片内又集成有 4KB ROM 作为程序存储器,是一个程序不超过 4KB
的小系统。ROM 内的程序是公司制作芯片时,代为用户烧制的,出厂的 8051 都是含有特殊
用途的单片机。 8751 在 8031 基础上,增加了 4KB 的 EPROM,它构成了一个程序小于 4KB 的小系统。
用户可以将程序固化在 EPROM 中,可以反复修改程序。但其价格相对于 8031 较贵。8031外扩一片 4KB EPROM 就相当于 8751,价格较低。集成电路能装入片内的外围接口电路也可
以是大规模的。 2.增强型 Intel 公司在 MCS-51 系列 3 种基本型产品基础上,又推出增强型系列产品,即 52 子系
列,典型产品为 8032/8052/8752。它们的内部 RAM 增到 256B,8052、8752 的内部程序存
储器扩展到 8KB,16 位定时器/计数器增至 3 个,具有 6 个中断源,串行口通信速率提高 5倍。
3.低功耗型 代表性产品为 80C31BH/87C51/80C51,采用 CI-IMOS 工艺,功耗很低。例如,8051
的功耗为 630mW,而 80C51 的功耗只有 120mW,它们用于低功耗的便携式产品或航天技
术中。此类单片机有两种掉电工作方式: 一种掉电工作方式是 CPU 停止工作,其他部分仍继续工作;另一种掉电工作方式是,除
片内 RAM 继续保持数据外,其他部分都停止工作。此类单片机的功耗低,非常适于电池供
电或其他要求低功耗的场合。 4.专用型 如 Intel 公司的 8044/8744,它们在 8051 的基础上,又增加一个串行接口部件,主要用于
利用串行口进行通信的总线分布式控制系统。 再如美国 Cypress 公司 近推出的 EZU SR-2100 单片机,它是在 8051 单片机内核的基础
上,又增加了 USB 接口电路,可专门用于 USB 串行接口通信。 5.超 8 位型 在 8052 的基础上,采用 CHMOS 工艺,并将 MCS-96 系列(16 位单片机)中的一些 I/O
部件如高速输入/输出(HSI/HSO)、A/D 转换器、脉冲宽度调制(PWM)和看门狗定时器
(WATCHDOG)等移植进来构成新一代 MCS-51 产品。PHilIPS(菲力蒲)公司生产的
80C552/87C552/83C552 系列即为此类产品。目前此类单片机在我国已得到了较为广泛的使
用。 6.片内闪速存储器型 随着半导体存储器制造技术和大规模集成电路制造技术的发展,片内带有闪速(Flash)
存储器的单片机在我国已得到广泛的应用。其中, 具代表性的产品是美国 ATMEL 公司推
出的 AT89C51,是一个低功耗、高性能的含有 4KB 闪速存储器的 8 位 CMOS 单片机,时钟
频率高达 20MHz,与 8031 的指令系统和引脚完全兼容。闪速存储器允许在线(+5V)电擦
第 1 章 单片机概述
·7·
除、电写入或使用通用编程器对其重复编程。此外,89C51 还支持由软件选择的两种掉电工
作方式,非常适于电池供电或其他要求低功耗的场合。片内带 EPROM 的 87C51 价格偏高,
而 89C51 芯片内的 4KB 闪烁存储器可在线编程或使用编程器重复编程,且价格较低,因此
89C51 受到了应用设计者的欢迎。 尽管 MCS-51 系列单片机以及 80C51 系列单片机有多种类型,但是因为 MCS-51 系列是
所有兼容、扩展型单片机的基础,因此掌握其基本型(8031、8051、8751 或 80C31、80C51、87C51)就显得十分重要了。
1.8 习题
1.什么是单片机? 2.单片机有何特点? 3.单片机主要应用在哪些领域? 4.单片机的主要发展方向有哪些? 5.MCS-51 系列中 8031、8051、8751 有什么区别?
第第 22 章章 MMCCSS--5511 系系列列单单片片机机的的基基本本结结构构
熟悉并掌握单片机的基本结构是后续学习和应用设计的基础。本章先对 MCS-51 单片机
的外部引脚及内部硬件结构做简要介绍,之后对单片机的工作方式与工作时序做详细的介绍。
通过本章的学习,读者可以对 MCS-51 单片机的硬件结构以及工作原理有较为深刻的了解。
2.1 MCS-51 单片机的外部引脚及功能
掌握 MCS-51 单片机,应先了解 MCS-51 的引脚,熟悉并牢记各引脚的功能。MCS-51的制造工艺为 HMOS,采用 40 引脚的双列直插式(DIP)封装,其外部引脚配置如图 2-1所示。
图 2-1 MCS-51 单片机外部引脚图
CHMOS 制造工艺的 80C51/80C31 除采用 DIP 封装外,还采用方形封装(如 PLCC44、QFP44),如图 2-2 所示。
MCS-51 单片机的 40 条引脚按功能来分,可分为 3 部分,电源及时钟引脚、控制引脚和
输入/输出引脚。
第 2 章 MCS-51 系列单片机的基本结构
·9·
(a)PLCC 封装图 (b)PQFP/TQFP 封装图
图 2-2 44 引脚封装图
2.1.1 主电源及时钟引脚
此类引脚包括电源引脚 Vcc、Vss、时钟引脚 XTALl、XTAL2。 (1)Vcc(40 脚):接+5V 电源,为单片机芯片提供电能。 (2)Vss(20 脚):接地。 (3)XTALl(19 脚):在单片机内部,它是一个反向放大器的输入端,该放大器构成了
片内的振荡器,可提供单片机的时钟控制信号。该时钟引脚也可接外部晶体振荡器的一个引
脚,采用外部振荡器时,对 HMOS 单片机系统,此引脚应接地;而对 CHMOS 单片机系统,
此引脚应作为驱动端。 (4)XTAL2(18 脚):在单片机内部,接至上述振荡器的反向输出端。当采用外部振荡
器时,对 HMOS 单片机来说,该引脚接收振荡器的信号,即把该信号直接接到内部时钟发生
器的输入端;对 CHMOS 单片机来说,此引脚应悬空。
2.1.2 控制引脚
此类引脚包括 RESET(即 RST/VPD)、 PROGALE/ 、PSEN 、PP/EA V ,可以提供控制
信号,有些具有复用的功能。 (1)RST/VPD(9 脚),复位信号输入端,高电平有效。当振荡器运行时,在此引脚加上
两个机器周期的高电平将使单片机复位(REST)。复位后应使此引脚电平保持为不高于 0.5V的低电平,以保证单片机正常工作。
掉电期间,此引脚可接上备用电源(VPD),以保持内部 RAM 中的数据不丢失。当 Vcc下降到低于规定值,而 VPD在其规定的电压范围内(5±0.5V)时,VPD就向内部 RAM 提供
备用电源。 (2) PROGALE/ (30 脚),ALE 为地址锁存允许信号。当单片机访问外部存储器时,
ALE(地址锁存允许)输出脉冲的下降沿用于锁存 16 位地址的低 8 位。即使不访问外部存储
器,ALE 端仍有周期性正脉冲输出,其频率为振荡器频率的 1/6。但是,每当访问外部数据
MCS-51 系列单片机原理与接口技术
·10·
存储器时,在两个机器周期中 ALE 只出现一次,即丢失一个 ALE 脉冲。ALE 端可以驱动 8个 LS TTL 负载。
对于片内具有 EPROM 型的单片机(如 8751),在 EPROM 编程期间,此引脚是编程脉
冲输入端。 (3)PSEN(29 脚),程序存储器允许输出控制端。此输出为单片内访问外部程序存储
器的读选通信号。在从外部程序存储器取指令(或取常数)期间,每个机器周期均 PSEN两
次有效。但在此期间,每当访问外部数据存储器时,这两次有效的 PSEN信号将不会出现。
PSEN同样可以驱动 8 个 LS TTL 负载。 如要检查某个 MCS-51 单片机应用系统上电后,CPU 能否正常到外部程序存储器读取指
令码,可以使用示波器检查 PSEN端有无脉冲输出,如有,则说明单片机应用系统基本工作
正常。 (4)
PP/EA V (31 脚),EA 功能为内外程序存储器选择控制端。当EA 端保持高电平时,
单片机访问内部程序存储器(对 8051、8751 来说),但在 PC(程序计数器)值超过 0FFFH时,将自动转向执行外部程序存储器内的程序。
当EA端保持低电平时,则只访问外部程序存储器,而不管它是否有内部程序存储器。
但对 8031 来说,该脚必须接地,因为其无内部程序存储器,只能选择外部程序存储器。 对于内有 EPROM 的单片机 8751,在 EPROM 编程期间,此引脚用于施加+21V 的编程
电源 Vpp。
2.1.3 输入/输出引脚
此类引脚包括 P0 口、P1 口、P2 口和 P3 口。 (1)P0(P0.0~P0.7)是一个 8 位三态双向 I/O 口,在不访问外部存储器时,做通用 I/O
口使用,用于传送 CPU 的输入/输出数据,当访问外部存储器时,此口为地址总线低 8 位及
数据总线分时复用口,可带 8 个 LS TTL 负载。 (2)P1(P1.0~P1.7)是一个 8 位准双向 I/O 口(作为输入时,口锁存器置 1),带有内
部上拉电阻,可带 4 个 LS TTL 负载。 (3)P2(P2.0-P2.7)是一个 8 位准双向 I/O 口,与地址总线高 8 位复用,可驱动 4 个 LS
TTL 负载。 (4)P3(P3.0~P3.7)是一个 8 位准双向 I/O 口,带有内部上拉电阻,可驱动 4 个 LS TTL
负载。P3 口为双功能口,它的第一功能作为通用 I/O 口,第二功能做控制口,如表 2-1 所示。
表 2-1 P3 口各个位的第二功能 P3 口的位 第二功能 说明
P3.0 RXD 串行数据接收口 P3.1 TXD 串行数据发送口 P3.2 INT0 外部中断 0 输入 P3.3 INT1 外部中断 1 输入 P3.4 T0 计数器。计数输入 P3.5 T1 计数器 1 计数输入 P3.6 WR 外部 RAM 写信号 P3.7 RD 外部 RAM 读信号
第 2 章 MCS-51 系列单片机的基本结构
·11·
P1 口、P2 口和 P3 口的各 I/O 口线片内均有固定的上拉电阻。当这 3 个准双向 I/O 口做
输入口使用时,要向该口先写“1”,另外准双向 I/O 口无高阻的“浮空”状态。P0 口线内
无固定上拉电阻,由两个 MOS 管串接,既可开漏输出,又可处于高阻的“浮空”状态,故
称为双向三态 I/O 口。
2.2 MCS-51 单片机的内部结构
MCS-51 单片机内部结构如图 2-3 所示。按功能划分,它由微处理器(CPU)、存储器、
I/O 端口、定时器/计数器和中断系统等 5 部分组成。
图 2-3 MCS-51 单片机内部结构图
2.2.1 MCS-51 单片机微处理器(CPU)
微处理器是单片机内部的核心部件,它决定了单片机的主要功能特性。微处理器由运算
器、控制器和专用寄存器组等组成。 1.运算器 运算器模块包括算术逻辑部件(ALU)、位处理器、累加器(A)、寄存器 B、暂存器
MCS-51 系列单片机原理与接口技术
·12·
以及程序状态字寄存器(PSW)等。该模块的功能是实现数据的算术逻辑运算、位变量处理
和数据传送操作。 ALU 的功能很强,它不仅可以对 8 位变量进行逻辑“与”、“或”、“异或”、循环、
求补和清零等基本操作,还可以进行加、减、乘、除等基本算术运算。ALU 还具有一般的微
计算机 ALU 不具备的功能,即位处理操作,它可对(bit)变量进行位处理,如置位、清零、
求补、测试转移及逻辑“与”、“或”等操作。 2.定时控制部件 定时控制部件起着控制器的作用,由定时控制逻辑、程序计数器(PC)、指令寄存器 IR、
指令译码器和振荡器(OSC,OSCillator)电路组成。 指令寄存器 IR 用于存放从程序存储器中取出的指令码。执行程序时,首先进行程序存
储器的读指令操作,也就是根据 PC 给出的地址从程序存储器中取出指令,并送指令寄存器
IR,IR 的输出送指令译码器(ID),然后由指令译码器对该指令进行译码,译码结果送定时
控制逻辑电路。定时控制逻辑在 OSC 配合下产生指令的时序脉冲,以完成相应指令的执行。
OSC 是控制器的心脏,为控制器提供时钟脉冲。 MCS-51 的时钟可以由内部或外部产生,内部方式的时钟电路如图 2-4(a)所示,利用
单片机内部的振荡电路,并在 XTALl 和 XTAL2 两引脚间外接晶体以及电容构成的并联谐振
电路,使内部振荡器产生自激振荡。晶体可以在 1.2~12MHz 之间,电容 C1 和 C2 可以在 20~100pF 之间选择,电容的大小对振荡频率有微小的影响,可起频率微调作用。外部方式的时
钟电路如图 2-4(b)所示,XTALl 接地,XTAL2 接外部振荡器。外部振荡器的振荡信号应
低于 12MHz 的方波信号。为保证 XTAL2 的电平为 TTL 逻辑,可在上面接一个 4.7~10kΩ的上拉电阻。
图 2-4 MCS-51 单片机时钟电路
控制部件是单片机的神经中枢,以主频率为基准控制 CPU 的时序,对指令进行译码,然
后发出各种控制信号。 3.专用寄存器组 专用寄存器组主要用于表示当前要执行指令的内存地址、存放操作数和指示指令执行后
的状态等。它是任何一台计算机的 CPU 不可缺少的组成部件,寄存器的多少因机器型号不同
而不同。专用寄存器组主要包括程序计数器(PC)、累加器(A)、通用寄存器 B、程序状
态寄存器 PSW、堆栈指针 SP 和数据指针 DPTR 等。 (1)程序计数器(PC) 程序计数器是控制部件中最基本的寄存器,是二进制 16 位的程序地址寄存器,专门
用来存放下一条需要执行的指令在程序存储器中的地址,能自动加 1。CPU 执行指令时,
第 2 章 MCS-51 系列单片机的基本结构
·13·
它根据程序计数器(PC)中的地址从程序存储器中取出当前需要执行的指令码,并把它
送给控制器分析执行,随后程序计数器(PC)中地址码自动加 1,以便为 CPU 取下一个
需要执行的指令码做准备。当下一个指令字节取出执行后,PC 又自动加 1,这样,程序
计数器(PC)一次次加 1,指令就被一条条执行。所以,需要执行程序的机器码必须在程
序执行前预先一条条地按顺序放到程序存储器中,并将程序计数器(PC)设置为程序中
第一条指令的内存地址。 程序计数器的基本工作方式有 3 种。 ①程序计数器自动加 1,这是最基本的工作方式。 ②执行有条件或无条件转移指令时,程序计数器将被置入新的数值,从而使程序的流向
发生变化。 ③在执行调用子程序指令或响应中断时,单片机自动完成如下中断操作: 将 PC 的值,即下一条将要执行的指令的地址(也是断点值)自动送入堆栈。 将子程序的入口地址或中断向量的地址送入 PC,程序流向发生变换,执行子程序或
中断子程序。子程序或中断子程序执行完毕,遇到返回指令 RET 或 RETI 时,将栈顶的断点
值弹到程序计数器(PC)中,程序的流程又返回到原来的地方,继续执行。 8051 程序计数器(PC)由 16 个触发器构成,故它的编码范围为 0000H~FFFFH,共 64KB。
这就是说 8051 的程序存储器的寻址范围为 64KB。如果想为 8051 配置大于 64KB 的程序存
储器,就必须在制造 8051 器件时加长程序计数器的位数,但在实际应用中,64KB 的程序存
储空间已足够了。 (2)累加器(A,Accumulator) 累加器(A)是一个最常用的具有特殊用途的二进制 8 位寄存器,又可记作 ACC,专门
用来存放操作数或运算结果。在 CPU 执行某种运算前,大部分单操作数指令的操作数取自累
加器;两操作数指令中通常有一个操作数放在累加器(A)中,运算完成后累加器(A)中便
可得到运算结果。例如加、减、乘、除算术运算指令的运算结果都存放于累加器(A)或 AB寄存器中。
累加器的作用如下。 ①累加器(A)是 ALU 单元的输入之一,因而是数据处理器之一。同时它还是 ALU 运
算结果的存放单元。 ②累加器(A)相当于数据的中转站。由于数据传送大多数都通过累加器(A),因此累
加器容易产生“堵塞”现象,即累加器具有“瓶颈”现象。 累加器(A)的进位标志 CY 比较特殊,因为它同时又是位处理器的位累加器。 (3)通用寄存器 B 通用寄存器 B 是专门为乘法和除法设置的寄存器,也是一个二进制 8 位寄存器,由 8 个
触发器组成。 该寄存器在作乘法或除法前,用来存放乘数或除数,在乘法或除法完成后用于存放乘积
的高 8 位或除法的余数,如除法指令中,被除数取自 A,除数取自 B,运算后商存放于 A,
余数存放于 B 中。 (4)程序状态字(PSW,ProgramStatusWord)寄存器 PSW 是一个 8 位标志寄存器,位于单片机片内的特殊功能寄存区,字节地址为 D0H。
PSW 的不同位存放了指令执行后的有关状态。PSW 中各位状态一般是在指令执行过程中形
MCS-51 系列单片机原理与接口技术
·14·
成的,但也可以根据需要采用传送指令加以改变。它的各标志位定义如下: ①CY(Carry):进位标志位。用于表示加减法运算时最高位有无进位或借位。在加法
运算时,若累加器最高位有进位,则 CY=1,否则 CY=0;在减法运算时,若有借位则 CY=1,否则 CY=0。在执行算术和逻辑指令时,可以被硬件或软件置位或清除。在布尔处理机(即
位处理机)中,它是位累加器。此外,CPU 在进行移位操作时也会影响这个标志位。 ②AC(Auxiliary Carry):辅助进位标志。当进行加法或减法操作并产生由低 4 位数向
高 4 位进位或借位时,AC 将被硬件置为 l,否则就被清零(即 AC=0)。若 AC=0,则表示
在加减过程中 A3 没有向 A4 进位或借位;若 AC=l,则表示加减过程中 A3 向 A4 有了进位
或借位。 ③F0(Flag zero):用户标志位。F0 标志位的状态通常不是机器在执行指令过程中自动
形成的,要由用户根据程序执行的需要通过软件对它置位或清除。该标志位状态一经设定,
便可通过软件测试来决定用户程序的流向。 ④RSl、RS0:寄存器选择位。8051 共有 8 个 8 位工作寄存器 R0~R7,可以用软件置位
或清除以确定当前使用的工作寄存器区。用户可以通过改变 RSl 和 RS0 的状态来决定 R0~R7 的实际物理地址。
RSl、RS0 与工作寄存器 R0~R7 的物理地址之间的关系如表 2-2 所示。
表 2-2 RSl、RS0 与工作寄存器地址之间的关系
RS1 RS0 工作寄存器区 R0~R7 的物理地址 0 0 0 组 00H~07H 0 1 1 组 08H~0FH 1 0 2 组 10H~17H 1 1 3 组 18H~1FH
例如:当(RSl、RS0)取(0、0)时,CPU 选中第 0 组为当前工作寄存器。 ⑤OV(Overflow):溢出标志位。用以指示运算过程中是否发生了溢出,由机器执行指
令过程中自动形成。若机器在执行运算指令过程中,累加器(A)中运算结果超出了 8 位带
符号数(2 的补码)所能表示的范围,即-128~+127,则 OV 被置位为 1,否则 OV 为 0。人
们根据执行运算指令后的 OV 状态,就可判断累加器(A)中的结果是否正确。 ⑥P(Parity):奇偶标志位。用于表示累加器(A)中值为 1 的二进制位的奇偶数。若
累加器(A)中 1 的个数为奇数时,P 为 1;若累加器中 1 的个数为偶数时,P 为 0。在串行
通信中常用奇偶校验的方法来检验数据传输结果的正确性。 (5)堆栈指针(SP,StackPointor) SP 是一个 8 位寄存器,指向专门在内存中留出来的数据存储器区域,即指示堆栈的位
置。堆栈是以“先进后出”或“后进先出”的方式进行数据操作的,也就是说最先存入堆
栈的数据最后才能取出,最近存入的数据可以最先取出。堆栈有栈顶和栈底之分,栈底由
栈底地址标识,栈顶由栈顶地址指示。栈底地址是固定不变的,它决定了堆栈在 RAM 中的
物理位置;栈顶地址始终在 SP 中,即由 SP 指示,它决定堆栈中是否存放有数据。因此,
D7 D6 D5 D4 D3 D2 D1 D0 CY AC F0 RS1 RS0 OV -- P PSW.7 PSW.6 PSW.5 PSW.4 PSW.3 PSW.2 PSW.1 PSW.0
第 2 章 MCS-51 系列单片机的基本结构
·15·
当堆栈中空无数据时,栈顶地址必定和栈底地址重合,即 SP 中一定是栈底地址;当堆栈中
存放的数据越多,SP 中的栈项地址比栈底地址就越大。因此 SP 始终指示着椎栈中最上面
的那个数据。 系统在复位后,SP 初始化为 07H,因此堆栈实际上由 08H 单元开始。08H~1FH 单元
分别属于工作寄存器区 1~3,若在程序设计中要用到这些区,则最好把 SP 值用软件改设
为 1FH 或更大的值。通常将堆栈区设在 30H~7FH 区间,因为 20H~2FH 区为位寻址空间。
由于堆栈区在程序中没有标识,因此程序设计人员在进行程序设计时应主动给可能的堆栈
区空出若干存储单元,这些单元是禁止用传送指令存放数据的,只能由 PUSH 和 POP 指令
访问它们。 (6)数据指针(DPTR,DataPointer) 数据指针是一个 16 位专用寄存器,由两个 8 位寄存器 DPH 和 DPL 组成。DPH 为高 8
位字节,DPL 为低 8 位字节。DPTR 主要用来保持 16 位地址,当对 64KB 外部数据存储器空
间寻址时,可做为间址寄存器使用。 例如:MOVX A,@DPTR MOVX @DPTR,A 在访问程序存储器时,DPTR 可用做基址寄存器。 例如:MOVC A,@A+DPTR,常用于读取存放在程序存储器中的表格常数。 (7)端口 P0~P3 专用寄存器 P0、P1、P2 和 P3 分别是 I/O 口 P0~P3 的锁存器。在 MCS-51 中,可以把
I/O 口当作一般专用寄存器来使用,不再专设口操作指令,都采用统一的 MOV 指令,P0~P3 在其他操作指令中,作为专用寄存器还可以以直接寻址方式。
(8)串行数据缓冲器 SBUF 串行数据缓冲器 SBUF 用于存放欲发送或已接收的数据,它实际上由两个独立的寄存器
组成。一个是发送缓冲器,另一个是接收缓冲器,从 SBUF 取数据器,取走的是刚接收到的
数据。 (9)定时器/计数器 MCS-51 中有两个 16 位定时器/计数器 T0 和 T1,它们各由两个独立的 8 位寄存器组成,
共有 4 个寄存器 TH0、TL0、THl、TLl。可以对这 4 个 8 位寄存器寻址,但不能把 T0 和 T1当作一个 16 位寄存器来寻址。
(10)其他控制寄存器 IP、IE、TMOD、TCON、SCON 和 PCON 寄存器分别包含有中断系统、定时器/计数器、
串行口和供电方式的控制和状态位。
2.2.2 MCS-51 单片机的存储器结构
MCS-51 单片机片内集成有一定容量的程序存储器(8031/8032/80C31 除外)和数据存储
器,此外,它还具有强大的外部存储器扩展能力。图 2-5 所示是 MCS-51 存储器结构图。
MCS-51 系列单片机原理与接口技术
·16·
图 2-5 MCS-51 存储器结构图
物理上,MCS-51 有 4 个存储器空间:片内程序存储器和片外程序存储器,以及片内数
据存储器和片外数据存储器。从用户使用的角度,即逻辑上,MCS-51 有 3 个存储器地址空
间:片内外统一的 64KB 的程序存储器地址空间,256B(对 51 子系列)或 384B(对 52 子系
列)的内部数据存储器地址空间(其中 128B 的特殊功能寄存器地址空间,仅有 20B 左右是
有实际定义的),以及 64KB 的外部数据存储器地址空间(即外部 RAM)。在访问这 3 个不
同的逻辑空间时应采用不同形式的指令。 1.程序存储器 程序存储器用来存放源程序和表格常数。程序存储器是以程序计数器(PC)作地址指针
的。MCS-51 单片机的程序计数器(PC)为 16 位,因此可以寻址到的地址空间为 64KB。 程序存储器空间可以分为片内和片外两部分,CPU 访问片内和片外程序存储器可以由
EA 引脚所接的电平来确定。 EA 引脚接高电平时,程序将从片内程序存储器开始执行,即访问片内程序存储器;当
PC 值超出片内 ROM 的容量时,会自动转向片外程序存储器空间执行程序。 EA 引脚接低电平时,将迫使单片机只能执行片外程序存储器中的程序。 8051 和 8751 内部有 4KB ROM/EPROM 程序存储器,1000H~FFFFH 为外部扩展程序存
储器空间,应将EA 引脚固定接高电平。若接低电平,则可用于程序调试,即将欲调试的程
序设置在与片内 ROM 空间重叠的片外程序存储器内,CPU 执行片外存储器的程序来进行程
序的调试。8031 片内没有程序存储器,0000H~FFFFH 都是外部程序存储器地址空间,其EA引脚应固定接低电平。
在 64KB 的程序存储器中有 7 个地址单元具有特殊功能。MCS-51 单片机在复位后程
序计数器(PC)的内容为 0000H,所以系统必须从 0000H 单元开始取指令,执行程序。
因为 0000H 是系统的启动地址,所以用户在设计程序时一般会在该单元中存放一条绝对
跳转指令,而主程序则是从跳转到的新地址处开始安放。除 0000H 单元外,其他 6 个特
第 2 章 MCS-51 系列单片机的基本结构
·17·
殊单元分别对应于 6 种中断源的中断服务子程序的入口地址,如表 2-3 所示。通常在程序
设计时会在这些入口地址处安放一条绝对跳转指令,而真正的中断服务子程序从转移地址
开始安放。
表 2-3 各中断服务子程序的入口地址
中断源 入口地址 外部中断 0 0003H
定时器 0 溢出中断 000BH
外部中断 1 0013H
定时器 1 溢出中断 001BH
串行口中断 0023H 2.片内数据存储器(片内 RAM) RAM 主要是用来存放数据的,又称为数据存储器。RAM 有片外和片内之分。片外 RAM
可有 64KB,地址范围为 0000H~FFFFH;片内 RAM,它在物理上又可以分为 3 个不同的块:
00H~7FH(0~127)单元组成的低 128B RAM 块,80H~FFH(128~255)单元组成的高 128B的 RAM 块(仅 8032/8052 单片机中有这一块),以及 128B 的特殊功能寄存器(SFR)块。
在 51 子系列中,只有低 128B 的 RAM 块和 128B 的专用寄存器块,后者占有 80H~FFH(128~255)地址空间,两块地址空间是相连的。在 52 子系列中,高 128B RAM 块与 SFR 块的地址
是重合的,究竟访问哪一块是通过不同的寻址方式加以区分的。访问高地址字节 RAM 时采
用寄存器间接寻址方式,访问 SFR 块时则只能采用直接寻址方式。访问低 128B RAM 时,两
种寻址方式都可采用。要注意的是,128B 的 SFR 块中仅有 26B 是有定义的,若访问的是这
一块中没有定义的单元,则将得到一个不确定的随机数。片内 RAM 的地址范围 00H~FFH和片外 RAM 的地址范围 0000H~00FFH 实际上是同一个地址范围的两种不同表示方法。为
了指示机器到片内 RAM 寻址还是到片外 RAM 寻址,单片机器件设计者为用户提供了两类
不同的传送指令,如 MOV 指令用于片内 00H~FFH 范围内的寻址,MOVX 指令用于片外
0000H~FFFFH 范围内的寻址。8051 内部数据存储器的分配如图 2-6 所示。 (1)工作寄存器区:00H~1FH 单元共 32B,分为 4 个通用工作寄存器区,每个区含 8
个寄存器,编号为 R0~R7,在专用寄存器 PSW(程序状态字)中由 RS0、RSl(见表 2-2)来确定采用哪一个工作寄存器区。若程序中并不需要 4 组工作寄存器,那么剩下的工作寄存
器区所对应的单元也可以作一般的数据缓冲器使用。 (2)位寻址区(20H~2FH):这 16 个 RAM 单元具有双重功能。它们既可以像普通
RAM 单元一样按字节存取,也可以对每个 RAM 单元中的任何一位单独存取,这就是位寻
址。20H~2FH 用作位寻址时,共有 16×8=128 位,每位都分配了一个特定地址,即 00H~
7FH。这些地址称为位地址,如图 2-6 所示。位地址在位寻址指令中使用。例如,把 24H单元中最高位(位地址为 27H)置位成 1,则可使用如下位置位指令:
SETB 27H ;27H←1,SETB 为置位指令的操作码
MCS-51 系列单片机原理与接口技术
·18·
图 2-6 8051 内部 RAM 的分配
位地址的另一种表示方法是采用字节地址和位地址结合的表示法。例如:位地址 05H 可
以表示成 20H.5。 (3)数据缓冲区:总共有 80 个 RAM 单元,用于存放用户数据或做堆栈操作使用。中
断系统中的堆栈一般都设在这一区域内,MCS-51 对数据缓冲区中的每个 RAM 单元是按字
节存取的。 3.特殊功能寄存器(SFR,SpecialFuntionRegistet) 特殊功能寄存器是指有特殊用途的寄存器集合,本质上是一些具有特殊功能的片内 RAM
单元,它离散地分布在地址范围 80H~FFH 内。SFR 的实际个数和单片机的型号有关,8051或 8031 的 SFR 有 21 个,8052 的 SFR 有 26 个。每个 SFR 占有一个 RAM 单元,它们在 80H~
FFH 的地址范围内,不为 SFR 占用的 RAM 单元实际并不存在,访问它们也是没有意义的。
表 2-4 列出了这些特殊功能寄存器的助记符号、名称和地址。
表 2-4 特殊功能寄存器
符号 名称 物理地址
#A(ACC) 累加器 0E0H #B 通用寄存器 0F0H
#PSW 程序状态字 0D0H
第 2 章 MCS-51 系列单片机的基本结构
·19·
续表
符号 名称 物理地址
SP 堆栈指针 81H DPTR 数据指针 DPL 数据指针低位字节 82H DPH 数据指针高位字节 83H #P0 P0 口锁存器 80H #P1 P1 口锁存器 90H #P2 P2 口锁存器 0A0H #P3 P3 口锁存器 0B0H #IP 中断优先级控制寄存器 0B8H #1E 中断允许控制寄存器 0A8H
TMOD 定时器/计数器方式控制寄存器 89H #TCON 定时器/计数器控制寄存器 88H
#T2CON 定时器/计数器 2 控制寄存器 0C8H TH0 定时器/计数器 0(高位字节) 8CH TL0 定时器/计数器 0(低位字节) 8AH THl 定时器/计数器 1(高位字节) 8DH TLl 定时器/计数器 1(低位字节) 8BH
*TH2 定时器/计数器 2(高位字节) 0CDH *TL2 定时器/计数器 2(低位字节) 0CCH
#*RLDH 定时器/计数器 2 自动再装载(高位字节) 0CBH #*RLDL 定时器/计数器 2 自动再装载(低位字节) 0CAH #SCON 串行控制寄存器 98H SBUF 串行数据缓冲器 99H PCON 电源控制寄存器 97H
在 21 个 SFR 寄存器中,用户可以通过直接寻址指令对它们进行字节存取,也可以对带
有“#”的 11 个寄存器进行位寻址。带#的寄存器表示可以位寻址;带*的寄存器表示与定时
器/计数器 2 有关的寄存器,仅在 8032/8052 芯片中存在。 对于 8051,我们已对累加器(A)、寄存器 B、PSW、SP 和 DPTR 等作过介绍,其余的
寄存器的细节将在后面有关章节中进行介绍。 4.位地址空间 MCS-51 单片机有一个功能很强的位处理器,它实际上是一个完整的 1 位微计算机。一
位机在开关决策、逻辑电路仿真和实时控制方面非常高效。MCS-51 单片机指令系统中有着
丰富的位操作指令(将在第 3 章中详细介绍),这些指令构成了位处理机的指令集。在 RAM和 SFR 中共有 211 个寻址位的位地址,位地址范围在 00H~FFH 内,其中 00H~7FH 这 128个位处于内部 RAM 字节地址 20H~2FH 单元中,如表 2-5 所示;其余的 83 个可寻址位分
布在特殊功能寄存器 SFR 中。可位寻址的寄存器有 11 个,共有位地址 88 个,其中 5 个未用,
其余 83 个位的位地址离散地分布于片内字节地址为 80H~FFH 的范围内,其最低的位地址
等于其字节地址,并且其字节地址的末位都为 0H 或 8H,如表 2-6 所示。
MCS-51 系列单片机原理与接口技术
·20·
表 2-5 MCS-51 内部 RAM 的可寻址位
位地址 字节 地址 D7 D6 D5 D4 D3 D2 D1 D0 2FH 7FH 7EH 7DH 7CH 7BH 7AH 79H 78H 2EH 77H 76H 75H 74H 73H 72H 71H 70H 2DH 6FH 6EH 6DH 6CH 6BH 6AH 69H 68H 2CH 67H 66H 65H 64H 63H 62H 61H 60H 2BH 5FH 5EH 5DH 5CH 5BH 5AH 59H 58H 2AH 57H 56H 55H 54H 53H 52H 51H 50H 29H 4FH 4EH 4DH 4CH 4BH 4AH 49H 48H 28H 47H 46H 45H 44H 43H 42H 41H 40H 27H 3FH 3EH 3DH 3CH 3BH 3AH 39H 38H 26H 37H 36H 35H 34H 33H 32H 31H 30H 25H 2FH 2EH 2DH 2CH 2BH 2AH 29H 28H 24H 27H 26H 25H 24H 23H 22H 21H 20H 23H 1FH 1EH 1DH 1CH 1BH 1AH 19H 18H 22H 17H 16H 15H 14H 13H 12H 11H 10H 21H 0FH 0EH 0DH 0CH 0BH 0AH 09H 08H 20H 07H 06H 05H 04H 03H 02H 01H 00H
表 2-6 SFR 中的位地址分布
位地址 特殊功能寄
存器符号 D7 D6 D5 D4 D3 D2 Dl D0 字节 地址
B F7H F6H F5H F4H F3H F2H F1H F0H F0H ACC E7H E6H E5H E4H E3H E2H E1H E0H E0H PSW D7H D6H D5H D4H D3H D2H D1H D0H D0H
IP ―― ―― ―― BCH BDH BAH D9H B8H B8H P3 F7H F6H F5H F4H F3H F2H F1H F0H B0H IE A1H ―― ―― ACH ABH AAH A9H A8H A8H P2 A7H A6H A5H A4H A3H A2H A1H A0H A0H
SCON 9FH 9EH 9DH 9CH 9BH 9AH 99H 98H 98H P1 97H 96H 95H 94H 93H 92H 91H 90H 90H
TCON 8FH 8EH 8DH 8CH 8BH 8AH 89H 88H 88H P0 87H 86H 85H 84H 83H 82H 81H 80H 80H 5.外部数据存储器 MCS-51 单片机内部有 128B 的 RAM 作为数据存储器,当需要外扩时,最多可外扩 64KB
的 RAM 或 I/O,这对很多应用来说已足够。 至此,我们已详细地介绍了 MCS-51 单片机的存储器结构。使用各类存储器,一定要注
意以下几点: (1)地址的重叠性。数据存储器与程序存储器全部 64KB 地址重叠;程序存储器中片内
外低 4KB 地址重叠;数据存储器中片内外最低的 128B 地址重叠。虽然有这些重叠,但不会
第 2 章 MCS-51 系列单片机的基本结构
·21·
产生操作混乱,这是因为采用了不同的操作指令及使用EA 控制选择的结果。 (2)程序存储器(ROM)与数据存储器(RAM),在使用上是严格区分的,不同的操作
指令不得混用。程序存储器只能放置程序指令及常数表格。除了程序的运行控制外,其操作
指令不分片内外。而数据存储器则存放数据,片内外的操作指令不同。 (3)位地址空间共有两个区域,即片内 RAM 中的 20H~2FH 的 128 位,以及 SFR 中的
位地址(其中有些位无定义)。这些位寻址单元与位指令集构成了位处理器系统。 (4)堆栈指针 SP 的内容可任设,复位时 SP=07H。要使用 2、3、4 组工作寄存器区时,
应将堆栈底 SP 移至片内 RAM 的高位地址(例如 60H)处。 (5)片外数据存储器中,数据区与用户外部扩展的 I/O 口统一编址。因此,应用系统中
所有外围接口的地址均占用 RAM 地址单元。与外围接口进行数据传送时,使用与访问外部
数据存储器相同的传送指令。
2.2.3 I/O 端口
I/O 端口又称为 I/O 接口,也叫做 I/O 通道或 I/O 通路。I/O 端口是 MCS-51 单片机对外
部实现控制和信息交换的必经之路,是一个过渡的集成电路,用于信息传送过程中的速度匹
配和增强它的负载能力。I/O 端口有串行和并行之分,串行 I/O 端口一次只能传送一位二进制
信息,并行 I/O 端口一次可以传送一组二进制信息。 1.并行 I/O 端口 8051 有 4 个并行 I/O 端口,分别命名为 P0、P1、P2 和 P3。这 4 个并行 I/O 端口都有双
向 I/O 功能,即 CPU 既可以向 4 个并行 I/O 端口中的任何一个输出数据,又可以从它们那里
读取数据。每个 I/O 端口内部都有一个 8 位数据输出锁存器和一个 8 位数据输入缓冲器,4个与相应的 I/O 端口同名的数据输出锁存器,它们和特殊功能寄存器(SFR)相对应(见表
2-4)。因此,CPU 数据从并行 I/O 端口输出时可以得到锁存,数据输入时可以得到缓冲。4个并行 I/O 端口在结构上并不相同,因此它们的功能和用途不同。P0 和 P2 口内部均有个受
控制器控制的二选一选择电路,故它们除可以用作通用 I/O 端口外还具有一些特殊的功能。
例如,P0 口可以输出外存储器的低 8 位地址码并读写数据(可以通过地址锁存器锁存 8 位地
址,以解决该口的地址和数据的分时复用问题,P2 口可以输出片外存储器的高 8 位地址码等。
P0 口常作为通用 I/O 端口使用,为 CPU 传送用户数据;在 4 个并行 I/O 中只有 P0 口是真正
的双向 I/O 口,故它具有较大的负载能力,最多可以推动 8 个 LS TTL 门,其余三个 I/O 端口
是准双向 I/O 口,只能推动 4 个 LS TTL 门。 (1)P0 口 P0 口的字节地址为 80H,位地址为 80H~87H。该口的各位口线具有完全相同但又相互
独立的逻辑电路,P0 口某一位的位结构的电路原理图如图 2-7 所示。 P0 口某一位的电路包括: 一个数据输出锁存器,用于进行数据位的锁存。 两个三态的数据输入缓冲器,分别用于锁存器数据和引脚数据的输入缓冲。 一个多路的转接开关(MUX),开关的一个输入来自锁存器,另一个输入为“地址/
数据”。输入转接由“控制”信号控制。之所以设置多路转接开关,是因为 P0 口既可以作
为通用的 I/O 端口,又可以作为单片机系统的地址/数据线使用。即在控制信号的作用下,由
MCS-51 系列单片机原理与接口技术
·22·
MUX 实现锁存器输出和地址/数据线之间的接通转接。
图 2-7 P0 口的位结构的电路原理图
数据输出的驱动和控制电路,由两只场效应管(FET)组成,上面的那只场效应管构
成上拉电路。 在实际应用中,P0 口绝大部分多数情况下都作为单片机系统的地址/数据线使用。当传
送地址或数据时,CPU 发出控制信号,打开上面的与门,使多路转接开关(MUX)倒向上
边,使内部地址/数据线与下面的场效应管反相接通。这时的输出驱动电路由于上下两个 FET处于反相,形成推拉式电路结构,大大提高了单片机负载能力。而当输入数据时,数据信号
则直接从引脚通过输入缓冲器进入内部总线。 P0 口也可作为通用的 I/O 口使用。这时,CPU 发来的控制信号为低电平,封锁了与门,
并将输出驱动电路的上拉场效应管截止,而多路的转接开关(MUX)倒向下边,与 D 锁存
器的输入端Q 接通。 当 P0 口作为输出口使用时,由锁存器和驱动电路构成数据输出通路。由于通路已有输
出锁存器,因此数据输出可以与外设直接相接,无需再加数据锁存器电路。进行数据输出时,
来自 CPU 的写脉冲加在 D 锁存器的 CP 端,数据写入 D 锁存器,并向端口引脚输出。注意,
由于输出电路是漏极开路电路,必须外接上拉电阻才能有高电平输出。 当 P0 口作为输入口使用时,应区分读引脚和读端口(或称读锁存器)两种情况。因此,
在端口电路中有两个用于读入的三态缓冲器。读引脚就是读芯片的引脚上的数据,这时,使
用下方的缓冲器,由“读引脚”信号把缓冲器打开,引脚上的数据经缓冲器通过内部总线读
进来;而读端口则是通过上面的缓冲器把锁存器 Q 端的状态读进来。 (2)P1 口 P1 口的字节地址为 90H,位地址为 90H~97H。P1 口某一位的位结构的电路原理图如图
2-8 所示。 P1 口只能作为通用的 I/O 口使用,所以在电路结构上与 P0 口有一些不同,主要表现在: P1 口只传数据,因此不再需要多路转接开关(MUX)。 由于 P1 口用来传送数据,因此输出电路中有上拉电阻,上拉电阻与场效应管共同组
成输出驱动电路。这样电路的输出不是三态的,所以 P1 口是准双向口。 因此: P1 口作为输出口使用时,已能对外提供推拉电流负载,外电路无需再接上拉电阻。
第 2 章 MCS-51 系列单片机的基本结构
·23·
图 2-8 P1 口的位结构的电路原理图
P1 口作为输入口使用时,应先向其锁存器先写入“1”,使输出驱动电路的 FET 截止。 (3)P2 口 P2 口的字节地址为 A0H,位地址为 A0H~A7H。P2 口某一位的位结构的电路原理图如
图 2-9 所示。
图 2-9 P2 口的位结构的电路原理图
在实际应用中,P2 口用于为系统提供高位地址,因此同 P0 口一样,在口电路中有一个
多路转接开关(MUX)。但 MUX 的一个输入端不再是“地址/数据”,而是单一的“地址”,
这是因为 P2 口只作为地址线使用,而不是作为数据线使用。当 P2 口作为高位地址线使用时,
多路转接开关应倒向“地址”端。由于 P2 只作为地址线使用,端口的输出用不着是三态的,
因此 P2 口也是一个准双向口。 此外,P2 口也可以作为通用 I/O 口使用,这时多路转接开关倒向锁存器 Q 端。 (4)P3 口 P3 口的字节地址为 B0H,位地址为 B0H~B7H。P3 口某一位的位结构的电路原理图如
图 2-10 所示。 虽然,P3 口可以作为通用 I/O 口使用,但在实际应用中,常使用它的第二功能。图 2-11
所示列出了 P3 口的第二功能定义。 为适应 P3 口的需要,在口电路中增加了第二功能控制逻辑。由于第二功能信号有输入
和输出两类,因此分两种情况进行说明。
MCS-51 系列单片机原理与接口技术
·24·
图 2-10 P3 口的位结构的电路原理图
图 2-11 P3 口的第二功能定义
输出的第二功能信号引脚,当作为通用的 I/O 口使用时,电路中的“第二输出功能”
线应保持高电平,与非门开通,以维持从锁存器到输出端数据输出通路的畅通。当输出第二
功能信号时,该锁存器应预先置“1”,使与非门对第二功能信号的输出是畅通的,从而实现
第二功能信号的输出。 第二功能作为输入信号的引脚时,在口线的输入通路上增加了一个缓冲器,输入的
信号就从这个缓冲器的输出端取得。而作为通用的 I/O 口线使用的数据输入,仍取自三态缓
冲器的输出端。总的来说,P3 口无论是作为输入口使用还是作为第二功能信号的输入使用,
输出电路中的锁存器输出和“第二功能输出信号”线都应保持高电平。 2.串行 I/O 端口 8051 有一个全双向的可编程串行 I/O 端口。这个串行 I/O 端口既可以在程序控制下把 CPU 的
8 位并行数据变成串行数据一位一位地从发送数据线(TXD)发送出去,也可以把串行接收到的
数据变成 8 位并行数据送给 CPU,而且这种串行发送和串行接收既可以单独进行,也可以同时进
行。 8051 的串行发送和串行接收利用了 P3 口的第二功能,即它利用 P3.1 引脚作为串行数据
的发送线(TXD),P3.0 脚作为串行数据的接收线(RXD),如表 2-1 所示。串行 I/O 口的
电路结构还包括串行口控制寄存器(SCON)、电源及波特率选择寄存器(PCON)和串行数
据缓冲器(SBUF)等,它们都属于 SFR 特殊功能寄存器。其中 PCON 和 SCON 用于设置串
行口的工作方式和确定数据的发送和接收波特率。SBUF 实际上由两个 8 位寄存器组成,一
个用于存放欲发送的数据,一个用于存放接收到的数据,起着数据的缓冲作用。
第 2 章 MCS-51 系列单片机的基本结构
·25·
2.2.4 定时器/计数器
8051 内部有两个 16 位可编程序的定时器/计数器,T0 和 T1。T0 由两个 8 位寄存器 TH0和 TL0 组成,其中 TH0 为高 8 位,TL0 为低 8 位。T1 也由两个 8 位寄存器 THl 和 TLl 组成,
其中 THl 为高 8 位,TLl 为低 8 位。TH0、TL0、THl 和 TLl 均为特殊功能寄存器,见表 2-4。T0 和 Tl 有定时器和计数器两种工作模式,在每种模式下又分为若干工作方式。在定时器模
式下 T0 和 T1 的计数脉冲可以由单片机时钟脉冲经 12 分频后提供,因此定时时间和单片机
时钟频率有关。在计数器的模式下,T0 和 T1 的计数脉冲可以从 P3.4 和 P3.5 引脚上输入。
T0 和 T1 有两个 8 位的特殊功能寄存器:一个称为定时器/计数器方式控制寄存器(TMOD),
用于确定定时器还是计数器工作模式;另一个叫做定时器/计数器控制寄存器(TCON),可
以决定定时器或计数器的启动、停止以及进行中断控制,TMOD 和 TCON 也是特殊功能寄存
器 SFR 之一,用户也可以通过指令确定它们的状态。
2.2.5 中断系统
中断是指 CPU 暂停执行原程序转而为外部设备服务(执行中断服务程序),并在服务完
后继续执行原程序的过程。中断系统是指能够处理上述中断过程所需要的那部分电路。中断
源是指能产生中断请求信号的源泉。8051 可处理 5 个中断源发出的中断请求,并对 5 个中断
请求信号进行排队和控制,响应其中优先权最高的中断请求。8051 的 5 个中断源有内部和外
部之分:外部中断源有两个,通常指外部设备;内部中断源有 3 个,两个定时器/计数器中断
源和一个串行口中断源。外部中断源产生的中断请求信号可以从 P3.2 和 P3.3(即可由 INT0 和
INT1)引脚上输入,有电平或边沿两种引起中断的触发方式。内部中断源 T0 和 T1 的两个
中断请求是在它们从全“1”变为全“0”溢出时,自动向中断系统提出的,内部串行口中断
源的中断请求是在串行口每发送完一个 8 位二进制数据或接收到 8 位输入数据后自动向中断
系统提出的。
2.2.6 布尔(位)处理器
为了更好地“面向控制”,在 80C51 单片微机系统中,与字节处理器相对应,还专门设
置了一个结构完整、功能极强的布尔(位)处理器。实际上这是一个完整的 1 位微计算机,
它具有自己的 CPU、寄存器、I/O、存储器和指令集。1 位机在开关决策、逻辑电路仿真和实
时控制方面非常高效。80C51 单片微机把 8 位机和布尔(位)处理器的硬件资源复合在一起,
这是 80C51 系列单片微机的突出优点之一,也给实际应用带来了极大的方便。 位处理器系统包括以下 5 个功能部件。 (1)位累加器:借用进位标志位 CY。在布尔运算中 CY 是数据源之一,又是运算结果
的存放处,位数据传送的中心。根据 CY 的状态实现程序条件转移:JC rel、JNC rel、JBC rel。 (2)位寻址的 RAM:内部 RAM 位寻址区中的 0~127 位(20H~2FH)。 (3)位寻址的寄存器:特殊功能寄存器(SFR)中可以位寻址的位。 (4)位寻址的 I/O 口:并行 I/O 口中可以位寻址的位(如 P1.0)。
MCS-51 系列单片机原理与接口技术
·26·
(5)位操作指令系统:位操作指令可实现对位的置位、清 0、取反、位状态判跳、传送、
位逻辑运算、位输入/输出等操作。 而布尔处理器的程序存储器和 ALU 与字节处理器合用。利用内部并行 I/O 口的位操作,
可以提高测控速度,增强实时性。利用位逻辑操作功能把逻辑表达式直接变换成软件进行设
计和运算,方法简便,免去了过多的数据往返传送、字节屏蔽和测试分支,大大简化了编程,
节省存储器空间,增强了实时性能。还可实现复杂的组合逻辑处理功能。
2.3 MCS-51 单片机的工作方式
通常 MCS-51 单片机的工作方式有复位方式、程序执行方式、节电方式和 EPROM 的编
程校验方式等 4 种。
2.3.1 复位方式
在设计单片机应用系统时,必须了解单片机的复位状态,因为单片机应用系统在使用时
会经常进入复位工作状态。应用系统的复位状态与单片机的复位状态密切相关。 单片机在开机时或者在时钟电路工作后,RESET(RST)引脚上出现 24 个时钟周期以上
的高电平时,单片机将进入复位状态。单片机复位以后,其程序计数器和特殊功能寄存器的
复位状态如表 2-7 所示。
表 2-7 程序计数器和特殊功能寄存器复位状态
寄存器 内容 寄存器 内容 PC 0000H TCON 00H
ACC 00H TH0 00H B 00H TL0 00H
PSW 00H THl 00H SP 07H TLl 00H
DPTR 0000H TH2(8052) 00H P0~P3 0FFH TL2(8052) 00H
IP(8052) ×××00000B RLDH(8052) 00H IP(8051) ××000000B RLDL(8052) 00H IE(8051) 0××00000B PCON(HCMOS) 0×××××××B IE(8052) 0×000000B PCON(CHMOS) 0×××0000B
TMOD 00H SCON 00H SBUF 不定
单片机通常有上电复位电路和外部复位电路。上电复位电路如图 2-12(a)所示,上电
瞬间 RST/VPD 端的电位与 Vcc 相同,随充电电流的减少,RST/VPD 的电位逐渐下降。按图中
所示的电路参数(其中 8.2kΩ为斯密特触发器输入端的一个下拉电阻),时间常数为 10×10-6
×8.2×103=82ms,只要 Vcc 的上升时间不超过 lms,振荡器建立时间不超过 l0ms,该时间
常数足以保证完成复位操作。上电复位所需的最短时间是振荡器建立时间加上 24 个时钟周
第 2 章 MCS-51 系列单片机的基本结构
·27·
期,在这段时间内 RST/VPD端的电平应维持高于斯密特触发器的下阈值。 外部复位电路有两种方案,第一种方案如图 2-12(b)所示,由外部提供一个复位脉冲,
此复位脉冲应保持宽于 24 个时钟周期。复位脉冲过后,由内部下拉电阻保证 RST/VPD 端为
低电平。 第二种方案是上电复位与手动复位相结合的方案,如图 2-12(c)所示。过程与图 2-12
(a)所示相似。手动复位时,按下复位按钮,电容 C 通过电阻 R1 迅速放电,使 RST/VPD
迅速变为高电平,松开后,电容通过 R2 和内部下拉电阻充电,逐渐使 RST/VPD 恢复为低
电平。
(a)上电复位电路 (b)外部复位电路方案一 (c)外部复位电路方案二
图 2-12 复位电路
2.3.2 程序执行方式
程序执行方式可以分为单步执行和连续执行两种工作方式。 (1)单步执行方式是指单片机在控制面板上的单步执行键控制下一条一条地执行用户程
序中的指令,即按一次单步键就执行一条用户指令。常用于用户程序调试。 单步执行方式是利用单片机外部中断功能实现的。单步执行键相当于外部中断源,当它
被按下时相应电路就产生一个负脉冲(即中断请求信号)送到单片机的 INT0(或 INT1)引
脚,MCS-51 单片机在 INT0 上的负脉冲作用下便能自动执行预先安排在中断服务程序中的如
下两条指令: LOOPl:JNB P3.2,LOOP1 ;若 INT0 =0,则不往下执行 LOOP2:JB P3.2,LOOP2 ;若 INT0 =1,则不往下执行 RETI ;退出循环,并返回用户程序中执行一条用户指令
该条指令执行完后,单片机又自动回到上述中断
服务程序,并等待用户再次按下单步执行键 (2)连续执行方式是所有单片机都需要的一种工作方式,执行程序可以存储于片内或片
外的 ROM 中。 由于单片机复位后程序计数器(PC)为 0000H,所以机器在上电或按钮复位后总是到
0000H 取程序执行,这样在程序设计过程中可以预先在 0000H 处设计一条转移指令,以跳转
到 0000H~FFFFH 中的任一地址的程序中执行。
MCS-51 系列单片机原理与接口技术
·28·
2.3.3 省电工作方式
省电工作方式是一种能减少单片机功耗的工作方式,常可分为空闲模式和掉电模式。 1.空闲方式 单片机需要执行一定的指令,才能进入此模式,如 80C31 执行如下指令进入此模式:
MOV PCON, #01H ;PCON.0 位(即 IDL)被置 1 进入空闲模式后 CPU 进入休眠状态,不工作。而其他片内外设(如中断、定时器/计数
器等)则可继续工作,片内 RAM 和所有的特殊功能寄存器(SFR)内容维持不变,所以功
耗很小。空闲模式可以通过由中断源发出中断请求或硬件复位来退出。当通过硬件复位退出
时,须在 RST 脚送一个脉宽大于 24 个时钟周期的脉冲,PCON 中的 IDL 位被清 0,单片机
继续执行进入空闲方式前的用户程序。 2.掉电模式 80C31 单片机执行如下指令就可进入掉电模式: MOV PCON, #02H ;PCON.1 位(即 PD)被置 1 执行此指令后,PD 变为高电平,单片机进入掉电模式。在掉电模式中,振荡器停止振
荡,片内所有器件都停止工作,片内 RAM 和特殊功能寄存器的内容保持不变。在掉电期间,
Vcc 电源可以降为 2V。惟一退出此模式的方法是硬件复位,复位后特殊功能寄存器将被重新
定义,但 RAM 中的内容保持不变。因此,若要想执行掉电且又希望在掉电模式结束后能继
续执行原来的程序,必须在掉电前预先把特殊功能寄存器的内容保存到 RAM 中,在掉电方
式退出后为 SFR 恢复掉电前的内容。
2.3.4 EPROM 的编程和校验方式
EPROM 的编程是指利用特殊的手段将用户程序写入单片机内部的 EPROM,校验则是对
写入的程序代码继续读出校验的过程。因此 EPROM 的编程校验方式只有在含有 EPROM 的
单片机(8751 系列)上才有。EPROM 可用紫外光照射其窗口擦除内容。由于日光和荧光中
都含有紫外线,EPROM 在这些光下暴露一段时间(日光下约 1 星期,室内荧光下约 3 年),
也会把 EPROM 的内容擦去,所以建议用不透明的标签把编程后的 EPROM 窗口贴起来。 8751H 片内含有 4KB 的 EPROM,它具有编程、校验和保密编程等工作方式。8751H 单
片机的各种工作状态控制方式引脚连接如表 2-8 所示。3 种工作方式的振荡器频率必须在 4~6MHz,CPU 应处于工作状态。
表 2-8 EPROM 工作方式引脚连接
方式 RST P2.7 P2.6 P2.5 P2.4
编程 1 0 Vpp 0 1 0 0 0
禁止 1 0 × 1 1 0 × × 校验 1 0 1 1 0 0 0 0
保密位编程 1 0 Vpp 0 1 1 0 0
第 2 章 MCS-51 系列单片机的基本结构
·29·
1.EPROM 的编程方式 8751H 单片机 EPROM 在编程时,相关引脚接法如图 2-13 所示。它的编程是在另一台主
单片机控制下进行的,编程单元的地址加在 P1 口和 P2 口的 P2.0~P2.3,数据(程序)由 P0口输入。其中 RESET(RST)要求 2.5V 的高电平,其他电平均为 TTL 电平。
PP/EA V 通常保
持 TTL 高电平,是编程电源的输入端,要求编程电源的电平为 21V。在 Vpp 为 21V 时,应
在 PROGALE/ (常保持 TTL 高电平)端加一个宽度为 50ms 的负脉冲,用以完成一个存储单
元的写入。8751H 的编程时序可以参考有关的资料,但由于现有 EPROM 编程器,可以方便
地在其上进行编程和校验。
图 2-13 8751H 编程时的相关引脚连接
2.EPROM 的程序校验方式 对程序校验时引脚的接法可参阅图 2-13 并按表 2-6 的接法连接。程序存储器的地址仍由
P1 和 P2.0~P2.3 输入,数据由 P0 输出。P2.4~P2.6 和 PSEN保持低电平,而 ALE、RST 和
PP/EA V 保持高电平。P2.7 作为读选通端,当 P2.7 保持 TTL 高电平时,P0 的引脚为悬浮状
态。在 P0 口上要求外接 10kΩ的电阻。当 P2.7 为低时,被寻址的单元的内容将出现在 P0 口
上,并被送给主单片机。主单片机把读出的代码和编程时写入的编程代码进行比较,若两者
相同,则该单元正确;若结果不同,则应重新编程校验,直到正确为止。 3.EPROM 的加密方式 8751H 的保密编程要求它的引脚按表 2-6 中相应状态连接,它和图 2-13 的惟一区别在于 P2.6
应接 TTL 高电平,8751H EPROM 加密编程的过程和 EPROM 编程过程类似,在此不再多述。 8751H 完成加密编程以后,用户可以让它自由执行 EPROM 中的程序。如果读出程序,
8751H 执行片外 ROM 中程序的功能就会随之消失。因此,8751H 的这种加密编程功能对于
保护单片机应用系统中软件的版权具有十分重要的意义。 不论是编程还是保密编程,8751HEPROM 中的程序代码均可在专用的 EPROM 擦除器中
擦除。一旦 EPROM 中信息被擦除,则再读出时即是单片机出厂时的时序,该时序比较简单,
对应用者来说,仅当需要精确分析程序中各指令执行时间或是研究单片机与各外部接口之间
MCS-51 系列单片机原理与接口技术
·30·
的时序关系时,才需分析它。
2.4 MCS-51 单片机的时钟电路
时钟是单片机能协调工作的时间基准。时钟电路有两种形式,一种是内部方式时钟路,
另一种是外部方式时钟电路。 1.内部方式时钟电路 内部方式时钟电路由内部振荡器产生的振荡信号接至内部时钟电路,由内部时钟电产生
的二分频信号构成了单片机的时钟,并向 CPU 提供 P1 和 P2 两相时钟信号。 内部振荡器由内部反相放大器通过引脚 XTAL1 和 XTAL2 与外接的晶体以及电容 C1 和
C2 构成并联谐振电路,产生出晶体振荡信号,此晶振信号接至内部的时钟电路,如图 2-14(a)所示。
图中的晶振频率可在 2~12MHz 之间。外接晶体时,电容 C1 和 C2 通常选 30pF。对外
接电容值没有严格要求,但电容的大小会影响振荡频率、振荡器的稳定性和起振的速度。振
荡器的这些特性对单片机的应用影响很大,因此在设计印刷电路板时,应使晶体和电容尽可
能与单片机靠近,以保证稳定可靠。 2.外部方式时钟电路 外部方式时钟电路是由外部振荡器产生振荡信号,通过电平转换接至 MCS-51 单片机的
XTAL2 引脚,由 XTAL2 直接与内部方式时钟电路相接,而 XTALl 引脚接低电平,如图 2-14(b)所示。
(a)内部方式时钟电路 (b)外部振荡器(外部方式时钟电路)
图 2-14
2.5 MCS-51 单片机的工作时序
单片机时序就是 CPU 在执行指令时所需控制信号的时间顺序。因此,微型计算机中的
CPU 实质上就是一个复杂的同步时序电路,这个时序电路是在时钟脉冲推动下工作的。在
执行指令时,CPU 首先要到程序存储器中取出需要执行的指令的指令码,然后对指令码译
码,并由部件产生一系列控制信号来完成指令的执行,这些控制信号在时间上的相互关系
就是 CPU 时序。 CPU 发出的时序信号有两类:一类用于片内各功能部件的控制,这类信号很多,但对用
第 2 章 MCS-51 系列单片机的基本结构
·31·
户没有意义的,故通常不作专门介绍;另一类用于片外存储器或 I/O 端口的控制,需要通过
器件的控制引脚送到片外,这部分时序对分析硬件电路原理至关重要,也是每个单片机设计
人员普遍关心的问题。 由于 CPU、存储器、定时器/计数器、中断系统和 I/O 端口电路等都集成在同一块芯片上,
因此单片机的时序通常要比微处理器的简单一些。
2.5.1 机器周期和指令周期
为了对 CPU 时序进行分析,首先需要定义一种能够度量各时序信号出现时间的尺度,通
常包含时钟周期、机器周期和指令周期。 1.时钟周期 时钟周期 T 又称为状态周期。由单片机片内振荡电路 OSC 产生的振荡周期经二分频产
生,是时序中最小的时间单位。 例如:若某单片机时钟频率为 1MHz,则它的时钟周期 T 应为 1μs。时钟周期的时间尺
度不是绝对的,是一个随时钟脉冲频率变化而变化的参量。时钟脉冲是计算机的基本工作脉
冲,它控制着计算机的工作节奏,使计算机的每一步工作都统一到它的步调上来。一个时钟
周期分为 2 个振荡周期,第一个振荡周期称为节拍 1,第二个振荡周期称为节拍 2。 2.机器周期 机器周期定义为实现特定功能所需的时间,或完成某一规定操作所需的时间,通常由若
干时钟周期构成。因此微型计算机的机器周期常常按其功能来命名,且不同机器周期包含的
时钟周期也不同。 但 MCS-51 的机器周期没有采用上述方案,它的机器周期时间是固定不变的,均由 6 个
时钟周期(即 12 个振荡周期)组成,分为 6 个状态(S1~S6),每个状态又分为 P1 和 P2两拍,因此,一个机器周期中的 12 个振荡周期可以表示为 S1P1,S1P2,S2P1,S2P2,S3P1……
S6P2。 3.指令周期 指令周期是时序中的最大时间单位,定义为执行一条指令所需的时间。由于机器执行不
同指令所需时间也不同,因此不同指令所包含的机器周期数也不相同。通常,包含一个机器
周期的指令称为单周期指令,包含两个机器周期的指令称为双周期指令。 指令的运算速度和指令所包含的机器周期数有关,机器周期数越少的指令执行速度越
快。MCS-51 单片机通常可以分为单周期指令、双周期指令和四周期指令 3 种。其中四周期
指令只有乘法和除法指令两条,其余均为单周期和双周期指令。
2.5.2 MCS-51 单片机指令的取指/执行时序
单片机执行任何一条指令时都可以分为取指令阶段和执行指令阶段。取指令阶段简称
为取指阶段,单片机在这个阶段里可以把程序计数器(PC)中地址送到程序存储器,并从
中取出需要执行指令的操作码和操作数。指令执行阶段可以对指令操作码进行译码,以产
生一系列控制信号,从而完成指令的执行。图 2-15 所示给出 MCS-51 单片机指令的取指/执行时序。
MCS-51 系列单片机原理与接口技术
·32·
图 2-15 MCS-51 单片机指令的取指/执行时序
由图中可见,ALE 引脚上出现的信号是周期性的,每个机器周期内出现两次高电平,出
现时刻为 S1P2 和 S4P2,持续时间为一个状态 S。ALE 信号每出现一次,CPU 就进行一次取
指操作,但由于不同指令的字节数和机器周期数不同,因此取指令操作随指令不同而不同。
按照指令字节数和机器周期数,8051 的 111 条指令可分为 6 类,分别对应于 6 种基本时序。
这六类指令是:单字节单周期指令、单字节双周期指令、单字节四周期指令、双字节单周期
指令、双字节双周期指令和三字节双周期指令。为了弄清楚这些基本时序的特点,现对几种
主要时序做一简述。 1.单字节单周期指令时序 这类指令的指令码只有一个字节(如 INCA 指令),存放在程序存储器 ROM 中,机器
从取出指令码到完成指令执行仅需一个机器周期,如图 2-15(a)所示。图中,机器在 ALE第一次有效(S2P1)时从 ROM 中读出指令码,把它送到指令寄存器 IR 中,接着开始执行。
在执行期间,CPU 一方面在 ALE 第二次有效(S4P2)时封锁 PC 加“l”,使第二次读操作
无效,另一方面在 S6P2 时完成指令执行。 2.双字节单周期指令时序 双字节单周期指令时序如图 2-15(b)所示。8051 在执行这类指令时需要分两次从 ROM
中读出指令码。ALE 在第一次有效时读出指令操作码,CPU 对它译码后便知道是双字节指令,
故使程序计数器(PC)加“1”,并在 ALE 第二次有效时读出指令的第二字节,最后在 S6P2时完成指令的执行。
3.单字节双周期指令时序 单字节双周期指令时序如图 2-15(c)所示,这类指令执行时,CPU 在第一机器周期 S1
第 2 章 MCS-51 系列单片机的基本结构
·33·
期间从程序存储器 ROM 中读出指令操作码,经译码后便知道是单字节双周期指令,故控制
器自动封锁后面的连续 3 次读操作,并在第二机器周期的 S6P2 时完成指令的执行。
2.5.3 访问片外 ROM/RAM 的指令时序
8051 专门有两类可以访问片外存储器的指令:一类是读片外 ROM 指令,另一类是访问
片外 RAM 指令。这两类指令执行时所产生的时序,除涉及 ALE 引脚外,还和PSEN 、P0(PORT0)、P2(PORT2)和RD 信号有关。下面讲解读片外 ROM 指令时序。
8051 执行如下指令时:MOVC A,@A+DPTR ;A←(A+DPTR) 首先把累加器(A)中地址偏移量和 DPTR 中地址相加,后把 16 位“和地址”作为片外
ROM 地址,并从中读出地址单元中的数据,送到累加器(A)。所以,A 在指令执行前是地
址偏移量,指令执行完后为片外 RAM 中读出的数据。指令执行的时序如图 2-16 所示。
图 2-16 读 Yc~t-ROM 指令时序
(1)ALE 信号在 S1P1 有效时,PSEN继续保持高电平或从低电平变为高电平无效状态。 (2)8051 首先把 PC 中高 8 位地址送到 P2 口引脚线上,把 PC 中低 8 位地址送到 P0 口
引脚线上,P0 口地址 A7~A0 在 ALE 下降沿被锁存到片外地址锁存器,P2 口地址 A15~A8能保存一段时间,因此它不必外接锁存器。
(3)PSEN有效时,选中片外 ROM 工作,并根据 P2 口和地址锁存器输出地址读出
MOVC 指令的指令码,经 P0 口送到 CPU 的指令寄存器(IR)。 (4)8051 对指令寄存器(IR)中 MOVC 指令码译码,产生执行该指令所需的一系列控
制信号。 (5)CPU 先把累加器(A)中地址偏移量和 DPTR 中地址相加,然后把“和地址”的高
8 位送到 P2 口、低 8 位送到 P0 口,其中 P0 口地址在 ALE 的第二个下降沿被锁存到片外地
址锁存器。 (6)PSEN在第二次有效时,从片外 ROM 中读出由 P2 口和片外地址锁存器输出地址所
对应单元中的常数,该常数经 P0 口送到 CPU 累加器中。 上述指令执行过程表明,MOVC 指令执行时分两个阶段: (1)根据程序计数器(PC)到片外 ROM 中取指令码。 (2)对累加器(A)和 DPTR 中 16 位地址进行运算,并按运算得到的和的地址去片外
ROM 中取出所需的常数送到累加器(A)中。
MCS-51 系列单片机原理与接口技术
·34·
2.5.4 读/写片外 RAM 指令时序
读片外 RAM 指令的时序如图 2-17 所示。
图 2-17 读片外 RAM 指令时序
设片外 RAM 的 2000H 单元中有一数 X,且 DPTR 中已存放有该数地址 2000H,则 CPU执行如下指令便可从片外 RAM 中取出 X 送到累加器(A)中:
MOVX A,@DPTR ;A←X 该指令指令码为 E0H,存放在片外 ROM 中,其地址存放在 CPU 程序计数器(PC)中。 上述指令执行时的时序与读外部 ROM 的指令极为相似,不同的是,在第二阶段,在读
外部 RAM 时RD 有效,在写外部 RAM 时WR 有效,此时PSEN 被封锁为高电平。
2.6 习题
1.80C51 单片机主要包含哪些逻辑功能部件?各有什么主要功能? 2.80C51 四个 I/O 端口的作用是什么?其片外的三总线都是如何分配的? 3.开机复位后,80C51 使用的是哪组工作寄存器?其地址为多少?CPU 如何确定和改
变当前的工作寄存器? 4.什么是时钟周期、机器周期和指令周期?当振荡频率为 8MHz 时,80C51 的时钟周期
为多少? 5.80C51 单片机运行出错或程序进入死循环状态,应该如何处理? 6.什么是 80C51 单片机的口锁存器的读、写、改操作以及读引脚操作? 7.什么是 80C51 单片机复位状态和 SFT 复位状态,两者之间有何区别?
第第 33 章章 指指令令系系统统
单片机系统中,一条指令,对应着一种基本操作。单片机所能执行的全部指令的集合就
是该单片机的指令系统。指令常以其英文名称或缩写形式来做助记符,以助记符形式表示的
指令是汇编语言。不同种类的单片机,其指令系统也不尽相同。本章主要介绍 MCS-51 单片
机的汇编语言指令系统。
3.1 MCS-51 单片机的指令系统
MCS-51 单片机具有自己独特的指令系统,具有简明、易掌握、效率高等特点,MCS-51共定义了 111 条基本指令。
3.1.1 基本概念
振荡周期:单片机提供时钟的振荡源的周期。 状态周期:又称为时钟周期,是单片机工作时钟的周期。8051 单片机的状态周期是振荡
源振荡周期的 2 倍,即工作时钟信号是振荡源经过 2 分频得到的。 指令周期:完成一条指令所占用的时间。
3.1.2 指令分类
MCS-51 单片机的基本指令共 111 条。 根据指令在程序存储器所占的字节数,指令系统可以分为: (1)单字节指令 49 条; (2)双字节指令 45 条; (3)三字节指令 17 条。 根据指令的执行时间,指令系统可以分为: (1)1 个机器周期(12 个时钟振荡周期)的指令 64 条; (2)2 个机器周期(24 个时钟振荡周期)的指令 45 条; (3)只有乘、除两条指令的执行时间为 4 个机器周期(48 个时钟振荡周期)。 在 12MHz 晶振的条件下,每个机器周期为 lμs。由此可见,MCS-51 单片机指令系统对
存储空间和时间的利用率较高。 MCS-51 单片机的一大特点是在硬件结构中有一个位处理机,对应这个位处理机,指令
系统中相应地设计了处理位变量的指令子集,这个子集在设计需大量处理位变量的程序时十
分有效、方便。
MCS-51 系列单片机原理与接口技术
·36·
根据照指令功能,指令系统可以分为: (1)数据传送类指令(28 条) (2)算术操作类指令(24 条) (3)逻辑操作类指令(25 条) (4)控制转移类指令(17 条) (5)布尔变量操作类指令(17 条)
3.1.3 指令格式
指令格式,通常由两部分组成,即操作码和操作数。操作码用来规定指令进行什么操作,
操作数是指令操作的对象。操作数可能是一个具体的数据,也可能是指出到哪里取得数据的
地址或符号。在 MCS-51 单片机指令系统中,有单字节指令、双字节指令、三字节这些不同
长度的指令,指令长度不同,指令的格式也就不同。 (1)单字节指令:指令只有一个字节,操作码和操作数同在一个字节中。
操作码 地址码 例如:MOV A,Rn 指令机器码为 11001rrr 单字节,其中 rrr 可表示为 000~111,分别代表 R0~R7。 (2)双字节指令:双字节指令包括两个字节。其中一个字节为操作码,另一个字节为操
作数。 操作码 地址码 数据或地址码
例如:MOV A,#data 8 位立即数 data 需占一个字节,操作码不能省略,也需一个字节。 (3)三字节指令:在三字节指令中,操作码占一个字节,操作数占两个字节。其中操作
数既可以是数据,也可以是地址。 操作码 数据或地址码 数据或地址码
例如:ANL direct,#data 指令需 3 个字节,第一字节为操作码,第二字节为 8 位直接地址 direct,第三字节为 8
位立即数 data。
3.1.4 指令系统中符号说明
在说明和使用 MCS-51 系列单片机指令时,经常使用一些符号。下面对所使用符号的意
义进行说明,如表 3-1 所示。
表 3-1 符号说明
符号 说明
Rn n=0~7,表示当前寄存器组的 8 个通用寄存器 R0~R7 中的一个 Ri i=0 或 1,可用作间接寻址的寄存器,只能是 R0,R1 寄存器中的一个
Direct 内部的 8 位地址,既可以指片内 RAM 的低 128 个单元地址,也可以指特
殊功能寄存器的地址或符号名称,因此,direct 表示直接寻址方式 #data 指令中所含的 8 位立即数
第 3 章 指令系统
·37·
续表
符号 说明
#data16 指令中所含的 16 位立即数 Addr16 16 位目的地址,只限于在 LCALL 和 LJMP 指令中使用 Addr11 11 位目的地址,只限于在 ACALL 和 AJMP 指令中使用
Rel 相对转移指令中的偏移量,为 8 位带符号数。为 SJMP 和所有条件转移指
令所用。转移范围为相对于下一条指令第一字节地址的-128~+127 DPTR 数据指针 Bit 片内 RAM(包括部分特殊功能寄存器)中的直接寻址位 A 累加器 B B 寄存器 C 进位标志位,是布尔处理机中的累加器,也称之为累加位 @ 间址寄存器的前缀标志 / 位地址的前缀标志,表示对该位操作数取反 (×) 某寄存器或某单元的内容 ((×)) 由×寻址的单元中的内容 ← 箭头左边的内容被箭头右边的内容所取代
3.1.5 单片机执行指令的过程
单片机执行指令的过程,分为取指令和执行指令两部分。 在取指阶段,单片机从程序存储器中取出指令操作码,送到指令寄存器 IR 中,通过指
令译码器译码,产生一系列的控制信号。 在执行指令阶段,利用指令译码产生的控制信号,进行本指令规定的操作。
3.2 指令系统的寻址方式
指令中用于说明操作数所在地址的方法,称为寻址方式。一个处理器寻址方式的多少,
说明了其寻找操作数的灵活程度。寻址方式越多,指令系统的功能就越强,灵活性越大。
MCS-51 单片机提供有 7 种寻址方式。
3.2.1 立即寻址
立即寻址的操作数包含在指令中(即操作数就是放在程序存储器内的常数)。采用立即
寻址方式的指令一般是双字节指令,第一个字节为操作码,第二个字节为立即操作数。立即
数前面应加前缀“#”号,以便与地址相区别。 例如:MOV A,#20H ;将立即数 20H 传送至寄存器 A 中。 立即数也可以是双字节的,如
MOV DPTR,#datal6 表示 16 位常数装入到数据指针寄存器中。
MCS-51 系列单片机原理与接口技术
·38·
3.2.2 寄存器寻址
寄存器寻址对选定的工作寄存器区的 8 个工作寄存器 R0~R7 进行操作,指令操作码字
节的低 3 位指明所用的寄存器。ACC、B、DPTR、AB 和 CY(位处理机的累加器)也可以
作为寄存器寻址的对象,只不过其寻址时具体寄存器已隐含在其操作码中。 用户可通过程序控制 PSW 中的 RS1 和 RS0 两位来达到选择寄存器组的目的。 例如:MOV A,Rn 其中,n=0~7,这条指令表示把寄存器 Rn 的内容传送给累加器(A),其源操作数就
是 Rn 的内容。
3.2.3 直接寻址
在这种寻址方式的指令中,存放操作数的存储单元的地址“直接”出现在指令代码中。
直接寻址是访问专用寄存器 SFR 的惟一方法,特殊功能寄存器中的可位寻址的 128 个位也可
认为是直接寻址的。采用直接寻址的指令一般是双字节或三字节指令,第一字节为操作码,
第二、三字节为操作数的地址码。MCS-51 单片机中,片内寄存器寻址只能用于片内低 128字节单元数据区或专用寄存器中。例如:
MOV A,20H ;将片内 RAM30H 单元中的内容传送至 A 中,30H 是一个 8 位的地址 LJMP 1000H ;将 16 位的地址 1000H 送至 PC 中 MOV A,P0 ;表示把 P0 口(地址为 80H)锁存器的内容传送给 A MOV C,bit ;表示把直接寻址的位送入进位位 C。
3.2.4 寄存器间接寻址
寄存器间接寻址的指令中,操作数的地址是某一个寄存器的内容。在这种寻址方式中,
寄存器中出现的数不是操作数本身,而是操作数在存储器中的存放地址。寄存器间接寻址可
用于访问内部 RAM 和外部数据存储器。访问内部 RAM 或外部数据存储器的低 256 个字节
时,可采用 R0 或 R1 作为间址寄存器,R0 或 R1 实际上是地址指针,用来存放所要访问数据
的地址。 例如:指令 MOV A,@Ri(i 为 0 或 1)表示从 Ri 中找到源操作数所在存储单元的地
址,把该地址中的内容传送给 A。 访问外部数据存储器的低 256 字节时,只要把 MOV 改为 MOVX 就行了。 此外,访问外部数据存储器时,还可以用数据指针 DPTR 作为间址寄存器,DPTR 为 16
位寄存器,故它可对整个外部数据存储器空间(64KB)寻址。 在执行进栈(PUSH)和出栈(POP)指令时,用堆栈指针 SP 作间址寄存器。 内部 RAM 的低半字节也可以采用寄存器间接寻址的方式访问,此时的间址寄存器为 R0
或 R1。如指令 XCHD A,@Ri(i=0 或 1)表示间接寻址的内部 RAM 存储单元低 4 位内
容与累加器低 4 位内容交换。
第 3 章 指令系统
·39·
3.2.5 基址寄存器加变址寄存器间接寻址
这种寻址方式用于访问程序存储器中的一个字节,该字节的地址是基址寄存器(PC 或
DPTR)的内容与变址寄存器 A 的内容之和。用 PC 作基址寄存器加上变址寄存器 A 的内容
形成操作数的 16 位地址。例如:指令 MOVC A,@A+PC,指令操作码助记符 MOVC 表示
从程序存储器中取数据,PC 的内容指向下一条指令的地址,作为基地址,A 中存放偏移量,
偏移量加上基地址构成了所要取的数据的地址。 如指令 MOVCA,@A+DPTR,DPTR 寄存器的内容作为基地址,A 中存放偏移量,偏
移量加上基地址构成了所要取的数据的地址。若 A 的内容为 01H,DPTR 的内容为 0200H,
该指令执行的结果是把程序存储器中地址为 0201H 单元的内容传送给 A。 这种寻址方在查表访问时特别有用。如,由程序存储器 0100H 单元开始存放一组 LED
七段显示代码,由 0 开始按数字顺序存放。要显示的数先放在累加器(A)中,0100H 预先
放在 DPTR 中,利用上述指令可以把此数对应的七段显示代码取到累加器中。
3.2.6 相对寻址
相对寻址是将程序计数器 PC 中的当前值与指令码中的第二字节(若为双字节指令)所
给出的数相加,其和为跳转指令的转移地址,PC 中的当前值称为基地址,指令中第二字节的
数据称为偏移量。偏移量为 8 位的带符号数,它的数值范围为-128~+127。所以跳转范围在
相对 PC 的当前值-128~+127 之间(即可以往增地址和减地址方向跳转)。这种寻址一般用
于相对跳转指令。 假设 PC=2000H 是当前该指令的地址,执行 SJMP 10H,则单片机要执行的下一条指
令的地址(即转移的目的地址)=(2000H+02H)+10H=200CH,加 02H 是因为当前跳转指令
代码为两个字节。执行完指令后,单片机的 PC=200CH,将转移到 200CH 程序单元去执行
程序。 相对寻址也可用于三字节指令。
3.2.7 位寻址
位寻址是指对片内 RAM 的寻址区(20H~2FH)和可以位寻址的专用寄存器进行位操作
时的寻址方式。在进行位操作时,借助于进位 C 作为操作累加器。操作数直接给出该位的地
址,然后根据操作码的性质对其进行位操作。位寻址的位地址和直接寻址的字节地址的形式
完全一样,主要由操作码来区分。 例如:MOV 20H,C;20H 是位寻址的位地址,表示把进位标志位 CY 的内容传送给位
地址 20H(地址为 24H 存储单元的 D0 位)。 MOV 20H,A;20H 是直接寻址的字节地址。 综上所述,所有的操作数寻址方式和寻址空间如表 3-2 所示。
MCS-51 系列单片机原理与接口技术
·40·
表 3-2 操作数的寻址方式和寻址空间
寻址方式 寻址空间 立即寻址 程序存储器 寄存器寻址 工作寄存器 R0~R7,A,B,CY,DPTR,AB 直接寻址 片内 RAM 低 128 字节、专用寄存器
寄存器间接寻址 片内 RAM 低 128 字节(@R0、@R1、@SP(对 PUSH 和 POP 指令);片
外 RAM(@R0、@R1 和@DPTR) 基址加变址寄存器寻址 程序寄存器(@A+PC、@A+DPTR) 相对寻址 程序寄存器 256 字节范围(@PC+偏移量) 位寻址 片内 RAM 的寻址区(20H~2FH)和可以位寻址的专用寄存器
3.3 指令系统详解
3.3.1 数据传递类指令
数据传送类指令是 基本、 重要,也是编程时使用得 频繁的一种指令。数据传送类
指令是把源操作数传送到目的操作数。指令执行后,源操作数不改变,目的操作数修改为源
操作数。数据传送类指令共有 4 条,除了通过累加器进行数据传送之外,还有不通过累加器
的数据存储器之间或工作寄存器与数据寄存器之间直接进行数据传送的指令。传送类指令一
般不影响标志位,只有堆栈操作可以直接修改程序状态字 PSW。另外,对目的操作数为 A的指令将影响奇偶标志 P 位。
数据传送类指令用到的助记符有 MOV、MOVX、XCH、XCHD、SWAP、PUSH、POP共 8 种。源操作数可以采用寄存器寻址、寄存器间接寻址、直接寻址、立即寻址、基址加变
址寄存器寻址 5 种方式;目的操作数可以采用前三种寻址方式。 1.以累加器为目的操作数的指令
MOV A,Rn ;6 个状态周期 MOV A,direct ;6 个状态周期 MOV A,@Ri ;6 个状态周期 MOV A,#data ;6 个状态周期
第一条指令中,Rn 代表的是 R0~R7。第二条指令中,direct 就是直接地址。第 3 条指
令中,Ri 表示间接寻址寄存器 R0 或 R1。第四条指令是将立即数 data 送到 A 中。 【例】 MOV A,R1 ;把寄存器 R1 中的值赋给 A
MOV A,10H ;把 RAM 中 10H 单元的数值赋给 A MOV A,@R1 ;R1 中的数值为地址,把该地址中的数值赋给 A MOV A,#30H ;把立即数[30H]赋给 A
传送指令是以累加器(A)为中心的。绝大部分传送操作均需通过 A 进行,所以累加
器(A)是个特殊的、使用十分频繁的寄存器。但是在 MCS-51 中,由于可以进行直接地址
之间的数据传送,大大地减轻了累加器的负担,缓解了频繁使用累加器(A)所造成的“瓶
第 3 章 指令系统
·41·
颈”现象。 2.以寄存器 Rn 为目的操作数的指令
MOV Rn,A ;6 状态周期 MOV Rn,direct ;12 状态周期 MOV Rn,#data ;6 状态周期
这组指令的功能是把源地址单元中的内容送入工作寄存器,源操作数不变。 【例】 MOV R1,A ;把 A 中的值赋给寄存器 R1
MOV R1,10H ;把片内地址为 10H 中的数值赋给 R1 MOV Rl,#10 ;把立即数[10H]赋给 R1
3.以直接地址为目的操作数的指令 MOV direct,A ;6 状态周期 MOV direct,Rn ;6 状态周期 MOV directl,direct2 ;12 状态周期 MOV direct,@Ri ;12 状态周期 MOV direct,#data ;12 状态周期
这组指令的功能是把源地址单元中的内容赋给直接地址。源操作数可以使用寄存器寻
址、直接寻址、寄存器间接寻址和立即寻址等寻址方式。 【例】MOV 20H,A ;把 A 中的数值赋给直接地址 20H MOV 20H,R1 ;把 R1 中的数值赋给直接地址 20H MOV 20H,10H ;把直接地址 10H 中的值赋给直接地址 20H MOV 20H,@R1 ;以 R1 中的数值为地址,把该地址中的数值赋给直接地址 20H
MOV 20H,#10H :把立即数[10H]赋给直接地址 20H 4.以间接地址为目的操作数的指令
MOV @Ri,A :6 状态周期 MOV @Ri,direct ;12 状态周期 MOV @Ri,#data ;6 状态周期
这组指令的功能是把源地址单元中的内容赋给间接地址。源操作数可以使用寄存器寻
址、直接寻址和立即寻址等寻址方式。 【例】 MOV @R0,A ;把累加器(A)中的数值赋给 30H
MOV @R0,20H ;把直接地址 20H 中的数值赋给 30H MOV @R0,#30H ;把立即数[30H]赋给 30H 间接寻址寄存器 Ri 由操作码字节的 低位来选定,间址寻址是以 Ri 的内容作为操
作数的地址来进行寻址的。也就是说 Ri 的内容并不是操作数,而是操作数的地址,而此
地址所对应的存储单元内容才是真正的操作数。 直接寻址 direct 单元在编程时就已明确,而间接寻址单元是在程序进行中明确的,
间接寻址空间和直接寻址空间范围相同,均为 0~255 个单元地址。 立即数#data 为一个常数,它是不带符号的 8 位二进制数。在编程中必须注意的是直
接地址 direct 和立即数#data 均以数据形式出现,但两者的含义是不相同的。在指令中必
须用#作为立即数的前缀以与直接地址相区别。例如:
MCS-51 系列单片机原理与接口技术
·42·
MOV 80H, #10H;是一条 3 字节指令,表示把立即数 10H 送到片内 RAM 中的 80H地址单元中去。
MOV 80H,20H;是一条 3 字节指令,表示把 20H 单元的内容送到 80H 单元中去。
这是片内数据存储单元中的地址单元之间数据的直接传送。 5.十六位数的传递指令
MOV DPTR, #data16 ;12 状态周期 8051 是一种 8 位机,这是惟一的一条 16 位立即数传递指令,其功能是将一个 16 位的立
即数送入 DPTR 中去。其中高 8 位送入 DPH,低 8 位送入 DPL。此操作不影响标志位。 例: MOV DPTR, #1020H 执行这条指令的结果是 DPH 中的值为[10H],DPL 中的值为[20H]。也可以分别向 DPH、
DPL 送数: 【例】 MOV DPH,#10H MOV DPL,#20H 这两条指令执行的结果和执行 MOV DPTR,#1020H 的结果一样。 6.累加器(A)与片外 RAM 之间的数据传递类指令
MOVX A, @Ri ;12 状态周期 MOVX @Ri, A ;12 状态周期 MOVX A, @DPTR ;12 状态周期 MOVX @DPTR, A :12 状态周期
在 8051 中,与外部存储器 RAM 打交道的只可以是 A 累加器。因此所有需要送入外部
RAM 的数据必需要通过 A 送去,而所有要读入的外部 RAM 中的数据也必需通过 A 读入。
内部 RAM 之间可以直接进行数据的传递。这就是内部 RAM 与外部 RAM 的区别。 【例】MOV DPTR,#1000H :要读的外部 RAM 地址 MOVX A,@DPTR ;读外部 RAM 中 1000H 中的内容到累加器(A) MOV DPTR,#2000H ;要写的外部 RAM 地址 MOVX @DPTR,A ;把累加器(A)中的内容写到地址为 2000H 的外部RAM
中 这段程序是将外部 RAM 中 1000H 单元中的内容读到累加器(A),然后通过累加器(A)
送入外部 RAM 中 2000H 单元中。 7.程序存储器向累加器(A)传送指令 MOVCA,@A+DPTR ;6 状态周期 本指令是将 ROM 中的数送入 A 中。此指令也被称为查表指令,常用于在 ROM 中查找
表格。 【例】MOV DPTR,#TABLE ;把表格基址赋给地址指针
MOV A,R0 ;把偏移地址赋给 A MOVC A,@A+DPTR ;从表格读取数据 …… TABLE : DB 0,1,8,27,64,125 ;表格
这段指令执行查询操作,数据在表格中的顺序存放在 R0 中,如 R0 中的内容为 3,则对
第 3 章 指令系统
·43·
应表格中的数值 8,地址指针寄存器 DPTR 中存放了表格的起始地址#TABLE,偏移地址 R0中存放的就是表格的顺序个数。
8.堆栈操作指令 PUSH direct :12 状态周期 POP direct :12 状态周期
第一条指令是入栈指令,将 direct 中的内容送入堆栈中,第二条指令是出栈指令,将堆
栈中的内容送回到 direct 中。入栈指令的执行过程是,首先将 SP 中的值加 1,然后把 SP 中
的值当作地址,将 direct 中的值送进以 SP 中的值为地址的 RAM 单元中。出栈指令,首先将
SP 中的值作为地址,并将此地址中的数送到 POP 指令后面的 direct 中,然后 SP 减 1。 MOV SP,#10H ;设置堆栈指针地址。 … MOV A, #20H
LOOP:LCALL BLK ;调用子程序 BLK INC A CJNE A,#80H, LOOP ……
BLK:PUSH A ;累加器(A)入栈,保护累加器(A)中的内容 …… POP A ; 累加器(A)的内容出栈。 RET 在该实例中,程序开头设置堆栈指针;LCALL BLK 表示调用子程序,在子程序中,要
用到累加器(A),所以累加器(A)中的内容要发生变化。堆栈所要完成的是保护主程序中
累加器(A)的内容不变,即在子程序中累加器(A)的内容可以变化,而在跳出主程序后累
加器(A)的内容要恢复。PUSH A 指令在子程序开头保护累加器(A)的内容,而 POP A这条指令在子程序结束后恢复累加器(A)中的内容。
3.3.2 算术运算类指令
算术运算类指令是通过算术逻辑运算单元 ALU 进行数据运算处理的指令。它包括各种
算术操作,如加、减、乘、除四则运算。这些指令能对 8 位无符号数进行直接运算,同时如
果借助溢出标志时还能对有符号的二进制整数进行加减运算。同时借助进位标志,可以实现
多精度的加减和循环移位。 算术运算指令执行的结果将使进位 CY、辅助进位 AC、溢出 OV 三种标志置位或复位。
但是加 1 和减 1 指令不影响这些标志。 该类指令使用的助记符为 ADD、ADDC、INC、DA、SUBB、DEC、MUL、DIV 等 8 种。 1.不带进位位的加法指令
ADD A, #DATA ;6 状态周期 ADD A, direct ;6 状态周期 ADD A, Rn ;6 状态周期 ADD A, @Ri ;6 状态周期
MCS-51 系列单片机原理与接口技术
·44·
将 A 中的值与其后面的值相加,结果放到累加器(A)中。 【例】 MOV A,#20H
ADD A,#10H 执行完这两条指令后,A 中的值为[30H]。
MOV 30H,#10H MOV A,#20H ADD A, 30H
执行完这段指令后,A 中的值为[30H]。 MOV A, #10H MOV R0, #20H ADD A, R0
这段程序执行后,累加器中的值变为[30H]。 MOV A, #10H MOV 30H, #20H MOV R0, #30H ADD A, @R0
这段程序也完成了加法运算,累加器(A)中的值为[30H]。 2.带进位位的加法指令
ADDC A, #DATA ;6 状态周期 ADDC A, direct ;6 状态周期 ADDC A, Rn ;6 状态周期 ADDC A, @Ri ;6 状态周期
将 A 中的值与其后面的值相加,结果放到 A 中。ADDC 指令和 ADD 指令的区别是 ADDC考虑了进位位 C,如果进位位 C=1,则需要多加 1,如果 C=0,则和 ADD 指令计算结果一样。
由于 8051 单片机是 8 位机,所以只能做 8 位的数学运算,但 8 位运算的范围只有 0~255,这在实际工作中是不够的,因此要进行扩展。一般是将 2 个 8 位的数学运算合起来,组成一
个 16 位的运算,这样就可以表达 0~65535 范围内的数。 【例】 MOV A, #10H
ADD A, #20H MOV 30H, A ;低 8 位相加,结果存放于 30H。 MOV A, #30H ADDC A, #40H MOV 30H, A ;高 8 位相加,结果放入 31H。
这段指令完成了 16 位的加法:[3010H+4020H],首先低位相加,[10H+20H],然后高位
带进位相加,[30H+40H],该指令执行完成后,在地址为 31H 和 30H 寄存器中存放了 16 位
加法的和。 3.带借位的减法指令
SUBB A, #data ;6 状态周期 SUBB A, Rn ;6 状态周期
第 3 章 指令系统
·45·
SUBB A, direct ;6 状态周期 SUBB A, @Ri ;6 状态周期
将累加器(A)中的数值带借位减去后面的数,结果放累加器(A)中。 【例】CLRC MOV A,#20H SUBB A,#10H 这段指令指令实现了 20H-10H,执行后 A 中的值为[10H],同样,借位减法可以完成 16
位或更多位的减法。 4.乘法指令
MUL A, B ;24 状态周期 此指令的功能是将 A 和 B 中的两个 8 位无符号数相乘,两数相乘结果一般比较大,因此
终结果用 1 个 16 位数来表达,其中高 8 位放在 B 中,低 8 位放在 A 中。在乘积大于[0FFFFH](65535)时,OV 置 1(溢出),否则 OV 为 0,而 CY 总是 0。
【例】 MOV A, #10H MUL B, #20H
执行这段指令后,乘积为[0200H],所以在 B 中放的是[02H],而 A 中放的则是[00H]。 5.除法指令
DIV A, B ;24 状态周期 此指令的功能是将 A 中的 8 位无符号数除以 B 中的 8 位无符号数,商放在 A 中,余数
放在 B 中,CY 和 OV 都是 0。如果在做除法前 B 中的值是[0H]也就是除数为 0,那么 OV=1。 【例】 MOV A, #20H MOV B, #10H DIV A, B 这段指令完成 A/B 的功能,结果商 A=[02H],余数 B=[00H]。 6.加 1 指令
INC A ;6 状态周期 INC Rn ;6 状态周期 INC direct ;6 状态周期 INC @Ri ;6 状态周期 INC DPTR ;12 状态周期
将目标操作数中的值加 1。 【例】A=[12H],R0=[33H],21H=[32H],34H=[22H],DPTR=[1234H]。执行下面的指令。
INC A INC R0 1NC 21H INC @R0 1NC DPTR
结果 A=[13H],R0=[34H],21H=[33H],内部 RAM 单元 34H=[23H],DPTR=[1235H]。 从结果上看 INC A 和 ADD A,#1 是一样的,但 INC A 是单字节、单周期指令,而 ADD
MCS-51 系列单片机原理与接口技术
·46·
#1 则是双字节、双周期指令,而且 INC A 不会影响 PSW 位。如果 A=[00H],执行 INC A 后
A=[00H],而 CY 依然保持不变。如果是 ADD A,#1,则 A=[00H],而 CY 一定是 1。所以
INC 指令尽量不要用于加法运算,而用来做计数、地址增加等。ADD、ADDC 加法类指令都
以累加器(A)为操作数指令,其中一个加数必须放在累加器(A)中,而运算结果也必须放
在累加器(A)中,INC 指令的操作数可以是寄存器、内存地址、间址寻址的地址等。 7.减 1 指令
DEC A ;6 状态周期 DEC RN ;6 状态周期 DEC direct ;6 状态周期 DEC @Ri ;6 状态周期
将后面目标操作数中的值减 1。 【例】 A=[12H],R0=[35H],21H=[32H],34H=[22H] 。执行下面的指令。
DEC A DEC R0 DEC 21H DEC @R0
结果 A=[11H],R0=[34H],21H=[31H],片内 RAM 单元 34H=[21H],DPTR=[1233H]。 DEC 指令是 INC 指令的逆运算,用法基本相同,DEC 指令不会影响 PSW 位,该指令主
要用于计数、地址递减等。
3.3.3 逻辑运算类指令
逻辑运算类指令包括与、或、异或、清除、求反、移位(左移、右移)等逻辑操作。使
用的助记符有:ANL、ORL、XRL、RL、RLC、RR、RRC、CPL、CLR 等 9 种。 1.对累加器(A)的逻辑操作
CLR A ;6 状态周期 将 A 中的数值清 0,单周期单字节指令,与 MOV A,#00H 效果相同
CPL A 将 A 中的数值按位取反。
RL A ;6 状态周期 将 A 中的数值逻辑左移。
RLC A ;6 状态周期 将 A 中的数值加上进位位进行逻辑左移。
RR A ;6 状态周期 将 A 中的数值进行逻辑右移。
RRC A ;6 状态周期 将 A 中的数值加上进位位进行逻辑右移。
SWAP A ;6 状态周期 将 A 中的数值高、低 4 位交换。 【例】 CLR A ;累加器(A)清零
第 3 章 指令系统
·47·
MOV A, #01010101B CPL A ;累加器(A)中的内容取反 RL A ;累加器(A)中的内容左移,第 7 位送到第 0 位,第 0 位送到第 1 位,
依次类推,结果 A=[01010101B]。 SETB C RLCA ;累加器(A)中的内容与 C 一起左移,即对[101010101B]进行左移,移
位后变为[010101011B],C 进位位的值变成了 0,A=[10101011B]。 RR A ;累加器(A)中的内容右移,第 7 位送到第 6 位,第 6 位送到第 5 位,
依次类推,结果 A=[11101010lB]。 SETB C RRCA ;累加器(A)中的内容与 C 一起进行右移,即对[101010101B]进行右移
后变为[1 10101010B],C 进位位的值还是 1,A=[110101010B]。 MOV A, #0000llllB SWAP A ;累加器(A)中的数据高低 4 位互换,A=[11110000B]。
2.逻辑与指令 ANL A, Rn ;6 状态周期
A 与 Rn 中的值按位与,结果存放累加器(A)中。 ANL A, direct ;6 状态周期
A 与 direct 中的值按位与,结果存放累加器(A)中。 ANL A, @Ri ;6 状态周期
A 与间址寻址单元@Ri 中的值按位与,结果存放累加器(A)中。 ANL A, #data ;6 状态周期
A 与立即数 data 按位与,结果存放累加器(A)中。 ANL direct, A ;6 状态周期
direct 中值与 A 中的值按位与,结果存放在 direct 中。 ANL direct, #data ;6 状态周期
direct 中的值与立即数 data 按位与,结果存放在 direct 中。 【例】 MOV A, #01010101H
ANL A, #0FH ;累加器(A)和[0FH]相与 这段指令完成了累加器(A)中的内容高 4 位舍去、低 4 位保留的任务。 两个数相与,对应位相与,对应位有一个是零,则这一位的相与结果就是 0,只有两个
都是 1,相与的结果才是 1。 3.或指令
ORL A, Rn ;6 状态周期 A 和 Rn 中的值按位或,结果存放累加器(A)中。
ORL A, @Ri ;6 状态周期 A 和间址寻址单元@Ri 中的值按位或,结果存放在累加器(A)中。
ORL A, direct ;6 状态周期 A 和 direct 中的值按位或,结果存放在累加器(A)中。
MCS-51 系列单片机原理与接口技术
·48·
ORL A, #data ;6 状态周期 A 和立即数 data 按位或,结果存放在累加器(A)中。
ORL direct, A ;6 状态周期 direct 中值和 A 中的值按位或,结果存放在 direct 中。
ORL direct, #data ;6 状态周期 direct 中的值和立即数 data 按位或,结果存放在 direct 中。 【例】 MOV A, #00001111B
ORL A, #F0H ;累加器中的内容和[F0H]相或,在结果为 A=[11111111B]。 这段指令保护累加器的低 4 位,高 4 位置 1。 或操作也是两个数的对应位相或,对应位有一个是 1,则相或结果为 1;只有两个同是 0,
或的结果才为 0。 4.异或指令
XRL A, Rn ;6 状态周期 A 和 Rn 中的值按位异或,结果存放在累加器(A)中。
XRL A, direct ;6 状态周期 A 和 direct 中的值按位异或,结果存放在累加器(A)中。
XRL A, @Ri ;6 状态周期 A 和间址寻址单元@Ri 中的值按位异或,结果存放在累加器(A)中。
XRL A, #data ;6 状态周期 A 和立即数 data 按位异或,结果存放在累加器(A)中。
XRL direct, A ;6 状态周期 direct 中值和 A 中的值按位异或,结果存放在 direct 中。
XRL direct, #data ;6 状态周期 direct 中的值和立即数 data 按位异或,结果存放在 direct 中。 【例】 MOV A, #00001110B
XRL A, #11110000B ;累加器( A )中的数据和 [11110000B] 相异或,
A=[11111110B] 不难看出,异或运算是按位异或的,对应位同是 0 或者同是 1,则对应位异或结果为 0,
否则为 1。
3.3.4 控制转移类指令
程序的执行顺序是由 PC 自动加 1 来实现的,但在实际应用时,往往需要强迫改变程序
执行顺序,比如调用子程序,根据判断条件使程序转到不同的分支等。这就需要使用控制转
移类指令控制程序到新的 PC 地址上。 控制转移指令有 64KB 地址范围的长转移和长调用指令,2KB 地址范围的绝对转移(短
转)和绝对调用(短调)指令,整个 64KB 空间的间接转移和短相对转移指令及条件转移指
令。 这类指令用到的助记符有 ACALL、AJMP、LCALL、LJMP、SJMP、JMP、JZ、JNZ、
CJNE、DJNZ 十种转移类指令。
第 3 章 指令系统
·49·
1.无条件转移类指令 AJMP addrll;短转移类指令,12 状态周期 LJMP addrl6 ;长转移类指令,12 状态周期 SJMP rel ;相对转移指令,12 状态周期 这三条指令,都是无条件跳转指令,让程序跳转到标号处继续运行。这三条跳转指令的
区别是跳转的范围不一样,LJMP 指令可以在 64KB 范围内跳转,而 AJMP 可以在 2KB 范围
内跳转,而 SJMP 只能 256KB 范围内跳转。原则上,所有用 SJMP 或 AJMP 的地方都可以用
LJMP 来替代,因此在不确定跳转距离时,一般使用 LJMP。AJMP 是双字节指令,这条指令
本身占用存储器(ROM)的两个单元。而 LJMP 则是三字节指令,即这条指令占用存储器
(ROM)的 3 个单元。 2.间接转移指令
JMP @A+DPTR ;12 状态周期 这条指令的用途也是跳转,它是相对于 DPTR 的间接跳转。 【例】 MOV DPTR,#TAB;将 TAB 所代表的地址送入 DPTR
MOV A,R0 ;从 R0 中取数 JMP @A+DPTR ;跳转 TAB:AJMP S1 ;跳转表格 AJMP S2 AJMP S3
使用 JMP 指令时,累加器(A)里面的内容决定了跳转的偏移量。 3.条件转移指令
JZ rel ;12 状态周期 JNZ rel ;12 状态周期
条件转移指令使程序在满足一定条件时进行相对转移。这两条指令都是判断累加器(A)
的内容是否为 0 以决定是否转移的指令。第一条指令的功能是:如果 A=[0H],则转移到标号
处,否则顺序执行本指令的下一条指令;第二条指令的功能是:如果 A=[0H],则转移到标
号处,否则顺序执行本指令的下一条指令。 4.比较转移指令
CJNE A, #data, rel ;12 状态周期 CJNE A, direct, rel ;6 状态周期 CJNE Rn, #data, rel ;6 状态周期 CJNE @Ri, #data, rel ;6 状态周期
这 4 条指令都是比较跳转指令,第一条指令的功能是将 A 中的值和立即数 data 比较,如
果两者相等,就顺序执行下一条指令,如果不相等,就转移到标号处。可以利用这条指令判
断数是否相等。第二条是把 A 中的值和直接地址中的值比较。第三条是将直接地址中的值和
立即数比较。第四条是将间址寻址得到的数和立即数比较。 【例】 CJNE A, 10H,UNEQU ;把 A 中的值和 10H 中的值比较
CJNE 10H, #35H, UNEQU ;把 10H 中的值和[35H]中的值比较 CJNE @R0, 35H, UNEQU ;把 R0 中的值作为地址,从此地址中取数同
MCS-51 系列单片机原理与接口技术
·50·
[35H]比较 NOP CLR A
UNEQU:MUL A, B ;上面的比较不相等,则跳转到这里继续执行 5.环转移指令
DJNZ Rn, rel ;12 状态周期 DJNZ direct, rel ;12 状态周期
寄存器减 1,非零就跳转到标号处,否则执行下一条指令。 6.调用与返回指令 有时一个功能会在程序的不同地方反复使用,我们可以把这个功能做成一段程序,称为
子程序,每次需要用到这个功能时就调用此子程序。子程序执行完之后必须再回到主程序调
用子程序的下面一条指令处继续执行。 LCALL addrl6 ;长调用指令,12 状态周期 ACALL addrll ;短调用指令,12 状态周期 RET ;返回指令,12 状态周期
7.空操作指令 NOP:空操作,停一个周期,一般用作短时间的延时,6 状态周期。
3.3.5 布尔变量操作类指令
在 8051 中,有一部份 RAM 和一部份 SFR 具有位寻址功能,也就是说这些 RAM 的每一
位都有自己的地址,如表 3-3 所示,可以直接用这个地址对其进行操作。
表 3-3 位寻址寄存器
字节地址 位地址
2FH 78H 2EH 70H 2DH 68H 2CH 60H 2BH 58H 2AH 50H 29H 48H 28H 40H 27H 38H 26H 30H 25H 28H 24H 20H 23H 18H 22H 10H 21H 08H 20H 07H 06H 05H 04H 03H 02H 01H 00H
第 3 章 指令系统
·51·
内部 RAM 的 20H~2FH 这 16 字节,就是 8051 的位寻址区。如表 3-3 所示,RAM 中的
每个位我们都可以直接用位地址找到它们,而不必用字节地址。 8051 中有一些 SFR 可以进行位寻址,这些 SFR 的特点是其字节地址均可被 8 整除,如
A 累加器、B 寄存器、PSW、IP(中断优先级控制寄存器)、IE(中断允许控制寄存器)、
SCON(串行口控制寄存器)、TCON(定时器/计数器控制寄存器)、P0~P3(I/O 端口锁存
器)。 MCS-51 单片机的硬件结构中,有一个位处理器(又称布尔处理器),它有一套位变量
处理指令集。它有自己的位 RAM,也就是我们刚讲的内部 RAM 的 20H~2FH 这 16 个字节
单元,即 128 个位单元。它还有自己的位 I/O 空间,即 P0.0……P0.7、P1.0……P1.7、P2.0……
P2.7、P3.0……P3.7。当然在物理实体上它们与原来的以字节寻址用的 RAM 及端口是完全相
同的,也就是说这些 RAM 及端口都可以有两种用法访问。 1.位传送指令 MOV C,BIT ;6 状态周期 MOV BIT,C ;12 状态周期 功能是实现位累加器(CY)和其他位地址之间的数据传递 【例】 MOV P1.0,CY ;这条指令将 CY 中的状态传送到 P1.0 引脚上去。
MOV CY,P1.0 ;这条指令将 P1.0 的状态赋给 CY。 2.位修正指令
CLR C ;6 状态周期 CLR BIT ;6 状态周期
这组指令是位清 0 指令。 【例】 CLR P1.0 ;这条指令使 P1.0 变为 0
SETB C ;6 状态周期 SETB BIT ;6 状态周期
这组指令是位置 1 指令。 【例】 SETB P1.0 ;这条指令使 P.0 变为 1。 CPL C ;使 CY 等于原来的相反的值,6 状态周期。 CPL bit ;使指定位的值等于其相反值,6 状态周期 这两条指令是位取反指令。 【例】 CPL P1.0 ;这条指令使 P1.0 取反。 3.位逻辑运算指令
ANL C,bit ;12 状态周期 CY 与指定的位地址的值相与,结果送回 CY。
ANL C,/bit ;12 状态周期 先将指定的位地址中的值取出后取反,再和 CY 相与,结果送回 CY,但指定的位地址
中的值并不发生变化。 【例】 ANL C,/P1.0 设执行本指令前,CY=1,P1.0 等于 1,则执行完本指令后 CY=0,而 P1.0 也等于 1。
ORL C, bit ;12 状态周期
MCS-51 系列单片机原理与接口技术
·52·
CY 与指定的位地址的值相或,结果送回 CY。 ORL C , /bit ;12 状态周期
先将指定的位地址中的值取出后取反,再和 CY 相或,结果送回 CY,但指定的位地址
中的值并不发生变化。 4.位条件转移指令
JC rel ;12 状态周期 JNC rel ;12 状态周期
第一条指令的功能是如果 CY=1 就转移到标号处,不等于 1 就顺序执行。第二条指令和
第一条指令相反,即如果 CY=0 就转移标号处,不等于 0 就顺序执行。 JB bit,rel ;6 状态周期 JNB bit,rel ;6 状态周期
第一条指令是如果指定的 bit 位中的值是 1,则转移到标号处,否则顺序执行。第二条指
令判断 bit 是否等于 0,如果 bit 等于 0,就转移到标号处,不等于 0 就顺序执行。
3.4 习题
1.80C51 系列中单片机是否使用完全相同的指令系统? 2.80C51 指令系统中有哪些寻址方式?其相应的寻址空间是多少?请举例说明。 3.什么是源操作数和目的操作数?通常在指令中如何加以区分?请举例说明。 4.试编程将片外 RAM 20H 单元的内容与 R1 的内容相交换。 5.试用 3 种方法将累加器(A)中的无符号数乘 2。 6.在 MOVX 指令中,用@Ri 如何访问片外数据存储器中的 16 位地址空间? 7.将片外数据存储器地址位 20H~40H 区域的数据块,全部移到片内 RAM 的同地址区
域,并将原数据区域全部填为 FFH。
第第 44 章章 汇汇编编语语言言程程序序设设计计
4.1 汇编语言概述
汇编语言是用助记符代表指令的操作码,用标号代表地址、常数或变量的程序设计语言。
助记符一般都是操作码的英文缩写,与机器码相比,汇编语言容易记忆,并且容易书写、阅
读和修改;与高级语言相比,汇编程序具有代码效率高,执行速度快和占用程序存储器少等
优点,因此在采用微处理器的控制系统中经常采用汇编语言。 汇编语言是面向机器的语言,不同的 CPU,其指令系统和汇编语言是不同的,因此,用
汇编语言写的程序一般不能移植。但汇编语言是相似的,掌握一种后,再掌握其他汇编语言
就很容易了。
4.1.1 汇编语言的优点
采用汇编语言编程与采用高级语言编程相比,有以下优点: (1)助记符指令和机器指令一一对应,所以用汇编语言编写的程序效率高,占用的内存
单元和 CPU 资源少,执行速度快。 (2)可直接调用访问存储器、输入/输出接口以及扩展的各种芯片,也可以直接处理中断,
因此,它能直接管理和控制硬件设备。 (3)能准确地掌握指令的执行时间,适用于实时控制系统。
4.1.2 汇编语言程序设计的过程
程序设计,就是用计算机所能接受的形式把解决问题的步骤描述出来。简单地说,程序
设计就是编制计算机程序。汇编语言程序设计就是采用汇编指令来编写计算机程序,对应用
中需要使用的寄存器、存储单元、I/O 端口等要先做出具体安排。一个好的程序不仅应该完
成规定的任务,而且应该层次清晰,易于阅读,并尽可能少占内存,缩短执行时间,但也不
要一味地追求少占内存,缩短执行时间。这样做可能会使程序的可读性变差。随着大规模和
超大规模集成电路的发展,芯片的内存容量在不断增加,计算机执行指令的平均时间在大大
缩短。因此,程序的长短和执行时间,不再显得那么重要,而程序的易读性和程序的开发周
期,显得越来越重要。 用汇编语言编写程序,一般可分为以下 6 个步骤。 1.分析任务,确定算法或解题思路 大家不要急于求成,开始时一定要仔细分析任务,找出合理的算法或思路,有时解决一
MCS-51 系列单片机原理与接口技术
·54·
个问题,往往有多种不同的方法,要从诸多算法中确定一种较为简捷的方法。这一步是完成
任务的关键。 2.制定程序流程图 流程图可以直观地表达程序的执行过程和作者的思路,并且流程图有助于他人阅读程
序,有助于自己发现问题,减少出错。对于复杂的问题,可以由粗到细,先分解问题,然后
再各个击破。 流程图是由一些几何图形、带箭头的线段组成的,常用的几何图形符号如图 4-1 所示。
图 4-1 流程图符号
(1)起始框和结束框:在程序的开始和结束时使用。 (2)处理框:表示一段程序的功能或处理过程。 (3)判断框:表示条件判断,以决定程序的流向。 (4)换页符:当流程图在一页上画不下时,使用换页符表示不同页流程图之间的连接。 (5)带箭头的线段:表示程序执行的流向。 3.确定数据结构 合理地选择和分配内存单元以及工作寄存器。希望尽量少占用程序存储器和数据存储
器。 4.编写程序 根据程序流程图,精心选择合适的指令和寻址方式来编制源程序。要求程序简洁明了,
层次清晰,执行速度快。 5.上机调试程序 将编好的源程序进行汇编,并执行目标程序,检查和修改程序中的错误,对程序运行的
结果进行分析,直至正确为止。
4.1.3 程序质量
解决某一问题、实现某一功能的程序不是惟一的。程序的优劣通常有以下 5 个判别标准: 程序的执行时间 程序所占用的内存字节数 程序的逻辑性、可读性 程序的兼容性、可扩展性 程序的稳定性 一般来说,一个程序的执行时间越短,占用的内存单元越少,其质量也就越高。这就是
程序设计中的“时间”和“空间”的概念。程序设计的逻辑性强、层次分明、数据结构合理、
第 4 章 汇编语言程序设计
·55·
便于阅读也是衡量程序优劣的重要标准;同时还要保证程序在任何实际的工作条件下,都能
正常运行。 另外,在较复杂的程序设计中,必须充分考虑程序的可读性和稳定性。同时,程序的可
扩展性、兼容性以及容错性等也是衡量与评价程序优劣的重要标准。
4.2 MCS-51 汇编语言
4.2.1 汇编语言程序的格式
汇编语句分为 3 部分,即标号、操作码、操作数。每部分之间要用分隔符隔开,分隔符
可以采用空格、冒号“:”、分号“;”,具体格式如下: 标号: 操作码 操作数 ;注释 必须严格语句格式编写程序,对于任一汇编语句来说,只有操作码是必不可少的。 (1)标号 标号位于语句的开始,由 1~8 个字母和数字组成,它代表该语句的地址。标号必须由
字母打头,以冒号结尾,不能使用指令助记符、伪指令或寄存器名。标号不是语句的必要组
成部分,在需要时才使用。 以下是一些合法的标号: B3,DA,AD,DELY,LOOP 等。 以下的字符串不能用作标号: 4A,A+B,END,ADD 等。 (2)操作码 操作码是指令的助记符,表示语句的性质,不可省略,它是语句的核心部分。 (3)操作数 操作数与操作码之间用空格分开。操作数一般有目的操作数和源操作数,操作数之间用
逗号分开。操作数可以是立即数,也可以是地址,但必须满足寻地方式的规定。MCS-51 的
111 条汇编语言指令大多有两个操作数,但有的只有一个操作数,如 CLR A。空操作指令 NOP无操作数。操作数中的常数可以是二进制数、八进制数、十进制数、十六进制数和字符串常
数。二进制数以 B 结尾;八进制数以 Q 结尾;十进制数以 D 结尾,也可省略;十六进制数
以 H 结尾;字符串用单引号引用。 (4)注释 注释是用户为方便阅读程序而加的说明,可有可无。注释与操作数之间用分号隔开。 【例】 标号 操作码 操作数 注释 LOOP:MOV A,#10H ;寄存器 A 的内容为 10H
MCS-51 系列单片机原理与接口技术
·56·
4.2.2 MCS-51 伪指令
为了便于编程和对汇编语言进行汇编,各种汇编程序都提供一些特殊的指令,供人们编
程使用。这些指令通常称为伪指令,由伪指令确定的操作称为伪操作。伪指令又称汇编程序
控制译码指令。 每种汇编语言都有自己的伪指令,用来对汇编过程进行某种控制,或者对符号、标号赋
值。伪指令和指令是完全不同的,伪指令是不能执行的指令,在汇编过程之中不能产生可执
行的目标代码。对不同版本的汇编语言,伪指令的符号和含义可能有所不同,但基本用法是
相似的。 1.ORG 汇编起始地址伪指令 ORG 伪指令的功能是规定下面的目标程序的起始地址。 指令格式:ORG 16 位地址 【例】 ORG 1000H STAR:MOV A,#34H 上述程序说明标号 START 所在的地址为 1000H,该指令从 1000H 开始存放。 在一个源程序中,可以多次使用 ORG 指令,以规定不同的程序段的起始位置。但所规
定的地址应该是从小到大的,而且不允许重叠,即不同的程序段之间不能有重叠地址。一个
源程序若没有 ORG 指令开始,则从 0000H 开始存放目标码。 2.END 汇编结束伪指令 指令格式:END 或 END 标号 END 是汇编语言源程序的结束标志,END 之后的指令,汇编程序都不予处理。一个源
程序必须有 END 命令,且只能有一个 END 命令。在同时包含有主程序和子程序的源程序中,
同样也只能有一个 END 命令。 如果源程序是一段子程序,END 后不用写标号;如果是主程序,则必须写标号,所写标
号就是该程序中第一条指令的符号地址。 3.EQU 赋值伪指令 格式:字符名称 EQU 数或汇编符号 赋值命令 EQU 将一个数或者特定的汇编符号赋予规定的字符名称。 这里使用的“字符名称”不是标号,不能用分号作分隔符。用 EQU 指令赋值以后的字
符名称可以用作数据地址、代码地址、位地址或者立即数。因此,给字符名称所赋的值可以
是 8 位数,也可以是 16 位数。 【例】 TEMP EQU R2 MOV A,TEMP 这里将 TEMP 赋值为汇编符号 R2,在后面的指令中 TEMP 可以代替 R2 使用。 使用 EQU 命令时必须先赋值后使用,而不能先使用后赋值。同时,该字符名称不能和
汇编语言的关键字同名,如 A、ADD、SJMP、B 等。
第 4 章 汇编语言程序设计
·57·
4.DL 定义标号值伪指令 格式:字符名称 DL 表达式 DL 命令将数据地址或代码地址赋予规定的字符名称。 DL 伪指令的功能与 EQU 有些相似,使用时要注意它们有以下区别: (1)EQU 伪指令必须先定义后使用,而 DL 伪指令则无此限制; (2)用 EQU 伪指令可以把一个汇编符号赋给一个字符名称,而 DL 伪指令则不能; (3)DL 伪指令可将一个表达式的值赋给一个字符变量,所定义的字符变量也可以出现
在表达式中,而 EQU 定义的字符则不能这样使用。 【例】 COUNT DL 1000H COUNT DL COUNT+1 DL 伪指令在程序中常用来定义数据地址。 5.DB 定义字节伪指令 格式:【标号:】 DB 8 位二进制数表 DB 命令是从指定的地址单元开始,定义若干个 8 位内存单元的内容。 这个伪指令是在程序存储器的某一部分存入一组 8 位二进制数,或者将一个数据表格存
入程序存储器中。这个伪指令在汇编以后,将影响程序存储器的内容。 【例】 ORG 1000H TABLE:DB 30H,31H,32H,33H,34H,35H DB 36H,37H,38H,39H ;0~9 的 ASCII 码 标号 TABLE 的地址为 1000H,此伪指令定义了将 0~9 的 ASCII 码值依次存入从 1000H
开始的连续存储单元,即 1000H 存入 30H,1001H 存入 31H,依此类推。 6.DW 定义字伪指令 格式:【标号:】 DW 16 位二进制数表 定义字命令 DW 是从指定的地址开始定义若干 16 位数据。一个 16 位数要占据两个单元
的存储器,其中,高 8 位存入低地址字节,低 8 位存入高地址字节。 【例】 DW 100H, 3456H,8H 表示按顺序存入 01H、00H、34H、56H、00H、08H。
注意:DB 和 DW 定义的数表中,数的个数不能超过 80 个。若数据的数目较多,则可以使用多个
命令定义。一般用 DB 定义数据,用 DW 定义地址。
7.DS 定义存储区伪指令 格式:【标号:】 DS 表达式 定义空间命令 DS 从指定的地址开始,保留若干字节的内存空间以作备用。 在汇编以后,将根据表达式的值来决定从指定的地址开始留出多少个字节空间,表达式
也可以是一个指定的数值。 【例】ORG 2000H DS 05H DB 10H, 20H 汇编后,从 2000H 开始保留 5 个字节的内存单元,然后从 2005H 开始,按照下一条 DB
MCS-51 系列单片机原理与接口技术
·58·
命令给内存单元赋值,即(2005H)=10H,(5006H)=20H。保留的空间将由程序的其他部
分决定它们的用途。 DB、DW、DS 伪指令都只对程序存储器起作用,不能用来对数据存储器的内容进行赋
值或其他初始化的工作。 8.BIT 位定义伪指令 格式:字符名称 BIT 位地址 BIT 命令对位地址赋予所规定的字符名称。 【例】 A1 BIT A.1 A2 BIT P2.0 这样就把两个位地址分别赋给了两个变量 A1 和 A2,在编程中它们就可当作位地址来使
用。这也是直接位寻址的一种表示方式。
4.3 汇编程序设计
在 MCS-51 单片机应用系统中,有许多应用程序,如循环程序、查表程序、散转程序、
数制转换等,其他还有许多与外围芯片、外围设备有关的应用程序,如显示、键盘、打印、
采集程序等。 前者有不少子程序库可供参考,后者与硬件电路有关,本节重点介绍一些与软件结构相
关的程序设计方法。
4.3.1 顺序结构程序设计
顺序结构程序是一种 简单、 基本的程序。它按照逻辑操作顺序,从某一条指令开始依
次顺序执行。在顺序结构程序中没有分支,也没有子程序,但它是组成复杂程序的基础、主干。 【例】不带符号多字节加法。 设被加数存放于片内 RAM 的 10H(低位字节)、11H(高位字节),加数存放于 12H(低
位字节)和 13H(高位字节),运算结果的和数存放于 10H(低位字节)和 11H(高位字节)中。 程序段如下: START:PUSH ACC ;将 A 中内容进栈保护 MOV R0,#10H ;将 10H 地址送 R0 MOV R1,#1H ;将 12H 地址值送 R1 MOV A,@R0 ;被加数低字节内容送 A ADD A,@R1 ;低字节数相加 MOV @R0,A ;低字节数和存 10H 中 INC R0 ;指向被加数高位字节 INC R1 ;指向加数高位字节 MOV A,@R0 ;被加数高位字节送 A ADDC A,@RI ;高字节数带进位相加 MOV @R0,A ;高字节数和存 11H 中
第 4 章 汇编语言程序设计
·59·
CLR A ADDC A,#00H MOV 20H,A ;进位暂存于 20H 中 POP ACC ;恢复 A 原内容 这里将 A 原内容入栈保护,如果原 R0、R1 内容有用,亦需进栈保护。如果相加结果高
字节的 高位产生进位且有意义时,应对标志 CY 位检测并进行处理。
注意:对于带符号数的减法运算,只要先将减数的符号位取反,即可按加法运算的原则对减法运
算进行处理。
对于带符号数的加法运算,首先要进行两数符号的判定,若两数符号相同,则进行两数
相加,并以被加数符号为结果的符号。 如果两数符号不同,则进行两数相减。如果相减结果为正,则该数即为 后结果,并以
被减数符号为结果的符号。如果两数相减的结果为负,则应将其差取补,并把被减数的符号
取反后作为结果的符号。
4.3.2 分支程序设计
在实际的应用程序中,程序不可能始终是直线执行的。计算机要能够做出一些判断并根
据判断作出不同的处理,这就需要使用分支程序进行设计。 分支程序的特点是程序执行流程中包含条件判断。符合条件要求和不符合条件要求的有
不同的处理路径。 1.简单分支程序 简单分支程序有 3 种典型的形式,如图 4-2 所示。
图 4-2 简单分支程序流程图
【例】求单字节有符号二进制数的补码 正数的补码是其本身,负数的补码是负数的反码加 1。编程时首先要判断输入数的符号。
数的 高位为符号位。 高位为 0 说明该数为正, 高位为 1 说明该数为负。流程图如图 4-3所示。
MCS-51 系列单片机原理与接口技术
·60·
图 4-3 程序流程图
程序段如下: CMPT: MOV A,30H ;单字节二进制数放入内存 30H JNB ACC.7,NCH ;(A)≥0,不需要转换 MOV C,ACC.7 ;保存符号 MOV 10H,C CPL A ADD A,#1 MOV C,10H MOV ACC.7,C ;恢复符号 NCH: END 2.多重分支程序 程序仅判断一个分支条件有时是无法解决问题的,这时需要判断两个或两个以上的条
件,通常也称为复合条件。 多重分支程序结构通常有两种形式,如图 4-4 所示。
图 4-4 多重分支结构流程图
【例】编程按下式要求给 y 赋值。设变量 x 存入 40H 单元中,求得函数 y 的值存入 41H中。
y=x+10 (x≥20 时)
第 4 章 汇编语言程序设计
·61·
y=0 (20>x≥10 时) y=x-10(0<x<10 时) 程序流程如图 4-5 所示。
图 4-5 程序流程图
程序段如下: ORG 4000H
CLR C ;0→Cy MOV A,40H ;取 x CJNZ A,#10,M0 ;与 10 比较
M0:JC M1 ;x<10 则转 M1 CLR C ;0→Cy CJNE A,#14H,MM ;与 20 比较
MM:JC M2 ;x<20 则转 M2 ADD A,#14H ;x>20 则 y=x+10 SJMP EN
M1:CLR C ;-0>Cy SUBB A,#14H ;0<X<10 则 y=x-10 SJMP EN
M2:MOV A,#0 ;20>x≥10 则 y=x-10 EN:MOV 41H,A
END
4.3.3 散转程序设计
散转程序属于分支程序的范畴,是一种并行多分支程序。它根据某种输入或运算结果,
分别转向各个处理程序。散转程序常使用散转指令 JMP@A+DPTR 实现程序的跳转。其中,
MCS-51 系列单片机原理与接口技术
·62·
DPTR 常存放散转地址表的首地址,累加器(A)存放转移地址序号。该指令把累加器的 8位无符号内容与 16 位数据指针的内容相加后装入程序计数器,实现程序的转移。A 的内容不
同,散转的入口地址不同。散转程序的基本结构如图 4-4(a)所示。 【例】根据 R2 的内容,转向各个处理程序 (R2)=0, 转向 PRG0 (R2)=1, 转向 PRGl . . . . . . (R2)=n, 转向 PRGn 程序清单: JMPl: MOV DPTR,#TABELl ;转移指令表首地址
MOV A,R2 ;给每个转移指令空出两个字节空间 ADD A,R2 JNC NADD INC DPH ;R2×2>256 时表空间增加一页
NADD: JMP @A+DPTR TABELl: AJMP PRG0
AlMP PRGl AJMP PRG2 . . . . . . AJMP PRGn
PRG0: … … … …
PRGl: … … … … . . . . . .
PRGn: … … … …
此散转程序在分支转移指令表中使用了 AJMP 指令,因此其寻址范围为 2KB,如果 n 个
散转分支程序长度超过 2KB 时,可改用 64KB 寻址指令 LJMP。这时,上述程序中应给每个
转移指令空出 3 字节空间。 散转分支超过 256 个时,即 n>255 时,一个字节存放不下,这时,可用两个字节,并利
用对 DPTR 进行加法运算的方法,直接修改 DPTR,然后再用 JMP@A+DPTR 实现散转。 【例】根据 R3、R2 内容转向不同的处理程序。 程序清单:
第 4 章 汇编语言程序设计
·63·
JMP2: MOV DPTR,#TABEL2 MOV A,R3 MOV B,#05H MUL A, B ADD A,DPH MOV DPH,A ; R3×5+DPH→DPH MOV A,R2 MOV B,#05H MUL A, B XCH A,B XCH A,DPH ; R2×5 低位在 A 中 ADD A,B ; R2×5 高位加到 DPH 上 JMP @A+DPTR
TABEL2: LJMP PRG0 UMP PRGl LJMP PRGn
4.3.4 循环程序设计
循环结构是强制 CPU 多次重复地执行一串指令的基本程序结构。从本质上看,循环程序
结构是分支程序中的一种特殊形式。在实际编程时,常常需要多次使用一段完全相同的程序,
此时可以采用循环程序,以缩短程序、减少程序占用的内存空间。 1.循环程序结构 循环程序一般包括下面几个部分。 (1)循环初值:循环初值是指执行循环时,各工作单元的初始值以及循环的次数。 (2)循环体:需要多次重复执行的程序段,它是循环程序的主体。 (3)循环修改:执行循环程序时,每执行一次,都要对参与工作的各工作单元的地址进
行修改,以指向下一个待处理的单元。 (4)循环控制:循环控制部分,首先对循环次数进行修改,然后对循环结束条件进行判
断。如果不满足循环结束条件,继续执行循环;如果满足循环结束条件,则退出循环,继续
执行后续程序。 循环程序的一般结构如图 4-6 所示。 2.计数控制循环结构 图 4-6 左侧所示为计数循环结构。先在初始化部分设定计数初值,循环控制部分依据计
数器的值决定循环次数。一般为减“1”计数,每循环一次自动减“1”,直到回“0”时结束。 MCS-51 设有功能很强的循环转移指令: DJNZ Rn,rel ;以工作寄存器作控制计数器 DJNZ direct,rel ;以直接寻址单元作控制计数器
MCS-51 系列单片机原理与接口技术
·64·
图 4-6 循环结构流程图
【例】已知内存单元有 16 个二进制无符号数,分别存放在 40H~4FH 单元中,试求它们
的累加和,并将其和数存放在 R4、R5 中。 存放 16 个二进制无符号数的首地址为 40H,此循环程序的循环次数为 16 次,放在 R2
中,和数放在 R4、R5 中,程序流程如图 4-7 所示。
图 4-7 程序流程图
程序如下: START: MOV R0, #40H MOV R2, #10H MOV R4, #00H MOV R5, #00H
第 4 章 汇编语言程序设计
·65·
LOOP: MOV A, R5 ADD A, @R0 MOV A, #00H ADDC A, R4 MOV R4, A INC R0 DJNZ R2, LOOP END 3.条件控制循环结构 图 4-6 所示右侧为条件控制循环结构。根据非计数性的条件,决定是否继续执行循环程
序。一般常用条件判跳指令进行控制和实现。 【例】浮点尾数规格化程序 在浮点表示法中,数的小数点位置是浮动的。浮点数分为阶码和尾数两个部分,在数的
表示中都有各自的符号位。规格化数即尾数的 高位是有效数字 1 而不是 0。要使浮点数规
格化,只要移动尾数的小数点即可实现。 要求将未规格化尾数左移直到 高位为 1,并从阶码中减去尾数左移的位数,阶码减 1,
直到检测到 高位为 1 为止。每次操作相同,因此应采用循环结构。循环次数,与尾数的数
值有关,因此,采用 高位是否为 1 作为循环结束条件,还需检查尾数是否为 0,以免发生
“死循环”。 设浮点数阶码地址存于 R0 中,尾数字节数存于 R5 中。 程序段如下: START:MOV A,R0 ;阶码地址送 A
CLR C ;清 CY SUBB A,R5 ;(R0)-(R5) MOV R1,A ;尾数低位字节地址存 R1 MOV R6,R5 ;将尾数字节数送 R6 MOV A,#00H ;清 A
LOOPl:XRL A,@R1 ;尾数字节内容与 A 比较 INC R1 ;以检查尾数是否为全 0 JNZ LOOP2 DJNZ R6,LOOP1 SJMP LOOP5 ;若尾数为全 0,转结束
Loop2: DEC R1 ;指向尾数 高位字节 MOV A,@R1 ;尾数 高字节内容送 A JB ACC.6,LOOP5 ;尾数 高位为 1 则转结束 MOV A,R5 ;计算尾数长度(位数) MOV B,#08H MUL AB MOV R2,A
MCS-51 系列单片机原理与接口技术
·66·
LOOP3:MOVA,R5 ;计算出尾数低位字节地址存人 R1 中 MOV R6,A MOV A,R0 CLR C SUBB A,R5 MOV R1,A CLR C
LOOP4:MOV A,@R1 ;尾数低位字节内容送 A RLC A ;带进位左移一位 MOV @R1,A ;移位后仍存原单元 INC R1 ;指向下一尾数单元 DJNZ R6,LOOP4 ;实现每一尾数字节左移一位 DEC @R0 ;阶码减 1 JB ACC.6,LOOP5 ;当尾数 高位为 1 时,转结束 DJNZ R2,LOOP3 ;当尾数 高位不为 1 且(R2)-1≠0 时,
;转 LOOP3 继续左移 LOOP5:SJMP LOOP5 ;结束
END 4.循环嵌套结构 循环嵌套是循环内套循环的结构形式,也称多重循环。 循环的执行过程是从内向外逐层展开的。内层执行完全部循环后,外层完成一次循环,
逐次类推。循环层次必须分明,层次之间不能有交叉,否则将产生错误。 【例】多字节二进制整数转换成 BCD 码。设二进制数低字节地址指针为 R0,二进制数长
度指针为 R5,BCD 码低字节地址指针为 R1。 设计方法:将二进制数从高位开始逐次移入结果寄存器(从 低位开始移入)。 程序段如下: START:PUSH PSW ;保护现场
PUSH ACC PUSH B MOV A,R0 ;将 R0,R1 内容暂存于 R5,R6 中 MOV R5,A MOV A,R1 MOV R6,A MOV A,R5 ;二进制数的字节数加 1 后暂存 R3 中 INC A MOV R3,A CLR A ;清 A
LOOP1:MOV @R1,A ;存放 BCD 码的单元清 0 INC R1
第 4 章 汇编语言程序设计
·67·
DJNZ R3,LOOPl MOV A,R5 ;求二进制数的总长(位数)存 R3 中 MOV B,#08H MUL AB MOV R3,A
LOOP2:MOV A,R5 MOV R0,A MOV A,R5 MOV R2,A
LOOP3:MOV A,@R0 ;二进制数左移一位后存入原单元 RLC A MOV @R0,A INC R0 ;指向下一单元 DJNZ R2,LOOP3 ;未全部移位完,则转 LOOP3 MOV A,R6 MOV R1,A MOV A,R5 ;字节数送 R2,并加 1 MOV R2,A INC R2
LOOP4:MOV A,@R1 ;结果单元内容×2+CY,进行调整后存入原单元 ADDC A,@R1
DA A MOV @R1,A INC R1 DJNZ R2, LOOP4 ;按字节相加未完,转 LOOP4 DJNZ R3 LOOP ;全部处理完了吗? POP B ;出栈,恢复原单元的内容 POP A POP PSW END
4.3.5 查表程序设计
在 MCS-51 指令系统中,指令 MOVC A,@A+DPTR MOVC A,@A+PC
是查表程序设计的基础。用查表的方法设计程序,往往可以使复杂的运算或转换过程简化,
缩短程序的长度和执行时间。查表程序广泛应用于数码显示、打印字符的转换、以及数据的
补偿等复杂的运算程序中。用查表的方法设计程序,应该在程序存储器中建立相应的表。例
如,为 Y=X*X(设 X=0~9)函数建立一个表:先计算出 X=0,1,2…9 时所对应的 Y 值,将 Y
MCS-51 系列单片机原理与接口技术
·68·
值按顺序存放在始地址为 TABLE 的程序存贮器中,根据 TABLE+X 的值,就可以找到与 X相对应的 Y 值。
若将表的基地址 TABLE→DPTR,将 x 的值→A,则使用远查表指令 MOVC A,@A+DPTR
后,累加器(A)中的值就是待求的 Y 值,也可以用近查表指令 MOVC A,@A+PC
实现。 【例】利用查表的方法编写 Y=X2(X=0,1,2…9)的程序。 设变量 X 的值存放在内存 40H 单元中,变量 Y 的值存入内存 41H 单元中。先用远查表
指令 MOVC A,@A+DPTR 编写程序(见参考程序 1);再用查表指令 MOVC A,@A+PC编写程序(见参考程序 2)。
参考程序 1: ORG 0000H
START:MOV A,40H MOV DPTR,#TABLE MOVC A,@A+DPTR MOV 41H,A
TABLE:DB 0,1,4,9,16 DB 25,36,49,64,81 END
参考程序 2: ORG 1000H
START:MOV A,40H ADD A,#02H MOVC A,@A+PC MOV 41H,A DB 0,1,4,9,16 DB 25,36,49,64,81 END
参考程序 2 中,执行完第一条指令 MOV A,40H 后,A 中的内容为 X 的值。 第二条指令 ADD A,#02H 的作用是为了正确定位表的位置,以使第三条指令能正确
地取出与 X 对应的 Y 值。
4.3.6 子程序设计
程序设计时经常会遇到这样的情况,在程序的不同位置,都需要使用一段完全相同的程
序。为了避免多次出现相同的程序段,可将相同的程序写成独立的程序段,在任何需要的地
方调用该程序,运行完毕后,再从该程序返回到原来的程序继续运行。这样独立的程序段称
为子程序。调用子程序的程序称为主程序。 使用子程序会大大简化主程序的结构,增加程序的可读性,避免重复性的工作,缩短整
第 4 章 汇编语言程序设计
·69·
个程序,节省程序存储器空间。同时,子程序还增加了程序的可移植性。一些常用的程序,
如代码转换程序、运算程序、外部设备的输入/输出驱动程序等,写成公用子程序可以被随时
引用,为用户提供了方便。设计子程序时需要注意以下 4 方面的问题。 1.子程序的调用与返回 MCS-51 单片机的子程序调用指令有 ACALL addrll 和 LCALL addrl6,RET 是子程序
返回指令。 (1)子程序调用 主程序在调用子程序时,使用 ACALL Addrll 或 LCALL Addrl6 指令。调用指令中的地
址为子程序的入口地址,在汇编语言中通常用标号来表示。执行子程序调用指令时,单片机
首先将当前的 PC 值(即调用指令的下条指令的首地址)压入堆栈保存,将子程序的入口地
址送入 PC 中,然后转去执行子程序,完成主程序对子程序的调用。 ①ACALL Addrll 是绝对调用指令,它是一条双字节指令,提供 PC 低 11 位调用目标地
址,PC 高 5 位地址不变。这意味着被调用的子程序首地址距调用指令的距离在 2KB 范围内。 ②LCALL addr16 是长调用指令。它是三字节指令,提供 16 位目标地址码。因此,子程
序可设置在 64KB 之内的任何存储器区域。 (2)子程序返回 被调用的子程序执行完后,需要返回主程序。返回指令 RET(一般在子程序 后)将调
用子程序时压栈的 PC 值返弹给 PC,使程序返回调用的地方,继续向下执行主程序。 2.保存与恢复寄存器内容 主程序和子程序常常要使用系统相同的资源,如寄存器。如不采取相应措施,可能会发
生冲突,使系统产生错误。例如,子程序改变了主程序正在使用的寄存器的内容。进入子程
序的开始部分,把寄存器的内容保存在堆栈中,称为保护现场;在退出子程序前,把寄存器
内容恢复原状,称为恢复现场。 【例】SUBl: PUSH PSW
PUSH A PUSH R6 : (此处省略了子程序的内容) : POP R6 POP A PUSH PSW
堆栈操作遵循后进先出的原则。保护现场和恢复现场的工作,也可在主程序中完成。 3.子程序的参数传递 主程序在调用子程序时,经常需要传送一些参数,子程序运行完后也经常将一些参数回
送给主程序,这被称为参数传递。 (1)入口参数 在调用子程序时,主程序应先把有关参数放在某些约定的寄存器或存贮单元中。子程序
运行时,可以从约定位置得到这些参数,称为入口参数。 (2)出口参数
MCS-51 系列单片机原理与接口技术
·70·
子程序结束前,也应把运算结果送到约定的寄存器或数据存贮器单元中,返回主程序后,
主程序从约定位置获得这些参数,称为出口参数。 在编写子程序时需首先确定入口参数和出口参数的存放位置。对存放入口参数和出口参
数的寄存器,不能进行现场保护,否则就破坏了应该向主程序传送的参数。参数传递可以采
用累加器(A)、工作寄存器和堆栈等来完成。 【例】编程计算 c=a2+b2。 计算某数的平方可以用子程序来实现,两次调用该子程序,并求和便得到所需结果。设
a、b 分别存于内部 RAM 的 20H、21H 单元,结果 C 存于内部 RAM 的 30H 单元。 参数传递:主程序中,将某数存放到累加器(A)中,作为子程序的入口参数;子程序
中将所求数的平方值存放在累加器(A)中,作为出口参数(即主程序的返回值)。 子程序的入口参数:A 中存放某数的值。 子程序的出口参数:A 中存放所求数的平方。 子程序如下: SQR: INC A
MOVC A,@A+PC ;查平方表 RET
TABLE:DB 0,1,4,9,16 DB 25,36,49,64,81
主程序流程如图 4-8 所示。
图 4-8 程序流程图
主程序如下: START: MOV A,30H
ACALL SQR ;调查表子程序 MOV R1,A ;a2 暂存 R1 中 MOV A,21H
第 4 章 汇编语言程序设计
·71·
ACALL SQR ;调查表子程序 ADD A,R1 MOV 30H,A END
4.子程序的嵌套 在子程序的执行过程中,可能出现再次调用其他子程序的情况。这种现象被称为子程序
嵌套。主程序执行时,调用子程序 1,子程序 1 执行过程中又调用子程序 2,子程序 2 执行时
再调用子程序 3,一级一级地调用。子程序执行完成时也一级一级地返回,即子程序 3 执行
完后返回子程序 2 断点地址,子程序 2 执行完后返回子程序 1 断点地址, 后由子程序 1 返
回到主程序断点地址。为了在子程序返回时不造成混乱,必须处理好子程序调用和返回的关
系,在子程序中处理好有关的保护和交换工作,特别是堆栈指针 SP 和堆栈内容。
4.4 汇编语言实用程序设计
本节介绍几种常用程序,并通过它们说明汇编程序设计的一般方法和技巧。
4.4.1 数码转换类程序
在计算机内部,任何数据 终都是以二进制形式出现的。但是,人们通过外部设备与计
算机交换数据时,采用的却常常是一些其他的形式。例如,标准的编码键盘和标准的 CRT 显
示器使用的都是 ASCII 码,LED 显示用的是七段字形码,单片机的简易键盘常常采用一种独
特的键值码。因此,在微机应用中,大都会碰到数据的转换问题(或称代码转换)。这里将
介绍 ASCII 码、BCD 码与二进制数相互转换的基本方法。 1.ASCII 码转换为二进制数 假设: (10H)=33H(字符“3”的 ASCII 码) (11H)=43H(字符“C”的 ASCII 码) 要求完成 ASCII 码到二进制数的转换,并拼装成一个字节,放到 20H 单元之中(60H 单
元内容转换的结果为低位)。 因为“字符 0”~“字符 9”的 ASCII 码值为“30H”~“39H”,它们与 30H 的差恰好
为“00H”~“09H”,均小于 0AH。而字符“A”~字符“F”的 ASCII 码值为“41H”~
“46H”,它们各自减去 37H 恰好为“0AH”~“0FH”,均大于等于 0AH。 根据这个关系,编写的转换程序如下: 主程序: ATOH: MOV R0, #11H ; 指向原始数据区(高位)
MOV R1, #20H ; 指向结果单元 ACALL CVERT ; 调用转换程序,结果在 A 中 SWAP A ; 高 4 位与低 4 位互换 MOV @R1,A ; 暂存高位
MCS-51 系列单片机原理与接口技术
·72·
DEC R0 ; 指向原始数据区(低位) ACALL CVERT ; 转换,结果在 A 中 XCHD A,@R1 ; 低位与结果单元高位拼装
子程序: CVERT: MOV A,R0 ; 取出待转换的 ASCII 码
CLR C SUBB A,#30H ; 减去 30H CJNE A,#0AH,NEQ ; 再与 0AH 相比 AJMP BIG
NEQ: JC, CEND BIG: SUBB; A, #07H ; 大于等于 0AH 时,再减去 07H CEND: RET ; 转换结果在 A 中 2.二进制数转换成 ASCII 码 这种转换是上例的反转换,常用于输出。当然可以按与上面相反的办法处理,当二进制
数小于 0AH 时,加 30H;若二进制数介于 0AH 和 0FH 之间,加 37H。 下面提供另一种方法,转换速度较快,也不用转移判断。 假定 R0 指向待转换的二进制数区,程序如下: CVERTl: MOV A, @R0 ;取出待转换的二进制数
ADD A, #90H DA A ADDC A, #40H DA A RET , ; 转换结果在 A 中
3.BCD 码与二进制数的转换 在单片机应用中,输入输出常用十进制数,数据的运算和存贮常用二进制数,这样经常
需要对这两种数进行互相转换。在以下的例题中,先介绍在数据检测及 A/D 转换的数据处
理中常用的 BCD 码本身的转换问题,再介绍 BCD 码与二进制数的相互转换。 【例】单字节 BCD 码转换成压缩 BCD 码子程序。 (1)功能。将(R0)指向的内部 RAM 中 2n 字节的单字节 BCD 码(一字节存放一位 BCD
码十进制数)转换成压缩 BCD 码(一个字节存放两位 BCD 码)存放于(R1)指向的 n 字节
中。 入口时:单字节 BCD 码放于(R0)指向的内部 RAM 单元中。
D7~D4 D3~D0 addr1 BCD 高位 Addr1+1 BCD … … … … … … Addr1+2n-1 BCD 低位
(R0)=addr1,(R3)=n,(R1)指向存放压缩 BCD 码结果的缓冲器地址 addr2。
第 4 章 汇编语言程序设计
·73·
出口时: D7~D4 D3~D0 Addr2 BCD BCD 高位 Addr2+1 BCD BCD … … … … … … Addr2+n-1 BCD BCD 低位
本子程序使用累加器(A)及工作寄存器 R0、R1、R3。程序流程图如图 4-9 所示。 程序清单如下: CBDC: MOV A, @R0 ;取高位 BCD SWAP A INC R0 XCHD A, @R0 ;取低位 BCD MOV @R1, A XCHD A, @R0 ;恢复(R0)指向的单字节 BCD 码 INC R0 INC R1 DJNZ R3, BCDC ;循环 n 次 4.压缩 BCD 码转换为单字节 BCD 码子程序 将(R0)指向的内部 RAM 中 n 字节的 BCD 码转换为 BCD 码存放于(R1)指向的 2n
个字节中。 入口时:压缩 BCD 码存放于内部 RAM 中。
D7~D4 D3~D0 Addr1 BCD BCD 高位 Addr1+1 BCD BCD … … … … … … Addr1+n-1 BCD BCD 低位
(R0)=addr1,(R3)=n,(R1)指向存放单字节 BCD 码的内部 RAM 单元地址 addr2。 出口时 D7~D4 D3~D0
Addr2 BCD 高位 Addr2+1 BCD … … … … … … Addr2+2n-1 BCD 低位
本子程序使用累加器(A),寄存器 R0、R1、R3。程序流程图如图 4-10 所示。 程序清单如下: CBCD: MOV A, @R0 ;取高位 BCD SWAP A ANL A, #0FH MOV @R1, A ;存放单字节 BCD MOV A, @R0 INC R1 ANL A, #0FH ;取低位 BCD MOV @R1, A ;存放单字节 BCD
MCS-51 系列单片机原理与接口技术
·74·
INC R0 INC R1 DJNZ R3, CBCD ;循环 n 次 RET
图 4-9 单字节 BCD 码转换成压缩 图 4-10 压缩 BCD 码转换为
BCD 码子程序流程图 单字节 BCD 码子程序
4.4.2 查找与排序
在计算机程序设计中,常常涉及到列表的问题。要快速、有效地解决关于列表中的查找、
插入、删除等相关问题,就需要设计有效的查找与排序算法。 由于查找某个数据元素依赖于数据元素在该列表中所处的位置,也就是需要了解该
列表的数据存储方式。因此,使用各种查找方法时,都必须先了解列表的数据格式和存
储方式。 目前,常用的查找与排序方法有冒泡排序、选择排序、插入排序、快速排序、希尔排序、
堆排序等。比较常用的查找方法有对分查找等。 现在以冒泡法为例,说明数据排序算法以及其在汇编程序中的实现。 【例】假设 8 个数据连续存放在以 10H 为首地址的内部 RAM 中,使用冒泡法对其进行
升序排序,即 大的数换到 后单元 17H 中, 小的数放到单元 10H。 程序分析:设 R7 为比较次数计数器,初始值为 07H。TR0 为冒泡过程是否有数据互换
的状态标志,TR0=0 表示没有互换,TR0=1 表示有互换。 冒泡算法的流程如图 4-11 所示。
第 4 章 汇编语言程序设计
·75·
START
置R0=10H
置R0=07H
清除交换标志
取前一个数
取后一个数
前数< 后数?
前数送后数单元
后数送前数单元
置交换标志
结束
R7-1=0?
交换标志=1
N
YY
Y
Y
N
图 4-11 冒泡法排序流程
程序示例: START: MOV R0, #10H ;数据存储区首地址 MOV R7, #07H ;冒泡比较次数 CLR TR0 ;清除互换标志 LOOP: MOV A, @R0 ;取前数
MOV 2BH, A ;存前数 INC R0 MOV AH, @R0 ;取后数 CLR C SUBB A, @R0 ;前数减后数 JC NEXT ;若前数小,不互换 MOV @R0, 2BH ;否则互换 DEC @R0 MOV @R0, 2AH ;两个数交换位置 INC R0 ;准备下次比较 SETB TR0 ;置互换标志
NEXT: DJNZ R7, LOOP ;返回,进行下一次比较 JB TR0, START ;返回,进行下一次冒泡 END: SJMP $ ;冒泡排序结束 查找与排序内容繁多,在一般的计算机程序设计书中均有相关介绍,如读者有兴趣可以
参考相关书籍,在这里不再做详细介绍。
MCS-51 系列单片机原理与接口技术
·76·
4.5 习题
1.单片机领域,目前使用 广泛的是哪种语言?有哪些优越性?单片机能否直接执行
该语言? 2.编写计算下列算式的程序。 (1)12H+34H+B7H+10H= (2)CDH+18H-37H-46H= 3.设有 50 个有符号数,连续的存放在以 1000H 为首地址的存储区中,试编程统计其中
正数、负数和零的个数。 4.试编写延时子程序(要求延时 1s、1min 和 1h)。 5.试编写多字节无符号数减法子程序。
第第 55 章章 中中断断系系统统原原理理与与应应用用
中断系统是为使 CPU 能对单片机外部或内部随机发生的事件进行实时处理而设置的。
MCS-51 片内的中断系统能大大提高 MCS-51 单片机处理外部或内部事件的能力。
5.1 中断系统概述
如果单片机没有中断功能,单片机对外部或内部事件的处理就只能采用程序查询方式,
即 CPU 不断查询是否有事件产生。显然,采用程序查询方式,CPU 大部分时间处于等待状
态,而不能做其他的事情。中断系统的出现,使得单片机具有了实时处理功能,能对外部或
内部发生的事件做出及时的处理,大大地提高了 CPU 的工作效率,这是现代计算机的一个重
要标志。
5.1.1 中断系统基本概念
1.中断 当 CPU 正在处理某件事情(例如,正在执行主程序)的时候,外部或内部发生的某一事
件(如某个引脚上电平的变化,一个脉冲沿的发生或计数器的计数溢出等)请求 CPU 迅速处
理,于是,CPU 暂时中止当前的工作,转去处理所发生的事件,中断服务处理程序处理完该
事件后,再回到原来被中止的地方,继续原来的工作,这样的过程称为中断,如图 5-1 所示。
图 5-1 中断流程
处理事件的过程,称为 CPU 的中断响应过程。对事件的整个处理过程,称为中断服务(或
中断处理),实现这种功能的部件称为中断系统。产生中断的请求源称为中断源。中断源向
CPU 提出的处理请求,称为中断请求或中断申请。中断时除了硬件会自动把断点地址(16位程序计数器 PC 的值)压入堆栈之外,用户还得注意保护有关的工作寄存器、累加器、标
志位等信息,称为保护现场。在完成中断服务程序后,要恢复有关的工作寄存器、累加器、
MCS-51 系列单片机原理与接口技术
·78·
标志位内容,称为恢复现场。最后执行中断返回指令,从堆栈中自动弹出断点地址到 PC,继
续执行被中断的程序,称为中断返回。 2.中断优先级 当有几个中断源同时申请中断时,或者 CPU 正在处理某中断源服务程序时,又有一个中
断源申请中断,那么 CPU 必须要区分哪个中断源更重要,从而确定优先处理谁,这种重要程
度称为中断优先级。 3.中断嵌套 计算机系统一般允许有多个中断源,MCS-51 单片机有 5 个中断源。当 CPU 正在处理一
个中断时,又发生了一个优先级高的中断请求,那么 CPU 暂时中止对前一个中断的处理,转
而响应优先级更高的中断请求,处理完优先级更高的中断请求后,再继续执行原来的中断处
理程序,这样的过程叫中断嵌套。图 5-2 所示是两级嵌套的中断过程的流程图。
图 5-2 中断嵌套流程图
5.1.2 中断的主要功能
1.实现 CPU 与外部设备的速度配合 应用系统的许多外部设备速度较慢,比如打印机与单片微机的接口,与高速的 CPU 之间
无法完成数据的同步交换,这时可以通过中断的方法来协调快速 CPU 与慢速外部设备之间的
工作。当 CPU 在执行程序过程中,若需要进行数据的输入或输出,则先启动外部设备,当外
部设备为数据的输入或输出做好准备后,即向 CPU 发出中断信号,CPU 响应中断,停止当
前程序的执行,转去为外部设备的数据输入或输出服务,中断服务结束后,CPU 返回断点处
往下继续执行程序,而外部设备为下一次数据的传送做准备。 2.实现实时控制 单片微机依靠中断技术能实现实时控制。实时控制要求计算机能及时完成被控对象随机
提出的分析和计算任务,以便使被控对象能保持在最佳工作状态,达到预定的控制要求。在
自动控制系统中,各控制参量可随机地在任何时刻向计算机发出请求,CPU 必须快速做出响
应、及时处理。 3.实现故障的及时发现及处理 单片微机应用时由于外界的干扰、硬件或软件设计中存在问题等因素,在实际运行中会
出现硬件故障、运算错误、程序运行故障等问题。通过中断技术,单片机系统就能及时发现
故障并自动处理。
第 5 章 中断系统原理与应用
·79·
4.实现人机联系 如,通过键盘向单片微机发出中断请求,可以实时干预计算机的工作。
5.2 MCS-51 中断系统的结构
MCS-51 单片机的中断系统有 5 个中断请求源,具有两个中断优先级,可实现两级中断
服务程序嵌套。用户可以用软件屏蔽所有的中断请求,也可以用软件使 CPU 接受中断请求;
每一个中断源可以用软件独立地控制为开中断或关中断状态;每一个中断源的中断级别均可
用软件设置。MCS-51 的中断系统结构示意图如图 5-3 所示。
图 5-3 MCS-51 的中断系统结构
5.3 中断请求源
MCS-51 中断系统共有 5 个中断请求源(如图 5-3 所示),分别为: (1) INT0—外部中断 0 请求,由 INT0 引脚输入,中断请求标志为 IE0。 (2) INT1—外部中断 1 请求,由 INT1引脚输入,中断请求标志为 IEl。 (3)定时器/计数器 T0 溢出中断请求,中断请求标志为 TF0。 (4)定时器/计数器 T1 溢出中断请求,中断请求标志为 TFl。 (5)串行口中断请求,中断请求标志为 TI 或 RI。 这些中断请求源的中断请求标志位分别由特殊功能寄存器 TCON 和 SCON 的相应位锁
存。
MCS-51 系列单片机原理与接口技术
·80·
1.TCON 简介 TCON 为定时器计数器的控制寄存器,字节地址为 88H,可位寻址。TCON 锁存外部中
断请求标志,格式如图 5-4 所示。
图 5-4 TCON 中的中断请求标志位
与中断系统有关的各标志位的功能如下。 (1)IT0—选择外部中断请求 INT0 为跳沿触发方式或电平触发方式的控制位。 IT0=0,为电平触发方式,引脚 INT0 上低电平有效。 IT0=1,为跳沿触发方式,引脚 INT0 上的电平从高到低的负跳变有效。 IT0 位可由软件置“1”或清“0”。 (2)IE0—外部中断 0 的中断请求标志位。 IT0=0,为电平触发方式,每个机器周期的 S5P2 采样 INT0 引脚,若 INT0 脚为低电平,
则置 IE0 位为“1”,否则 IE0 清“0”。 IT0=1,为跳沿触发方式,当第一个机器周期采样到 INT0 为低电平时,则置 IE0 位为“1”。
IE0=1,表示外部中断 0 正在向 CPU 申请中断。当 CPU 响应中断,转向中断服务程序时,IE0由硬件清“0”。
(3)ITl—选择外部中断请求 INT1为跳沿触发方式或电平触发方式的控制位,其意义
和 IT0 类似。 (4)IEl—外部中断 1 的中断请求标志位,其意义和 IE0 类似。 (5)TF0—MCS-51 片内定时器/计数器 T0 溢出中断请求标志位。 当启动 T0 计数后,定时器/计数器 T0 从初值开始加 1 计数,当最高位产生溢出时,由
硬件置 TF0 位为“1”,向 CPU 申请中断,CPU 响应 TF0 中断时,TF0 由硬件清“0”,TF0也可由软件清 0(查询方式)。
(6)TFl—MCS-51 片内的定时器/计数器 T1 的溢出中断请求标志位,功能和 TF0 类似。 TR1(D6 位)、TR0(D4 位)与中断无关,仅与定时器/计数器 T1 和 T0 有关。 当 MCS-51 复位后,TCON 被清 0,CPU 关闭中断,所有中断请求被禁止。 2.SCON 简介 SCON 为串行口控制寄存器,字节地址为 98H,可位寻址。SCON 的低两位锁存串行口
的接收中断和发送中断标志,格式如图 5-5 所示。
图 5-5 SCON 中的中断请求标志位
SCON 中各标志位的功能如下: (1)TI—串行口的发送中断请求标志位。CPU 将一个字节的数据写入发送缓冲器
第 5 章 中断系统原理与应用
·81·
SBUF 时,就启动一帧串行数据的发送,每发送完一帧串行数据后,硬件自动置 TI 位为“1”。但 CPU 响应中断时,CPU 并不清除 TI 位,必须在中断服务程序中用软件对 TI 清“0”。
(2)RI—串行口接收中断请求标志位。在串行口允许接收时,每接收完一个串行帧,
硬件自动置 RI 位为“1”。CPU 在响应本中断时,并不清除 RI,必须在中断服务程序中用软
件对 RI 清“0”。
5.4 中断控制
5.4.1 中断允许寄存器 IE
中断允许寄存器 IE 控制 CPU 对中断源的开放或屏蔽。IE 的字节地址为 A8H,可进行位
寻址,格式如图 5-6 所示。
图 5-6 IE 的中断允许控制位
中断允许寄存器 IE 对中断的开放和关闭实现两级控制,即有一个总的开关中断控制位
EA(IE.7 位),当 EA=0 时,所有的中断请求被屏蔽,CPU 对任何中断请求都不接受;当
EA=1 时,CPU 开放中断,但 5 个中断源的中断请求是否允许,还要由 IE 中的低 5 位所对
应的 5 个中断请求允许控制位的状态来决定。 IE 中各位的功能如下。 (1)EA:中断允许总控制位 EA=0,CPU 屏蔽所有的中断请求(也称 CPU 关中断)。 EA=1,CPU 开放所有中断(也称 CPU 开中断)。 (2)ES:串行口中断允许位 ES=0,禁止串行口中断。 ES=1,允许串行口中断。 (3)ET1:定时器/计数器 T1 的溢出中断允许位 ET1=0,禁止外部中断 1 中断。 ET1=1,允许 T1 中断。 (4)EX1:外部中断 1 中断允许位 EX1=0,禁止外部中断 1 中断。 EX1=1,允许外部中断 1 中断。 (5)ET0:定时器/计数器 T0 的溢出中断允许位 ET0=0,禁止 T0 中断。 ET0=1,允许 T0 中断。 (6)EX0:外部中断 0 中断允许位
MCS-51 系列单片机原理与接口技术
·82·
EX0=0,禁止外部中断 0 中断。 EX0=1,允许外部中断 0 中断。 MCS-51 复位以后,IE 中的每一位均被清 0。用户程序可以对 IE 相应的位置“1”或清
“0”,以允许或禁止各中断源的中断申请。若使某一个中断源允许中断,必须同时使 CPU 开
放中断。如更新 IE 的内容,可由位操作指令来实现(即 SETB BlT;CLR BlT),也可用字节
操作指令实现(即 MOV IE,#DATA;ANL IE,#DATA;ORL IE,#DATA;MOV IE,A 等)。 【例】假设允许片内定时器/计数器中断,禁止其他中断源的中断申请。试根据假设条件
设置 IE 的相应值。 (1)用位操作指令编写的程序段如下:
CLR ES ;禁止串行口中断 CLR EX1 ;禁止外部中断 1 中断 CLR EX0 ;禁止外部中断 0 中断 SETB ET1 ;允许定时器/计数器 T1 中断 SETB ET0 ;允许定时器/计数器 T0 中断 SETB EA ;CPU 开中断
(2)用字节操作指令编写的如下: MOV IE,#10H
5.4.2 中断优先级寄存器 IP
MCS-51 的中断请求源有两个中断优先级,可由软件将中断请求源定为高优先级中断或
低优先级中断。
图 5-7 两级中断嵌套
如图 5-7 所示,一个正在执行的低优先级中断程序能被高优先级的中断源所中断,但不
能被另一个低优先级的中断源所中断。若 CPU 正在执行高优先级的中断,则不能被任何中断
源所中断,直到其执行结束,遇到中断返回指令 RETI,返回主程序后再执行一条指令后才能
响应新的中断请求。以上所述可以归纳为下面两条基本规则: (1)低优先级可被高优先级中断,反之则不能。 (2)任何一种中断(不管是高级还是低级),一旦得到响应,不会再被它的同级中断源
所中断。如果某一中断源被设置为高优先级中断,在执行该中断源的中断服务程序时,则不
能被任何其他的中断源所中断。
第 5 章 中断系统原理与应用
·83·
MCS-51 内有一个中断优先级寄存器 IP,其字节地址为 B8H,可位寻址。改变其内容即
可设置各中断源中断级别,IP 寄存器格式如图 5-8 所示。
图 5-8 中断优先级寄存器 IP 的格式
中断优先级寄存器 IP 各个位的含义如下: (1)PS—串行口中断优先级控制位 PS=1,串行口中断定义为高优先级中断。 PS=0,串行口中断定义为低优先级中断。 (2)PTl—定时器 T1 中断优先级控制位 PTl=1,定时器 T1 定义为高优先级中断。 PT=0,定时器 T1 定义为低优先级中断。 (3)PXl—外部中断 1 中断优先级控制位 PXl=1,外部中断 1 定义为高优先级中断。 PXI=0,外部中断 1 定义为低优先级中断。 (4)PT0—定时器 T0 中断优先级控制位 PT0=1,定时器 T0 定义为中断优先级中断。 PT0=0,定时器 T0 定义为低优先级中断。 (5)PX0—外部中断 0 中断优先级控制位 PX0=1,外部中断 0 定义为高优先级中断。 PX0=0,外部中断 0 定义为低优先级中断。 中断优先级控制寄存器 IP 的各位通过用户程序置“1”和清“0”,可用位操作指令或字
节操作指令更新 IP 的内容,以改变各中断源的中断优先级。 MCS-51 复位以后 IP 为 0,各个中断源均为低优先级中断。 为进一步了解 MCS-51 中断系统的优先级,下面简单介绍一下 MCS-51 的中断优先级结
构。MCS-51 的中断系统有两个不可寻址的“优先级激活触发器”。其中一个指示某高优先级
中正在执行,所有后来的中断均被阻止。另一个触发器指示某低优先级的中断正在执行,同
级的中断都被阻止,但不阻断高优先级的中断请求。 在同时收到几个同一优先级的中断请求时,哪一个中断请求能优先得到响应,取决于
查询的顺序。这相当于在同一个优先级内,还同时存在另一个辅助优先级结构,其查询顺
如下。
由上可见,各中断源在同一个优先级的条件下,外部中断 0 的优先权最高,串行口的优
MCS-51 系列单片机原理与接口技术
·84·
先权最低。 【例】设置 IP 寄存器的初始值,使得 8031 的 2 个外中断为高优先级,其他中断为低优
先级。 (1)使用位操作指令 SETB PX0 ;2 个外中断为高优先级 SETB PX1 CLR PS ;串行口、2 个定时器为低优先级中断 CLR PT0 CLR PT1 (2)使用字节操作指令 MOV IP,#05H
5.5 中断响应过程
5.5.1 中断响应
满足以下条件时,中断源的中断请求响应才能被响应。 (1)该中断源发出中断请求; (2)CPU 开中断,即中断总允许位 EA=1; (3)申请中断的中断源的中断允许位=1; (4)无同级或更高级中断正在被服务。 中断响应就是对中断源提出的中断请求的接受,是在中断查询之后进行的。有中断请求
时,满足上述条件后,紧接着就进行中断响应。 中断响应后,是由硬件自动生成一条长调用指令 LCALL addrl6。这里的 addrl6 就是程
序存储区中的相应的中断源的中断入口地址,如下所示。
例如,对于外部中断 1 的响应,产生的长调用指令为: LCALL 0013H 生成 LCALL 指令后,CPU 执行该指令。首先将程序计数器 PC 的内容压入堆栈以保护
断点,先压低位地址,后压高位地址,同时堆栈指针 SP 加 2。再将中断入口地址装入 PC,使程序转向相应的中断入口地址。
各中断入口间只相隔 8 个字节,一般情况下难以安排下一个完整的中断服务程序。因此,
通常总是在中断入口地址处放置一条无条件转移指令,使程序转向执行在其他地址中存放的
第 5 章 中断系统原理与应用
·85·
中断服务程序。 中断响应是有条件的,并不是查询到的所有中断请求都能被立即响应,当遇到下列 3 种
情况之一时,中断响应被封锁。 (1)CPU 正在处理优先级相同或更高的中断。因为当一个中断被响应时,要把对应的中
断优先级状态触发器置“1”(该触发器指出 CPU 所处理的中断优先级别),从而封锁了低级
中断和同级中断。 (2)所查询的机器周期不是所执行指令的最后一个机器周期。目的是使当前指令执行完
毕后,才能进行中断响应,以确保当前指令完整地执行。 (3)正在执行的指令是 RETI 或是访问 IE、IP 寄存器的指令。因为按 MCS-51 中断系统
特性的规定,在执行完这些指令后,需要再执行一条指令才能响应新的中断请求。 如果存在上述三种情况之一,CPU 将丢弃中断查询结果,不能进行中断响应。
5.5.2 中断返回
中断服务程序由中断入口地址开始执行,直至遇到 RETI 指令为止。执行中断返回指令
RETI,一是撤消中断申请,弹出断点地址并送入 PC(先弹出高位地址,后弹出低位地址),
同时堆栈指针 SP 减 2,恢复原程序的断点地址执行;二是恢复中断触发器原先状态。
5.6 外部中断的响应时间
在应用设计者使用外部中断时,有时需考虑从外部中断请求有效(外中断请求标志置
“1”)到转向中断入口地址所需要的响应时间。 外部中断的最短的响应时间为 3 个机器周期。其中中断请求标志位查询占 1 个机器周期,
而这个机器周期恰好是处于正在执行的指令的最后一个机器周期,在这个机器周期结束后,
中断即被响应,CPU 接着执行一条硬件子程序调用指令 LCALL 以转到相应的中断服务程序
入口,而该硬件调用指令本身需 2 个机器周期。 外部中断响应最长时间为 8 个机器周期。该情况发生在中断标志查询时,刚好开始执行
RETI 或是访问 IE 或 IP 的指令,则需把当前指令执行完再继续执行一条指令后,才能响应中
断;执行上述的 RETI 或是访问 IE 或 IP 的指令,最长需要 2 个机器周期;而接着再执行一
条指令,按最长的指令(乘法指令 MUL 和除法指令 DIV)来算,也只有 4 个机器周期;加
上硬件子程序调用指令 LCALL 的执行,需要 2 个机器周期;所以,外部中断响应最长时间
为 8 个机器周期。 如果正在处理同级或更高级中断,外部中断请求的响应时间就取决于正在执行的中断服
务程序的处理时间,这种情况下,响应时间就无法计算了。 这样,在一个单一中断的系统里,外部中断请求的响应时间总是在 3~8 个机器周期之
间。
MCS-51 系列单片机原理与接口技术
·86·
5.7 外部中断的触发方式选择
外部中断有两种触发方式:电平触发方式(低电平有效)和跳沿触发方式(电平发生由
高到低的跳变时触发)。这两种触发方式可通过设置 TCON 寄存器中的 IT1(TCON.2)、IT0(TCON.1)中断申请触发方式控制位选择。
5.7.1 电平触发方式
若外部中断定义为电平触发方式,外部中断申请触发器的状态随着 CPU 在每个机器周期
采样到的外部中断输入线的电平变化而变化,这能提高 CPU 对外部中断请求的响应速度。 外部中断源被设定为电平触发方式时,在中断服务程序返回之前,外部中断请求输入必
须无效(即变为高电平),否则 CPU 返回主程序后会再次响应中断。所以电平触发方式适合
外部中断以低电平输入而且中断服务程序能清除外部中断请求源(即外部中断输入电平又变
为高电平)的情况。
5.7.2 跳沿触发方式
外部中断若定义为跳沿触发方式,外部中断申请触发器能锁存外部中断输入线上的负跳
变。即使 CPU 暂时不能响应,中断申请标志也不会丢失。在这种方式里,如果连续两次采样,
一个机器周期采样到外部中断输入为高,下一个机器周期采样为低,则置“1”中断申请触发
器,直到 CPU 响应此中断时才清 0。这样不会丢失中断,但输入的负脉冲宽度至少要保持 12个时钟周期(若晶振频率为 6MHz,则为 2μs),才能被 CPU 采样到。外部中断的跳沿触发方
式适合于以负脉冲形式输入的外部中断请求。
5.8 中断请求的撤消
中断请求响应完成后,需要撤消中断请求。下面按中断类型分别说明中断请求的撤消方
法。 1.定时器/计数器中断请求的撤消 定时器/计数器的中断请求被响应后,硬件回自动把中断请求标志位(TF0 或 TFl)清“0”,
因此定时器/计数器中断请求是自动撤消的。 2.外部中断请求的撤消 (1)跳沿方式外部中断请求的撤消 跳沿方式中断请求的撤消包括两项内容:中断标志位清“0”和外中断信号撤消。其中,
中断标志位(1E0 或 IE1)的清“0”是在中断响应后由硬件自动完成的。而外中断请求信号
在跳沿信号过后也就消失了,所以跳沿方式外部中断请求也是自动撤消的 (2)电平方式外部中断请求的撤消
第 5 章 中断系统原理与应用
·87·
电平方式外部中断请求的撤消是自动的,但中断请求信号的低电平可能会继续存在,在
以后的机器周期采样时,又会把已清“0”的 IE0 或 IE1 标志位重新置“1”。为此,要彻底撤
消电平方式外部中断请求,除了标志位清“0”之外,必要时还需在中断响应后把中断请求信
号引脚从低电平强制改变为高电平。为此,可在系统中增加如图 5-9 所示的电路。
图 5-9 电平方式外部中断请求的撤消电路
用 D 触发器锁存外来的中断请求低电平,并通过 D 触发器的输出端 Q 接到 INT0 (或
INT1)。所以,增加的 D 触发器不影响中断请求。中断响应后,撤消中断请求可利用 D 触发
器的直接置位端 S0 实现,把 SD 端接 MCS-51 的口线 P1.0。 因此,只要 P1.0 端输出一个负脉冲就可以使 D 触发器置“1”,从而撤消了低电平的中
断请求信号。所需的负脉冲可通过在中断服务程序中增加如下两条指令得到: SETB P1.0 ;P1.0 为“1” CLR P1.0 ;P1.0 为“0” 可见,电平方式的外部中断请求信号的完全撤消,是通过软硬件相结合的方法来实
现的。 3.串行口中断请求的撤消 串行口中断请求的撤消时只存在标志位清“0”的问题。串行口中断的标志位是 T1 和
RI,这两个中断标志不自动清“0”。中断响应后,CPU 无法知道是接收中断还是发送中断,
因此要测试这两个中断标志位的状态,以判定是接收操作还是发送操作,然后才能清除标志
位。所以串行口中断请求的撤消只能使用软件的方法,在中断服务程序中进行,即用如下的
指令清除标志位。 CLR TI ;清 TI 标志位 CLR RI ;清 RI 标志位
5.9 中断服务程序的设计
中断系统虽然是硬件系统,但必须在相应的软件配合下才能正确使用。设计中断程序需
要弄清楚以下几个问题。 1.中断服务程序设计的任务 中断程序设计需要考虑许多问题,基本任务有以下 4 条。 (1)设置中断允许控制寄存器 IE,允许相应的中断请求源中断。 (2)设置中断优先级寄存器 IP,确定并分配所使用的中断源的优先级。 (3)若是外部中断源,还要设置中断请求的触发方式 IT1 或 IT0,以决定采用电平触发
MCS-51 系列单片机原理与接口技术
·88·
方式还是跳沿触发方式。 (4)编写中断服务程序,处理中断请求。 前 3 条一般放在主程序的初始化程序段中。 【例】假设允许外部中断 0 中断,并设定它为高级中断,其他中断源为低级中断,采用
跳沿触发方式。在主程序中可编写如下程序段: SETB EA ;EA 位置“1”,CPU 开中断 SETB ET0 ;ET0 位置“1”,允许外部中断 0 产生中断 SETB PX0 ;PX0 位置“1”,外部中断 0 为高级中断 SETB IT0 ;IT0 位置“1”,外部中断 0 为跳沿触发方式 2.采用中断时的主程序结构 各中断入口地址是固定的,程序必须先从主程序起始地址 0000H 执行,因此在 0000H 起
始地址中,要用条件转移指令,跳转到主程序。另外,各中断入口地址之间依次相差 8 个字
节。中断服务程序稍长就超过 8 个字节,这样中断服务程序就占用了其他的中断入口地址,
影响其他中断源的中断。为此,一般在中断进入后,利用一条无条件转移指令,把中断服务
程序跳转到远离其他中断入口的适当地址。 常用的主程序结构如下: ORG 0000H LJMP MAIN ORG 中断入口地址 LJMP INT MAIN:主程序 INT:中断服务程序
注意:在以上的主程序结构中,如果有多个中断源,就对应有多个“ORG 中断入口地址”,“ORG
中断入口地址”必须按地址依次由小到大排列。
3.中断服务程序的流程 MCS-51 响应中断后,进入中断服务程序。中断服务程序的基本流程如图 5-10 所示。
图 5-10 中断服务程序的基本流程
第 5 章 中断系统原理与应用
·89·
下面对有关中断服务程序执行过程中的一些问题进行说明。 (1)现场保护和现场恢复 现场是指中断时刻单片机中某些寄存器和存储器单元中的数据或状态。为了使中断服
务程序的执行不破坏这些数据或状态,以免在中断返回后影响主程序的运行,要把寄存器
或存储单元中的数据送入堆栈中保存起来,这就是现场保护。现场保护一定要位于现场中
断处理程序的前面。中断处理结束后,在返回主程序前,把保存的现场内容从堆栈中弹出,
以恢复那些寄存器和存储器单元中的原有内容,这就是现场恢复。现场恢复一定要位于中
断处理程序的后面。 MCS-51 现场保护和现场恢复使用的主要是堆栈操作指令 PUSH direct 和 POP direct。至
于要保护哪些内容,应该由用户根据中断处理程序的具体功能来决定。 (2)关中断和开中断 图 5-10 所示中,保护现场和恢复现场前关中断,这是为了防止此时有高一级的中断进入,
避免现场被破坏;在保护现场和恢复现场之后开中断,这是为下一次的中断做准备,此时也
允许有更高级的中断进入。这样做的结果是,中断处理可以被打断,但原来的现场保护和恢
复不允许更改,除了现场保护和现场恢复的片刻外,仍然可以进行中断嵌套。 但有时,一个重要的中断在执行时,不允许被其他的中断嵌套。对此可在现场保护
之前先关闭中断系统,彻底屏蔽其他中断请求,待中断处理完成后再开中断。这样,就
需要将图 5-10 中的“中断处理”步骤前后的“开中断”和“关中断”两个过程去掉。 具体中断请求源的关与开,可通过 CLR 或 SETB 指令对寄存器 IE 中的有关位清“0”或
置“1”来实现。 (3)中断处理 中断处理是中断源请求中断的具体目的。应用设计者应根据任务的具体要求编写中断处
理部分的程序。 (4)中断返回 中断服务程序的最后一条指令必须是返回指令 RETI,RETI 指令是中断服务程序结束的
标志。CPU 执行完这条指令后,把响应中断时所置“1”的优先级状态触发器清“0”,然后
从堆栈中弹出栈顶上的两个字节的断点地址送到程序计数器 PC,弹出的第一个字节送入
PCH,弹出的第二个字节送入 PCL,CPU 从断点处重新执行被中断的主程序。 【例】根据图 5-10 所示的中断服务程序流程,编写中断服务程序。假设,现场保护只需
要将 PSW 寄存器和累加器 A 的内容压入堆栈保护起来。 【解】一个典型的中断服务程序如下: INT:CLR EA ;CPU 关中断 PUSH PSW ;现场保护 PUSH A ; SETB EA ;CPU 开中断 中断处理程序:
CLR EA ;CPU 关中断 POP A ;现场恢复 POP PSW ; SETB EA ;CPU 开中断
MCS-51 系列单片机原理与接口技术
·90·
RETI ;中断返回,恢复断点 上述程序中有几点需要说明: (1)本例的现场保护仅仅涉及到 PSW 和 A 的内容,如果还有其他的需要保护的内容,
只需要在相应的位置再加几条 PUSH 和 POP 指令即可。
注意,堆栈是先进后出的,次序不可颠倒。
(2)应用设计者应根据中断任务的具体要求,编写中断服务程序中的“中断处理程序段”。 (3)如果中断服务程序不允许被其他的中断所中断,可将“中断处理程序段”前后的
“SETB EA”和“CLR EA”两条指令去掉。 (4)中断服务程序的最后一条指令必须是返回指令 RETI,它是中断服务程序结束
的标志。CPU 执行完这条指令后,返回断点处,从断点处重新执行被中断的主程序。
5.10 多个外部中断源系统设计
MCS-51 为用户提供两个外部中断申请输入端 INT0 和 INT1,在实际应用中,两个外部
中断请求源往往不够,需对外中断源进行扩充。本节介绍扩充外中断源的方法。
5.10.1 定时器/计数器作为外部中断源的使用方法
MCS-51 有两个定时器/计数器(有关定时器/计数器的工作原理将在下一章介绍),当它
们选择为计数器工作模式,T0 或 T1 引脚上发生负跳变时,T0 或 T1 计数器加 1,利用这个
特性,可以把 T0、T1 引脚作为外部中断请求输入引脚,而定时器/计数器的溢出中断 TF1或 TF0 作为外部中断请求标志。例如,T0 设置为方式 2(自动恢复常数方式)外部计数工
作模式,计数器 TH0、TL0 初值均为 FFH,并允许 T0 中断,CPU 开放中断,初始化程序
如下: ORG 0000H ;跳到初始化程序 MOV TMOD,#06H ;设置 T0 的工作方式寄存器 MOV TL0,#FFH ;给计数器设置初值 MOV TH0,#FFH SETB TR0 ;启动 T0,开始计数 SETB ET0 ;允许 T0 中断 SETB EA ;CPU 开中断 当连接在 P3.4 的外部中断请求输入线上的电平发生负跳变时,TL0 加 1,产生溢出,TF0
置“1”,向 CPU 发出中断请求,同时 TH0 的内容 FFH 送 TL0,即 TL0 恢复初值 FFH,这样,
P3.4 相当于跳沿触发的外部中断请求源输入端。对 P3.5 也可做类似的处理。
第 5 章 中断系统原理与应用
·91·
5.10.2 中断和查询结合的方法
若系统中有多个外部中断请求源,可以按它们的轻重缓急进行排队,把其中最高级别的
中断源直接接到 MCS-51 的一个外部中断源 INT0 的输入端,其余的中断源 IRl~IR4 用“线
或”的办法连到另一个中断源输入端 INT1,同时还连到 P1 口,中断源的中断请求由外设的
硬件电路产生,这种方法原则上可处理任意多个外部中断。例如,5 个外部中断源的排队顺
序依此为 IR0、IR1……lR4,对于这样的中断源系统,可以采用如图 5-11 所示的中断电路。
图 5-11 中断和查询相结合的多外部中断源系统
图 5-11 所示中,4 个外设的中断请求通过集电极开路的 OC 门构成“线或”的关系,
它们的中断请求输入均通过 INT1传给 CPU。无论哪一个外设提出的高电平有效的中断请求
信号,都会使 INT1引脚的电平变低。究竟是哪个外设提出的中断请求,通过程序查询 P1.0~P1.3 的逻辑电平即可知道。设 IRl~IR4 这 4 个中断请求源的高电平可由相应的中断服务程
序清“0”。
INT1的中断服务程序如下: ORG 1000H LJMP INTl ; INT1:PUSH PSW ;保护现场 PUSH A JB P1.0,IR1 ;如 P1.0 脚为高,则 IRl 有中断请求,跳标号 IRl 处理 JB P1.1,IR2 ;如 P1.1 脚为高,则 IR2 有中断请求,跳标号 IR2 处理 JB P1.2,IR3 ;如 P1.2 脚为高,则 IRl 有中断请求,跳标号 IR3 处理 JB P1.3,IR4 ;如 P1.3 脚为高,则 IRl 有中断请求,跳标号 IR4 处理 INTIR:POP A ;恢复现场 POP PSW
MCS-51 系列单片机原理与接口技术
·92·
RETI ;中断返回 IR1:IR1 的中断处理程序 AJMP INTIR ;IR1 中断处理完毕,跳标号 INTIR 处执行 IR2:IR2 的中断处理程序 AJMP INTIR ;IR2 中断处理完毕,跳标号 INTIR 处执行 IR3:IR3 的中断处理程序 AJMP INTIR ;IR3 中断处理完毕,跳标号 INTIR 处执行 IR4:IR4 的中断处理程序 AJMP INTIR ;IR4 中断处理完毕,跳标号 INTIR 处执行 查询法扩展外部中断源比较简单,但是扩展的外部中断源个数较多时,查询时间较长。
5.10.3 用优先权编码器扩展外部中断源
当所要处理的外部中断源的数目较多而其响应速度又要求很快时,采用软件查询的方
法对中断优先级进行排队常常满足不了时间上的要求。这种方法是按照从优先级最高到最
低的顺序进行,由软件逐个进行查询的,在外部中断源很多的情况下,响应优先级最高的
中断和响应优先级最低的中断所需的时间可能相差很大。如果采用硬件对外部中断源进行
排队就可以避免这个问题。这里将讨论有关采用优先权编码器扩展 MCS-51 单片机外部中
断源的问题。 74LS148 是一种优先权编码器,它有 8 个输入端“0~7”,用作 8 个外部中断源输入端,
3 个编码输出端 A2~A0,一个编码器输出端GS,一个使能端(低电平有效)。在使能端输
入低电平的情况下,只要其 8 个输入端中任意一个输入为低电平,就有一组相应的编码从
A2~A0 端输出,且编码器输出端GS为低电平。如果 8 个输入端同时有多个输入,则 A2-A0端将输出输入编码中最大的所对应的编码。下面给出了 74LSl48 的真值表。
用 74LSl48 扩展 8031 外部中断源的基本硬件电路如图 5-12 所示。 图中编码器输出端 A2~A0 连至 8031 的 P1 口的 P1.1~P1.3,编码器输出端GS和 8031
的外中断源 INT1相连。当 8 个中断源 IR0~ IR7中有中断申请时(低电平有效),与其对应
的一组编码就出现在 8031 的 P1 口的 P1.1~P1.3 线上,这时编码器输出端GS为低电平,则
8031 外中断输入引脚 INT1也为低电平。这时,若 8031 的中断开放,就可以响应外部中断源
第 5 章 中断系统原理与应用
·93·
所提出的中断请求。
图 5-12 扩展 8 个外部中断源的硬件电路
为了使程序转向各中断源的中断服务子程序,必须在 8031 的中断服务程序中编写如下
引导程序。 ORG 2000H ;中断服务程序入口 AJMP LAB ORG 0040H
LAB: ORL P1, #00001110B ;设置 P1.1、P1.2.P1.3 为输入 MOV A, P1 ;P1 口内容送累加器 ANL A, #00001110B ;屏蔽除 P1.1、P1.2、P1.3 以外的位 MOV DPL, #00H ;中断服务程序转移表首地址低 8 位地址送 DPL MOV DPH, #10H ;中断服务程序转移表首地址高 8 位地址送 DPH JMP @A+DPTR ;跳转到中断服务程序转移表 ORG 1000H ;转移表首地址
JMPTBI:AJMP IR0 ;8 个中断服务子程序分支转移表 AJMP IR1 … … AJMP IR7
中断源中断申请信号的低电平应一直保持到 8031 将 74LSl48 提供的编码取走为止,否则
会出现错误。 74LSl48 的输入端“7”(即 IR0端)具有最高优先权,输入端“0”(即 IR7端)的优先权
最低,这相当于给图中的 8 个中断源安排了一个中断优先级顺序。因此,当同时有多个中断
源提出中断申请时,8031 只响应优先权最高的那个中断源的中断请求。 以上电路的最大特点是结构简单,价格低廉,但该电路无法实现中断服务子程序的嵌套。
即当一个中断请求正在被响应时,单片机不能响应别的中断源的中断申请(仅指 IR0~ IR7)。
MCS-51 系列单片机原理与接口技术
·94·
由于所扩展的外中断源都是经 INT1向 8031 提出中断申请,因此,这些外中断源在使用
时应注意以下 3 个问题。 1.中断响应时间 MCS-51 单片机的外中断响应时间在 3-8 个机器周期内,由于 8031 在真正为所扩展的外
中断源( IR0~ IR7 )服务之前需执行一段引导程序,因此对所扩展的外中断源而言,真正
的中断响应时间还要把执行引导程序所需的时间算在内。 2.中断申请信号的宽度 扩展的内部中断源,其中断申请信号宜采用负脉冲形式,且负脉冲要有足够的宽度,以保
证 8031 能读取到由锁存器提供的中断向量低 8 位地址,8031 读取这个地址要执行 4 条执指令,
需 7 个机器周期,若系统时钟频率为 12MHz,则中断申请信号负脉冲的宽度至少要大于 15μs。 3.堆栈深度的问题 由于单片机堆栈设在片内,字节有限,每次响应中断时都要将中断返回地址、现场保护
内容压入堆栈内,如果发生中断服务子程序又调用子程序,则极容易发生堆栈溢出或侵占了
片内 RAM 其他内容,从而造成程序混乱,在使用中要特别注意。
5.11 中断编程实例
【例 1】图 5-13 所示为 3 个故障源显示电路,当系统无故障时,3 个故障源输入端 X1~X3 全为低电平,对应的 3 个显示灯全灭;当某部分出现故障时,其对应的输入端由低电平变
为高电平,从而引起 MCS-51 单片机中断,中断服务程序的任务是判定故障,并点亮对应的
发光二极管。其中,发光二极管 LED1~LED3 对应 3 个输入端 Xl~X3。 【解】实现上述功能的电路如图 5-13 所示。3 个故障源 X1~X3 通过“或非门”与 8031
单片机的外部中断 0 输入端相连,同时,Xl~X3 与 P0 口的 P1.0~P1.2 引脚相接,3 支发光
二极管 LED1~LED3 分别与 P0 口的 P1.3~P1.5 相接。
图 5-13 采用中断方式对 3 个故障进行显示的电路原理图
主程序为: ORG 0000H AJMP MAIN ORG 1000H
第 5 章 中断系统原理与应用
·95·
AJMP SERVE MAIN:ORL P1,#FFH ;灯全灭,准备读入 SETB IT0 ;选择边沿触发方式 SETB EX0 ;允许 INT0 中断 SETB EA ;CPU 开中断 AJMP $ ;等待中断 中断服务子程序为: SERVE: JNB Pl.0,L1 ;若 Xl 有故障,跳到 L1 CLR Pl.3 ;点亮 LEDl JNB Pl.1,L2 ;若 X2 有故障,跳到 L2 CLR Pl.4 ;点亮 LED2 JNB Pl.2,L3 ;若 X3 有故障,跳到 L3 CLR Pl.5 ;点亮 lED3 RETI 【例 2】设单片机的晶振频率 f=6MHz,试利用定时器 T0 的中断方式在 P1.0 脚上输出周
期为 2ms 的方波。 【解】要在 P1.0 上得到周期为 2ms 的方波,只要使 P1.0 每隔 1ms 取反一次即可。设定定
时器 T0 的初始值 TH0 为 F0H、TL0 为 0CH。 主程序为: ORG 0000H LJMP MAIN ;转主程序 ORG 000BH ;T0 的中断入口 LJMP INT0 ;转中断服务程序 ORG 1000H MAIN:MOV SP, #50H ;设置堆栈 MOV TMOD, #00H ;设置 T0 为方式 0 MOV TL0, #0CH ;计数初值设置 MOV TH0, #F0H SETB EA ;CPU 开中断 SETB ET0 ;T0 开中断 SETB TR0 ;T0 定时器启动 WAITING:SJMP WAITING ;等待中断 ;中断服务程序: INT0:MOV TL0, #0CH ;重装初始值 MOV TH0, #F0H CPL P1.0 ;方波输出 RETI ;中断返回 END
MCS-51 系列单片机原理与接口技术
·96·
5.12 习题
1.什么是中断,80C51 的中断能实现哪些功能? 2.在中断响应过程中,为什么需要保护现场?如何保护? 3.80C51 单片机的中断系统有几个优先级,如何设定?若扩充多个中断源,则又如何设
定优先级? 4.在中断请求有效并且中断打开的情况下,能否保证中断得到立即响应?如不能,需
要什么条件? 5.中断响应中,CPU 应能完成哪些自主的操作,这些操作状态对程序运行有什么影响? 6.试用中断设计一个使发光二极管每秒闪亮 400ms 的电路,设主频为 6MHz。
第第 66 章章 定定时时器器//计计数数器器
在实时控制系统中,常常需要有实时时钟以实现定时或延时控制。MCS-51 中有两个 16位定时器/计数器 T0 和 T1,它们各由两个独立的 8 位寄存器组成,利用 T0 和 T1 可以完成事
件计数、测量时间间隔和脉冲宽度以及产生定时中断请求等功能。
6.1 定时器/计数器概述
定时和计数是计算机控制系统中两个重要的功能,在实际系统中应用极为普遍,常见的
定时器/计数器专用芯片有 MC6840、Z80-CTC、8253、8254 等。许多单片机,本身带有定时
器和计数器,使用时不需附加专用的定时计数芯片。MCS-51 系列单片机内部有两个 16 位可
编程定时器/计数器,即定时器 T0 和定时器 T1。MCS-52 子系统中除这两个定时器外,还有
定时器/计数器 T2,后者的功能比前者强。它们都具有定时和计数的功能,并有 4 种工作方
式可供选择。MCS-51 系列单片机内部还有两个专用寄存器 TMOD、TCON,可通过软件设
定有关参数,如方式选择、定时计数选择、运行控制、溢出标志和触发方式等控制字。
6.1.1 定时器/计数器结构
MCS-51 单片机内部设置的两个 16 位可编程的定时器/计数器 T0 和 T1,可以处于计数方
式或定时方式。可通过设置特殊功能寄存器 TMOD 中的控制位来选择 T0 或 T1 为定时器还
是计数器。T0 或 T1 状态字在相应的特殊功能寄存器中,通过对控制寄存器的设置,用户可
以方便地选择工作模式。MCS-51 单片机定时器/计数器的结构如图 6-1 所示。
图 6-1 MCS-51 单片机定时器/计数器的结构图
图中,TMOD 用于控制和确定各定时器/计数器的功能和工作模式;TCON 用于控制定时
器/计数器 T0、T1 的启动和停止计数,同时设置定时器/计数器的状态。它们的内容由软件设
MCS-51 系列单片机原理与接口技术
·98·
置,系统复位时,寄存器的所有位都被清零。 1.工作方式控制寄存器 TMOD TMOD 用于设定定时器/计数器的工作方式及工作模式,各位的定义如图 6-2 所示。
图 6-2 TMOD 寄存器各位定义
TMOD 地址为 89H,高 4 位为定时器 T1 的方式控制字段,低 4 位为定时器 T0 的方式控
制字段。 (1)门控位 GATE:当 GATE=0 时,定时器/计数器只由软件控制位 TR0 或 TRl 来控制
启停。TRi 位为 1 时,定时器启动开始工作;为 0 时,定时器调整工作。当 GATE=1 时,定
时器/计数器的启动要由外部中断引脚和 TRi 为共同控制。只有当中断引脚 INT0 或 INT1为高
时,TR0 或 TR1 置 1 才能启动定时器工作。 (2) T/C : T/C =0 为定时器方式,采用晶振脉冲的 12 分频信号作为计数器的计数脉
冲,即对机器周期进行计数。若选择 12MHz 晶振,则定时器的计数频率为 1MHz。从定时器
的计数值便可求得计数时间,因此称为定时器方式。
T/C =1 为计数器方式,采用外部引脚(T0 为 P3.4,T1 为 P3.5)的输入脉冲作为计数
脉冲。当 T0(或 T1)输入发生高到低的负跳变时,计数器加 1,最高计数频率为晶振频率的
1/14。 (3)M1、M0:定时器的工作方式由 M1、M0 二位的状态确定,对应关系如下所示。
M1 M0 工作方式 功能描述
0 0 方式 0 13 位的计数器,Tli 只使用低 5 位
0 1 方式 1 16 位的计数器
1 0 方式 2 8 位的自动重装计数初值的计数器
1 1 方式 3 T0 分成 2 个独立的 8 位计数器 2.控制寄存器 TCON TCON 的主要功能是用于定时器的启动、停止以及在溢出时设定标志位和外部中断触发
方式。它的字节地址为 88H,位地址为 88H~8FH。其控制字各位的定义如图 6-3 所示。
图 6-3 TCON 寄存器各位定义
低 4 位与外部中断有关,高 4 位的功能如下: (1)TFl 为 T1 的溢出标志位。 当定时器 T1 溢出时,由硬件将 TF1 置 1,并申请中断。当进入中断服务程序时,硬件
又自动将 TF1 清零(也可以用软件清零)。 (2)TR1 为定时器 T1 的运行控制位。 该位由软件置位和复位。当 GATE(TMOD.7)为 0,TRl 为 1 时允许 T1 计数,TR1 为 0
第 6 章 定时器/计数器
·99·
时禁止 T1 计数;当 GATE 为 1,TR1 为 1 而且 INT1输入高电平时,才允许 T1 计数,TR1为 0 或 INT1输入为低电平时,禁止 T1 计数。
(3)TF0 为定时器 T0 的溢出标志位。 当定时器 T0 溢出时,由硬件将 TF0 置 1,并申请中断。当进入中断服务程序时,硬件
又自动将 TF0 清零(也可以用软件清零)。 (4)TR0 为定时器 T0 的运行控制位。 该位由软件置位和复位。当 GATE(TMOD.3)为 0,TR0 为 1 时允许 T0 计数,TR0 为
0 时禁止 T0 计数;当 GATE 为 1,TR0 为 1 而且 INT0 输入高电平时,才允许 T0 计数,TR0为 0 或 INT0 输入为低电平时,禁止 T0 计数。
6.1.2 定时器/计数器的初始化
定时器的功能是由软件设置的,一般在使用定时器/计数器前均要对其进行初始化。 1.初始化的步骤
(1)确定工作模式(是计数还是定时)、工作方式和启动控制方式,并将其写入 TMOD寄存器。
(2)设置定时或计数器的初值:可直接将初值写入 TH0、TL0 或 THl、TLl 中。16 位计
数初值必须分两次写入对应的计数器。 (3)根据要求决定是否采用中断方式:直接对 IE 位赋值。开放中断时,对应位置“1”;
采用程序查询方式时,IE 位应清 0 以进行中断屏蔽。 (4)启动定时器工作。可使用 SETB TRi 启动。 若第一步设置为软启动,即 GATE 设置为 0 时,以上指令执行后,定时器即可开始工
作。 若 GATE 设置为 1 时,还必须由外部中断引脚 INT0 和 INT1共同控制,只有当 INT0 和
INT1引脚电平为高时,以上指令执行后定时器方可启动工作。定时器一旦启动就按规定的方
式定时或计数。 2.计数初值的计算 定时或计数方式下计数初值如何确定,定时器选择不同的定时或计数模式,不同的工作
方式其计数初值均不相同。 若设最大计数值为 M,各工作方式下的 M 值为: 方式 0:M=213=8192 方式 1:M=216=65536 方式 2:M=28=256 方式 3:M=256,定时器 T0 分成两个独立的 8 位计数器,所以 TH0、TL0 的 M 均
为 256。 MCS-51 的两个定时器均为加 1 计数器,当加到最大值(00H 或 0000H)时产生溢出,
将 TF 位置 1,可引发溢出中断。因此计数器初值 X 的计算公式为: X=M-计数值。 式中的 M 由操作模式确定,不同的操作模式计数器的长度不相同,故 M 值也不相同。
式中的计数值与定时器的工作方式有关。
MCS-51 系列单片机原理与接口技术
·100·
(1)计数工作模式时 计数工作模式时,计数脉冲由外部引入,对外部脉冲进行计数,因此计数值根据要求确
定。其计数初值 X=M-计数值。 【例】某工序要求对外部脉冲信号计 100 次,则 X=M-100。 (2)定时工作模式时 定时工作模式时,计数脉冲由内部供给,对机器周期进行计数,因此计数脉冲频率为 fcont
=fosc/l2、计数周期 T=1/fcont=12/fosc,定时工作方式的计数初值 X: X=M-计数值=M-t/T=M-(fosc×t)/12
式中 fosc为振荡器的振荡频率,t 为要求定时的时间。 【例】MCS-51 的主频 6MHz,要求产生 lms 的定时,试计算计数初值 X。若设置定时器
工作于工作方式 1(见下一节),定时 1ms,则计数初值 X: X=216-(6×106×1×10-3)/12=65536-500=65036=FE0CH 3.定时器初始化举例 T0 为计数方式,对外部脉冲计数 100 次,硬启动,禁止中断,选工作方式 2。设置 T1
为定时工作方式,定时 25ms,选择工作方式 1,允许中断,软启动;编写其初始化程序,设
fosc=12MHz。 初始化如下: T0 设为计数模式的工作方式 2(见下一节),硬启动,计数初值 X0 为 X0=256-100=156=9CH T1 设为定时方式,定时 25ms,工作方式 1,软启动,其计数初值 X1 为 X1=65536-(12×25×1000)/12=655536-25000=40536=9E58H 方式控制字:0001110H 初始化程序如下:
MOV TMOD,#1EH ;写工作模式字 MOV TH0,#9CH ; 定时器 0 计数初值,TH0 中的数自动重新装入 TL0 MOV TL0,#9CH MOV THl,#9EH ;定时器 1 计数初值 MOV TLl,#58H MOV IE,#1001000B ;CPU、T1 开中断 SETB TR0 ;启动 T0,但要等到 INT0 =1 时方可真正启动 SETB TRl ;启动 T1
第 6 章 定时器/计数器
·101·
6.1.3 定时器/计数器的工作方式
定时器/计数器 T0 和 T1 有 4 种工作方式,即方式 0、方式 1、方式 2 和方式 3。 T0 和 T1 这两个定时器在方式 0、方式 1、方式 2 下工作时,其用法完全一致,仅在方式
3 时有所区别。 各种方式的选择是通过对 TMOD 的 M1、M0 两位进行编码来实现的。 1.方式 0 当 TMOD 中的 M1M0 位为 00 时,定时器/计数器就工作在方式 0,如图 6-4 所示是定时
器 T0(T1)方式 0 的逻辑结构。
图 6-4 T0(或 T1)工作方式 0 的结构图
方式 0 实质上是对定时器 T0 或 T1 的两个 8 位计数器 TH0、TL0(或 TH1、TL1)进行
计数操作。其中高位计数器 TH1 的 8 位全部使用,而低位计数器 TL0 只用其低 5 位。从而
构成了一个 13 位的计数器。计数时 TL0 低 5 位计满向 TH0 进位,TH0 计满向中断标志位 TF0进位,由硬件置位 TF0,申请中断。
13 位计数器的启动和停止是受某些逻辑门控制的,选择定时还是计数则由逻辑软开关
T/C 控制。 做定时器使用时,计数时钟是由 CPU 的晶体振荡器经 12 分频产生的。此时 T/C =0,
软开关拨向定时器,T0 对机器周期计数。其定时时间由下式计算: 定时时间=(213-x)×时钟周期×12
式中 x 即为 T0 的初值。 用作外部事件计数器时,设定 T/C =1,使软开关接通定时器 T0 的输入端(P3.4)引脚。
外部时钟通过 P3.4 引脚供 13 位计数器计数用。 控制计数器启动、停止的信号主要是门控位 GATE 和运行控制位 TR0。GATE=0 时计数
器运行条件只取决于 TR0;GATE=1 时,则由 TR0 和 INT0 共同决定。 如图 6-4 所示中,GATE=0 时或门输出总是 1(与 INT0 无关)。若 TR0=1 则与门输出
为 1,控制开关接通计数器,允许 T0 在原值上做加法计数,直到溢出。溢出时计数器恢
复为 0、TF0=1(申请中断),T0 仍从 0 开始计数。若 TR0=0,则封锁与门,软开关断开,
停止计数。 当 GATE=1 且 TR0=1,则或门仅受 INT0 控制,与门也间接受 INT0 控制,于是外部中
断信号电平通过引脚 P3.2 直接启动或关闭计数通道。这种控制方法常用来测量外部信号的脉
冲宽度(如 INT0 =1 启动计数、INT0 =0 停止计数,就记录了一个脉冲宽度。软件设定 IT0=l
MCS-51 系列单片机原理与接口技术
·102·
则 IE0=1,申请中断。应注意与溢出中断的区别)。 【例】选用 T0 操作模式 0,用于定时,由 P1.0 输出周期为 4ms 的方波,设晶振 fosc=
12MHz。 【解】要在 P1.0 引脚输出周期为 4ms 宽的方波,只要每隔 2ms 将 P1.0 取反一次即可
得到 4ms 的方波。因此选用 T0 的定时时间为 2ms。先以 16 位计数器计算,初始值 X0 为 X0=213-fosc×t/l2=8192-12×2000/12=8192-2000=6192=17F1H
由于采用操作模式 0,计数器为 13 位,TL0 的高 3 位未用,应补 0,TH0 占高 8 位,所
以 X0 的实际值应为: X=1011111100010001B=DF11H
根据题意设置方式控制字:TMOD=00000000B=00H 上电复位后,TMOD 各位均为 0,所以此字可以不用写入。 源程序如下:
ORG 0010H MOV TH0,#DFH ;T0 的计数初值 X0 MOV TL0,#11H SETB TR0 ;启动 T0
LOOP1:JBC TF0,LOOP2 ;查询 T0 计数溢出否,同时清除 TF0 AJMP LOOPl ;没有溢出则继续等待
LOOP2:MOV TH0,#DFH ;若溢出重置计数初值 MOV TL0,#11H CPL P1.0 ;输出取反 SJMP LOOP1 ;重复循环
2.方式 1 当 TMOD 中的 M1 M0 为 01 时,定时器/计数器工作于方式 1,这时的定时器/计数器的
结构和工作过程几乎与方式 0 完全相同,惟一的区别是计数器的长度为 16 位。 定时时间=(216-x)×时钟周期×12;x 即为 T0 的初值。 计数初值=216-t×fosc/l2 【例】用定时器 0 产生一个 50Hz 的方波,由 P1.1 输出,仍用程序查询方式,振荡频率为
12MHz。 【解】方波周期 T=1/50=0.02s=20ms,定时值只需 10ms,所以可用 T0 定时 10ms。计数
初值 Xl: X1=216-12×10×1000/12=65536-10000=55536=D8F0H 源程序如下
ORG 0010H MOV TMOD #11H ;T0 工作在方式 l,定时模式 SETB TR0 ;启动 T0 LOOP:MOV TH0,#D8H ;T0 计数初值 MOV TL0,#F0H JNB TF0,$ ;T0 没有溢出则原地等待,$为地址计数器
第 6 章 定时器/计数器
·103·
CLR TF0 ;产生溢出清标志位 CPL P1.1 ;P1.1 取反输出,输出方波 SJMP LOOP ;继续循环 3.方式 2 当 TMOD 中的 M1 M0 为 1 0 时,定时器/计数器工作于方式 2。当方式 0、方式 1 用
于循环重复定时计数,每次计满溢出时,寄存器全部为 0,下一次计数还得重新装入计数
初值。 这样不仅编程麻烦,而且影响定时时间精度,方式 2 克服了它们的缺点,能自动重装计
数初值。 方式 2 中把 16 位的计数器拆成两个 8 位计数器,低 8 位做计数器用,高 8 位保存计
数初值。当低 8 位计数产生溢出时,将 TFi 位置 1,同时又将保存在高 8 位中的计数初值
重新自动装入低 8 位计数器中,再继续计数,循环重复不止。方式 2 的逻辑结构如图 6-5所示。
图 6-5 T0(或 T1)工作方式 2 的结构图
初始化编程时,THi 和 TLi 都装入该计数初值。方式 2 适用于做较精确的脉冲信号发生
器,尤其适用于串行口波特率发生器。 【例】用定时器 0,方式 2 计数,要求每计满 200 次,将 P1.1 端取反。 【解】T0 工作于计数方式,外部计数脉冲由 T0(P3.5)引脚引入,每来一个由 1 至 0 的
跳变计数器加 1,由程序查询 TF0 的状态。 计数初值 X=28-200=56=38H 所以 TH0=TL0=38H,TMOD=06H(T0 计数模式:方式 2) 源程序如下:
ORG 0010H MOV TMOD,06H MOV TH0,#38H ;T0 计数初值 MOV TL0,#38H SETB TR0 ;启动 T0 LOOP1:JBC TF0,LOOP2 ;如果 TF0=1,则转到 LP2 SJMP LOOP1 ;否则一直等待 LOOP2:CPL P1.1 ;P1.1 取反输出 SJMP LOOP1
MCS-51 系列单片机原理与接口技术
·104·
4.方式 3 方式 3 是为了增加一个附加的 8 位定时器/计数器而提供的,使得 MCS-51 具有 3 个定时
器/计数器。方式 3 只适用于定时器/计数器 T0,定时器 T1 处于方式 3 时相当于 TRl=0,停止
计数。当 TMOD 的低 2 位 M1M0 为 11 时,定时器 T0 工作在方式 3 下,引脚的逻辑结构如
图 6-6 所示。
图 6-6 T0 工作方式 3 的结构图
T0 在该方式下被拆成两个独立的 8 位计数器 TH0 和 TL0,其中 TL0 使用原来 T0 的一
些控制位和引脚,如: T/C 、GATE、TR0、TF0 和 T0(P3.4)以及 INT0 (P3.2)引脚。此
方式下的 TL0 除作为 8 位计数器外,其功能和操作与方式 0、方式 1 完全相同,可做定时也
可做计数用。 该方式下的 TH0,此时只可用作简单的内部定时器功能,它借用原定时器 T1 的控制位
和溢出标志位 TR1 和 TF1,同时占用了 T1 的中断源。TH0 的启动和关闭仅受 TR1 的控制,
TR1=1,TH0 启动定时;TR0=0,TH0 停止定时工作。 当 T0 选作操作模式 3 时,TH0 占用了 T1 的 TR1 和 TF1 控制和溢出标志位,此情况下
定时器 T1 仍可工作在方式 0、方式 1 和方式 2,作为串行口波特率发生器,或用在任何不需
要中断的场合。 上面主要介绍了计数器/定时器 T0 的使用,T1 的使用方法与 T0 基本相同,下面对 T1
的工作方式做一个简要的介绍。 (1)定时器 T1 的控制字 TMOD 的 M1 M0 为 00 时,定时器 T1 工作在方式 0,工作示意
图如图 6-7(a)所示。 (2)定时器 T1 的控制字 TMOD 的 M1 M0 为 01 时,定时器 T1 工作在方式 1,工作示意
图如图 6-7(b)所示。 (3)定时器 T1 的控制字 TMOD 的 M1M0 为 10 时,定时器 T1 工作在方式 2,工作示意
图如图 6-7(c)所示。
第 6 章 定时器/计数器
·105·
图 6-7 T0 工作于方式 3 时 T1 各种工作方式示意图
(4)定时器 T1 的控制字 TMOD 的 MIM0 为 11 时,定时器 T1 停止计数。 设置 T1 中的 位可对内部时钟进行定时或对外部引脚脉冲进行计数。当 T1 被设置成
工作方式 3 时,由于 T1 的 TRl 和 TFl 被 TH0 占用,因此 T1 溢出产生中断时不能由 TF1 发
出,只能从串行口输出 T1 的溢出信号。 由此可见,当 T0 工作于模式 3 时,T1 一般用作串行口波特率发生器。当设置好工作方
式后,定时器 T1 自动开始运行;若要停止操作,只需送入一个设置定时器 1 为方式 3 的模
式控制字。 【例】设某用户系统中已使用了两个外部中断源,并置定时器 T1 工作于方式 2,用作串
行口波特率发生器。现要求再增加一个外部中断源并由 P1.0 输出一个 10kHz 的方波。单片机
振荡频率为 12MHz。 【解】为了不增加其他硬件开销,可设置 T0 工作于方式 3 计数方式,把 T0 的引脚作附
加的外部中断输入端,TL0 的计数初值为 FFH;当检测到 T0 引脚由 1 至 0 的负跳变时,TL0立即产生溢出,申请中断,相当于边沿触发的外部中断源。
T0 的模式 3 下,TL0 作计数用,而 TH0 可用作 8 位的定时器,定时控制 P1.0 输出的 10kHz的方波信号。
因为 P1.0 的方波频率为 10kHz,故周期 T=1/10kHz=0.1ms。 所以用 TH0 定时 0.05ms,TL0 的计数初值为 FFH;TH0 的计数初值 X=256-0.05×10-3
×12×106/12=216=D8H。 程序如下: ORG 0010H MOV TMOD,#27H ;T0 工作于方式 3,计数;T1 工作于方式 2,定时 MOV TL0,#FFH ;TL0 的计数初值 MOV TH0,#D8H ;TH0 的计数初值
MCS-51 系列单片机原理与接口技术
·106·
MOV THl,#data[H] ;data 是根据波特率要求设置的常数 MOV TLl,#data[L] MOV TCON,#55H ;外中断 0、1 边沿触发,启动 T0,T1 MOV B,#9FH ;开放全部中断 TL0 溢出中断服务程序(由 000BH 转来): TL0OF:MOV TL0,#FFH ;TL0 重装初值 (中断处理) RETI TH0 溢出中断服务程序(由 001BH 转来): TH0OV:MOV TH0,#D8H ;TH0 重装初值 CPL P1.0 ;P1.0 取反输出 串行口及外部中断 0、1 的服务程序在此不再全列出。
6.2 定时器/计数器综合应用举例
定时器/计数器是单片机应用系统中经常使用的部件之一。定时器/计数器的使用方法对
程序编制、硬件电路以及 CPU 的工作都有直接影响。下面将通过一些综合的实例来说明定时
器的具体应用方法。
6.2.1 门控位 GATE 的应用
门控位 GATE 可对 INT0 和 INT1引脚上的高电平持续时间进行计量。该实例我们在第 5章曾做过一个简要介绍,这里主要侧重于定时器/计数器的使用。当 GATE 位设为 1,并设定
时器/计数器启动位 TRx 为 1 时,定时器/计数器定时完全取决于 INT0 、INT1引脚,仅当 INT0和 INT1引脚电平为 1 时,定时器才工作。从另一方面说,定时器实际记录的时间就是相应
INT0 或 INT1引脚上高电平的持续时间。通过反相器,可测得相应 INT0 或 INT1引脚上低
电平的持续时间。两个时间的和即为 INT0 或 INT1引脚上输入波形的周期,其倒数即为 INT0或 INT1引脚上输入波形的频率。还可据此算出占空比等参数。
【例】利用定时器/计数器测定图 6-8 所示波形的一个周期长度。
图 6-8 波形脉冲宽度测试原理
这里利用门信号 GATE 启动定时器。如图 6-8 所示,定时器/计数器 T1 为计数器,T1 的
电平由 1 到 0,计数器计数。 (1)查询法
ORG 0010H MAIN:MOV TMOD,#D0H ;设置 T1 为计数器,方式 1,GATA 位置 1
第 6 章 定时器/计数器
·107·
MOV TL1,#00H ;置为最大定时值 MOV TH1,#00H LOOPl:JB P3.3,LOOPl ;P3.3 为高电平,等待 SETB TR1 ;当 P3.3 为低电平时,置 TRl 位为 1,开始计数 LOOP2:JNB P3.3,LOOP2 ;当 P3.3 为低电平时,再等待 LOOP3:JB P3.3,LOOP3 ;当 P3.3 为高电平时,继续等待 CLR TRl ;当 P3.3 为低电平时,波形周期计数结束 SJMP $ 当 fosc=12MHz 时,机器周期为 1μs,本方案最大被测脉冲宽度为 65536μs(65.536ms)。靠
软件进行启动和停止计数,存在一定的测量误差。 若被测波形除了接至 P3.3 外还通过一个反相器接至 P3.2( INT0 ),则还可以测得波形
的高电平宽度和低电平宽度。 (2)中断法 对于脉冲宽度大于 65.536ms 的脉冲,可以采用对定时溢出次数进行计数的方法。这样,
脉宽=(定时溢出时间×溢出次数)+定时时间。利用定时器/计数器来测定脉冲周期的方法
如图 6-9 所示。
图 6-9 利用定时器/计数器测脉冲周期
设定机器周期 Tc 为 2μs,定时器/计数器 T0 为方式 1,定时溢出时间为 100ms,则 T0 定
时初始值 X=216-(100×10-3/(2×10-6))=15536=3CB0H,因此(TH0)=3CH,(TL0)=B0H。 因为外部脉冲同时接至定时器/计数器 T1 的输入引脚 T1,所以 T1 脚上对下降沿计数两
次,即为外部脉冲的一个周期时间。现设定时器/计数器 T1 为计数器。计数值为 2。当计数
值为 1 时,启动定时器;当计数值为 2 时,中断计数器 T1,并停止定时器 T0 的定时;T1 中
断优先级设为高于定时器 T0。 计数器 T1 计数初值为 FFFEH:(TH1)=FFH,(TL1)=FEH。 编程如下: ORG 0010H SJMP MAIN ORG 000BH ;定时器 T0 中断入口 AJMP TIME0 ORG 001BH ;定时器 T1 中断入口 AJMP TIME1 MAIN:MOV R0,#0 ;清除 T0 定时中断次数计数器
MCS-51 系列单片机原理与接口技术
·108·
MOV TMOD,#59H ;设 T0 为定时器、方式 1,门控位 GATE=1; ;设 T1 为计数器、方式 1 MOV TH0,#3CH ;T0 定时器初值 MOV TL0,#B0H MOV THl,#FFH ;T1 计数器初值 MOV TL1,#FEH SETB TR0 ;启动 T0 定时器 SETB TRl ;启动 T1 计数器 MOV IP,#08H ;T1 中断优先级高于 T0 SETB ETl ;允许 T1 中断 SETB ET0 ;允许 T0 中断 SETB EA ;CPU 开中断 SETB 20H ;设 20H 为 T1 计数中断标志 LOOP:SETB F0 ;设用户标志 F0 为 T0 定时中断标志 JB F0,$ ;T0 定时未溢出,等待 JB 20H,LOOP ;判 T1 计数溢出,若未溢出则循环,否则结束 SJMP $ ORG 0100H : TIME0:MOV TL0,#B0H ;重置 T0 定时器初值 MOV TH0,#3CH INC R0 ;T0 定时溢出计数器加 1 CPL F0 ;T0 定时中断变反 RETI ORG 0200H TIME1:CLR F0 ;清除 T0 定时中断标志 CLR 20H ;清除 T1 计数中断标志 CLR ET0 ;禁止 T0、T1 中断 CLR ETl CLR EA ;关中断 RETI 因此可测的最大周期长度为 256×l00ms=25.6s。若周期大于 25.6s,则不用 T0、改用 16
位计数器即可。
6.2.2 运行中读定时器/计数器
80C51 可以随时读写计数寄存器 TLx 和 THx(x 为 0 或 1),比如实时显示计值等。但在读
取时应注意分时读取 TLx 和 THx 带来的特殊性。例如读 TLx,再读 THx,此时定时器/计数
器还在运行,如果在读 THx 之前刚好发 TLx 溢出,向 THx 进位的情况,则读得的 TLx 值就
不正确了;同样,先读 THx,再读 TLx 时也可能产生这种错误。 解决办法是:先读 THx,后读 TLx,再重读 THx,若两次读得的 THx 值是一样的,则可
第 6 章 定时器/计数器
·109·
以确定读入的数据是正确的;若两次读得的 THx 值不一致,则必须重读。 程序示例: RDTIME:MOV A,TH0 ;读 TH0
MOV R0,TL0 ;读 TL0 并存入 R0 CJNE A,TH0,RDTIME ;再读 TH0,与上次读入的 TH0 比较
;若不等,重读 MOV R1,A ;存 TH0 在 R1 中 RET
6.2.3 实时时钟的设计
实时时钟就是以秒、分、时为单位进行计时的。 1.实时时钟实现的基本方法 时钟的最小计时单位是秒,但如使用定时器的方式 1,最大的定时时间也只能达到 131ms。
我们可把定时器的定时时间定为 l00ms,这样,计数溢出 10 次即得到时钟的最小计时单位:
秒,而计数 10 次可用软件方法实现。 (1)计数初值的计算 假设使用定时器的方式 1,进行 l00ms 的定时。设计数初值为 X,单片机的晶振频率为
6MHz,为得到 100ms 的定时,则: (216-X)×2×10-6=0.1
所以 X=15536=0011110010110000B=3CB0H (2)秒、分、时计时的实现 秒计时是采用中断方式进行溢出次数的累计而得到的。从秒到分,从分到时可通过软件
累加并进行比较的方法来实现的。要求每满 1 秒,则“秒”单元 32H 中的内容加 1;“秒”单
元满 60,则“分”单元 31H 中的内容加 1:“分”单元满 60,则“时”单元 30H 中的内容加
1;“时”单元满 24,则将 32H、31H、30H 的内容全部清“0”。 2.程序设计
(1)主程序的设计 主程序的主要功能是进行定时器的初始化,并启动 T1,然后通过循环(或反复调用显示
子程序),等待 l00ms 定时中断的到来。主程序的流程如图 6-10 所示。 (2)中断服务程序的设计 中断服务程序(1T0P)的主要功能是实现秒、分、时的计时处理。 中断服务程序的流程如图 6-11 所示。 程序如下: ORG 0010H AJMP MAIN ;上电,跳向主程序 ORG 000BH ;T0 的中断入口 AJMP 1T0P ;跳 T0 的中断服务入口 ORG 1000H
MCS-51 系列单片机原理与接口技术
·110·
图 6-10 时钟主程序流程图 图 6-11 中断服务程序流程图
MAIN:MOV TMOD,#01H ;设 T0 为方式 1 定时 MOV 20H,#0AH ;中断次数为 20H 单元 CLR A ;A 清 0 MOV 30H,A ;“时”单元清 0 MOV 31H,A ;“分”单元清 0 MOV 32H,A ;“秒”单元清 0 SETB ET0 ;允许 T0 申请中断 SETB EA ;CPU 开中断 MOV TH0,#3CH ;给 T0 装入计数初值 MOV TL0,#B0H ; SETB TR0 ;启动 T0 HERE:SJMP HERE ;等待中断(也可调用显示子程序) IT0P: PUSH PSW ;T0 中断服务程序入口,保护现场 PUSH ACC
第 6 章 定时器/计数器
·111·
MOV TH0,#3CH ;重新给 T0 装入初值 MOV TL0,#B0H ; DJNZ 20H,EXIT ;1 秒未到,返回 MOV 20H,#0AH ;1 秒时间到,重置中断次数 MOV A,#01H ;“秒”单元增 1 ADD A,32H
DA A ;“秒”单元十进制调整 MOV 32H,A ;“秒”的 BCD 码存回“秒”单元 CJNE A,#60H,EXIT ;是否到 60 秒,未到则返回 MOV 32H,#00H ;计满 60 秒,“秒”单元清 0 MOV A,#01H ;“分”单元增 1 ADD A,31H DA A ;“分”单元十进制调整 . MOV 31H,A ;“分”的 BCD 码存回“分”单元 CJNE A,#60H,EXIT ;是否到 60 分,未到则返回 MOV 31H,#00H ;计满 60 分,“分”单元清 0 MOV A,#01H ;"时”单元增 1 ADD A,30H
DA A ;“时”单元十进制调整 MOV 30H,A CJNE A,#24,EXIT ;是否到 24 小时,未到则返回 MOV 30H,#00H ;"时”单元增 1 EXIT:POP Acc ;恢复现场 POP PSW RETI ;中断返回 END
6.3 习题
1.80C51 单片机有几个定时器/计数器?各由哪些寄存器组成?有哪几种工作方式?各
有什么特点? 2.80C51 定时器/计数器工作在方式 0 时,其计数初值如何计算? 3.如何使用外部引脚信号来控制定时器/计数器的开启和停止? 4.试采用 T0 作为外部计数器,实现每计数到 1000 个脉冲后,使 T1 开始 2ms 定时,定
时时间到后,T0 又开始计数,如此循环。 5.用 80C51 的定时器测量某正脉冲宽度,采用何种方式可得到最大量程?如何测量?
设系统时钟频率为 6MHz,则允许测量的最大脉冲宽度为多少?
第第 77 章章 串串行行口口
MCS-51 单片机内部有一个全双工的串行接口,有两个物理上独立的接收、发送缓冲器
SBUF,可同时发送和接收数据。发送缓冲器只能写入、不能读出,接收缓冲器只能读出、不
能写入,两个缓冲器占用一个地址(99H)。MCS-51 的串行口只要在输入输出引脚上外加一
电平转换器,就可构成一个标准的 RS-232C 接口。
7.1 串行通信的基本概念
7.1.1 通信数据的传输方式
数据的传输方式有单工、半双工、全双工和多工传输方式。 1.单工传输方式 如图 7-1(a)所示,数据只能按一个固定方向传送,且是非交互式的。这种单向连接的
用途有限,仅适用远程串行口电传打印机与系统通信等场合。有的系统虽是单工传输,但可
利用另一线路(图中虚线)将接收的监视信号返回给发送方,通常用于差错检测的应答。
图 7-1 各种不同的线路传输方式示意
2.半双工传输方式 如图 7-1(b)所示,通信双方既可发送又可接收数据,但不能同时进行。可通过“收/
发”开关实现线路的切换。当然,这种开关并非实际的物理开关,而是根据半双工通信协议
由软件控制的电子开关。在某些系统中,也可通过图中虚线实现同时按两个方向传输监视信
号。
第 7 章 串行口
·113·
3.全双工传输方式 如图 7-1(c)所示,通信双方可同时发送和接收数据。同样,在某些系统中,也可通过
图中虚线实现同时按两个方向传输监视信号。 就传输效率而言,第一位是全双工方式,然后是半双工方式,最后是单工方式。不过在
实际应用中;全双工方式的设备及线路费用要认真考虑。虽然半双工方式因线路反复切换所
引起的延迟积累效应导致效率不及全双工,但由于它经济实用,在传输效率不处于首要地位
的系统中应用较多。 4.多工传输方式 上述三种传输方式的共同特点是在一条线路上传输一种信号频率。如果使用多路复用器
或多路集中器专用通信设备,把一个信道(即传输信号的线路)划分为若干个频带或使用时
间复用技术,可实现多路信号同时共享信道的功能,如图 7-1(d)所示,这种传输方式被称
为多工传输方式。
7.1.2 串行通信的两种基本通信方式
1.异步通信 在异步通信中,发送器和接收器有各自的时钟,如图 7-2(a)所示。异步通信用帧来表
示一个字符。一帧包含如下内容:一个起始位,表示一个字符的开始,接着为若干位表示字
符本身,最后用停止位表示字符的结束。如图 7-3 所示传送 55H(字符 U 的 ASCII 码)的 8位异步通信格式时,起始位占 1 位,字符编码为 7 位(ASCII 码),第 8 位为奇(偶)校验位。
停止位有 3 种形式:占 1 位,或 1.5 位(一位半)或两位,因此一个字符(一帧)由 10 位或
10.5 或 11 位构成。
图 7-2 异步通信和同步通信的时钟控制
图 7-3 异步通信一帧数据格式
2.同步通信 在同步通信中,发送器和接收器由同一个时钟控制,如图 7-2(a)所示。在异步通信中,
每一个字符要用起始位和停止位作为一个字符的开始和结束的标志,占用了时间。在数据块
传送时,为了提高速度,去掉这些标志而采用同步传送。它在数据块开始处用特定的同步字
符作为标志,如图 7-4 所示。
MCS-51 系列单片机原理与接口技术
·114·
图 7-4 同步字符
同步传送的速度高于异步传送的速度。但是,它要求传送时钟来实现发送端与接收端之
间的同步,传送的信息量较异步传送大,而且硬件复杂,费用也大。
7.1.3 串行通信数据的传送速率
在串行通信中,数据传送速率涉及到两个测量单位,即 bit/s 和波特率。 (1)bit/s(bitpersecond):每秒位数,即每秒传送的位数。 (2)波特率(Baudrate):每秒符号数,即每秒传送的符号数。 在具有调制解调器的通信中,波特率涉及到调制速率。对于一次发送一位的装置,如 PC
机和 MCS-51 的串行口,bit/s 和波特率是一样的,即单位为“位/秒”。而对于把位组成复合
符号的形式传送的调制解调器而言,这两个速度是不一样的。例如,工作在 1200bit/s 速度下
的标准 PC 调制解调器每次编码两位,即每秒传送 600 个字符,所以传送速率为 1200bit/s 或600 波特。
串行传送时,数据是一位一位依次顺序传送的,而在计算机中数据是并行的,所以,当
数据自计算机送往终端时,要把并行数据变换成串行的数据才能传送。而计算机接收由终端
送来的数据时,要把串行数据转换成并行的数据才行。这类转换工作可用软件方法完成,也
可用硬件来实现。用软件方法时,CPU 执行一段程序来完成串、并行间的转换,但这将大大
降低 CPU 的利用率。所以,通常采用一种称为通用异步接收/发送器(UART)的硬件电路来
实现这种转换。
7.2 串行口的工作方式
控制 MCS-51 单片机串行口工作的控制寄存器共有两个:特殊功能寄存器 SCON 和
PCON。 (1)串行口控制寄存器 SCON,字节地址 98H。
D7 D6 D5 D4 D3 D2 D1 D0
SCON SM0 SM1 SM2 REN TB8 RB8 TI RI
位地址 9F 9E 9D 9C 9B 9A 99 98
SM0、SM1:串行口工作方式控制位,其编码见表 7-1。 SM2:允许方式 2 和方式 3 的多机通信特性位。在方式 2 或 3 中,如 SM2 置为 1,
则接收到第 9 位数据(RB8)为 0 时不激活 RI。在方式 1 中,如 SM2=1,则只有收到有效的
停止位时才会激活 RI。在方式 0 中,SM2 应置 0。 REN:允许串行接收。由软件置位以允许接收,由软件清 0 来禁止接收。
第 7 章 串行口
·115·
表 7-1 串行口的工作方式及功能
方式 SM0 SMl 功能说明 0 0 0 移位寄存器方式(用于 I/O 扩展) L 0 1 8 位 UART,波特率可变 2 l 0 9 位 UART,波特率为 fosc/64 或 fosc/32 3 1 1 9 位 UART,波特率可变
RB8:方式 2 和方式 3 中接收到的第 9 位数据。在方式 1 中,如 SM2=0,RB8 是接
收到的停止位,在方式 0 中,不使用 RB8。 TB8:方式 2 和 3 中发送的第 9 位数据。需要时由软件置位或复位。 TI:发送中断标志。由硬件在方式 0 串行发送第 8 位结束时置位。在其他方式串行
发送停止位的开始时置位,必须由软件清 0。 RI:接收中断标志。由硬件在方式 0 串行接收到第 8 位结束时置位。在其他方式串
行接收到停止位的中间时置位(除了与 SM2 有关),必须由软件清 0。SCON 的所有位由复
位清 0。 (2)特殊功能寄存器 PCON 没有位寻址功能,字节地址为 87H。PCON 的第 7 位为
SMOD,SMOD 为波特率选择位,SMOD 可以是 1 或 0,在波特率计算中要用到这一位。 D7 D0
PCON SMOD
7.2.1 方式 0
串行口的工作方式 0 为移位寄存器输入输出方式,可外接移位寄存器,可扩展 I/O 口,
也要外接同步输入输出设备。 1.方式 0 输出 数据从 RXD 引脚串行输出,TXD 引脚输出同步脉冲。当一个数据写入串行口发送缓冲
器时,串行口将 8 位数据从低位到高位,以 fosc/12 的波特率从 RXD 引脚输出,发送完后置
中断标志 T1 为“1”。 8031 的串行口外接 74LSl64 串行输入并行输出移位寄存器的接口方式如图 7-5 所示。
图 7-5 8031 与移位寄存区的接口
2.方式 0 的输入 REN 为串行口接收器允许接收控制位,REN=0 时,禁止接收,REN=1 时,允许接收。
当串行口置为方式 0,并置 REN 为 1 时,串行口处于方式 0 输入,此时 RXD 为数据输入端,
MCS-51 系列单片机原理与接口技术
·116·
TXD 为同步信号输出端,接收器也以 fosc/12 的波特率采样 RXD 引脚输入的数据信息。当接
收器收到 8 位数据时,中断标志 RI 置“1”。 在方式 0 中不使用 SCON 中的 TB8、RB8 位。方式 0 发送或接收完 8 位数据后由硬件置
位 TI 和 RI 中断标志,CPU 响应 TI 或 RI 中断请求,转入中断后标志必须由用户程序清“0”。如 CPU 执行 CLRTI 或 CLR RI,或 ANLSCON,#0FEH,或 ANLSCON,#0FDH 等指令,清
除 TI 或 RI。在方式 0 中,SM2(多机通信控制位)必须为 0。 图 7-6 所示为输入 I/O 扩展,CD4014 是 8 位并行输入/串行输出移位寄存器,串行数据
由 P3.0(RXD)输入,移位时钟由 P3.1(TXD)输出。一根口线(如 P2.6)控制 CD4014 的
工作状态,当 P/S=1 时,并行数据输入 CD4014,当 P/S=0 时,CD4014 处于串行移位状态。
图 7-6 并行输入串行输出移位寄存器输入
7.2.2 方式 1
当 SM0、SMl=01 时,串行口工作于方式 1。此时,串行口为波特率可变的 8 位异步通信
接口。其波特率为 波特率=2SMOD/32×定时器 1(T1)的溢出率 1.方式 1 输出 串行口以方式 1 输出时,数据位由 TXD 端输出,发送一帧信息为 10 位,如图 7-7 所示,
其中起始位“0”,8 位数据位(先低位后高位)和停止位“1”。CPU 执行一条数据写入缓冲
器 SBUF 的指令,就启动发送器发送,当发送完数据位后,中断标志 TI 置“1”。
图 7-7 方式 1 数据传送格式
2.方式 1 输入 串行口以方式 1 输入时(SM0、SMl=01,REN=1),以所选波特率的 16 倍的速率采样
RXD 状态,当采样到 RXD 引脚从“1”到“0”的跳变时就启动接收器,接收的值是 3 次
采样中至少相同两次的值,以保证可靠无误。当检测到起始位有效时,开始接收一帧的其
余信息。 帧信息也是 10 位,1 位起始位,8 位数据位(先低位后高位)和 1 位停止位。当 RI=0
且停止位为 1 或 SM2=0 时,停止位进人 RB8,且中断标志则置“1”,若这两个条件不满足,
第 7 章 串行口
·117·
信息将丢失。因此中断标志必须由用户的中断服务程序清 0。通常情况下,串行口以方式 1工作时,SM2 置“0”。
7.2.3 方式 2
当 SM0、SMl=10 时,串行口工作于方式 2,此时串行口被定义为 9 位异步通信接口。方
式 2 的波特率由下式确定: 波特率=2SMOD/64×(振荡器频率) 1.方式 2 输出(发送) 发送数据由 TXD 端输出,发送一帧信息为 11 位,如图 7-8 所示,一位起始位“0”,8
位数据位(先低位后高位),一位可编程为 1 或 0 的第 9 位数据,一位停止位。第 9 位数据是
SCON 中 TB8 的值,由软件置位或清“0”,可作为多机通信中地址、数据标志位,也可作为
数据的奇偶校验位。
图 7-8 方式 2 数据传送格式
【例】下面的发送中断服务程序以 TB8 作为奇偶校验位,在数据写入 SBUF 之前,先将
奇偶位写入 TB8,R0 作为发送数据区指针,设工作区为 2 区。 START:PUSH PSW ;保护现场
PUSH A SETB PSW.4 ;工作区为 2 区 CLR PSW.3 CLR TI ;清“0”发送中断标志 MOV A,@R0 ;取数据 MOV C,P ;奇偶位→TB8 MOV TB8,C MOV SBUF,A ;数据写入发送缓冲器,启动发送器 INC R0 ;数据指针加 1 POP A ;恢复现场 POP PSW RETI
2.方式 2 输入(接收) 当 SM0、SMl=10,REN=1 时,串行口以方式 2 接收数据,数据由 RXD 输入,接收 11
位信息,一位起始位“0”,8 位数据位,一位附加的第 9 位数据,一位停止位“1”。当接收
器采样到 RXD 端从“1”到“0”的跳变,并判断起始位有效后,便开始接收一帧信息。在
接收到第 9 位数据后,如果满足下列两个条件,则接收到的数据送入 SBUF,第 9 位数据送
入 RB8,并置 RI 位为“1”,若这两个条件不满足,则将接收的信息无效,数据丢失,这两
个条件是
MCS-51 系列单片机原理与接口技术
·118·
(1)RI=0; (2)SM2=0 或第 9 位数据为 1。 【例】若附加的第 9 位数据为奇偶校验位,在接收程序中应作校验处理,可采用如下程
序,设工作区为 1 区,R0 为数据缓冲器指针。 START: PUSH PSW
PUSH A SETB PSW.3 CLR PSW.4 CLR RI MOV A,SBUF MOV C,P JNC T1 JNB RB8,ERP AJMP T2
T1: JB RB8,OHTER T2: MOV @R0,A
INC R0 POP A POP PSW RETI
OHTER: … … … … … … RETI
7.2.4 方式 3
当 SM0、SMl=11 时,串行口工作在方式 3,方式 3 为波特率可变的 9 位异步通信方式, 除波特率外,方式 3 和方式 2 相同。方式 3 的波特率由下式确定:
波特率=2SMOD/32×(定时器 1 的溢出率)
7.3 波特率的设计
对 MCS-51 串行口来说,波特率与 bit/s 的意义是一样的,即串行口每秒钟传送的位数。
当串行口被定义为方式 2 时,其波特率=晶振频率×2SMOD/64。方式 1 和方式 3 的波特率与
Ti 的溢出率有关,而 Ti 的溢出率又与工作方式、计数初值、晶振频率有关。下面介绍串行口
波特率的设计方法。
第 7 章 串行口
·119·
7.3.1 定时器的溢出率计算
1.方式 0 定时器 T1 工作于方式 0 时,其溢出率由下式确定
溢出率 m=fosc/12×(213-Z+NR)-1 式中,fosc为晶振频率,Z 为 T1 置 13 位定时器的初值,NR 为 T1 溢出到执行中断服务
程序恢复初值所需要的机器周期。 2.方式 1 方式 1 为 16 位计数器,TL1、TH1 的初值均为 8 位二进制数。设 TLl 的初值为 X,THl
的初值为 Y,则 T1 的初值为 Z= Y7Y6Y5Y4Y3Y2YlY0X7X6X5X4X3X2X1X0 溢出率 m=fosc/12×(216-Z+NR)-1
3.方式 2 方式 2 为自动恢复初值的 8 位计数器,设 THl 初始值为 X,则初值
Z= X7X6X5X4X3X2X1X0 溢出率 m=fosc/(12×(256-Z))
式中,Z 为 TH1 中的初值。 这是一种自动装入方式,它不需要中断处理,所以 NR 可以认为是零。 【例】下面以 T1 的初始化程序和 T1 溢出中断服务程序为例,说明串口在不同工作方式
下其波特率与溢出率的关系。 MAIN: SETB PT1 ;定义 T1 为最高中断优先级
SETB EA ;CPU 中断开放 SETB ETl ;允许 T1 中断 MOV TMOD,#00H ;设置 T1 工作方式 0 MOV TLl,#XH MOV THl,#YH SETB TRl … …
TINT: MOV TL1,#XH ;T1 溢出中断服务程序 MOV TH1,#YH ;重装系数 RETI 在以上程序中,TLl 和 THl 的初值 X、Y 均为 16 进制数,由于方式 0 为 13 位计数器,
计数器初值以二进制数表示为: Z=Y7Y6Y5Y4Y3Y2YlY0X4X3X2XlX0
例如: Y=AAH,X=08H 则 Z=1548H
执行 T1 溢出到恢复初值的中断服务程序的周期数 NR≈N1+N2=5+4。
MCS-51 系列单片机原理与接口技术
·120·
其中,N1 为 CPU 从响应中断到转入中断服务程序所需要的周期数,一般情况下 N1 执
行 MOV TLl,#XH 和 MOV THl,#YH 的周期数。这里取 N2=4。 设 fosc=6MHz,则溢出率
M=2SMOD/12×(213-1548H+5+4)-1=181.6。 如果串行口工作在方式 1,则 波特率=2SMOD/32×(定时器 T1 的溢出率)=11.4(位/秒)(设 SMOD=1)
7.3.2 串行口工作方式 1 和 3 的波特率设计
串行口设计时,先设定串行口波特率和 T1 的工作方式,然后计算出 T1 的初始值。 【例】设波特率为 9600,晶振频率 fosc=11.0592MHz,T1 选为方式 2,SMOD=0,
因为波特率=2SMOD/32×m (m 为 T1 的溢出率) 所以 m=307200 又因为溢出率 m=fosc/(12×(256-Z)), 所以 Z=253=FDH
通常情况下,T1 选用工作方式 2,所得的波特率比较精确,初始值计算也较方便。对
于非常低的波特率,定时器 T1 可选用方式 0 或方式 1。MCS-51 串行口常用波特率如表 7-2所示。
表 7-2 常用波特率
定 时 器 1 波特率 f(MHz) SMOD
方式 重新装入值 方式 0 最大,1M 12 × × × × 方式 2 最大:375k 12 1 × × ×
62.5k 12 1 0 2 FFH 19.2k 11.0592 1 0 2 FDH 9.6k 11.0592 0 0 2 FDH 4.8k 11.0592 0 0 2 FAH 2.4k 11.0592 0 0 2 F4H 1.2k 11.0592 0 0 2 E8H 137.6 11.986 0 0 2 1DH 110 6 0 0 2 27H
方式 1、3
110 12 0 0 1 FEEBH
7.4 串行口的多机通信
如前所述,串行口控制寄存器 SCON 中的 SM2 为多机通信控制位。串行口以方式 2 或
方式 3 接收时,若 SM2 为 1,则仅当串行口接收到的第 9 位数据 RB8 为 1 时,才把数据装
入接收缓冲器 SBUF,并将中断标志 RI 置“1”;如果接收到第 9 位数据 RB8 为 0,则不产生
中断标志,信息将丢失;当 SM2 为 0 时,则收到一个数据字后,不管第 9 位数据是 1 还是 0,
第 7 章 串行口
·121·
都产生中断标志 RI,将接收到的数据装入 SBUF。应用这个特性,便可实现多机通信。 设在一个多机通信系统中,有 1 个 8031 系统作为主机,有 3 个 8031 系统作为从机,如
图 7-9 所示。
图 7-9 多机系统示意图
设从机的地址分别定义为 00H、01H、02H。从机系统由初始化程序(或相关处理程序)
将串行口编程为方式 2 或方式 3 接收,即 9 位异步通信方式,且将 SM2 和 REN 置“1”,允
许串行口中断。在主机和某一个从机系统通信之前,先将从机的地址发送给各个从机系统,
接着才传送数据或命令。主机发出的地址信息的第 9 位为 1,数据(包括命令)信息的第 9位为 0。当主机向各从机发送地址时,各从机的 8031 串行口接收到第 9 位信息 RB8 为“1”时,将 RI 中断标志置“1”,各从机 CPU 响应中断,执行中断服务和程序,判断主机送来的
地址是否和本系统地址相符,若为本机地址,则 SM2 置“0”,准备接收主机的数据或命令;
若地址不一致,则保持 SM2 为“1”。接着主机发送数据,此时,各从机串行口接收到的 RB8为“0”,只有前面地址相符的从机系统(SM2 已清“0”)才能激活中断标志 RI,并接收主机
的数据(或执行主机命令),实现和主机传送信息。其余的从机系统因 SM2 保持为 1,RB8为 0,不激活中断标志,所接收的数据丢失不作处理,从而实现主机和从机一对一的通信。
实际应用的多机通信有不少采用两级控制方式,构成两级数据采集系统,如图 7-10 所示。
图 7-10 两级通信控制方案
在这些方案中,可采用 IBM—P3/P4 等兼容机作为主机(上位机),设置“菜单”式中文
提示,提供人机对话功能,查询、监测下位机的工作状态,接收下位机的数据或向下位机发
布命令。下位机采用 8031 系列,直接安装在现场,可完成控制或数据采集任务。
MCS-51 系列单片机原理与接口技术
·122·
7.5 串行口编程和应用
7.5.1 串行口发送和接收数据
【例 1】发送程序。将片内 RAM40H~4FH 中的数据串行发送,串行口设定为工作方式 2,TB8 作奇偶校验位。在数据写入发送缓冲器之前,先将数据的奇偶位 P 写入 TB8,第 9 位数
据作奇偶校验用。 程序清单如下: ORG 0000H AJMP MAIN ORG 0100H MAIN:MOV SCON, #80H ;方式设定
MOV PCON, #80H ;取波特率为 fosc/32 MOV R0, #40H ;首地址 40H→R0 MOV R7, #10H ;数据长度 10H→R7
LOOP:MOV A,@R0 ;取数据→A MOV C, PSW.0 ;P→TB8 MOV TB8, C MOV SBUF, A ;数据→SBUF,启动发送
WAIT:JBC TI,NEXT ;判断发送中断标志 SJMP WAIT
NEXT:INC R0 DJNZ R7,LOOP RET
【例 2】接收程序,将接收的 16 个字节数据送入片内 RAM40H~4FH 单元中。设串行口
以方式 3 状态工作,波特率为 2400。定时器/计数器 1 用作波特率发生器,工作于方式 2,SMOD=0,计数常数为 F4H,见表 7-2。
程序清单如下: RVE:MOV TMOD,#20H ;T1 编程为方式 2 定时状态 MOV THl,#F4H ;计数常数→T1 MOV TLl,#F4H SETB TRl ;启动 T1 MOV R0,#40H ;R0 置地址初值 MOV R7,#10H ;数据长度 10H→R7 MOV PCON,#00H ;置 SMOD=0 MOV SCON,#B0H ;串行口编程方式 3 接收 WAIT: JBC RI,PR ;等待接收到数据
第 7 章 串行口
·123·
SJMP WAIT PR:MOV A,SBUF ;奇偶校验位判断:RB8=1? JNB PSW.0,PNP JNB RB8,ERR SJMP RIGHT PNP:JB RB8,PER RIGHT:MOV @R0,A ;数据→缓冲器 INC R0 DJNZ R7, WAIT ;判数据块接收完否? CLR PSW.5 ;正确接收完 16 个字节置标志 F0=0
RET ERR:SETB PSW.5 ;置奇校验出错标志 F0=1
RET
7.5.2 双机通信
设有两个 8031 应用系统相距很近,将它们的串行口直接相连,以实现全双工的双机通
信,如图 7-11 所示。甲机发送乙机接收,双方约定串行口工作于方式 1,波特率为 2400,定
时器 1 工作于工作方式 2。
图 7-11 8031 双机通信系统
波特率设计:甲乙两机均选用 6MHz 的振荡频率,定时器 1 工作于方式 2,其溢出率 m=fosc/(12×(256-Z))
而串行口方式 1 的波特率=2SMOD/32×(T1 的溢出率) 因此,当 SMOD=0 时,Z=249.49,圆整误差过大,改取 SMOD=1,Z=242.98≈243=F3H。 (1)甲机发送程序 甲机将外部数据存储器 4000H~42FFH 单元的内容向乙机发送,在发送数据之前先将数
据块长度发送给乙机,每发送完 256B,向乙机发送一个累加校验和。其程序框图如图 7-12所示。
发送程序约定: ①波特率设置初始化:T1 方式 2 工作,计数常数为 F3H,SMOD=1。 ②串行口初始化:方式 1 工作,允许接收(因为要不断接收乙机状态)。 ③工作寄存器设置:
MCS-51 系列单片机原理与接口技术
·124·
R7、R6—数据块长度寄存器,R7 为高 8 位,R6 为低 8 位。 R7—累加和寄存器。
图 7-12 双机通信发送程序框图
发送程序清单: TRT:MOV TMOD,#20H ;波特率设置
MOV THl, #F3H ;T1 初始值设置 MOV TLl, #F3H SETB TRl ;启动 T1 MOV SCON,#50H ;串行口初始化 MOV PCON,#80H ;SMOD 位设置
RPT:MOV DPRT,#4000H MOV R6,#00H ;长度寄存器初始化 MOV R7,#03H ;发送长度高 8 位 MOV R5,#00H ;校验和寄存器初始化
MOV SBUF,R6 ;发送长度低 8 位 MOV A,R5 ;形成累加和送 R5 ADD A,R6 MDV R5,A
TR0:JBC TI,TRl
第 7 章 串行口
·125·
AJMP TR0 TRl:MOV SBUF,R7 ;发送长度高 8 位 MOV A,R5 ;形成累加和送 R5 ADD A,R7 MOV R5,A
TR2:JBC TI,TR3 AJMP TR2
TR3:MOV SBUF,R5 ;发送校验码 MOV R5,#00H
TR4:JBC TI,TR5 AJMP TR4
TR5:JBC RI,TR6 ;等乙机回答 AJMP TR5
TR6:MOV A,SBUF ;传送正确否? JZ TR7 AJMP RPT
TR7:MOVX A,@DPTR ;读取数据 MOV SBUF,A ADD A,R5 MOV R5,A INC DPTR ;指针加 1
TR8:JBC TI,TR9 ;等待发完一个字节 AJMP TR8
TR9:DJNZ R6,TR7 ;是否发送完 256 字节 DJNZ R7,TRl4 ;是否发送结束 MOV SBUF,R5 MOV R5,#00H
TR10;JBC TI,TR11 ;发校验码 AJMP TRl0
TR11:JBC RI,TRl2 ;等乙机回答 AJMP TRll
TR12:MOV A,SBUF JZ TRl3 AJMP RPT
TR13:RET TR14:MOV SBUF,R5 ;发送校验码
MOV R5,#00H TR15:JBC TI,TR7
AJMP TRl5 (2)乙机接收程序
MCS-51 系列单片机原理与接口技术
·126·
乙机接收甲机发送的数据,并写入以 4000H 为首地址的外部数据存储器中。首先接收数
据长度和累加和校验码,之后接收数据。每接收 256 个字节,进行一次累加和校验,数据传
送结束时向甲机发送一个状态字节,表示传送正常或出错。其程序框图如图 7-13 所示。
图 7-13 双机通信接收程序框图
接收程序约定: ①波特率设置初始化:与发送程序同。 ②串行口初始化:与发送程序同。 ③工作寄存器设置。 R5—累加和寄存器, R4—页内计数器, R7、R6—数据块长度寄存器,R7 为高 8 位,R6 为低 8 位。 ④传送状态字:00H 为传送正常,FFH 为传送出错。 接收程序清单: RSV:MOV TMOD,#20H ;T1 初始化
MOV THl,#F3H ;T1 初始值设置 MOV TLl,#F3H SETB TRl ;启动 T1 MOV SCON,#50H MOV PCON,#80H
第 7 章 串行口
·127·
RPT:MOV R5,#00H ;累加和寄存器清零 MOV R4,#00H ;页内计数器清零 MOV DPTR,#4000H ;初值→指针
TR0:JBC RI,TRl ;接收长度低 8 位 AJMP TR0
TR1:MOV A,SBUF MOV R6,A ADD A,R5 ;形成累加和 MIOV R5,A
TR2:JBC RI,TR3 AJMP TR2
TR3:MOV A,SBUF ;接收长度高 8 位 MOV R7,A ADD A,R5 ;形成累加和, MDV R5,A
TR4:JBC RI,TR5 ;接收校验码 AJMP TR4
TR5:MOV A,SBUF XRL A,R5 JZ RIGHT MOV SBUF,#FFH ;出错
WT:JBC TI,RPT AJMP WT
RIGHT:MOV R5,#00H MOV SBUF,#00H ;正确回送
TR6:JBC Tl,WTD AJMP TR6
WTD:JBC RI,TR7 ;接收数据 AJMP WTD
TR7:MOV A,SBUF MOVX @DPTR,A INC DPTR ADD A,R5 MOV R5,A DJNZ R4,TR10 ;未传完一页转 TR10
TR8:JBC RI,TR9 ;接收校验码 AJMP TR8
TR9:MOV A,SBUF XRL A,R5 MOV R5,#00H
MCS-51 系列单片机原理与接口技术
·128·
JZ TR10 SETB PSW.5 ;置“1”出错标志
TR10:DJNZ R6,WTD DJNZ R7,WTD MOV A,R4 JZ TRl9
TR11:JBC RI,TRl2 AJMP TRll
TR12:MOV A,SBUF XRL A,R5 JNZ TR13 AJMP TR20
TR13:MOV SBUF, #FFH ;出错处理 TR14:JBC TI,TRl5 ;发送完返回
AJMP TRl4 TR15:RET TR16:JBC TI,TR17
AJMP TRl6 TR17:AJMP RPT TR19:JB PSW.5,TRl3 TR20:MOV SBUF,#00H ;正确回送 00H
7.6 习题
1.数据通信的传输方式有哪几种?各有什么特点? 2.什么是串行异步通信?它有哪些特点?80C51 串行口设有几个控制寄存器?它们的
作用是什么? 3.若 80C51 异步通信接口按方式 3 传输,每分钟可传输 1200 个字符,试计算其波特率。 4.已知 80C51 单片机定时器 T1 工作于方式 2,用于做波特率发生器,设系统的时钟频
率为 6MHz,则该波特率发生器能够产生的波特率最高和最低为多少? 5.设计一个发送程序,将片内 RAM 地址为 20H~2FH 中的数据串行发送(要求采用中
断方式),设串行口工作于方式 2。 6.请简单叙述多机通信原理,在多机通信中 TB8/RB8、SM2 各起什么作用?
第第 88 章章 MMCCSS--5511 单单片片机机的的存存储储器器扩扩展展
MCS-51 单片机的特点是硬件设计简单、系统结构紧凑,一片 8051,或一片 8751,或一
片 8031 外接一片 EPROM 所构成的最小系统就可以实现某些简单应用。如果应用复杂,可对
MCS-51 进行扩展,构成功能强、规模较大的系统。 MCS-51 系列单片机的程序存储器空间和数据存储器空间是互相独立的,在内部 ROM 和
RAM 的基础上,程序存储器和数据存储器最多可达 64KB(包括 I/O 口),编址分别为 0000H~
FFFFH。本章以 8031 为例,讨论其外部存储器的设计方法。
8.1 外部程序存储器设计
8.1.1 扩展程序存储器的接口设计
8031 单片机与外部程序存储器的一般连接方法如图 8-1 所示。从图中看出,单片机与外
部程序存储器之间的连线包括地址总线、数据总线和控制总线。
图 8-1 8031 与外部存储器的连接方法
8031 的 P0 口和 P2 口的 16 根 I/O 线输出地址码、其中 P2 口与 EPROM 高 8 位地址线及
片选CE连接,作为高 8 位地址线;P0 口作为时分复用地址/数据线,分别与外接地址锁存器
I0~I7 端口及 EPROM 的数据线 O0~O7 连接,锁存器的输出线作为低 8 位地址线。 8031 的EA 口接地,PSEN 与 EPROM 的输出允许OE连接,ALE 与外部地址锁存器 CLK
端口连接。 这里以 8031 单片机与 EPROM 连接方法为例来说明扩展外部程序存储器的—般方法。
MCS-51 系列单片机原理与接口技术
·130·
1.CPU 访问 EPROM 的过程 MCS-51 单片机与其他微型计算机一样,在访问外部程序存储器时,首先通过地址总线
给出地址信号,选中一个存储单元作为访问对象,然后由控制总线发出读选通信号,在读选
通信号的作用下,外部程序存储器把指定单元的内容送至数据总线,单片机通过对数据总线
的采样(读数据总线)获得该单元的内容,完成一次外部程序存储器的访问过程。 如图 8-1 所示,在外部存储器取指期间,P0 和 P2 口的 16 根 I/O 线输出地址码,P0 作为
分时复用地址/数据总线,送出程序计数器 PC 的低 8 位地址(PCL),由 ALE 信号选通进入
地址锁存器,然后变成浮置状态,等待从程序存储器读出指令码。P2 口输出的程序计数器中
高 8 位地址(PCH)保持不变。被锁存后的低 8 位地址信号与 P2 口输出的高 8 位地址信号构
成可寻址 64KB 的 16 位地址信号。 2.CPU 访问外部程序存储器的时序分析 单片机访问外部存储器的时序图如图 8-2 所示。通过对该图的分析,可以清楚地了解单
片机访问程序存储器的整个过程。
图 8-2 访问外部程序存储器的时序
图 8-2 所示为 MCS-51 单片机在访问外部程序存储器时,P2 口、P0 口以及 ALE、PSEN上的信号相对于内部状态和相位的定时关系。
从图中看出,从 S2P1 开始,单片机通过 P2 口及 P0 口送出地址信号 A0~A15。P2 口送
出的是地址信号的高 8 位 A8~A15,在 S4P2 结束前有效;P0 口送出的地址信号是低 8 位
A0~A7,因为 P0 口还要用来输入指令字节,故地址信号 A0~A7 仅在状态 S2 内保持有效。
为了保证外部程序存储器在被访问的过程中,其输入的地址信号稳定不变,P0 口送出的低 8位地址信号必须外加锁存器后才能送至外部程序存储器。在地址锁存允许信号 ALE 下跳时,
由 P0 口送出的低 8 位地址信号在 P0 口上已经稳定,所以,可以用 ALE 的下跳沿将 A0~A7装入外部地址锁存器内。
S3P1 开始时刻,外部程序存储器选通信号PSEN 开始有效,选通外部程序存储器,使外
部程序存储器把给定的单元的内容送至 P0 口。
PSEN 上跳前,单片机对 P0 口采样,读取外部程序存储器送至 P0 口的内容,完成一次
第 8 章 MCS-51 单片机的存储器扩展
·131·
外部存储器访问过程。 在一个外部存储器访问的机器周期中,ALE 信号和PSEN 信号均被激活两次(ALE 上出
现两个正脉冲,PSEN 上出现两个负脉冲),说明在一个机器周期中,单片机可以访问两次外
部程序存储器。MCS-51 的大部分指令为单字节和双字节指令,其执行时间只需要一个机器
周期。如果是单字节指令,第二次读出的字节被丢弃,程序计数器不增量。 3.外接 EPROM 的读取时间与主机的时钟匹配问题 8031 单片机的时钟一定,8031 访问外部程序存储器时地址信号的输出时间,以及采样
P0 口输入指令字节的时间也就确定了。它总是在PSEN 上跳前采样 P0 口,而不管外部程序
存储器是否已经把指定单元的指令字节送至 P0 口。所以,被选用的 EPROM 必须有足够高的
工作速度才能与 8031 接口匹配。 8031在访问外部程序存储器时,从地址输出到输入指令字节(读P0口)的有效时间TAVIV
=5TCLCL-115ns,从 PSEN 有效到输入指令字节有效时间为 TPLIV=3TCLCL-125ns。在主
机晶振频率选为 12MHz 时,时钟周期 TCLCL=83.3ns,地址输出到输入指令字节有效时间
TAVIV=302ns,TPLIV=125ns。这就要求选择主机外部程序存储器的 EPROM,其读取时间
TACC 应小于 302ns,OE有效到指令字节输出稳定时间 TOE 应小于 125ns。当然,降低主机
的晶振频率,即可降低对选用的 EPROM 的工作速度的要求,这可根据应用系统的要求综合
考虑。 MCS-51 扩展外部程序存储器时可使用 EPROM 芯片,EPROM 是一种可用紫外线擦除,
也可用电编程的只读存储器,其中典型产品有 2716(2KB)、2732(4KB)、2764(8KB)、27128A(16KB)、27256A(32KB)和 27512A(64KB)等。这些芯片均可通过编程器将系统的控制
程序固化到其中,也可在紫外线照射下擦除(约 20 分钟),使存储器的各位信息均变为 1,再次编程固化程序。本节通过典型的设计实例,说明在设计外部程序存储器的接口电路时,
应掌握的知识。 (1)应弄清所选用的 EPROM 芯片的特性、工作方式、参数及时序等。 (2)与 8031 接口电路的连接方法。 (3)EPROM 与单片机时钟的匹配问题。
8.1.2 2732 与 8031 的接口电路设计
1.2732 的特性、参数及时序 2732 是一种 4KB 的 EPROM,单一+5V 供电,最大静态工作电流为 150mA,维持电流
30mA,读出时间最大为 450ns(2732A 为 250ns)。2732 为 24 脚双列直插式封装,其引脚功
能如表 8-1 所示,管脚配置如图 8-3 所示。
表 8-1 2732 引脚功能
A0~A12 地址线
CE 片选
PP/OE V 输出允许/编程电源 I/O0~I/O7 数据线
2732 的 5 种工作方式如表 8-2 所示。要注意的是,对不同公司生产的 EPROM 编程电压
MCS-51 系列单片机原理与接口技术
·132·
VPP有不同的要求,有 25V、21V 和 12.5V 等几种。 2732 的读周期波形如图 8-4 所示。2732 的读周期十分简单,自地址有效开始,经过时间
TACC 后,数据即可由存储单元读至内部数据存储器,但能否出现在 00~07 上,还要取决于
CE和OE信号。要保证自地址有效后,经时间 TACC 数据能出现在 00~07 上,则CE必须在
数据有效前 TCE 时间有效,OE信号必须在数据有效前 TOE 时间有效。CE
图 8-3 2732 引脚配置 图 8-4 2732 读周期波形
表 8-2 2732 工作方式选择 引脚
方式 CE
(18) PP/OE V
(20) VCC
(24) 输出
(9-11,13-17) 读 VIL VIL VCC DOUT
维持 VIH 任意 VCC 高阻 编程 VIL VPP VCC DIN
编程检验 VIL VIL VCC DOUT
编程禁止 VIH VPP VCC 高阻 2732EPROM 读周期有关参数如表 8-3 所示。在该表中,TACC 和 TOE 两个参数对选择
哪种型号的 EPROM 才能与单片机时钟匹配,起决定性的作用。
表 8-3 2732 读周期有关参数 2732A-2 2732A-20
2732A 2732A-25
2732A-3 2732A-30 2732A-4
符号 参数 Min Max Min Max Min Max min Max
单
位 测试条件
TACC 地址到输出延迟 200 250 300 450 ns ILOECE V==
TCE CE到输出延迟 200 250 300 450 ns ILOE V=
TOE OE到输出延迟 70 100 150 150 ns ILCE V=
TDF OE到输出浮空 0 60 0 60 0 130 0 130 ns ILCE V=
TOH 地址断开输出保
持 0 0 0 0 ns ILOECE V==
在考虑选用 EPROM 芯片作为单片机外部程序存储器时,除了容量外,还必须考虑它与
单片机的时钟匹配问题。根据 EPROM 的参数及时序分析,在单片机晶振频率为 12MHz 时,
第 8 章 MCS-51 单片机的存储器扩展
·133·
只有 2732A 及 2732A-2 才能作为它的外部程序存储器。当使用 2732 的其他型号(如 2732A-3或 2732A-4)芯片作为外部程序存储器时,必须降低单片机的晶振频率,才能使两者相匹配。
2.2732 与 8031 的接口电路 图 8-5 所示是扩展 4KB EPROM(2732)与 8031 的接口电路,构成 8031 单片机的最小
系统。图中 74LS373 是带三态输出的 8 位锁存器,在扩展电路中作为地址锁存器。三态控制
端OE接地,以保持输出常通,其三态输出还有一定的驱动能力。G 端与 8031 单片机的 ALE连接,当 G=1 时(ALE 高电平持续期间),74LS373 的输出 Q0~Q7 随其输入 D0~D7 的状
态变化,即 P0 口送出的低 8 位地址信号一旦输出,就传输到 2732 的地址输入线 A0~A7 上。
G 端的状态由“1”变“0”时(ALE 下跳变),低 8 位地址被锁存。
图 8-5 2732 与 8031 的接口电路(8031 单片机的最小系统)
2732 有 4KB 的存储器容量,因此有 12 根地址线 A0~A11,可寻址片内 4KB 存储器中
任何单元。这 12 根地址线中的高 4 位 A8~A11 与 8031 的 P2.0~P2.3 连接,低 8 位 A0~A7与地址锁存器 74LS373 的输出端 Q0~Q7 连接,数据线 D0~D7 直接与 8031 的 P0 口连接。
当 8031 系统发出低 12 位地址信息时,分别选中 2732 片内 4KB 存储器中各单元。 2732 的CE 引脚为片选信号输入端,低电平有效该片选信号决定了 2732 这块芯片的 4KB
存储器在整个 8031 系统扩展程序存储器 64KB 空间中的位置。本电路中将CE 接地,表示系
统只选中该 2732芯片。根据图 8-5所示的接法,2732占有扩展程序存储器地址空间为 0000H~
0FFFH。 8031 的PSEN与 2732 的OE端连接,当PSEN选通信号为低电平选通 2732 时,2732D0~
D7 端口上的指令或常数可由 8031 从 P0 口读入。当PSEN为高电平时,则禁止 2732 的数据
读入 P0 口。 8031 的EA 端必须接地,这样使得 8031 一上电就到外部程序存储器读取指令。对于 8051
MCS-51 系列单片机原理与接口技术
·134·
或 8751,EA 一般接高电平,使单片机开机后首先从内部 ROM 或内部 EPROM 读取指令,
然后再到外部程序存储器读取指令。P2 口作为扩展程序存储器的高 8 位地址,在这里使用了
4 根,空余的 4 根不宜作通用 I/O 口线,否则会给软件编写和使用带来相当多的麻烦,在 8031系统设计中要注意这一点。
8.1.3 外扩 8KBEPROM 的 8031 系统
1.2764EPROM 的特性 2764 是一种 8KB 的紫外线擦除、可电编程的只读存储器,单一+5V 供电,工作电流为
100mA,维持电流为 50mA,读出时间最大为 250ns。2764 为 28 脚双列直插式封装,其引脚
配置如图 8-6 所示,引脚功能如表 8-4 所示。2764 的工作方式如表 8-5 所示。
图 8-6 2764 引脚配置
表 8-4 2764 引脚功能
A0~A12 地址线 I/O0~I/O7 数据输出线
CE 片选 OE 数据输出选通线 VPP 编程电源 PGM 编程脉冲输入线
表 8-5 2764 工作方式选择 引脚
方式
CE (18)
OE (20)
PGM (24)
VPP (1)
VCC (28)
输出 (11-13,15-19)
读 VIL VIL VIH VCC VCC DOUT
维持 VIH 任意 任意 VCC VCC 高阻
编程 VIL VPP VIL VPP VCC DIN
编程检验 VIL VIL VIH VPP VCC DOUT
编程禁止 VIH 任意 任意 VPP VCC 高阻 2764 的编程电源 Vpp 随公司产品和型号的不同而不同,典型的有 25V、21V、12.5V。 设置CE 、OE、 PGM 和 VPP 以确定 2764EPROM 的工作方式:读、维持、编程、编程
检验和编程禁止等。 2764 的读周期有关参数如表 8-6 所示。
第 8 章 MCS-51 单片机的存储器扩展
·135·
表 8-6 2732 读周期有关参数 2732A-2
2732A-20 2732A
2732A-25 2732A-3
2732A-30 2732A-4 符号 参数
Min Max Min Max Min Max min Max
单
位 测试条件
TACC 地址到输出延迟 200 250 300 450 ns ILOECE V==
TCE CE 到输出延迟 200 250 300 450 ns ILOE V=
TOE OE到输出延迟 75 100 120 150 ns ILCE V=
TDF OE到输出浮空 0 60 0 60 0 105 0 130 ns ILCE V=
TOH 地址断开输出保
持 0 0 0 0 ns ILOECE V==
2.2764 与 8031 的接口电路 2764 与 8031 的接口电路如图 8-7 所示,也是—个 8031 单片机的最小系统。与图 8-5 所示相
比,2764 的存储容量为 8KB,因此高 8 位地址线比 2732 多使用 1 根,即 2764 的A8~A12 与 8031的 P2.0~P2.4 连接,形成高 5 位地址线,而 P2.5~P2.7 未用,在一般情况下,它们也不能移作它
用。图中地址锁存器采用芯片 8282,8282 的特性与 74LS373 类似。其余连线与图 8-5 所示类似。
图 8-7 扩展 2764AEPROM
3.多片 2764 与 8031 的接口电路 为了进一步增加外部程序存储器的容量,可采用多片 EPROM。采用多片扩展 EPROM
时,将涉及到地址空间的分配问题。扩展多片 EPROM 可采用线选法寻址,也可采用译码法
寻址。这里以译码法寻址为例来说明多片 EPROM 的扩展方法。 图 8-8 所示是采用 74LSl38 译码器扩展的程序存储器扩展电路。74LSl38 是 3-8 线译码器,
MCS-51 系列单片机原理与接口技术
·136·
其逻辑功能真值表如表 8-7 所示。74LSl38 有 3 个选择输入端,可组合出 8 种输入状态,对应 8种输出,也就是说,对每种输入状态,Y0~Y7 中仅有一个输出为低电平,其余都为 1。它还有
3 个使能端 E3、E2和E1,仅当E3E2E1=100 时,译码器才工作,否则译码器输出无效。
图 8-8 译码法 EPROM 扩展电路
表 8-7 74LS138 逻辑功能真值表
输入 输出 使能 选择
E3 E2 E1 C B A Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7
1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 1 1 0 1 1 1 1 1 1 1 0 0 0 1 0 1 1 0 1 1 1 1 1 1 0 0 0 1 1 1 1 1 0 1 1 1 1 1 0 0 1 0 0 1 1 1 1 0 1 1 1 1 0 0 1 0 1 1 1 1 1 1 0 1 1 1 0 0 1 1 0 1 1 1 1 1 1 0 1 1 0 0 1 1 1 1 1 1 1 1 1 1 0
从图 8-8 所示中可以看出,3 片 2764 的片选信号CE 分别与译码器的译码输出端Y0、Y1
和Y2 连接,而 138 的 3 个编码输入端 A、B、C 分别与 P2.5、P2.6、P2.7 相连。这样,由
P2.5、P2.6 和 P2.7 的不同状态,就可分别选中 ICl、IC2 和 IC3。 译码器提供 64KB 地址空间,且扩展的存储器芯片的地址是连续的。图 8-8 所示中 3 片
2764的地址空间分别是:ICl为0000H~1FFFH;IC2为2000H~3FFFH;IC3为4000H~5FFFH;
其余的地址待用。
8.1.4 扩展 16KB 的接口电路
扩展较大容量的外部程序存储器时除用上述的多片 EPROM 外,还可使用大容量的
EPROM 芯片,如 27128、27256 等。外扩 16KB 程序存储器可使用 27128 芯片。
第 8 章 MCS-51 单片机的存储器扩展
·137·
1.27128 的特性 27128 的容量为 16KB,单一+5V 供电,工作电流为 100mA,维持电流为 40mA,可与
12MHz 时钟的单片机系统相匹配。27128 为 28 脚双列直插式封装,其引脚配置如图 8-9 所示,
引脚功能如表 8-8 所示。
表 8-8 2764 引脚功能
A0~A13 地址线 I/O0~I/O7 数据输出线
CE 片选 OE 数据输出选通线 VPP 编程电源 PGM 编程脉冲输入线
27128 的 5 种工作方式如表 8-9 所示。
表 8-9 2764 工作方式选择 引脚
方式
CE (20)
OE (22)
PGM (27)
VPP (1)
VCC (28)
输出 (11-13,15-19)
读 VIL VIL VIH VCC VCC DOUT
维持 VIH 任意 任意 VCC VCC 高阻 编程 VIL VPP VIL VPP VCC DIN
编程检验 VIL VIL VIH VPP VCC DOUT
编程禁止 VIH 任意 任意 VPP VCC 高阻 2.27128 与 8031 的接口电路 27128 与 8031 的硬件连线如图 8-9 所示。图中 8282 是带三态输出的 8 位锁存器(功能
与 74LS373 相同),三态控制端面接地,以保持输出处于常通状态。STB 端与 8031 的 ALE连接,每当 ALE 下跳时,8282 锁存低 8 位地址 A0~A7。27128 的 14 根地址线的高 6 位与
P2.0~P2.5 连接,低 8 位与 8282 的 Q0~Q7 连接,当 8031 系统发出 14 位地址信息时,便选
中 27128 片内 16KB 存储器中某个单元。图中 27128 的地址范围为 0000H~3FFFH。
图 8-9 27128 引脚配置 图 8-10 扩展 27128EPROM 电路图
MCS-51 系列单片机原理与接口技术
·138·
8.2 外部数据存储器设计
MCS-51 单片机有 128B 的内部 RAM,CPU 对内部 RAM 具有丰富的操作指令,这个 RAM区是十分宝贵的资源,可以作为工作寄存器、堆栈、软件标志和数据缓冲器,用户应合理地
分配和充分地利用内部 RAM,充分发挥它的作用。在实际应用中,仅靠片内提供的 128B 数
据存储器往往是不够用的,需要扩展外部 RAM。目前常用的 RAM 芯片有 2114(1KB×4 位)、
6116(2KB×8 位)、6264(8KB×8 位)等。 图 8-11 所示给出了单片机扩展外部 RAM 的一般电路结构。常用外部数据存储器有静态
RAM 和动态 RAM,这里只讨论静态 RAM 的扩展方法。
图 8-11 MCS-51 外部数据存储扩展电路结构
外部数据存储器的地址空间和外部程序存储器的地址空间是一样的,都为 64KB。从
图 8-11 中可以看出,P2 口提供高 8 位地址,P0 分时提供低 8 位地址和 8 位数据。数据存
储器的读和写由 RD(P3.7)和 WR (P3.6)信号控制,而程序存储器由读选通 PSEN信号
控制。虽然数据存储器和程序存储器共处于同一地址空间,但控制信号不同,所以不会发
生总线混乱。 MCS-51 单片机专门设有 MOVX 指令访问外部数据存储器,MOVX 指令分为两类。 (1)以寄存器 R0 和 R1 为地址寄存器,对由 R0 或 R1 所指明的外部数据存储单元进行
读、写操作。 读操作:MOVX A,@Ri 写操作:MOVX @Ri,A ;i=0,1 执行以上指令时,寄存器 R1 或 R0 的内容由 P0 口输出,为外部数据存储器提供一个 8
位地址,P2 口保持原状态不变,仍可作通用 I/O 口使用。这两条指令只能访问低 8 位寻址的
256 个单元。 (2)如果寻址范围超过 256 个单元,可使用如下两条指令。
读操作:MOVX A,@DPTR 写操作:MOVX @DPTR,A
第 8 章 MCS-51 单片机的存储器扩展
·139·
DPTR 为 16 位地址寄存器。执行这类指令时,P0 口输出低 8 位地址信号(DPL),P2 口
输出高 8 位地址信号(DPH),为外部数据存储器提供一个 16 位地址信号。这类指令用来访
问外部数据存储器 64KB 地址空间。 CPU 访问外部数据存储器的操作时序如图 8-12 所示。
图 8-12 CPU 访问外部 RAM 时序图
先看读外部数据存储器的时序。在第一个周期的 S1,允许地址锁存信号 ALE 由低变高
①,开始读周期。在 S2 状态,CPU 把低 8 位地址送上 P0 总线,把高 8 位地址送上 P2 口(设
采用 MOVX A,@DPTR 指令)。ALE 的下跳沿②用来把低 8 位地址信号锁存到外部锁存器
内③。而高 8 位地址信息此后一直锁存在 P2 口上,无须再外加锁存器。在 S3 状态,P0 口总
线驱动器进入高阻状态④。在 S4 状态,读控制信号RD 变为有效⑤,它使被寻址的数据存储
器略过片刻后把有效数据送上总线⑥,当RD 回到高电平后⑦,被寻址的存储器本身的总线
驱动器悬浮起来⑧,使 P0 口总线进入高阻状态。 写外部数据存储器的时序与读的情况类似。但是写的过程是 CPU 主动把数据送上总
线,故在时序上,CPU 向 P0 口总线送完被寻址存储器的低 8 位地址后,在 S3 状态,就
由送地址直接改为送数据上总线③,其间总线上不出现高阻悬浮状态。在 S4 状态,写
控制信号有效,选通被寻址的存储器,稍过片刻,P0 口上的数据就写到被寻址的存储器
内了。
MCS-51 系列单片机原理与接口技术
·140·
8.2.1 扩展 2KBRAM 的接口电路
扩展 2KB 外部 RAM,可使用静态 RAM6116。6116 采用 CMOS 工艺制造,单一+5V 供电,
额定功耗 160mW,典型存储时间 200ns,24 脚双列直插式封装,其引脚配置如图 8-13 所示,
引脚功能如表 8-10 所示,其工作方式选择如表 8-11 所示。
图 8-13 6116 引脚配置
扩展 2KBRAM 与 8031 的接口电路如图 8-14 所示。8031 的RD (P3.7)和WR (P3.6)分别与 6116 的读允许OE和写允许WE连接,实现读写控制;CE 是 RAM 的片选端,因该方
案中只外扩一片 6116,CE 可以直接接地,处于常通状态。在这里CE 与 P2.7 连接,P2.7 低
电平时,选中该片。
表 8-10 6116 引脚功能
A0~A10 地址线 I/O0~I/O7 双向输出线
CE 片选 OE 读允许线
WE 写允许线
表 8-11 6116 工作方式选择
CE WE OE 方式 功能
0 0 1 写 I/O0~I/O7 上内容写入 A0~A7 对应单元
0 1 0 读 A0~A7 对应单元内容输出到 I/O0~I/O7
1 × × 未选中 I/O0~I/O7 呈高阻 P2.0~P2.2 提供高 3 位地址,P0 口通过地址锁存器 74LS373 提供低 8 位地址。在读RD
和写WR 信号的控制下,实现对外部 RAM 的读和写的操作。 这里要注意的一点是,在图 8-14 中,尽管 P2 口只用去 P2.0~P2.2 和 P2.7 四根线,但其
余 4 根已无法作通用 I/O 线使用,这是由于在送地址时,口线内锁存的 I/O 信息被暂时切换
成地址信息。如果仍希望利用 P2.3~P2.6 线作通用 I/O 使用,可以用软件的方法来实现。但
是,这还必须在本系统中在没有外接程序存储器的情况下才行。
第 8 章 MCS-51 单片机的存储器扩展
·141·
图 8-14 扩展 6116 与 8031 接口电路
8.2.2 扩展 8KBRAM 的接口电路
扩展 8KBRAM 可使用 6264 芯片。6264 是静态 RAM,单一+5V 供电,额定功耗 200mV,
典型存储时间 200ns。28 脚双列直插式封装,其引脚配置如图 8-15 所示,引脚功能如表
8-12 所示。
表 8-12 6264 引脚功能
A0~A12 地址线 I/O0~I/O7 双向输出线
CE1 片选 1 OE 读允许线
CE2 片选线 2
6264 的工作方式选择如表 8-13 所示。
表 8-13 6264 工作方式选择
WE CE1 CE2 OE 方式 D0~D7
× 1 × × 未选中 高阻抗
× × 0 × 未选中 高阻抗
1 0 1 1 输出禁止 高阻抗
0 0 1 0 写 DIN
1 0 1 0 读 DOUT
MCS-51 系列单片机原理与接口技术
·142·
图 8-15 6264 引脚配置
6264 与 8031 的接口电路如图 8-16 所示。从图中看出,本电路除了 P2.0~P2.4 与 6264的 A8~A12 连接和 CE2(片选 2)接高电平外,其他的连接方法及工作原理与扩展 6116RAM接口电路完全相同,在此不再赘述。
图 8-16 扩展 6264 静态 RAM 接口电路
第 8 章 MCS-51 单片机的存储器扩展
·143·
8.2.3 扩展 16KBRAM 和 16KBEPROM 的接口电路
在实际的应用系统设计中,需要扩展外部数据存储器,同时还需要扩展外部程序存储在此
接口电路中,采用两片 2764EPROM 和两片 6264RAM 芯片作为程序存储器和数据存储器。该接
口电路采用译码法连接,使用一片译码器 74LSl39,74LSl39 的译码逻辑功能真值表见表 8-14。
表 8-14 74LSl39 译码器真值表
输入 输出 使能 选择
G B A Y0 Y1 Y2 Y3
1 × × 1 1 1 1 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 1 0 1 0 1 1 1 1 1 0 由表 8-14 可知,74LSl39 译码器仅有一个使能端 G,低电平选通;有两个选择输入,4
个译码输出,输出低电平有效。 如图 8-17 所示,当 P2.7 口输出为低电平时,选中 74LSl39。P2.6 和 P2.5 两根地址线组
成的 4 种状态可选择位于不同地址空间的芯片。各芯片对应存储空间为: IC0:程序存储器空间 0000H~1FFFH(Y0 ) ICl:程序存储器空间 2000H~3FFFH(Y1) IC2:数据存储器空间 0000H~1FFFH(Y0 ) IC3:数据存储器空间 4000H~5FFFH(Y2 ) Y3的寻址空间为 6000H~7FFFH,未被使用。
图 8-17 扩展 16KBRAM 和 16KBEPROM 的接口电路
MCS-51 系列单片机原理与接口技术
·144·
扩展系统中 P2 口为高 8 位地址线,P0 口为低位地址和数据线复用。访问扩展数据空间
使用“MOVX @DPTR”指令,产生WR 和RD 信号,对该空间读、写。PSEN是程序存储
器的读选通信号。对于 IC0 和 IC2 两个芯片虽然共处同一地址空间,但由于控制信号不同,
因此在读取数据时不会产生总线冲突。
8.3 习题
1.在 80C51 系统扩展中,程序存贮器和数据存贮器共用 16 位地址线和 8 位数据线,为
什么两个存储空间不会发生冲突? 2.8031 单片机存储器扩展包含哪些总线?其一般电路连接方法是什么? 3.请简述 80C51 单片机访问外部存储器的一般流程。 4.请简述扩展 EPROM 程序存储器时应该注意的问题。 5.试用 Intel 2764、6l16 为 80C51 单片机设计一个存储系统,它具有 8KB EPROM(地
址为 0000H~1FFFH)和 16KB 的程序、数据兼用的 RAM 存储器(地址为 2000H~5FFFH)。
具体要求:画出硬件连接图,并指出每片芯片的地址空间。
第第 99 章章 II//OO 接接口口扩扩展展设设计计及及应应用用
MCS-51 单片机本身具有很强的接口能力,对于 8051/8751 组成的系统,P0~P3 口均可
作 I/O 口用,共有 32 根 I/O 口线。但对于 8031 组成的系统,实际上只有 P1 口 8 根口线和
P3 口部分口线可以作 I/O 口线使用,这在许多应用系统中往往是不够用的,需要对 I/O 接口
电路进行扩展。 I/O 接口和 I/O 端口是不同的。I/O 端口简称 I/O 口,常指 I/O 接口电路中带有端口地址
的寄存器或缓冲器,单片机通过端口地址就可以对端口中信息进行读写。I/O 接口是指单片
机与外设间的 I/O 接口芯片。一个外设通常需要一个 I/O 接口,但一个 I/O 接口可以有多个
I/O 端口,传送数据的称为数据口,传送命令的称为命令口,传送状态的称为状态口。 常用的 I/O 接口芯片有 (1)8255A:可编程通用并行接口芯片。 (2)8155H:可编程扩展 IO/RAM 芯片。 (3)8253/8254:可编程定时/计数器。 (4)8251:可编程串行接口芯片。 (5)8279:可编程键盘显示接口芯片。 另外,74系列LSTTL电路或CMOS电路也可以作为MCS-51的扩展 I/O接口,如 74LS373
和 74LS377 等。
9.1 可编程并行 I/O 接口芯片 8255A
9.1.1 8255A 芯片简介
8255A 是 Intel 公司生产的可编程的并行 I/O 接口芯片,它具有 3 个 8 位的并行 I/O 口,
有 3 种工作方式,使用灵活方便,通用性强,可作为单片机与多种外围设备连接时的中间接
口电路。8255A 的引脚及内部的结构如图 9-1 和图 9-2 所示。 1.引脚说明 8255A 共有 40 个引脚,采用双列直插式封装,各引脚功能如下。 D7-D0:三态双向数据线,与单片机数据总线连接,用来传送数据信息。 CS :片选信号线,低电平有效,表示芯片被选中。 RD :读出信号线,低电平有效,控制数据的读出。 WR :写入信号线,低电平有效,控制数据的写入。 Vcc:+5V 电源。 PA7~PA0:A 口输入/输出线。
MCS-51 系列单片机原理与接口技术
·146·
PB7~PB0:B 口输入/输出线。 PC7~PC0:C 口输入/输出线。 RESET:复位信号线。 A1~A0:地址线,用来选择 8255A 内部端口。
图 9-1 8255A 的引脚 图 9-2 8255A 的内部结构
2.内部结构 8255A 内部结构如图 9-2 所示,包括 3 个并行数据输入/输出端口,2 个工作方式控制电
路,1 个读/写控制逻辑电路和 8 位数据总线缓冲器。 (1)端口 A、B、C 8255A 有 3 个 8 位并行口:PA、PA 和 PC,都可以选择作为输入输出工作模式,但在功
能和结构上有所差异。 ①PA 口:一个 8 位数据输出锁存器和缓冲器;一个 8 位数据输入锁存器。 ②PB 口:一个 8 位数据输出锁存器和缓冲器;一个 8 位数据输入缓冲器(输入不锁存)。 ③PC 口:一个 8 位数据输出锁存器;一个 8 位数据输入缓冲器(输入不锁存)。 通常情况下,PA、PB、PC 口可以当成 3 个独立的 8 位数据端口,其中 PC 口也可在软
件的控制下,分为两个 4 位的端口,作为端口 A、B 在选通方式操作时的状态控制信号。 (2)A 组和 B 组控制电路 这是两组根据 CPU 写入的“控制字”来控制 8255A 工作方式的控制电路。A 组控制 PA
口和 PC 口的上半部(PC7~PC4);B 控制 PB 口和 PC 口的下半部(PC3~PC0),并可根据
“控制字”对端口的每一位实现按位“置位”或“复位”。 (3)数据总线缓冲器 数据总线缓冲器是一个三态双向 8 位缓冲器,作为 8255A 与系统总线之间的接口,用来
传送数据、指令、控制命令以及外部状态信息。 (4)读/写控制逻辑电路 读/写控制逻辑电路接收 CPU 发来的控制信号RD 、WR 、RESET 以及地址信号 A1~A0
第 9 章 I/O 接口扩展设计及应用
·147·
等,然后根据控制信号的要求,将端口数据读出,送往 CPU,或者将 CPU 送来的数据写入端口。 各端口的工作状态与控制信号的关系如表 9-1 表所示。
表 9-1 8255A 端口工作状态选择表
A1 A0 RD WR CS 工作状态 0 0 0 1 0 A 口数据→数据总线(读端口 A) 0 1 0 1 0 B 口数据→数据总线(读端口 B) 1 0 0 1 0 C 口数据→数据总线(读端口 C) 0 0 1 0 0 总线数据→A 口(写端口 A) 0 1 1 0 0 总线数据→B 口(写端口 B) 1 0 1 0 0 总线数据→C 口(写端口 C) 1 1 1 0 0 总线数据→控制字寄存器(写控制字) × × × × 1 数据总线为三态 1 1 0 1 0 非法状态 × × 1 1 0 数据总线为三态 3.工作方式选择控制字及 C 口置位/复位控制宇 8255A 有 3 种基本工作方式。 ①方式 0:基本输入输出。 ②方式 1:选通输入输出。 ③方式 2:双向传送。 (1)工作方式选择控制字 工作方式由写入控制字寄存器的方式控制字来决定。方式控制字的格式如图 9-3 所示。3
个端口中 C 口被分为两个部分,上半部分随 A 口称为 A 组,下半部分随 B 口称为 B 组。其
中 A 口可工作于方式 0、1 和 2,而 B 口只能工作在方式 0 和 1。
图 9-3 8255A 的方式控制宇
MCS-51 系列单片机原理与接口技术
·148·
例如,写入工作方式控制字 95H,可将 8255A 编程为:A 口方式 0 输入,B 口方式 1 输
出,C 口的上半部分(PC7~PC4)输出,C 口的下半部分(PC3-PC0)输入。 (2)C 口按位置位/复位控制字 C 口 8 位中的任一位,可用一个写入控制口的置位/复位控制字来对 C 口按位置“1”或
“0”。这个功能主要用于位控。C 口按位置位/复位控制字的格式如图 9-4 所示。
图 9-4 C 口按位置位/复位控制字格式
例如,05H 写入控制口,则置 PC2 为“1”;08H 写入控制口,则 PC4 清“0”。 4.8255A 的 3 种工作方式 (1)方式 0 方式 0 是一种基本的输入/输出工作方式。在这种方式下,3 个端口都可以由程序设置为
输入或者输出,没有固定的用于应答的联络信号。方式 0 基本功能如下: ①具有两个 8 位端口(A、B)和两个 4 位端口(C 口的上半部分和下半部分)。 ②任何一个端口都可以设定为输入或者输出。各端口的输入、输出可构成 16 种组合。 ③数据输出时锁存,输入时不锁存。 8255A 的 A 口、B 口和 C 口均可设定为方式 0,并可根据需要规定各端口为输入方式或
输出方式。例如,设 8255A 的控制字寄存器地址为 FF7FH,令 A 口和 C 口高 4 位工作在方
式 0 输出,B 口和 C 口低 4 位工作于方式 0 输入,初始化的程序为: MOV DPTR,#FF7FH ;控制字寄存器地址送 R0 MOV A,#83H ;方式控制字 83H 送 A MOVX @DPTR, A ;83H 送控制字寄存器。 在方式 0 下,MCS-51 可对 8255A 进行 I/O 数据的无条件传送。例如,读一组开关的状
态,控制一组指示灯的亮、灭。实现这些操作,并不需要应答联络信号。外设的 I/O 数据
可在 8255A 的各端口得到锁存和缓冲,也可以把其中的某几位指定为外设的状态输入位,
CPU 对状态位查询便可实现 I/O 数据的异步传送。因此,8255A 的方式 0 属于基本输入/输
第 9 章 I/O 接口扩展设计及应用
·149·
出方式。 (2)方式 1 方式 1 是一种选通式输入/输出工作方式。A 口和 B 口皆可独立地设置成这种工作方式。
在方式 1 下,8255A 的 A 口和 B 口通常用于传送和它们相连外设的 I/O 数据,C 口用作 A 口
和 B 口的应答联络线,以实现中断方式传送 I/O 数据。C 口的 PC7~PC0 应答联络线是在设
计 8255A 时规定的,其各位分配如图 9-5 和图 9-7 所示,图中,标有 I/O 的各位仍可用作基
本输入/输出,不作应答联络线用。 下面简单介绍方式 1 输入/输出时的应答联络信号和工作原理。 ①方式 1 输入 当任何一个端口按照工作方式 1 输入时,应答联络信号如图 9-5 所示,各应答联络信号
的功能如下。
图 9-5 方式 1 输入联络信号
STB:选通输入,低电平有效。输入信号是由输入设备送来的。 IBF:输入缓冲器满,高电平有效。表示数据已送人输入锁存器,它由STB信号的下
降沿置位,由RD 信号的上升沿复位。 INTR:中断请求信号,高电平有效,由 8255A 输出,向 CPU 发中断请求。 INTE A:A 口中断允许信号,由 PC4 的置位/复位来控制。 INTE B:由 PC2 的置位/复位来控制。 下面以 A 口的方式 1 输入为例(A 口方式 1 输入工作示意图如图 9-6 所示),介绍方式 1
输入的工作过程以及各控制联络信号的功能。 当输入设备输入一个数据并送到 PA7~PA0 上时,输入设备自动在选通输入线 ASTB
上发送一个低电平选通信号。
MCS-51 系列单片机原理与接口技术
·150·
8255A 收到 ASTB 上负脉冲后,自动把 PA7~PA0 上输入数据存入 A 口的输入数据缓
冲/锁存器;并使输入缓冲器输出线 IBFA 变为高电平,以通知输入设备 8255A 的 A 口已收到
它送来的输入数据。
图 9-6 A 口方式 1 输入的工作示意图
8255A 同时检测到 ASTB 变为高电平、IBFA 为高电平时使 INTRA 变为高电平,向
CPU 发出中断请求。 CPU 响应中断后,可以通过中断服务程序从 A 口的“输入数据缓冲/锁存器”读取输
入设备送来的输入数据。当输入数据被 CPU 读走后,8255A 撤消 INTRA 上的中断请求,并
使 IBFA 变为低电平,以通知输入设备可以送下一个输入数据了。 ②方式 1 输出 当任何一个端口按照工作方式 1 输出时,应答联络信号如图 9-7 所示,各联络信号的功
能如下。
图 9-7 方式 1 输出联络信号
第 9 章 I/O 接口扩展设计及应用
·151·
OBF :输出缓冲器满信号,低电平有效,是同输出设备的联络信号。表示 CPU 已把
输出数据送到指定端口,外设可以将数据取走。它由WR 信号的上升沿置“0”(有效),由
ACK 信号的下降沿置“1”(无效)。 ACK :外设响应信号,低电平有效。表示 CPU 输出给 8255 的数据已由输出设
备取走。 INTR:中断请求信号,高电平有效。表示数据已被外设取走,请求 CPU 继续输出数
据。中断请求的条件是ACK 、OBF 、INTE(中断允许)为高电平,中断请求信号由WR 的
下降沿复位。 INTE A:由 PC6 的置位/复位来控制。 INTE B:由 PC2 的置位/复位来控制。 图 9-8 所示为 B 口工作于方式 1 输出下的工作示意图。
图 9-8 B 口工作于方式 1 选通输出的示意图
B 口在方式 1 输出的工作过程如下。 8031 可以通过 MOVX @Ri,A 指令把输出数据送到 B 口的输出数据锁存器,8255A
收到后便令输出缓冲器满引脚线 BOBF (PC1)变为低电平,以通知输出设备输出数据已到
达 B 口的 PB7~PB0 上。 输出设备收到 BOBF 上低电平后,从 PB7~PB0 上取走输出数据并使 BACK 线变为低
电平,以通知 8255A 输出设备已收到输出数据。 8255A 从回答输入线死接收到低电平后就对 BOBF 、 BACK 和中断允许触发器
状态进行检测,若它们皆在高电平,则 变为高电平而向 CPU 请求中断。 CPU 响应 INT0 上中断请求后便可通过中断服务程序把下一个输出数据送到 B 口的
输出数据锁存器,并重复上述过程,完成下一个数据的输出。 (3)方式 2 方式 2 只有 A 口才能设定。图 9-9 所示为 A 口在方式 2 下的工作过程示意图。在方式 2
下,PA7~PA0 为双向 I/O 总线。当作为输入总线使用时,PA7~PA0 受 ASTB 和 IBFA控制,
其工作过程和方式 1 输入时相同;当作为输出总线使用时,PA7~PA0 受 AOBF 和 AACK 控
制,其工作过程和方式 1 输出时相同。 方式 2 特别适用于像键盘、显示终端一类外部设备,因为有时需要把键盘上输入的编码
信号通过 A 口送给 CPU,有时又需要把数据通过 A 口送给终端显示。
MCS-51 系列单片机原理与接口技术
·152·
图 9-9 A 口在方式 2 下的工作示意图
9.1.2 8031 单片机和 8255A 的接口设计
8031 扩展 8255A,将 PA 口设置成输入方式,PB 口设置成输出方式,PC 口高 4 位设
置成输入方式,PC 口低 4 位设置成输出方式。下面设计扩展接口电路,并给出初始化程
序。 电路如图 9-10 所示。
图 9-10 8255A 的扩展接口电路
根据图 9-10 所示的硬件接口方式并结合前面的分析得知,8255A 芯片的 PA 端口的地址
为 7FFCH,PB 端口的地址为 7FFDH,PC 端口的地址为 7FFEH,控制寄存器的地址为 7FFFH。
可用“MOVX”指令来访问这些端口。 8255A 复位时,所有端口(A、B、C)均被置为基本输入方式,如果不符合应用系统的
要求就必须编程改变这个工作方式,即向 8255A 控制寄存器写入一个值,以确定各端口的工
作方式、I/O 方向等。
第 9 章 I/O 接口扩展设计及应用
·153·
根据要求:A 口输入,B 口输出,两者均采用工作方式 1,PC 口高 4 位输入、低 4 位输
出,控制字为 BCH。把控制字送入 8255A 的控制寄存器即可,程序初始化清单如下: MOV A,#BCH ;方式控制字→A MOV DPTR,#7FFFH ;选通控制寄存器 MOVX @DPTR,A ;方式控制字送入 8255A MOV DPTR,#7FFCH ;选择 PA 口 MOVX A,@DPTR ;读 PA 口数据 MOV DPTR,#7FFDH ;选择 PB 口 MOVX @DPTR,A ;把 PA 口数据送 PB 口输出 【例】在一个 8031 的应用系统中,利用扩展 8255A 设计一个 EPROM 2764 编程器,要求
8255A 的 PA 口作为 D0~D7 数据输出口,PB 口作为低 8 位地址口,PC 口作为高 5 位的地
址口。并将起始地址设定为 1000H、长度为 LEN16(为 16 位)的外扩 RAM 中用户程序固化
到起始地址为 2000H 的 2764EPROM 中。 硬件接口电路如图 9-11 所示(图中未给出外扩 EPROM 和外扩 RAM)。
图 9-11 EPROM 编程器逻辑图
在该系统中扩展 8255A 地址分配如下: PA 口:7FFCH;PB 口:7FFDH;PC 口:7FFEH;控制口:7FFFH。 8255A 的 PA 口、PB 口、PC 口均选为方式 0 输出工作方式。PC7 与 EPROM 2764 的编
程控制端 连接,当 PC7=1 时,EPROM 停止编程;PC6 与 2764 EPROM 的输出使能端
连接:PC5 与 2764EPROM 的片使能端 连接。 软件程序设计: ①8255A 的初始化程序如下: START: MOV DPTR,#7FFFH ;选通控制寄存器
MOV A,#80H ;方式控制字 80H 送 A MOVX @DPTR,A ;方式控制字送接口
MCS-51 系列单片机原理与接口技术
·154·
MOV A,#0FH ;置/复位控制字 MOVX @DPTR,A ;1→PC,2764 编程无效
②对 2764 编程的软件流程图如图 9-12 所示。
图 9-12 用户程序固化子程序流程图
③用户程序固化到 2764EPROM 中的子程序清单如下: STARTl: MOV DPTR,#1000H ;RAM 起始地址→DPTR MOV R4,#00H MOV R5,#20H ;EPROM 起始地址→R5,R4 MOV R6,#LEN16(L)
MOV R7,#LENl6(H ) ;长度→R7,R6 MOV A,R6 JNZ LOOP DEC R7 ;调整长度值 LOOP:MOVX A,@DPTR ;取 RAM 中数据 INC DPTR ;RAM 地址指针加 1 PUSH DPL PUSH DPH ;RAM 地址压入堆栈 MOV DPTR,#7FFCH ;A 口地址→DPTR MOVX @DPTR,A ;数据→A 口 INC DPTR ;选通 B 口地址 MOV A,R4 MOVX @DPTR,A ;低 8 位地址→B 口
第 9 章 I/O 接口扩展设计及应用
·155·
mC DPTR ;选通 C 口地址 MOV A,R5 ANL A,#1FH ;地址高 5 位 PC0~PC4 SETB ACC.6 ;0→PC7 MOVX @DPTR,A ;开始写 EPROM MOV A,R4 ;EPROM 起始低地址送 A INC A ;EPROM 低地址加 1 MOV R4,A JNZ LOOPl ;若 A 不为 0 转 LOOPl JNC R5 ;否则 R4 有进位到高位,即 R5 加 1 LOOPl: ACALL DL50 ;延时 DL50 子程为 50ms 延时子程序 MOV DPTR,#7FFFH ;控制口地址→DPTR MOV A,#0FH ;1→PC7(控制口) MOVX @DPTR,A ;停止编程 POP DPH; POP DPL ;RAM 地址指针出栈 DJNZ R6,LOOP DJNZ R7,LOOP ;长度减为 0 结束,非 0 继续 RET 在实际的应用系统中,根据外设的类型选择 8255A 的操作方式,并在初始化程序中把相
应的控制字写入操作口,所有方法如前所述,在此不再举例说明。
9.2 MCS-51 与可编程 RAM/IO 芯片 8155H 的接口
Intel 8155H 芯片内包含有 256 个字节的 RAM 存储器(静态),RAM 的存取时间为 400ns。两个可编程的 8 位并行口 PA 和 PB,一个可编程的 6 位并行口 PC,以及一个 14 位减法定时
器/计数器。PA 口和 PB 口可工作于基本输入输出方式(同 8255A 的方式 0)或选通输入输出
方式(同 8255A 的方式 1)。8155H 可直接和 MCS-51 单片机相连,不需要增加任何硬件。8155H既有 I/O 口又具有 RAM 和定时器/计数器,是 MCS-51 单片机系统中最常用的外围接口芯片
之一。
9.2.1 8155H 芯片介绍
1.8155H 的结构与引脚 (1)8155H 的逻辑结构 8155H 的逻辑结构如图 9-13 所示。 (2)8155H 的引脚功能说明 如图 9-14 所示,8155H 共有 40 个引脚,采用双列直插式封装。
MCS-51 系列单片机原理与接口技术
·156·
图 9-13 8155H 的逻辑结构图 图 9-14 8155H 的引脚
①AD7~AD0(8 条):AD7~AD0 为地址/数据总线,常可和 MCS-51 的 P0 口相接,用
于分时传送地址/数据信息。 ②I/O 总线(22 条):PA7~PA0 为通用 I/O 线,用于传送 A 口上的外设数据,数据传送
方向由 8155H 命令字决定(如图 9-15 所示)。PB7~PB0 为通用 I/O 线,用于传送 B 口上的
外设数据,数据传送方向也由 8155H 命令字决定。PC5~PC0 为 I/O 数据/控制线,共有 6 条,
在通用 I/O 方式下,用作传送 I/O 数据;在选通 I/O 方式下,用作传送命令/状态信息。 ③控制总线(8 条)。 RESET:复位输入线,在 RESET 线上输入一个大于 600ns 宽的正脉冲时,8155H 立
即处于复位状态,A、B、C 三口也定义为输入方式。 CE和 MIO/ 为 8155H 片选输入线,若CE=0,则 CPU 选中 8155H。 MIO/ 为 I/O 端
口或 RAM 存储器的选通输入线;若 MIO/ =0,则 CPU 选中 8155H 的 RAM 存储器;若 MIO/=1,则 CPU 选中 8155H 片内某一寄存器。
RD 和WR :RD 是 8155H 的读/写命令输入线,WR 为写命令线,当RD =0 和WR=1 时,8155H 处于读出数据状态;当RD =1 和WR =0 时,8155H 处于写入数据状态。
ALE:为允许地址输入线,高电平有效。若 ALE=1,则 8155H 允许 AD7~AD0 上地址
锁存到地址锁存器;否则,8155H 的地址锁存器处于封锁状态。8155H 的 ALE 常和 MCS-51的同名端相连。
TIMERIN 和TIMEROUT:TIMERIN 是计数器输入线,其脉冲上跳沿用于对 8155 片内
14 位计数器减 1。TIMEROUT 为计数器输出线,当 14 位计数器从计满回零时就可以在该引
线上输出脉冲或方波,输出信号的形状和计数器工作方式有关。 ④电源线(2 条):Vcc 为+5V 电源输入线,Vss 为接地线。 2.CPU 对 8155I/O 口的控制 8155H 的 A、B、C 三个端口的数据传送是由命令字和状态字控制的。 (1)8155H 端口地址
第 9 章 I/O 接口扩展设计及应用
·157·
8155H 内部有 7 个寄存器,需要 3 位地址来加以区分。表 9-2 所示为端口地址分配表。
表 9-2 8155H 端口地址分配
A7 A6 A5 A4 A3 A2 A1 A0 所选端口 0 1 × × × × × 0 0 0 命令/状态寄存器 0 1 × × × × × 0 0 1 A 口 0 1 × × × × × 0 1 0 B 口 0 1 × × × × × 0 1 1 C 口 0 1 × × × × × 1 0 0 计数器低 8 位 0 1 × × × × × 1 0 1 计数器高 8 位 0 0 × × × × × × × × RAM 单元
注:X 表示 0 或 1。 (2)8155H 的命令字 在 8155H 的控制逻辑部件中,设置有一个控制命令寄存器和一个状态标志寄存器。8155H
的工作方式由 CPU 写入命令寄存器中的命令字来确定。命令寄存器只能写入而不能读出,命
令寄存器 D0~D3 中用来设置 A 口、B 口和 C 口的工作方式。D4、D5 位用来确定 A 口、B口以选通输入输出方式工作时是否允许中断请求。D6、D7 位用来设置定时器/计数器的操作。
命令字的格式如图 9-15 所示。
图 9-15 8155H 的命令字
MCS-51 系列单片机原理与接口技术
·158·
(3)8155H 的状态字 在 8155H 中还设有状态标志寄存器,用来存入 A 口和 B 口的状态标志。状态标志寄存
器的地址与命令寄存器的地址相同,CPU 只能对其读出,不能写入。状态寄存器的格式如图
9-16 所示,CPU 可以直接查询。 下面仅对状态字中的 D6 位进行说明。 D6 为定时器中断状态标志位。定时器正在计数或开始计数前,D6=0;若定时器的计数
长度已计满,则 D6=1,在硬件复位或对它读出后又恢复为 0。
图 9-16 8155H 的状态字
3.8155H 的工作方式 (1)存储器方式 8155H 的存储器方式用于对片内 256 字节 RAM 单元进行读写,若 MIO/ =0 和CE=0,
则 8155H 处于存储器工作方式。此时,CPU 可以通过 AD7~AD0 上的地址选择在 RAM 存
储器中任一单元进行读写。 (2)I/O 方式 8155H 的 I/O 方式又可分为基本 I/O 和选通 I/O 两种工作方式,如表 9-3 所示。在 I/O 方
式下,8155H 可选择对片内任一寄存器读写,端口地址由 A2、A1、A0 三位决定。
表 9-3 C 口在两种 I/O 工作方式下各位定义
通用 I/O 方式 选通 I/O 方式 C 口
ALT1 ALT2 ALT3 ALT4 PC0 输入 输出 A INTR(A 口中断) A INTR(A 口中断) PC1 输入 输出 A BF(A 口缓冲器满) A BF(A 口缓冲器满)
PC2 输入 输出 STBA (A 口选通) STB A (A 口选通)
PC3 输入 输出 输出 B INTR(B 口中断) PC4 输入 输出 输出 B BF(B 口缓冲器满)
PC5 输入 输出 输出 B STB(B 口选通) ①基本 I/O 方式
第 9 章 I/O 接口扩展设计及应用
·159·
在本方式下,A、B、C 三口用作输入/输出,由图 9-15 所示的命令字决定。其中,A、B两口的输入/输出由 D1、D0 决定,C 口各位由 D3、D2 状态决定。例如,若把 02H 的命令字
送到 8155H 命令寄存器,则 8155H 的 A 口和 C 口各位设定为输入方式,B 口设定为输出方式。 ②选通 I/O 方式 由命令字中 D3、D2 状态设定,A 口和 B 口都可独立工作于这种方式。此时,A 口和 B
口用作数据口,C 口用作 A 口和 B 口的联络控制。C 口各位联络线的定义是在设计 8155H 时
规定的,其分配和命名如表 9.3 所列。 选通 I/O 方式又可分为选通输入和选通输出两种方式。 选通输入。A 口和 B 口都可设定为本工作方式:若命令字中 D0=0 和 D3、D2=10B
(或 11B),则 A 口设定为本工作方式;若命令字中 D1=0 和 D3、D2=11B,则 B 口设定为
本工作方式。选通输入的工作过程和 8255A 的选通输入的情况类似,如图 9-17 所示。 选通输出。A 口和 B 口都可设定为本工作方式:若命令字中 D0=1 和 D3、D2=10B
(或 11B),则 A 口设定为本工作方式;若命令字中 D1=1 和 D3、D2=11B,则 B 口设定为
本工作方式。选通输出过程也和 8255A 选通输出时情况类似,如图 9-18 所示。
图 9-17 选通 I/O 数据输入示意图
图 9-18 选通 I/O 数据输出示意图
4.8155H 内部定时器/计数器及使用 在 8155H 中还设置有一个 14 位的减 1 计数器,可用来定时或对外部事件计数,CPU 可
通过程序选择计数长度和计数方式。计数长度和计数方式由输入给计数寄存器的计数控制字
来确定,计数寄存器的格式如图 9-19 所示。
MCS-51 系列单片机原理与接口技术
·160·
图 9-19 8155H 计数寄存器的格式
其中 T13~T0 为计数长度,M2、M1 设置定时器的输出方式。8155H 定时器 4 种工作方
式及相应的TIMEROUT脚输出波形如图 9-20 所示。
图 9-20 8155H 定时器方式及TIMEROUT 脚输出波形
将启动命令字写入命令寄存器后,任何时刻都可以设置定时器的长度和工作方式。如果
定时器正在计数,那么,只有在写入启动命令之后,定时器才接收新的计数长度并按新的工
作方式计数。 若写入定时器的初值为奇数,那么方波输出是不对称的,例如初值为 9 时,定时器输出
的 5 个脉冲周期内为高电平,4 个脉冲周期内为低电平,如图 9-21 所示。
图 9-21 不对称方波输出(长度为 9)
值得注意的是,8155H 的定时器初值不从 0 开始,而要从 2 开始。这是因为如果选择定
时器的输出为方波形式(无论是单方波还是连续方波),则规定是从启动计数开始,前一半计
数输出为高电平,后一半计数输出为低电平。显然,如果计数初值是 0 或 1,就无法产生这
种方波。因此写入 8155H 计数器的计数初值是 2H~3FFFH。 如果将 0 或 1 作为初值写入,则其效果与送入初值 2 的效果一样。 8155H 复位后不预置定时器的方式和长度,并停止计数器计数。
9.2.2 MCS-51 与 8155H 的接口设计
MCS-51 单片机不需要外加任何逻辑即可直接与 8155H 接口连接,此时系统可以增加 256
第 9 章 I/O 接口扩展设计及应用
·161·
个字节片外 RAM 单元,22 位 I/O 口线及 1 个 14 位定时器。 【例】设计 8031 与 8155 接口并确定 RAM 和 I/O 口地址。 图 9-22 所示为 8155 与 8031 的一种接口方案。电路中 8031 的 P2.7 与 8155 的 相连,
8031 的 P2.0 与 8155 的 相连,8031 的 P0.0~P0.7 与 8155 的 AD0~AD7 相连。 8155 的 RAM 和 I/O 地址分配如下。 ①当 P2.7=0,P2.0=0 时,选中 8155 片内 RAM,地址是 7E00H~7EFFH。 ②当 P2.7=0,P2.0=1 时,选中 I/O 口,各口的地址分配为: 7F00H(命令状态寄存器地址) 7F01H(PA 口地址) 7F02H(PB 口地址) 7P03H(PC 口地址) 7F04H(定时器低位地址) 7P05H(定时器高位地址)
图 9-22 8155 与 8031 接口电路
【例】8031 与 8155 硬件电路如图 9-22 所示,其内部 RAM 与 I/O 操作如下。 ①将 8155 片内 RAM 的 7E10H 单元内容读入 A 累加器中。 程序段如下: MOV R0,#10H ;10H→(R0) MOV P2,#7EH ;P2.7,P2.0 置零,选中片内 RAM MOVX A,@R0 ;(10H)→A ②设 A 中的数据为 1,并写入 8155 的 RAM 中 7EF0H 单元。 程序段如下:
MCS-51 系列单片机原理与接口技术
·162·
MOV DPTR,#7EF0H ;指向 8155RAM 的 7EF0H 单元 MOV A,#01H ;数据送入 A 累加器 MOVX @DPTR,A ;01H→7EF0H 单元 ③将 A 口定义为基本输入方式,B 口定义为基本输出方式,C 口定义为输入方式,定时
器作为方波发生器对输入脉冲进行 24 分频(注意 8155 定时器最高计数频率为 4MHz),读 PA口数据送 PB 口输出。则 8155I/O 口初始化程序如下:
MOV DPTR,#7F04H ;指向定时器低 8 位 MOV A,#18H ;计数常数 18H=24 MOVX @DPTR,A ;送计数常数 INC DPTR ;指向定时器高 8 位 MOV A,#40H ;设定时器输出连续方波
9.3 用 74LSTTL 电路扩展并行 I/O 口
在 MCS-51 单片机应用系统中,采用 TTL 电路、CMOS 电路锁存器或三态门电路也可构
成各种类型的简单输入/输出口,在有些场合可以降低成本、缩小体积。通常这种 I/O 都是通
过 P0 口扩展。由于 P0 口只能分时使用,故构成输出口时,接口芯片应具有锁存功能;构成
输入口时,根据输入数据是常态还是暂态,要求接口芯片应能三态缓冲或锁存选通。数据的
输入、输出由单片机的读/写信号控制。
9.3.1 用 74LS377 扩展 8 位并行输出口
通过 P0 口扩展输出口时,锁存器被视为一个外部 RAM 单元,输出控制信号为WR 。 74LS377 为带有允许输出端的 8 位锁存器,有 8 个 D 输入端,8 个 Q 输出端,一个时钟
输入端 CP,一个锁存允许信号E。当E=0 时,CP 端的上跳变将把 8 位 D 输入端的数据打入
8 位锁存器,这时在 Q 输出端将保持 D 端输入的 8 位数据。利用 74LS377 的这些特性,可以
将其作为 8031 系统中的一个 8 位输出口,接口电路如图 9-23 所示。
图 9-23 8031 和 74LS377 的接口
图 9-23 中,8031 的 P0 口与 74LS377 的 D 端相连,WR 与 CP 相连,P2.7 作为 74LS377
第 9 章 I/O 接口扩展设计及应用
·163·
的片选信号。当 P2.7 低电平有效时,在 的上升沿,P0 口输出的数据将被 74LS377 锁存起
来,并在 Q 端输出。 图 9-23 中 74LS377 的口地址为 7FFFH,若将一个数据字节由 74LS377 输出,则执行下
面程序。 MOV DPTR,#7FFFH ;地址指针指向 74LS377 MOV A,#DATA ;待输出数据→A MOVX @DPTR, A ;输出数据
9.3.2 用 74LS373 扩展 8 位并行输入口
74LS373 是一个三态门的 8 位锁存器,它可以作为 8031 外部的一个扩展输入口,接口电
路如图 9-24 所示。
图 9-24 用 74LS373 扩展并行输入口
接口电路的工作原理:当外设把数据准备好后,发出一个控制信号 XT 加到 373 的 G 端,
即锁存控制端,使输入数据在 74LS373 中锁存。同时,XT 信号加到 8031 单片机的中断请求
端,单片机响应中断,在中断服务程序中执行下面程序: MOV DPTP,#BFFFH ;指向 74LS373 的入口地址 MOVX A,@DPRT ;读入数据 在执行上面的第二条指令时,P2.6=0,RD 有效,通过或门后加到 373 的OE端,即 373
的三态门控制端,使三态门畅通,锁存的数据读入到累加器 A 中。
9.3.3 用三态门扩展 8 位并行输入口
常态数据的输入,只需采用 8 位三态门控制电路芯片即可。图 9-25 所示是用 74LS244通过 P0 口扩展的 8 位并行输入口。
图中,三态门由 P2.6 和RD 逻辑或控制,其数据输入使用以下两条指令。 MOV DPTR, BFFFH ;指向 74LS244 口地址 MOVX A,@DPTR ;读入数据
MCS-51 系列单片机原理与接口技术
·164·
图 9-25 用 74LS244 扩展并行输入口
9.3.4 采用 74LSTTL 的 I/O 接口扩展应用举例
如图 9-26 所示是利用 74LS273 和 74LS244 将 8 位 P0 接口扩展成简单的输入、输出口的
电路。74LS273 是 8 位锁存器扩展输出口,输出端接 8 个 LED 发光二极管,以显示 8 个按钮
开关状态,低电平时二极管发光。74LS244 是缓冲驱动器,扩展输入口,它的 8 个输入端分
别接 8 个按钮开关。74LS273 与 74LS244 的工作受 P2.0、RD 、WR 三条控制线控制。
图 9-26 74LSTTL I/O 扩展举例
当 P2.0=0,RD =0(WR =1)时选中 74LS244,此时若无按钮开关按下,输入全为高
电平,当某按钮开关按下时则对应位输入为“1”,74LS244 的输入端不全为“1”,其输入状
第 9 章 I/O 接口扩展设计及应用
·165·
态通过 P0 接口数据线被读入 8031 片内;当 P2.0=0,WR =0(RD =1)选中 74LS273 芯片, CPU 通过 P0 接口输出数据锁存到 74LS273,74LS273 的输出端低电平位对应的 LED 发光二
极管点亮。 总之,在图 9-25 中只要保证 P2.0 端低电平就有可能使扩展输入口/输出口工作,哪一个
口工作受WR 和RD 控制线控制,二者不会同时为“0”,因此在图 9-26 中,两个扩展芯片可
共用一个地址。 扩展口地址确定原则为:只要保证 P2.0 为“0”,其他地址位或“0”或“1”即可。如,
地址用 FEFFH(无效位全为“1”),或用 0000H(无效位全为“0”)。 输出程序段: MOV A,#data ;数据→A MOV DPTR,#FEFFH ;I/O 地址→DPTR MOVX @DPTR, A ;WR 为低电平,数据经 74LS273 口输出 输入程序段: MOV DPTR,#FEFFH ;I/O 地址→DPTR MOVX A,@DPTR ;74LS244 接口数据读入内部 RAM 【例】编写程序把按钮开关状态通过图 9-26 中的发光二极管显示出来。 程序: LP: MOV DPTR,#FEFFH ;输入口地址→DPTR
MOVX A,@DPTR ;按钮开关状态读入 A 中 MOVX @DFIB, A ;A 数据送显示输出口 SJMP LP ;(输入、输出共用一地址)反复连续执行
从这个程序可看出,对于接口的输入/输出就像从外部 RAM 读/写数据一样方便。图 9-26所示仅仅扩展了两片,如果仍不够用,还可扩展多片 244、273 之类的芯片。但作为输入口时,
一定要求有三态功能,否则将影响总线的正常工作。
9.4 LED 显示电路
LED 显示电路以及下一节的键盘控制电路是并行 I/O 口的典型扩展应用,下面分别作详
解介绍。
9.4.1 LED 显示器结构及原理
发光二极管芯片进行适当连接(包括串联和并联)可构成发光显示器的发光段或发光点。
这些发光段或发光点可以组成数码管、符号管、米字管、矩阵管、电平显示器管等。通常把
数码管、符号管、米字管统称为笔画显示器,而把笔画显示器和矩阵管统称为字符显示器。
MCS-51 系列单片机原理与接口技术
·166·
图 9-27 发光二极管芯片结构图
基本的半导体数码管是由 7 个条状发光二极管芯片按图 9-27 排列而成的,也称为七段数
码显示器,可实现 0~9、A~F 以及 H、P 的显示。从各发光段电极连接方式分有共阳极和
共阴极两种。共阳极型是指笔画显示器各段发光管的阳极(即 P 区)是公共的,而阴极互相
隔离。共阴极型是笔画显示器各段发光管的阴极(即 N 区)是公共的,而阳极是互相隔离的,
如图 9-28 所示。共阴极 LED 数码管的 a~g 七个发光二极管加高电平(“1”)发亮,加低电
平(“0”)发暗,而共阳极的 LED 数码管的 a~g 七个发光二极管正好相反。
图 9-28 共阴极和共阳极发光二极管
七段 LED 数码管与单片机的接口很简单,只需将单片机的一个 8 位并行 I/O 口与数码管
的发光二极管的引脚相连即可。根据 8 位 I/O 口输出的不同数据,LED 就可以显示不同的数
字或字符,这 8 位数据称为显示代码。显示代码如表 9-4 所示,显然,共阳极和共阴极的显
示代码是不同的。
表 9-4 LED 字形代码表
段符号 十六进制代码 所显示字符
dp g f e d c b a 共阴极 共阳极 0 0 0 1 1 1 1 1 1 3FH C0H 1 0 0 0 0 0 1 1 0 06H F9H 2 0 1 0 1 1 0 1 1 5BH A4H 3 0 1 0 0 1 1 1 1 4FH B0H 4 0 1 1 0 0 1 1 0 66H 99H 5 0 1 1 0 1 1 0 1 6DH 92H
第 9 章 I/O 接口扩展设计及应用
·167·
续表
段符号 十六进制代码 所显示字符
dp g f e d c b a 共阴极 共阳极 0 0 0 1 1 1 1 1 1 3FH C0H 1 0 0 0 0 0 1 1 0 06H F9H 2 0 1 0 1 1 0 1 1 5BH A4H 3 0 1 0 0 1 1 1 1 4FH B0H 4 0 1 1 0 0 1 1 0 66H 99H 5 0 1 1 0 1 1 0 1 6DH 92H 6 0 1 1 1 1 1 0 1 7DH 82H 7 0 0 0 0 0 1 1 1 07H F8H 8 0 1 1 1 1 1 1 1 7FH 80H 9 0 1 1 0 1 1 1 1 6FH 90H A 0 1 1 1 0 1 1 1 77H 88H B 0 1 1 1 1 1 0 0 7CH 83H C 0 0 1 1 1 0 0 1 39H C6H D 0 1 0 1 1 1 1 0 5EH A1H E 0 1 1 1 1 0 0 1 79H 86H F 0 1 1 1 0 0 0 1 71H 8EH H 0 1 1 1 0 0 0 1 76H 89H P 0 1 1 1 0 0 1 1 73H 8CH U 0 0 1 1 1 1 1 0 3EH C1H
熄灭 0 0 0 0 0 0 0 0 00H FFH
9.4.2 LED 显示接口
控制数码管驱动级的控制电路(也称驱动电路)有静态式和动态式两类。 单片机系统中,LED 显示接口一般采用静态驱动和动态扫描两种驱动方式。静态驱动工作
原理是每一个 LED 显示器用一个 I/O 端口驱动,亮度大,耗电也大,占用 I/O 端口多,显示位
数多时很少采用;动态扫描驱动方式的工作原理是将多个显示器的段码同名端连在一起,位码分
别控制,利用眼睛的余辉暂留效应,分别进行显示。只要保证一定的显示频率,看起来的效果和
一直显示是一样的。在电路上用一个 I/O 端口驱动段码,用另一个 I/O 端口实现位控,占用 I/O端口少,耗电也小,简化了电路,降低了成本,显示位数多时常采用这种方式。
(1)静态驱动电路 图 9-29 就是用锁存器设计的静态驱动电路。L1~L4 为 4 位共阳极 LED 显示器,扩展了
4 片 8D 锁存器 74LS273,用来锁存字形码并输出驱动,4 片 74LS273 占用系统的 I/O 端口地
址 7FFCH~7FFFH,D1~D3 用于降低数码管的供电电压。 下面给出通用显示子程序,该程序的思路是建立一个段码(字形码)表,将显示缓冲区
(首址送 R0)中要显示的数取出,通过指令 MOVC A,@A+DPTR 查表找到与之对应的字
形码,并送段码地址锁存器。
MCS-51 系列单片机原理与接口技术
·168·
图 9-29 用锁存器设计的静态驱动电路
功能:显示子程序 入口:显示数据首址送 R0 SHOW:MOV P2,#7FH ;P2.7=0
MOV R1,#FFH ;R1 指向 L1 MOV DPTR,#TAB ;段码表首址 MOV R7,#4 ;LED 显示器位数 4 送 R7
SHOW1:MOV A,@R0 ;取要显示数据 ANL A,#0FH MOVC A,@A+DPRT ;查表 CPL A ;取反 MOVX @R1,A ;送段码显示 INC R0 ;指向下一个要显示数据 DEC R1 ;指向下一个 LED DJNZ R7,SHOW1 ;未完继续 RET
第 9 章 I/O 接口扩展设计及应用
·169·
TAB:DB 3FH,06H,5BH,4FH DB 66H,6DH,7DH,07H DB 7FH,6FH,77H,7CH DB 39H,5EH,79H,71H
(2)用 8155 设计动态扫描驱动接口 用 8155 并行接口芯片设计的动态扫描驱动接口电路如图 9-30 所示。8155 的 PA 口可作
段码驱动器;8155 的 PC 口经 75451 驱动输出位控码,当 PC 口输出为低时,允许显示,显
示不同的字形,如果 PC 口输出为高,则相应的数码管熄灭。
图 9-30 用 8155 实现的显示器接口
4 个共阴极数码管的段码同名端是连接在一起的,如果 PC 口都写 0,势必使 4 个管显示
同一数字,这是不允许的。必须采用“分时动态扫描”的方法显示。即每次点亮一个 LED 显
示器,延时一段时间再点亮下一个 LED 显示器……周而复始,4 个 LED 显示器轮流扫描动
态显示。若每个 LED 显示器点亮 1~2ms,由于人眼视觉余辉的暂留效应,看起来好像几个
显示器同时显示,这就是分时轮流扫描产生的效果。因而可以在 4 个 LED 显示器上“同时”
显示不同的字符。 由此可以看出,在一个简单的单片机系统中,硬件上必须有一个段码锁存器和一个位码
锁存器,与系统数据总线接口,再编制一个软件驱动程序,便可作为系统显示输出设备,以
用来显示各种信息和数据。 设 8155 控制口地址为 CR,A 口入口地址为 PA,C 口入口地址为 PC。设计一显示子程
序,要求 4 个 LED 显示器从左至右依次显示一遍。 下面给出一个显示子程序,其功能是将显示缓冲区(DISBUF 为首地址)70H~73H 的
BCD 数从右至左轮流扫描显示一遍。该程序的思路是建立一个段码(字形码)表,将显示缓
冲区 70H~73H 中要显示的数取出,通过查表指令 MOVC A,@A+DPTR 找到与之对应的
字形码,送 PA 口,再取相应的位码送 PC 口,使一个 LED 显示器显示 1~2ms,再取下一个……
MCS-51 系列单片机原理与接口技术
·170·
直到最右边。程序便可控制 4 个 LED 显示从左至右轮流显示一遍。 软件驱动程序如下: SHOW:MOV DPTR,#CR ;
MOV A,#4DH ;设置 8155 工作方式 MOVX @DPTR,A ;设 A 口、C 口均作输出口 MOV R0,#DISBUF ;指向显示缓冲区首址 MOV R5,#FEH ;选中第一个 LED 显示器
MOV R4,#4 ;LED 显示数量送 R4 SHOWl:CLR A
MOV DPTR,#PC MOVX @DPTR,A ;全熄
SHOW0:MOV A,@R0 ;取数 MOV DPTR,#TAB ;指向表首址 MOVC A,@A+DPTR ;查表,取段码 MOV DPTR,#PA ;指向段码地址 MOVX @DPTR,A ;送段码至 PA 口 MOV A,R5 ;取位码 MOV DPTR,#PC ;指向位码地址 MOVX @DPTR,A ;送位码至 PC 口 RL A ;选中下一个 LED 显示器 MOV R5,A ;修改位码 LCALL DELY ;延时 INC R0 ;准备取下一个数 DJNZ R4,DIR0 RET
DELY:MOV R7,#3 ;延时函数 DEL1:MOV R6,#250
DJNZ R6,$ DJNZ R7,DEL1 RET
TAB:DB 3FH,06H,5BH,4FH DB 66H,6DH,7DH,07H DB 7FH,6FH,77H,7CH DB 39H,5EH,79H,71H
9.4.3 键盘接口
键盘由多个按键组成,一般将其排列成阵列形式,如图 9-31 所示。当没有键按下时,行
线和列线之间是不相连的,若第 N 行第 M 列的键被按下,那么第 N 行与第 M 列的线就被接
通。如果在列线上加上信号,根据行线的状态,便可得知是否有键按下。如果在列线上逐行
第 9 章 I/O 接口扩展设计及应用
·171·
加上一个扫描信号,就可以判断按键的位置。
图 9-31 阵列式键盘示意图
根据上述原理,设计两个端口,一个作为扫描信号输出口,一个作为信号接收口或称扫
描信号输入口,就可以方便地实现扩展键盘接口,图 9-32 给出了由 8155 扩展的键盘接口。
图 9-32 8155 扩展 I/O 口组成的行列式键盘
键盘由 32 个键组成,排成 8 行 4 列。8155 的 PA 口输出作为键盘的行扫描线,8155 的
PC 口输入作为键盘的列回扫线。当 PA 口输出全部为低电平时,若无键按下,则 PC 口输入
都是高电平:若有键按下,PC 口必有一个输入为低电平。仅知道有键按下是不够的,必须要
判断哪一个键被按下。可以逐行扫描键盘,即让 PA0 先为低,Pal~PA7 为高,看 PC 口输入
是否有为低的。如果有,则闭合键在第一行上,如果无,则再使 PAl 为低,PA 口其他端为高,
依次扫描下去,找到按键所在的行,同时根据 PC 口输入的哪一位为低,便可知道键在哪一
列上。
MCS-51 系列单片机原理与接口技术
·172·
下面给出一个键盘扫描子程序,其中 PA 口地址为 PA,PC 口地址为 PC。首先判断是否
有键按下,如果有,则延时一段时间,再判断是否有键按下,其目的是为了消除电路抖动和
消除干扰信号。一般按键的时间至少有十几毫秒,而干扰信号的时间都很短。只要两次判断
都有键按下,就可以认为是有键按下。当确认有键按下后,再逐列扫描判断按键的位置。 KEY:CLR A
ACALL KR ;有键按下吗? JZ NK ;无键按下返回 ACALL DLAY ;调用延时程序,消除抖动 CLR A ACALL KR ;再次判断是否有键按下 JZ NK ;无键按下返回 MOV A,#FEH ;行扫描信号,从最低位开始 MOV R4,#0 ;行计数器,初始值为 0 MOV R2,A ACALL KS ;扫描键盘 JNZ FIND ;找到按下的键,转移到处理程序 FIND INC R4 ;否则,行计数器加 1,指向下一行 MOV A,R2 RL A ;行扫描信号左移一位 CJNE A,#FE,KEY ;若没有扫描完 8 行,则继续扫描 MOV A,#0 ;若扫结束,则没有找到键 SJMP NFIND ;转移到没有发现键处理程序 NFIND SWAP A ;返回值 A ADD A,R4 RET
KR:MOV DPTR,#PA ;A 口地址送 DPTR MOVX @DPTR,A ;送行扫描信号 MOV DPTR,#PC ;C 口地址送 DPTR MOVX A,@DPTR ;读列回扫信号 CPL A ;求反 ANL A,#0FH ;屏蔽高四位 RET ;若 A=0,则无键按下
FIND: ………. NFIND: …………. 此键盘扫描子程序返回值在累加器(A)中。如果无键按下,ACC 的内容为零。如果有
键按下,ACC 的低 3 位是行编码,ACC 的高 4 位与列相对应,按键所在列的相应位为 1。表
9-5 给出了累加器 ACC 返回值的格式,该格式又称为键的特征码。
第 9 章 I/O 接口扩展设计及应用
·173·
表 9-5 ACC 返回键值格式
列编码 行编码 D7 D6 D5 D4 D3 D2 D1 D0
0:PC3 列有闭
合键 1:无闭合键
0:PC2 列有闭
合键 1:无闭合键
0:PC1 列有闭
合键 1:无闭合键
0:PC0 列有闭
合键 1:无闭合键
0
PA7-PA0 编码; 000:PA0 行有闭合键 001:PA1 行有闭合键 010:PA2 行有闭合键 … …… 111;PA7 行有闭合键
9.4.4 可编程键盘/显示接口 8279
锁存器或 8155 都可以作键盘显示器的接口。它们共同的缺点是,需要编制定时扫描显示和扫
描键盘的程序,因此整个系统软件比较复杂。Intel8279 是一个专用的显示器键盘接口,它用
硬件完成对显示器和键盘的扫描。在硬件上它只占用两个地址,在软件上省去了显示和键盘
扫描,大大方便了用户使用。 1.8279 的主要功能 Intel8279 可以显示 8 或 16 位 LED 显示器,可以和具有 64 个按键或传感器的阵列相连,
并多种工作方式。8279 的主要特点如下: (1)键盘与显示器能同时工作。 (2)具有扫描式键盘工作方式。 (3)具有扫描式传感器工作方式。 (4)用选通方式送入输入信号。 (5)带有 8 字符的键盘先入先出存贮器(FIFO)。 (6)触点回弹时两键封锁或 N 键巡回。 (7)带有双排 8 字或单个 16 字的数字显示器。 (8)带有可右入或左入的 16 字节显示器 RAM。 (9)工作方式可由 CPU 编程。 (10)可编程扫描定时、键盘送入时有中断输出。 2.INTEL8279 的管脚 8279 采用 40 引脚封装,其管脚配置及逻辑符号如图 9-33 所示。其引脚功能如下。 DB0~DB7:双向缓冲数据总线,与 CPU 总线连接,用于在 CPU 和 8279 之间传送
命令、数据和状态信息。 CLK:时钟输入线,为 8279 提供内部定时时钟。 RESET:复位线,当输入高电平时,8279 复位。其复位状态为 16 个字符左入显示;
编码扫描键盘一双键封锁;时钟为 31 分频。 CS:片选信号,当输入低电平时,允许对 8279 进行读写操作,否则禁止。 A0:数据缓冲器地址输入线。A0=1 时,选择命令或状态寄存器,A0=0 时,选择数
据寄存器。 RD 、WR :读写控制线,低电平有效。
MCS-51 系列单片机原理与接口技术
·174·
图 9-33 8279 逻辑符号及管脚配置
IRQ:中断请求线,高电平有效。在键盘工作方式下,当 FIFO/传感器 RAM 有数据
时(有键闭合),IRQ 变为高电平向 CPU 请求中断。当 CPU 读出 FIFO 数据时,IRQ 变低,
若 RAM 中还有数据,IRQ 在读出后又返回高电平,直至 FIFO 中数据被读完,该线复位。在
传感器工作中,每当检测到传感器状态变化时,IRQ 就出现高电平。 Vcc、Vss:电源线(+5V)、地线(图中未给出)。 SL0~SL3:行扫描输出线,用来扫描键盘和显示器。扫描分为译码方式和编码方式
(通过编程设定)。图 9-34 所示分别给出了译码方式和编码方式的输出波形图。
图 9-34 编码及译码方式
第 9 章 I/O 接口扩展设计及应用
·175·
从图 9-34 中可以看出,在编码方式下,扫描线输出的是二进制编码信号。SL0~SL3 可
输出 16 种不同的状态。对编码信号进行译码,可以得到 16 个译码信号,作为 16 个扫描信号
线。 在译码方式下,SL0~SL3 输出 4 个译码信号,在同一时刻,只有一个输出为低电平,
所以在这种方式下,SL0~SL3 可以直接用作扫描信号线。当需要扫描信号数不多于 4 个时,
一般采用译码方式。当扫描信号多于 4 个时,需采用编码方式,并通过译码器获得多个(最
多可到 16 个)扫描信号。 RL0~RL7:回送线,内部有有源提升电路,以保持高电平,有键闭合为低电平。在
选通工作方式中,也可以作为一般的数据输入端。 SHIFT:字型变换输入线,在键盘方式时,用于扩充键的功能,可以用作键盘的上下
档功能键。在传感器方式和选通方式下,该信号线无效。 STBCNTL/ :控制/选通输入线。在键盘方式,通常用来扩充键的控制功能。在选通
输入方式时,该信号的上升沿将锁存 RL0~RL7 的信号。在传感器方式,该线无用。 OUTA0~OUTA3:A 组显示输出线(显示 RAM 高 4 位)。 OUTB0~OUTB3:B 组显示输出线(显示 RAM 低 4 位)。 这是两个 16×4 显示刷新寄存器的输出端。依次把 RAM 中显示的内容送到端口上,并
与扫描线(SL0~SL3)同步。两个端口可分别使用,也可合起来作为一个 8 位端口。 BD :显示熄灭信号,该信号在数字切换或使用熄灭命令时,输出为低电平。 3.8279 的内部结构 8279 的内部结构如图 9-34 所示。DB0~DB7 是数据线,与 CPU 总线相连。当CS=0
时,选中该片。此时,若 A0=1,数据线上的信息是命令或状态;若 A0=0,数据上的信息是
显示数据或键盘数据。即 A0=1、WR =0 时,命令写到定时与控制寄存器去,对 8279 进行
编程、RD =0 时,读 FIFO/传感器 RAM 状态寄存器的内容;当 A0=0、WR =0 时,数据写
到显示 RAM;RD =0 时,读 RAM 或 FIFO/传感器 RAM 的内容。 扫描计数器通过 SL0~SL3 输出扫描信号,扫描信号分为译码和编码两种(由编程确定)。
显示寄存器通过 OUTA 和 OUTB 同步输出显示 RAM 的内容。这一过程由硬件自动完成,无
须程序干预。 扫描输出和回扫线可以构成对键的一个扫描阵列。当有键按下时,该键在行列中的位置
加上 SHIFT 和 CNTL 的状态一起被送到 FIFO 存贮器中,同时使 IRQ 变高。FIFO/传感器 RAM是一个 8×8RAM,在键盘和选通方式工作时,它是 FIFO 存贮器,其输入或读出遵循先入先
出的原则。此时 FIFO 状态寄存器存放 FIFO 存贮器空、满、溢出等状态。当 FIFO 存贮器有
数据时,IRQ 信号变为高电平。在传感器矩阵方式工作时,这个存贮器是传感器 RAM,它的
每一位对应着一个传感器的状态。当传感器发生变化时,IRQ 信号变为高电平。 4.8279 编程命令 8279 的工作方式是通过 CPU 对 8279 编程来确定的。当CS=0,A0=1,WR =0,写入
8279 的数据是 8279 的编程命令。8279 共有 8 条命令。
MCS-51 系列单片机原理与接口技术
·176·
图 9-35 8279 结构框图 RAM 或 FIFO/传感器 RAM 的内容
(1)键盘显示器方式设置命令 此命令用于设置键盘与显示器的工作方式,其代码为:
D7 D6 D5 D4 D3 D2 D1 D0 0 0 0 D D K K K
其中 D7D6D5=000 是键盘显示方式设置命令的特征位,后 5 位是参数。 DD 用来设定显示方式: DD 00 8 个字符显示,左端送入 01 16 个字符显示,左端送入 10 8 个字符显示,右端送入 11 16 个字符显示,右端送入 在编码扫描方式下,如果是 8 个字符显示,扫描线只有 SL0~SL2 起作用,显示 RAM
只用 8 个。如果是 16 个字符显示,则 SL0~SL3 全部起作用,显示 RAM 用 16 个。 将显示数据写入显示 RAM 有两种不同的写入方式,即左端送入和右端送入。 在左端送入方式中,每个显示位置均直接和显示器 RAM 中的某个字节相对应,是一种
最简单的显示形式。RAM 的地址 0 构成最左边的显示字符,地址 15 显示器最右边的显示字
符。在自动加 1 方式下,字符的进入从 0 位置开始,使显示器从左起填充。第 17 个字符又重
新送入最左边的位置,并从此位重新开始填入,见表 9-6。
第 9 章 I/O 接口扩展设计及应用
·177·
表 9-6 左端送入方式(自动加 1) 写入 次数
RAM 地址
显示 位 0
显示 位 1
显示 位 2
… 显示 位 12
显示 位 13
显示 位 14
显示位15
1 0 1 2 1 1 2 3 2 1 2 3 … … …… … …
14 13 l 2 3 13 14 15 14 1 2 3 13 14 15 16 15 1 2 3 13 14 15 16 17 0 17 2 3 13 14 15 16 18 1 17 18 3 13 14 15 16
右端送入是大多数电子计算器所使用的方法。 第一次送入的被放在最右边的显示字符上;第二次送入时,已送入的字符左移一位,其
中最左边的字符被移出界外并丢失,最右端是第二次送入的字符……最后字符送入时,已送
入的字符仍然左移一位,其中最左边的字符被移出界外并丢失,最右端是最后送入的字符,
详见表 9-7。
注意:复位后 DD=01,即为 16 位字符左入显示方式。
表 9-7 右端送入方式(自动加 1) 写入
次数 RAM 地址
显示 位 0
显示 位 1
显示 位 2
显示
位 3 显示
位 11 显示 位 12
显示 位 13
显示 位 14
显示
位 151 0 1 2 1 1 2 3 2 1 2 3 … … 14 13 1 2 10 11 12 13 14 15 14 1 2 3 11 12 13 14 15 16 15 1 2 3 4 12 13 14 15 16 17 0 2 3 4 5 13 14 15 16 17 18 1 3 4 5 6 14 15 16 17 18
KKK 用来设定键盘方式: KKK 000 编码(外译码)扫描键盘双键互锁 001 译码(内译码)扫描键盘双键互锁 010 编码(外译码)扫描键盘 N 键巡回 011 译码(内译码)扫描键盘 N 键巡回
MCS-51 系列单片机原理与接口技术
·178·
100 编码(外译码)扫描传感器阵列 101 译码(内译码)扫描传感器阵列 110 选通输入,编码显示扫描 111 选通输入,译码显示扫描 ①如果设定为扫描键盘,则 FIFO/传感器是先进先出存贮器(FIFO 堆栈)。在双键互锁
方式下,如果有两个以上的键先后按下,则先按下键被认为有效;如果有两个以上的键同时
按下,则最后释放的键被认为有效,并将其信息存入 FIFO 存贮器。在 N 键巡回方式下,有
多个键按下时,按照键盘扫描时发现的顺序,将这些键的信息依次存入 FIFO 栈。 ②如果是传感器方式,传感器 RAM 的每一位对应着每一个传感器的状态(0 或 1)。 ③选通输入方式中,RL0~RL7 的数据只有在 STBCNTL/ 线上升沿时才进入 FIFO 堆栈。 ④复位后 KKK=000,即为编程扫描双键互锁方式。 (2)时钟编程命令 该命令将引脚 CLK 输入的时钟信号进行分频,代码为:
D7 D6 D5 D4 D3 D2 D1 D0 0 0 1 P P P P P
D7D6D5=001 为时钟编程命令特征位。 PPPPP 的值可在 2~31 的范围之内。 8279 典型的内部工作时钟为 100KHz,如果输入时钟频率为 2MHz,PPPPP 取 10100,即 20
分频,则时钟编程命令为 34H;输入时钟频率为 1MHz,PPPPP 取 01010,即 10 分频,则时钟编
程命令为2AH。在典型的内部工作时钟为100KHz时,对8字符显示周期为5.1ms,16字符为10.3ms。 复位后分频系数为 31。 (3)读 FIFO/传感器 RAM 命令 代码为:
1 D6 D5 D4 D3 D2 D1 D0 0 1 0 AI × A A A
D7D6D5=010 为该命令的特征位。 这条命令的目的是指定读 8279 的数据为 FIFO/传感器 RAM 的内容。 当 A0=0,RD =0 时,对 8279 的读有两种情况,读 FIFO/传感器 RAM 和读显示 RAM。
若先设置了这一条命令,那么读数据就是 FIFO/传感器的内容,其中 AI 为自动加 1 标志,AAA为 FIFO/传感器的地址。
如果 AI=1,读了一次 FIFO/传感器的内容后,下一次的读就是 AAA+1 的内容。如果 AI=0,则读出 AAA 单元内容后,下一次的读仍是 AAA 的内容(地址固定为 AAA)。
在扫描键盘时,对 FIFORAM 的读总是按键送入的顺序读取,遵循先进先出的原则。 (4)读显示器 RAM 命令 代码为:
D7 D6 D5 D4 D3 D2 D1 D0 0 1 1 AI A A A A
D7D6D5=011,是该命令特征位。 当设置这条命令后,读 8279 的数据(A0=0)就是读显示 RAM 的内容,也就是当前显
示的段码。其中 AI 为自动加 1 标志(如果 AI=1,每读一次,RAM 地址自动加 1;AI=0,则
每次读取的是固定地址 AAAA),AAAA 为显示 RAM 地址。
第 9 章 I/O 接口扩展设计及应用
·179·
(5)写显示 RAM 命令 代码为:
D7 D6 D5 D4 D3 D2 D1 D0 1 0 0 AI A A A A
D7D6D5=100,是该命令特征位。 这条命令是用来设置写显示RAM 的地址。寻址方式和自动加 1 功能均与读显示RAM 相同。 (6)显示器屏蔽/熄灭命令 代码为:
D7 D6 D5 D4 D3 D2 D1 D0 1 0 1 × IWA IWB BLA BLB
D7D6D5=101,是该命令特征位。 有时在应用中需要将OUTA和OUTB分别输出,可用 IWA、IWB位来屏蔽半字节。当 IWA=1
时,OUTA 被屏蔽,因此,从 CPU 送数据进入显示 RAM 时不会影响该端口。同样 IWB=1 时,
OUTB 被屏蔽。必须注意,OUTB0 对应显示 RAM 的 D0 位,OUTA3 对应显示 RAM 的 D7 位。
BL 位是熄灭位,如果 BLA/BLB=1,则 OUTMOUTB 口输出熄灭段码。段码(00H 或 FFH 或
20H)由清除命令决定。应注意到,为了使 8 位端口显示熄灭,两个 BL 位都应该置位。 (7)清除命令 代码为:
D7 D6 D5 D4 D3 D2 D1 D0 1 1 0 CD2 CD1 CD0 CF CA
D7D6D5=110,为该命令特征位。 这条命令是用来清除显示 RAM 和 FIFO/传感器 RAM 状态寄存器的。 CD2 CDl CD0 1 0 × 显示 RAM 全 00H(×:任意值) 1 1 0 显示 RAM 全 20H(00100000B) 1 1 1 显示 RAM 全 FFH 0 × × 不清除显示 RAM(若 CA=1,则 CDlCD0 仍有效) CD2:为 1 时允许清除显示 RAM(或用 CA=1); CDl、CD0:用于确定显示 RAM 初始状态,即 CDlCD0=0×时,显示 RAM 清为全 00H,
即 CDlCD0=10 时,显示 RAM 清为全 20H;CDlCD0=11 时,显示 RAM 清为全 FFH。 在显示器 RAM 被清除期间(160μs)不能被写入。在此期间,FIFO 状态字的最高位被
置“1”,清除完毕时,该位自动复位。 CF:若 CF=1,则清除 FIFO 状态寄存器,并将中断输出线复位,FIFO/传感器 RAM 的
地址指示器也被清“0”。 CA:是总清“0”位,它的功能相当于 CD2 与 CF 的结合。 (8)中断结束/出错方式设置命令 代码为:
D7 D6 D5 D4 D3 D2 D1 D0 1 1 1 E × × × ×
D7D6D5=111,为特征位。 对传感器阵列方式而言,此命令将 IRQ 线变为低电平(即中断结束),并允许对RAM 进一步
写入。在传感器阵列中,传感器开关的状态被直接送到传感器RAM 中。用这一方法,传感器RAM
MCS-51 系列单片机原理与接口技术
·180·
将保持着传感器阵列中开关状态的“映像”。若在一次传感器阵列扫描完成时,检测出有传感器的
数值发生变化,IRQ 线变为高电平。如果自动加 1 标志被置为“0”(不自动加 1),则 IRQ 由第一
次读数据操作被复位为低电平。若自动加 1 标志为“1”(自动加 1),则需要用中断结束命令来使
IRQ 线复位为低电平。即在传感器阵列方式自动加 1 状态下,当传感器开关的状态发生变化时,IRQ线变高,在此之后,传感器开关状态发生的变化,都将被阻止,不能写入RAM。只有通过写一次
中断结束命令,使 IRQ 线复位为低电平之后,新的状态才能被写入RAM。 如果扫描键盘为 N 键巡回方式,当多个键同时按下时,8279 将按照扫描时发现它们的顺
序,将这些键的信息依次存入 FIFO 存贮器。但如果设置成特殊出错方式,即置 E=1,那么
当巡回键时发现两个以上键同时按下,就建立出错标志。这一标志将阻止任何对 FIFO 的进
一步写入,并设置中断。在此方式中,可用读 FIFO 状态字这条命令读取该出错标志,设置
清除命令 CF=1,可将该出错标志复位。 以上 8 种用于确定 8279 操作方式的命令,都由 D7D6D5 三个特征位来定义,输入 8279
命令口(A0=1)后,能自动寻址相应的命令寄存器。 (9)状态字 当 A0=1, =0 时为读 FIFO 状态,FIFO 状态寄存器的格式为:
D7 D6 D5 D4 D3 D2 D1 D0 DU S/E O U F N N N
NNN:FIFO 中的字符数(闭合键次数)。FIFO 无字符(无闭合键)时,此数为 000。 F:FIFO 满标志,当 FIFO 有 8 个字符时,F=1,FNNN=1000。 U:读空标志,即当 FIFO 中无字符(FNNN=0000)时,读 FIFO,该位置 1。 O:FIFO 溢出标志,当 FIFO 已满(有 8 个字符),再送入一字符,该位置 1。 S/E:在传感器方式时,若 S/E=1,表示至少有一个开关闭合;在 N 键巡回,特殊出错方
式下,S/E=1,表示有多键同时按下,该位用 CF=1 的清除命令复位。 DU:显示无效特征位。在显示器 RAM 被清除期间,该位置 1,即自动复位。 (10)FIFO RAM 的数据格式 ①键盘工作时,FIFORAM 的数据格式为:
D7 D6 D5 D4 D3 D2 D1 D0 CNTL SHIFT 扫描码 回送码
D2~D0 为 RL7~RL0 的编码值,D5~D3 为 SL3~SL0 扫描计数器的值。 ②在传感器阵列中,由于 RAM 的每一位对应一个传感器,AAA 就是选择 RAM 的地址,
若 AI=1,则下一次读的是 AAA+1 的内容。数据格式为: D7 D6 D5 D4 D3 D2 D1 D0 RL7 RL6 RL5 RL4 RL3 RL2 RL1 RL0
③在选通输入方式中,数据从回线进入 FIFO(用 STBCNTL/ 线的上升沿进入)。数据
格式为: D7 D6 D5 D4 D3 D2 D1 D0 RL7 RL6 RL5 RL4 RL3 RL2 RL1 RL0
第 9 章 I/O 接口扩展设计及应用
·181·
9.4.5 MCS-51 与 8279 的连接设计 1.硬件连接 8279 管脚与 INTEL CPU 兼容,可以很方便地与 MCS-51 连接,图 9-36 所示为一个实际
应用电路。
图 9-36 8279 键盘/显示接口电路原理图
8279 的 DB0~DB7 与 8031 的 P0 口相连。8279 的 IRQ 经非门接到 8051 的 INT0(P3.2)管脚上,可以实现键盘查询或键盘中断。8051 的 ALE 输出作为定时时钟从 8279 的 CLK 管
脚输入。8051 的RD 、WR 与 8279 的RD 、WR 相连。8031 的 P2.7 作为 8279 的片选(CS)
MCS-51 系列单片机原理与接口技术
·182·
信号。并且 P2.0 与 8279 的 A0 相连。因此 8279 的数据口为 7EFFH,命令或状态口为 7FFFH。 8279 与 6 个共阴极显示器和一个 12 键的小键盘连接。SL0~SL2 的扫描按编码方式经
74LSl38 译码输出作为键盘的行扫描线,同时经驱动器 75451 接 LED 显示器的 COM 端作为
显示器位扫描驱动信号。OUTA 与 OUTB 经驱动器 74LS244 与显示器的段码线相连,直接控
制显示字形,RP200A 为 8 个 200Ω/0.5W 上拉电阻。键盘的列扫描线送到回扫端 RL0~RL3上。
2.编写程序 8279 与一个 12 键的小键盘相连,12 键的编码为 0、1、2……9、*、#。这是一个 3×4
的矩阵,根据扫描信号与回扫线的连接可以计算出键符与 8279 扫描键盘送入 FIFO 键值的关
系,如表 9-8 所示。 OUTA、OUTB 口与显示器的段码相连,根据连线,可以计算出段码与字形的关系,如
表 9-4 所示。
表 9-8 键符(有序数编码)与扫描键值的关系
键符(有序数编码) 扫 描 码 回 送 码 扫 描 键 值 1(0lH) 000 000 00H
4(04H) 000 001 01H
7(07H) 000 010 02H
*(0AH) 000 011 03H
2(02H) 001 000 08H
5(05H) 001 001 09H: 8(08H) 001 010 0AH
0(00H) 001 011 0BH
3(03H) 010 000 10H
6(06H) 010 001 11H
9(09H) 010 010 12H
#(0BH) 010 011 13H 下面我们给出一个程序,功能为:如果按下的是数字键,则在显示器上将该数字依次显
示;如果按下的是“*”键,则显示器全灭;如果按下的是“#”键,则 6 个 LED 显示 123456。 初始化程序:
ORG 0000H MOV SP,@2FH ;设定栈指针 MOV DPTR,#7FFFH ;初始化 8279 MOV A,#0D1H ;清除命令 MOVX @DPTR,A ;清显示器,清 FIFO NOP NOP
LOOP:MOVX A,@DPTR ;读状态字 JB ACC.7,LOOP ;清除未完毕,则循环 MOV A,#34H
第 9 章 I/O 接口扩展设计及应用
·183·
MOVX @DPTR,A ;20 分频(fosc=12MHz) MOV A,#0 ;设键盘与显示方式 MOVX @DPTR,A ;(双键互锁,编码方式、8 字符、左进)
主程序 MAIN:MOV DPTR,#7FFFH ;通过对 IRQ 线进行查询来判断有无闭合键
MOVX A,@DPTR ;读 FIFO 状态 ANL A,#0FH JZ MAIN ;FIFO 的低 4 位全零,无键按下,转 MAIN LCALL KEY ;若有键闭合,调键盘处理子程序 LCALL DIR ;调显示子程序 SJMP MAIN
键盘处理子程序 KEY:MOV DPTR,#7FFFH
MOV A,#40H ;写‘读扫描键值命令’ MOVX @DPTR,A MOV DPTR,#7EFFH MOVX A,@DPTR ;读扫描键值 ANL A,#3FH MOV DPTR,#KTAB MOVC A,@A+DPTR ;查表转换成键有序编码 CJNE A,#0AH,KEYl
KEYl:JC ISDATA ;是数字键,转 ISDATA 处理 SUBB A,#0AH ;以下为命令键处理 MOV B,#03H MUL AB MOV DPTR,#COMAB JMP @A+DPTR
COMAB:LJMP A1 ;转‘*’键处理 LJMP A2 ;转‘#’键处理
A1:MOV R0,#70H ;‘*’键处理 MOV R2,#06H MOV A,#10H ;送暗码序号,6 个 LED 全暗
A11:MOV @R0,A INC R0 DJNZ R2,A11 RET
A2:MOV R0,#70H ;‘#’键处理,(123456 送 70H~75H) MOV R2,#06H MOV A,#01H
A21:MOV @R0,A
MCS-51 系列单片机原理与接口技术
·184·
INC A INC R0 DJNZ R2,A21 RET ;
ISDATA:MOV R0,#70H ;数字键处理 MOV R2,#6
ISDATA1:XCH A,@R0 INC R0 DJNZ R2,ISDATA1 RET ;
SHOW:MOV DPTR,#7FFFH ;显示子程序 MOV A,#90H MOVX @DPTR,A ;写显示命令,自增方式 MOV P2,#07EH MOV R1,#0FFH MOV DPTR,#DTAB MOV R7,#6 MOV R0,#70H
SHOW1:MOV A,@R0 MOVC A,@A+DPTR MOVX @R1,A INC R0 DJNZ R7,SHOW1 RET
;DTAB:显示字型段码表 DTAB:DB 3FH,06H,5BH,4FH ;0,1,2,3
DB 66H,6DH,7DH,07H ;4,5,6,7 DB 7FH,6FH,77H,7CH ;8,9,A,B DB 39H,5EH,79H,71H ;C,D,E,F DB 00H ;(暗码) ;KTAB:根据扫描键值大小(由小到大)形成的键有序数编码转换表
KTAB:DB 01H,04H,07H,0AH ;1,4,7,*(‘*’=0AH) DB 00H,00H,00H,00H ;由于键值不连续,空余单元中置 0 DB 02H,05H,08H,00H ;2,5,8,0 DB 00H,00H,00H,00H ;空余单元中置 0 DB 03H,06H,09H,0BH ;3,6,9,#(‘#’=0BH) END
【分析】在内存 70H~75H 开辟显示缓冲区,对应 LED1~LED6。当按下键时,程序通
第 9 章 I/O 接口扩展设计及应用
·185·
过第一次查表,将从 8279 读到的键值转换成键有序数编码。由于键值不连续,所以转换表中
空余单元中置 0。根据键有序数编码大小,区分是数字键还是功能键?如果是数字键,则转
数字键处理;如果是功能键,则转功能键处理。处理完毕,则调用显示子程序将显示缓冲区
内容输出显示。 查询有无闭合键可以通过对 8279 的状态字查询实现,也可以通过对 8279 的 IRQ 线进行
查询,程序如下: MAIN:JB P3.2,MAIN ;查询是否有键闭合,若无键闭合,则等待 键盘处理也可用中断方式,将上述初始化程序中增加 SETB EA、SETB EX0 两条指令;
主程序中去掉 LCALL KEY 指令;增加键盘中断处理子程序即可。 程序如下:
ORG 03H LJMP KEYINT ;键盘中断处理子程序
KEYINT:PUSH PSW ;现场保护 PUSH ACC PUSH DPL PUSH DPH SETB RS0 ;中断服务子程序用工作寄存器区 3 SETB RS1 ;保护工作寄存器区 0 LCALL KEY ;调键盘处理子程序 KEY POP DPH ;恢复现场 POP DPL POP ACC POP PSW
RETI ;中断返回
9.5 习题
1.80C51 单片机的 I/O 口扩展方法主要有哪几种?各有什么特点? 2.试简述 8255 有哪几种工作方式?怎样选择其工作方式? 3.试编程对 8155 进行初始化,使其 A 口为选通输出,B 口为基本输入,C 口作为控制
联络信号端,并启动定时器/计数器,按方式 1 定时工作,定时时间为 10ms,输入时钟频率
为 500kHz。 4.请用 80C51 的 P1 口设计一个 16 个键的键盘电路,并编写出相应的键盘程序。 5.试设计通过 8155 扩展的 6 位动态数码管显示器的接口电路,B 口输出显示代码,A
口输出位选码。 6.在 80C51 应用系统钟扩展一片 8255,其中 8255 外接 4 位显示器和 4 位 BCD 码拨盘,
试画出该部分的接口逻辑电路,并编写相应的显示子程序和读拨盘的子程序。
第第 1100 章章 MMCCSS--5511 与与 DD//AA、、AA//DD 的的接接口口设设计计
在单片机的实时控制和智能仪表等应用系统中,控制或测量对象的有关变量,往往是
一些连续变化的模拟量,如温度、压力、流量和速度等物理量。这些模拟量必须转换成数
字量后才能输入到单片机中进行处理。单片机处理的结果,也常常需要转换为模拟信号。
若输入的是非电信号,还需经过传感器转换成模拟电信号。实现模拟量转换成数字量的器
件称为模/数转换器(ADC),数字量转换成模拟量的器件称为数模转换器(DAC)。 随着大规模集成电路技术的迅速发展,大规模 A/D、D/A 集成电路芯片越来越多。本章
将从应用的角度,介绍几种典型的 D/A、A/D 集成电路芯片及其同 MCS-51 的硬件接口设计
和软件设计。
10.1 D/A 转换器
10.1.1 概述
D/A(数/模)转换器输入的是数字量,经转换后输出的是模拟量。转换时先将各位数码
按其权的大小转换为相应的模拟分量,然后再以叠加方法把各模拟分量相加,其和就是 D/A转换的结果。
使用 D/A 转换器时要注意区分输出形式以及转换器内部是否带有锁存器。 (1)电压与电流输出形式。 D/A 转换器有两种输出形式,一种是电压输出形式,即输入的是数字量,输出为电压;
另一种是电流输出形式,即输出为电流。在实际应用中如需要电压模拟量的话,对于电流输
出的 D/A 转换器,可在其输出端加运算放大器构成电流—电压转换电路,将转换器的电流输
出转变为电压输出。 (2)D/A 转换器内部是否带有锁存器。 模拟量转换需要一定时间,在这段时间内 D/A 转换器输入端的数字量应保持稳定,为此
应当在数/模转换器数字量输入端的前面设置锁存器,以提供数据锁存功能。根据转换器芯片
内是否带有锁存器,可以把 D/A 转换器分为两类。 ①内部无锁存器的 D/A 转换器 这种 D/A 转换器不带锁存器,内部结构简单,可与 MCS-51 的 P1、P2 口直接相接,因
为 P1 口和 P2 口的输出有锁存功能。当转换器与 P0 口相接时,需要在转换器芯片的前面增
加锁存器。 ②内部带有锁存器的 D/A 转换器 这种 D/A 转换器的芯片内部不但有锁存器,而且还有地址译码电路,有的还具有双重或
第 10 章 MCS-51 与 D/A、A/D 的接口设计
·187·
多重的数据缓冲电路,可与 MCS-51 的 P0 口直接相接。
10.1.2 主要技术指标
D/A 转换器的指标很多,用户最关心的是分辨率、建立时间和转换精度。 (1)分辨率 D/A 转换器的分辨率指输入的单位数字量变化引起的模拟量输出的变化,是对输入量变
化敏感程度的描述。通常定义为满刻度值与 2n之比(n 为 D/A 转换器的二进制位数)。显然,
二进制位数越多,分辨率越高,即 D/A 转换器对输入量变化的敏感程度越高。若满量程为 10V,
根据分辨率定义则分辨率为10V/2n。如果是8位D/A转换,即n=8,分辨率为10V/28=39.1mV,
即二进制数最低位的变化可引起输出的模拟电压变化 39.1mV,该值占满量程的 0.391%,常
用符号 1LSB 表示。 同理:10 位 D/A 转换 1LSB=9.77mV=0.1%满量程
12 位 D/A 转换 1LSB=2.44mV=0.024%满量程 14 位 D/A 转换 1LSB=0.61mV=0.006%满量程 16 位 D/A 转换 1LSB=0.076mV=0.00076%满量程
使用时,应根据对 D/A 转换器分辨率的需要来选定 D/A 转换器的位数。 (2)建立时间 建立时间是描述 D/A 转换速度快慢的一个参数,用于表明转换速度。其值为从输入数字
量到输出达到终值误差±(1/2)LSB(最低有效位)时所需的时间。输出形式为电流的转换器
建立时间较短,而输出形式为电压的转换器,由于要加上运算放大器的延迟时间,因此建立
时间要长一些。快速的 D/A 转换器的建立时间可达 1μs 以下。 (3)转换精度 理想情况下,精度与分辨率基本一致,位数越多精度越高。但电源电压、参考电压、电
阻等各种因素存在着误差,因此严格讲精度与分辨率并不完全一致。如果位数相同,分辨率
则相同,但相同位数的不同转换器精度会有所不同。例如,某种型号的 8 位 DAC 精度为±
0.19%,而另一种型号的 8 位 DAC 精度为±0.05%。
10.2 MCS-51 单片机与 8 位 D/A 转换器接口技术
能与微机接口的 D/A 转换器芯片有许多种,有的不带数据锁存器,这类 D/A 转换器与
微机连接时需要扩展并行 I/O 接口,使用起来不够方便;有的带数据锁存器,可以直接与单
片机或微处理器相连接,应用较为广泛,本节将通过几种典型芯片来介绍这类 D/A 转换器的
接口。
MCS-51 系列单片机原理与接口技术
·188·
10.2.1 DAC0832 的技术指标
DAC0832 是美国国家半导体公司(NSC)的产品之一,是一种具有两个输入数据寄存器
的 8 位 D/A 转换器,它能直接与 MCS-51 单片机接口,不需要附加任何其他 I/O 接口芯片。
其主要技术指标如下: 分辨率 8 位。 电流稳定时间 1μs。 可双缓冲,单缓冲或直接数字输入。 只需在满量程下调整其线性度。 单一电源供电(+5~+15V)。 低功耗,20mW。 DAC0832 是 DAC0830 系列产品的一种,其他产品有 DAC0830、DAC0831 等,它们都
是 8 位 D/A 转换器,完全可以相互代换。
10.2.2 DAC0832 的结构及原理
DAC0832 采用 CMOS 工艺,具有 20 个引脚双列直插式单片 8 位 D/A 转换器,其结构如
图 10-1 所示。
图 10-1 DAC0832 结构图
DAC0832由3大部分组成:8位输入寄存器,8位DAC寄存器和8位D/A转换器。DAC0832
第 10 章 MCS-51 与 D/A、A/D 的接口设计
·189·
器件由于有两个可以分别控制的数据寄存器,使用时有较大的灵活性。可以根据需要接成多
种工作方式。它的工作方式简述如下: DAC0832 可以构成双缓冲、单缓冲、直通数据输入 3 种工作方式。双缓冲工作方式主要
用于多个 DAC0832 同步输出的情况,先分别让所有的芯片的 ILE、CS、WR1同时有效,将
各输出数据逐个写入到各自的输入数据寄存器中。然后让所有的WR2 和XFER 同时为低电
平,则完成同步模拟量的输出;单缓冲方式用于单一的 DAC0832 输出的情况,通常把WR2和XFER 直接接地,对 DAC0832 进行写操作;直通数据输入方式用于连续数字反馈控制回
路,只要把 ILE 接高电平、CS、WR1、WR2 和XFER 接地即可。 由此可见,当 ILE=1,CS=0,WR1=0 时,LE1=0,允许数据输入;而当WR1=1
时LE1=0,则数据被锁存。能否进行 D/A 转换,除了取决于LE1以外,还要依赖于LE2 。 由图 10-1 可知,当WR2 和XFER 均为低电平时,LE2 =1,此时允许 D/A 转换,否则LE2
=0,将数据锁存于 DAC 寄存器中。 在使用时可以采用双缓冲方式(两级输入锁存),也可以用单缓冲方式(只用一级输入
锁存,另一级始终直通),或者接成完全直通的形式。
10.2.3 DAC0832 管脚功能
DAC0832 的引脚排列,如图 10-2 所示。
图 10-2 DAC0832 引脚图
1.控制信号引脚 CS:片选信号引脚(低电平有效)。 ILE:输入锁存允许信号(高电平有效)。 WR1:第一级锁存写选通(低电平有效)。当WR1为低电平时,用来将输入数据传
送到输入锁存器;当WR1为高电平时,输入锁存器中的数字被锁存:当 ILE 为高电平,且CS和WR1同时为低电平时,才能将锁存器中的数据进行更新。以上 3 个控制信号构成第一级输
入锁存。 WR2 :第二级锁存写选通(低电平有效)。该信号与XFER 配合,可使锁存器中的
数据传送到 DAC 寄存器中进行转换。 XFER :传送控制信号(低电平有效)。XFER 将与 WR2 配合使用,构成第二级
MCS-51 系列单片机原理与接口技术
·190·
锁存。 2.其他管脚的功能 D0~D7:数字输入量。D0 是最低位(LSB),D7 是最高位(MSB)。 IOUT1(IO1):DAC 电流输出 1。当 DAC 寄存器为全 1 时,表示 IOUT1 为最大值;
当 DAC 寄存器为全 0 时,表示 IOUT1 为 0。 IOUT2(IO2):DAC 电流输出 2。IOUT2 为常数减去 IOUT1,或者 IOUT1+IOUT2=
常数。在单极性输出时,IOUT2 通常接地。 Rfb:内部集成反馈电阻,为外部运算放大器提供一个反馈电压。Rfb 可由内部提供,
也可由外部提供。 VREF:参考电压输入,要求外部接一个精密的电源。当 VREF 为±10V(或±5V)
时,可获得满量程四象限的可乘操作。 VCC:数字电路供电电压,一般为+5~+15V。 AGND:模拟地;DGND:数字地。 这是两种不同的地,但在一般情况下,这两个地最后总有一点接在一起,以便提高抗干
扰能力。
10.2.4 8 位 D/A 转换器
现在以 DAC0832 为例说明 D/A 转换器输入端与单片机接口,具体方法如下。 1.单缓冲型接口方法 单缓冲型接口电路主要应用于一路 D/A 转换器或多路 D/A 转换器不同步的场合。图 10-3
所示出单缓冲型的 3 种接口方法。 这类接口电路主要是把 D/A 转换器的两个寄存器中任一个接成常通状态。 图 10-3(a)所示的接口电路把 DAC 寄存器接成常通状态;即 ILE 接高电平,WR2 和
XFER 接地,CS与 P2.7 口连接,WR1与单片机的WR 端连接。 图 10-3(b)所示接口电路是将输入寄存器接成常通状态,即将 ILE 接高电平,CS和WR1
接地,WR2 接单片机的WR 端,XFER 与 P2.7 口连接。 图 10-3(c)所示的接口电路使两个寄存器同时选通及锁存,WR1和WR2 与单片机的WR
连接,CS和XFER 与 P2.7 口连接。 2.双缓冲型接口方法 双缓冲型接口电路如图 10-4 所示,其主要应用在多路 D/A 转换器同步系统中。该接口
电路中,P2.7 接CS,P2.6 接XFER ,进行二次输出操作完成数据的传送及转换。第一次CS(P2.7=0)有效时,将 D0~D7 数据线上数据锁存到输入寄存器中。第二次当XFER(P2.6=0)有效时,将输入寄存器中内容锁存到 DAC 寄存器,并由 D/A 转换成输出电压。
第 10 章 MCS-51 与 D/A、A/D 的接口设计
·191·
图 10-3 单缓冲型接口
MCS-51 系列单片机原理与接口技术
·192·
图 10-4 双缓冲型接口电路
3.直通型的接口方法 直通型电路如图 10-5 所示。将 CS、WR1、WR2 和 XFER 接地,ILE 端保持高电平,
DAC0832 的数据线 D0~D7 可接微机系统独立的并行输出端口,如 MCS-51 的 P1 口或
8255 的 PA~PC 口。它一般不能直接接微机系统的数据总线,所以很少使用直通接口方
法。
图 10-5 直通型接口电路
10.2.5 D/A 转换器的输出方式
D/A 转换器输出分为单极性和双极性两种输出形式。其转换器的输出方式只与模拟量输
出端的连接方式有关,而与其位数无关,因此,这里仅以 8 位 D/A 为例进行讨论,其他位数
D/A 转换器的输出端连接与此相同。 1.单极性输出 图 10-6 所示是 DAC0832 与 8031 单片机的接口电路。
第 10 章 MCS-51 与 D/A、A/D 的接口设计
·193·
图 10-6 DAC0832 与 8031 单片机的接口电路
在该图中,DAC0832 的输出端连接成单极性输出电路,其输入端连接成单缓冲型接口电
路。它主要应用于只有一路模拟输出,或几路模拟量不需要同步输出的场合。这种接口方式,
将二级寄存器的控制信号并接,输入数据在控制信号作用下,直接输入 DAC 寄存器中,并
由 D/A 转换成输出电压。 图 10-6 中,ILE 接+5V,WR1和WR2 同时连接到 8031 单片机的WR 端口,CS和XFER
相连接到地址线 P2.7,DAC0832 芯片也作为 8031 的一个外部 I/O 端口,口地址为 7FFFH,
CPU 对它进行写操作,把数据直接写入 DAC 寄存器后,DAC0832 便输出一个新的模拟量。
执行下面一段程序,DAC0832 输出一个新的模拟量,数据存放于 R3 中。 MOV DPTR,#7FFFH MOV A,R3
MOVX @DPTR,A CPU 执行“MOVX @DPTR,A”指令时,便产生写操作,更新 DAC 寄存器内容,输
出一个新的模拟量。在单极性输出方式下,当 VREF 接-5V(或+5V)时,输出电压范围是 0~+5V(或 0~-5V)。若 VREF 接-10V(或+10V)时,输出电压范围为 0~+10V(或-10~0V)。
其中数字量与模拟量的转换关系,如表 10-1 所示。
表 10-1 单极性输出 D/A 关系
输入数字量 MSB LSB
模拟量输出(V)
11111111 ±VREF(255/256)
10000010 ±VREF(230/256)
10000000 ±VREF(128/256)
01111111 ±VREF(127/256)
00000000 ±VREF(0/256)
MCS-51 系列单片机原理与接口技术
·194·
2.双极性输出 在一般情况下把 D/A 转换器输出端接成单极性输出方式。但在随动系统中(例如电机控制系
统),由偏差产生的控制量不仅与其大小有关,而且与控制量的极性有关。这时,要求D/A 转换器
输出为双极性,此时,只需在图 10-6 的基础上增加一个运算放大器即可,其电路如图 10-7 所示。
图 10-7 DAC0832 双极性输出电路
在图 10-7 中,运算放大器U3 的作用是把运算放大器U2 的单向输出电压转变成双向输出。其
原理是将U3 的输入端 2 通过电阻R1 与参考电压VREF 相连,因此运算放大器U3 的输出电压 VO2=-((R2/R3)VO1+(R2/R1)VREF) 代入 R1、R2、R3 的值,可得 VO2=-(2VO1+VREF) 设 VREF=+5V 当 VO1=0V 时,VO2=-5V;
当 VO1=-2.5V 时,VO2=0V 当 VO1=-5V 时,VO2=+5V
其 D/A 转换关系如表 10-2 所示。
表 10-2 双极性输出 D/A 关系
输入数字量 模拟量输出(V) MSB LSB +∣VREF∣ -∣VREF∣
11111111 ∣VREF∣-1LSB -∣VREF∣+1LSB
11000000 ∣VREF∣/2 -∣VREF∣/2
10000000 0 0
01111111 -1LSB +1LSB
00111111 ∣VREF∣/2-1LSB ∣VREF∣/2+1LSB
00000000 -∣VREF∣ +∣VREF∣
10.3 MCS-51 单片机与 12 位 D/A 转换器接口技术
8 位 D/A 转换器的分辨率是比较低的,在有些控制系统中往往满足不了要求,有时为了
提高精度,需要用 10 位、12 位等高精度 D/A 转换器。
第 10 章 MCS-51 与 D/A、A/D 的接口设计
·195·
下面以 DAC1210 为例,说明 12 位 D/A 转换器的原理及接口技术。
10.3.1 DAC1210 的技术指标
DAC1210 系列是国家半导体公司生产的 12 位双缓冲乘法 D/A 转换器,可以与各种微处
理器直接接口。在与 16 位微处理器一起使用时,DAC1210 系列的 12 根数据输入线可直接与
微处理器的数据总线接口。其主要技术指标如下: ①分辨率 12 位。 ②电流建立时间 1μs。 ③线性度,满量程的 8 位、10 位、11 位。 ④可双缓冲,单缓冲或直接数字输入。 ⑤满足 TTL 电平规范的逻辑输入。 ⑥可与所有通用微处理器直接接口。 ⑦参考电压 VREF=-10~+10V。 ⑧单电源,+5~+15V。 ⑨低功耗,20mW。 DAC1210 系列包括 DACl208、DACl209、DAC1210 等各种型号的产品,它们的管脚是
兼容的,可互换。
10.3.2 DAC1210 的结构与原理
1.DAC1210 的结构 DAC1210 的硬件结构如图 10-8 所示。
图 10-8 DAC1210 功能方块图
MCS-51 系列单片机原理与接口技术
·196·
从图 10-8 所示中,可以看到 DAC1210 转换器是一种带有双输入缓冲器的 12 位 D/A 转
换器。第一级缓冲器由高 8 位输入寄存器和低 4 位输入寄存器构成,第二级缓冲器为 12 位
DAC 寄存器,此外,它还有一个 12 位 D/A 转换器。 2.管脚功能 DAC1210 共有 24 个管脚,采用双列直插式结构,其排列顺序如图 10-9 所示。
图 10-9 DAC1210 管脚
从图 10-9 所示中可以看出,DAC1210 管脚又分为 3 组。 (1)输入/输出线 数据总线 D0~D11 用来传送被转换的数字,高 8 位 D4~D11 对应高 8 位输入寄存器,
低 4 位 D0~D3 对应低 4 位输入寄存器。电流输出线为 IOUT1 和 IOUT2,IOUT1+IOUT2=常量。DAC 寄存器中所有数字位均为“1”时,IOUT1 为最大;为全“0”时,IOUT1 为零。
(2)电源及地线 Vcc:数字电源电压输入。 AGND:模拟地。DGND:数字地。 VREF:基准电压输入,选择范围-10~+10V。 (3)控制线 Rfb:片内集成反馈电阻,供外部运算放大器使用。 CS:片选信号。 WR1:第一级缓冲器的写选通信号。 B1/B2:字节顺序控制信号。此控制端为高电平,高 8 位输入寄存器及低 4 位输入
寄存器均被允许;此控制端为低电平时,仅低 4 位输入寄存器被允许。 WR2 :第二级缓冲器的写选通信号,即 12 位 DAC 寄存器写信号。 XFER :传送控制信号。 3.工作原理 DAC1210 时序图如图 10-10 所示。
第 10 章 MCS-51 与 D/A、A/D 的接口设计
·197·
图 10-10 DAC1210 时序图
结合该时序图可知:当B1/B2与XFER 为高电平,CS和WR1、WR2 为低电平时,LE1(1)=1、LE1(2)=1,高 8 位和低 4 位输入寄存器。数据 D11~D0 同时被更新,并在WR1、
WR2 的上升沿被锁存。能否进行 D/A 转换,最终依赖于LE2的状态。由图 10-10 时序可知,
当WR1、WR2 、B1/B2和XFER 也为低电平时,LE2=1,刷新低 4 位输入寄存器并更新 12位 DAC 寄存器内容,同时 12 位数据送入 D/A 寄存器进行 D/A 转换。否则LE2=0,12 位
DAC 寄存器内容保持不变。这里需要强调的是,图 10-10 工作时序是对 DAC1210 引脚控制
线 BY1/BY2 和XFER 连结在一起使用的情形,WR1和 WR2 也是连结在一起使用的。根据
DAC1210 转换器的工作原理,控制线完全可根据其逻辑表达式进行控制,即高 8 位、低 4 位
以及 12 位 DAC 寄存器的锁存命令可分别进行产生。这样 DAC1210 转换器既可异步输出,
又可多路同步输出,有极大的灵活性。
10.3.3 8031 与 DAC1210 转换器接口技术
图 10-11 所示为 DAC1210 与 8031 的接口电路。
图 10-11 DAC1210 与 8031 接口电路
需要指出的是,此处采用向左对齐的数据格式:
MCS-51 系列单片机原理与接口技术
·198·
高字节 低字节 D11D10D9D8D7D6D5D4 D3D2D1D0×××× MSB←一————DAC 数据————一→LSB
字节 1 字节 2 ×:无关位 12 位数据的高 8 位作为字节 1 通过数据线 D7~D0 送 DAC1210 的 D11~D4,而低 4 位
作字节 2 通过数据线 D7~D4 送 DAC1210 的 D3~D0。从图 10-11 中可以看出,DAC1210转换器占有两个地址:当 P2.7=0、A0=1 时,送高 8 位数据;而 A0=0 时,送低 4 位数据。即
DAC1210 的 8 位输入寄存器地址为 7FFFH,4 位输入寄存器地址为 7FFEH。从图中还可以看
到,DAC1210 转换器的工作采用输入双缓冲方式,即在送入数据时要先送 12 位数据中的高
8 位 D11~D4,然后再送入低 4 位数据 D3~D0,而不能按相反的顺序传送。这是因为在输
入 8 位寄存器时,4 位输入寄存器也是打开的,如果先送低 4 位后送高 8 位,结果就会产生
错误。这里 4 位输入寄存器与 12 位 DAC 寄存器是同一个地址 7FFEH,即当送完高 8 位数据
后,送低 4 位数据时,12 位 DAC 寄存器同时被打开并送 12 位 D/A 转换器转换。设 12 位数
据存放在内部 RAM 的两个单元 DIGIT 和 DIGIT+1 中。12 位数字量的高 8 位在 DIGIT 单元,
低 4 位在 DIGIT+1 单元的低 4 位。若按图 10-11 的连接送数据到 DAC1210 转换器去转换,
则控制程序如下: MOV DPTR,#7FFFH ;8 位输入寄存器地址 MOV R0,#DIGIT ;高 8 位数字量地址 MOV A,@R0 ;取高 8 位数据 MOVX @DPTR,A ;高 8 位数送 DAC1210 MOV DPTR,#7FFEH ;4 位输入寄存器地址 INC R0 ;低 4 位数字量地址 MOV A,@R0 ;取低 4 位数据 SWAP A ;低 4 位与高 4 位交换 ANL A,#F0H ;A 低 4 位清“0” MOVX @DPTR,A ;低 4 位数据送 DAC1210,并完成 12 位 D/A 转换 如果 8031 与 DAC1210 的连接与图 10-11 所示不完全相同,则相应的程序也要有所修改。
若系统有两个以上的 DAC1210 转换器,并需要同步控制,则它们的控制信号XFER 需要单独
控制并占用一个地址。当分别写入高 8 位数据和低 4 位数据后,再用公共地址(即XFER 信号)
去选通它们各自的 12 位 DAC 寄存器,可以使用几路 D/A 转换器同时转换,以达到同步控制
的目的。 12 位 D/A 转换器的种类很多,常用的还有 DAC1230 等,DACl230 的结构和 DAC1210
相似,但数据输入线只有 8 条,而且在 D/A 转换器芯片内部把 8 位输入寄存器的高 4 位输入
与低 4 位输入寄存器的输入线接在一起。因此,使用时与 DAC1210 转换器没有什么不同,
只是与 8 位 CPU 的接线更方便些。
第 10 章 MCS-51 与 D/A、A/D 的接口设计
·199·
10.4 D/A 转换器接口技术举例
D/A 转换技术可以应用在许多场合。在此,综合应用前面已学过的基础知识,介绍 8 位
D/A 转换器接口设计和程序设计。
10.4.1 单极性输出接口系统设计 【例】若在外部 RAM 区 6000H~607FH 单元中存放着一个控制模型(128 个 8 位二进制
数),要求实现如下功能:按顺序从 6000H 开始的存储区域中取出一个字节的二进制数据送
往 D/A 转换器转换成电压输出,经过时间 Δt 延时后,再取下一个字节数据,转换成电压输
出。直到 128 个字节都转换完毕,之后再从头重复执行上述过程。 1.系统硬件设计 硬件系统如图 10-12 所示,采用 32K×8 的 27C256 EPROM 做系统的外部程序存储器,
用 8K×8 的 6264 RAM 作系统的外部数据存储器。 27C256 EPROM和 6264 RAM的片选端CE 接 P2.7。27C256 EPROM地址空间为 0000H~
7FFFH,外部数据存储器 6264 地址空间为 6000H~7FFFH,由 P2 口提供高 8 位地址,P0 口
(通过 373)分时提供低 8 位地址和 8 位数据线。 外部数据存储器 6264 的读(OE端)和写(WE端)由 8031 的RD 和WR 信号控制。而
外部程序存储器 27C256 的读(OE端)由 8031 的程序存储器读选通PSEN信号控制,两者读
选通信号不同,因此不会发生冲突。 图 10-12 所示中的 D/A 转换器输出为单极性电压输出,输入数据端接口电路采用单缓冲
工作方式,CS、XFER 接 P2.6,编址为 BFFFH。
图 10-12 D/A 转换硬件接口电路
MCS-51 系列单片机原理与接口技术
·200·
2.程序设计 参考程序设计如下所示。 ORG 0000H LJMP DA0 DA0:MOV R7,#128 ;置数据长度 … …
MOV DPTR,#6000H ;选择 6264 MOV P2,#BFH ;置 D/A 指针高 8 位 MOV R0,#FFH ;置 D/A 指针低 8 位
DAl:MOVX A,@DPTR ;取数 MOVX @R0,A ;送数 INC DPTR ;指向下一个数据 MOV DPTR,#BFFFH ;选则输入寄存器 MOVX @DPTR,A ;数据送输入寄存器和 DAC 寄存器,完成 DA 转换
ACALL DLY ;调延时 Δts DJNE R7,DAl ;128 个数未完则重复转换工作 AJMP DA0 ;重新开始 END ;结束
延时 Δts 子程序略。图 10-12 中的运算放大器亦可选用 LF356 或 OP07 等集成电路。
10.4.2 双极性输出接口系统设计
D/A 转换器在很多随机控制系统中用作电压波形发生器。 1.硬件电路设计 在图 10-13 中,外接程序存储器 EPROM 和外接数据存储器 RAM 接口电路与图 10-12
相同,在此不再复述。 D/A 转换器输入数据采用单缓冲方式:即WR2 和WR1与 8031 的WR 连在一起,XFER
控制线与CS接 P2.6。当 P2.6=0 时,选通 D/A 通道。 对于 D/A 转换器输出部分的接口电路,由于考虑到由软件产生电压波形有正、负极性输
出,因此这部分电路设计成双极性电压输出。其中 U6、U7 亦可选用 LF356,OP07 等集成电
路,低噪声的运算放大器可选用 OP27 集成电路。 2.软件设计 在图 10-13 所示硬件电路支持下,只要编写不同的程序便可产生不同波形的模拟电
压。 (1)反向锯齿波程序清单
ORG 0000H MOV DPTR,#BFFFH ;指向 D/A 输入寄存器
LOOP0:MOV R7,#70H ;置输出初值 LOOP1:MOV A,R7 ;数字量送 A
第 10 章 MCS-51 与 D/A、A/D 的接口设计
·201·
MOVX @DPTR,A ;送 D/A 进行转换 DJNZ R7,LOOP1 ;修改数字量:R7=R7-1 AJMP LOOP0 ;重复下一个波形
其输出电压波形如图 10-14(a)所示。
图 10-13 电压波形发生器硬件电路
(2)正向锯齿波程序清单 ORG 0000H
MOV DPTR,#BFFFH ;指向 D/A 输入寄存器 LOOP0:MOV R7,#80H ;置输出初值 LOOPl:MOV A,R7 ;数字量送 A
MOVX @DPTR,A ;送 D/A 进行转换 INC R7 ;修改数字量:R7=R7+1 CJNE R7,#255,LOOP1 ;数字量是否是 255,不是则转 LOOP1 AJMP LOOP0 ;重复下一个波形
其输出电压波形如图 10-14(b)所示。 (3)双向锯齿波程序清单 ORG 0000H
MOV DPTR,#BFFFH ;指向 D/A 输入寄存器
MCS-51 系列单片机原理与接口技术
·202·
MOV R7,#0 ;置输出初值 LOOP:MOV A,R7 ;送 D/A 进行转换
MOVX @DPTR,A INC R7 ;修改数字量:R7=R7+1 AJMP LOOP
其输出波形如图 10-14(c)所示。 (4)三角波程序清单 ORG 0000H
MOV DPTR,#BFFFH ;指向 D/A 输入寄存器 LOOP1:MOV R7,#80H ;置输出初值 LOOP2:MOV A,R7 ;送 D/A 进行转换
MOVX @DPTR,A INC R7 ;修改数字量:R7=R7+1 CJNZ R7,#255,LOOPl ;数字量是否是 255,不是则转 LOOPl
LOOP:DEC R7 ;修改数字量:R7=R7-1 MOV A,R7 MOVX @DPTR,A ;送 D/A 进行转换 CJNE R7,#80H,LOOP2 ;数字量是否是 128,不是则转 DAS2 AJMP LOOP0
其输出波形为正向三角波如图 10-14(d)所示。 (5)正弦波电压输出 正弦波电压输出为双极性电压,最简单的办法是将一个周期内电压变化的幅值(-5V~
+5V)按 8 位 D/A 的分辨率分为 256 个数值,然后依次将这些数字量送入 D/A 转换输出。只
要循环不断地送数,在输出端就能获得正弦波输出,如图 10-14(e)所示。正弦波程序清单: ORG 0000H
MOV R7,#00H ;设置偏移量 LOOP:MOV A,R6
MOV DPTR,#TAB ;设指针,指向表首 MOVX A,@A+DPTR ;取数据 MOV DPTR,# BFFFH MOVX @DPTR,A ;送 D/A 转换 INC R6 ;修改偏移量 AJMP LOOP
TAB:DB 80H,83H,86H,89H,8DH,90H DB 93H,96H,99H,9CH,9FH,0A2H DB 0A5H,0A8H,0ABH,0AEH … … JB 6FH,72H,76H,79H,7CH,80H
第 10 章 MCS-51 与 D/A、A/D 的接口设计
·203·
图 10-14 D/A 输出电压波形
10.4.3 双路 D/A 同步控制系统设计
DAC0832 工作在双缓冲方式时,输入寄存器的锁存信号和 DAC 寄存器锁存信号分开控
制,这种方式适合于几路模拟量同步输出的控制系统,每一路模拟量输出需要一个 DAC0832,构成多个模拟量同步输出的控制系统。
图 10-15 所示为双极性双路 D/A 同步输出的 8031 系统。图中 U2 和 U3 的第一级缓冲器
的选通由 8031 的 P2.5 和 P2.6 线选控制,其地址分别为 DFFFH 和 BFFFH,第二级缓冲器共
用一个选通信号(地址)由 8031 的 P2.7 线选控制,其地址为 7FFFH。8031 执行下列程序,
即可完成双路 D/A 同步控制。
图 10-15 双路 0832 与 8031 接口电路
MCS-51 系列单片机原理与接口技术
·204·
编程操作: MOV DPTR,#DFFFH ;选通 U2 输入寄存器 MOV A,#DATA1 ;数字量送 A MOV @DPTR,A ;数字量锁入 U2 输入寄存器 MOV DPTR,#BFFFH ;选通 U3 输入寄存器 MOV A,#DATA2 ;数字量送 A MOVX @DPTR,A ;数字量锁入 U3 输入寄存器 MOV DPTR,#7FFFH ;选通 U2、U3 的 DAC 寄存器 MOVX @DPTR,A ;同步 D/A 转换
在图 10-15 中若将 U2、U3 的第二级缓冲器锁存信号分开控制,并修改相应的程序,就
可以对异步输出进行控制。
10.5 A/D 转换器
能够将模拟量转换成数字量的器件称为模数转换器,简称 A/D 转换器或 ADC。计算所
能识别并处理的都是数字量,然而在一些实际的测控系统中所发生的各种物理参数常常是一
些模拟量(如压力、温度、位移等)。对于这样一些物理参数首先用传感器将其转换成电倍号
(电压或电流),再经过模/数转换器转换成数字信号,传送给计算机进行处理。 A/D 转换器的种类很多,就位数来分,有 8 位、10 位、12 位和 16 位等。位数越高其分
辨率就越高,价格也越贵。和 D/A 转换器一样,A/D 转换器型号很多,在精度、转换速度和
价格上差别很大。根据 A/D 转换器的工作原理,常用的 A/D 转换器可分为两种,双积分式
A/D 换器和逐位逼近式 A/D 转换器。
10.5.1 双积分 A/D 转换器原理
双积分 A/D 转换器采用间接测量原理,它将被测电压转换成时间常数 T,其工作原理如图
10-16 所示。双积分 A/D 转换器由电子开关、积分器、比较器、计数器和控制逻辑等 5 部分组成。 所谓双积分就是进行一次 A/D 转换需要两次积分。电路先对被测的输入电压 Vx 进行固
定时间(T0)的正向积分,然后控制逻辑将积分器的输入端通过电子开关接参考电压 VR.由于参考电压与输入电压反向,且参考电压值是恒定的,所以反向积分的斜率是固定的。从反
向积分开始到结束,对参考电压进行反向积分的时间 T,正比于输入电压。
图 10-16 双积分 A/D 转换器原理
第 10 章 MCS-51 与 D/A、A/D 的接口设计
·205·
如图 10-16(b)所示,输入电压越大,反向积分时间越长。用高频标准时钟脉冲计数测
此时间,即可得到相应于输入电压的数字量。双积分 A/D 转换器的特点有:可有效地消除干
扰和电源噪声;精度高;速度慢。此类转换器主要用于数字式测量仪表中。
10.5.2 逐位逼近式 A/D 转换器原理
逐位逼近式 A/D 转换器原理如图 10-17 所示。主要由 n位逐位逼近式寄存器、D/A 转换
器、比较器、控制逻辑和输出缓冲器 5 部分组成。
图 10-17 逐位逼近式 A/D 转换框图
能实现对分搜索,完成 A/D 转换。n位寄存器的初始状态为全“0”,当启动信号作用后,
先使最高位 Dn-1=n,位寄存器内容经 D/A 转换得到整个量程一半的模拟电压 Vs,并与输入
被测电压 Vx 比较,若 Vx 大于 Vs,则保留 Dn-1=1,若 Vx 小于 Vs,则 Dn-1清“0”。然后使
下一位 Dn-2=1,与上一次的结果一起经 D/A 转换后与 Vx 相比较,重复这样的过程直至使
D0=1;再将经 D/A 转换后得到的模拟量 Vs 与被测电压 Vx 比较,以决定 D0 位保留为“1”还是清“0”。这样经过 n 次逐位比较后,发出转换结果信号,此时,n 位寄存器的内容即为
转换后的数据,只要发送读(输出允许)信号即可获得 A/D 转换结果。逐位逼近式 A/D 转换
器从速度和转换精度来看比较适中,既有较高的速度和精度,电路结构又不太复杂,因而得
到广泛的应用,尤其是在一些实时控制系统中。
10.5.3 描述 A/D 转换器的性能参数
1.分辨率与量化误差(ResolutionandQuantizingError) A/D 转换器的分辨率与 D/A 转换器完全相同。实际上,无论是 A/D 转换器还是 D/A 转
换器,当其位数确定后,分辨率也已经确定。分辨率仅仅是一个参数,只能反映 A/D 转换器
对输入的敏感程度。量化误差是由于 A/D 转换器分辨率有限引起的误差,其大小通常规定为
±(1/2)LSB。该量反映了 A/D 转换器所能辨认的最小输入量,因而量化误差与分辨率是统一
的,提高分辨率可减少量化误差。 2.偏移误差 偏移误差是指输入模拟量为 0 时,输出数字量不为“0”的偏移值,一般在 A/D 转换器
外部加电位器作调节便可使偏移误差调至最小。 3.线性误差(Linearity) 线性误差又叫线性度,与 D/A 转换器一样,线性误差也是实际的输出特性曲线偏离理想
直线的最大偏移值。线性误差不论是对 A/D 转换器还是对 D/A 转换器都是十分重要的性能指
MCS-51 系列单片机原理与接口技术
·206·
标。它不包括量化误差、偏移误差,不像偏移误差那样可以进行调整,但可以用实验的方法
将误差测出,再用软件的方法进行补偿。 4.精度(Accuracy) A/D 转换器的精度可用绝对精度和相对精度来描述。绝对精度是指转换器在其整个工作
区间理想值与实际值之间的最大偏差。它包括量化误差、偏移误差和线性误差等所有误差。
相对误差是指绝对误差与满刻度值之比,一般用百分数(%)表示。 5.转换速度(ConversionRate) 转换速度是一项重要的技术指标。产品手册一般会给出完成一次转换所需的时间。一般
情况下,速度越高价格越贵。在应用时要根据实际需要和价格来选择器件。 6.电源灵敏度(SourceSensitivity) 当电源电压发生变化时,将使 A/D 转换器的输出数据发生±1LSB 变化时所对应的电源
电压变化范围。通常 A/D 转换器对电源变化的灵敏度用相当于同样变化的模拟输入量的百分
数表示。例如,电源灵敏度为 0.05%/ΔUs 时,其含义是电源电压 Us 变化 1%时,相当于引入
0.05%模拟量输入量的变化。
10.6 MCS-51 单片机与 8 位 A/D 转换器接口技术
8 位 A/D 转换器应用较为广泛,大都采用逐位逼近式进行转换。下面介绍国内应用最多
的 ADC0808/0809 转换器的性能、结构、工作原理及接口技术。
10.6.1 ADC0808/0809 的主要功能特点
分辨率为 8 位。 总的不可调误差在±(1/2)LSB 和±1LSB 范围内。 典型转换时间为 100μs。 具有锁存控制的 8 路多路开关。 具有三态缓冲输出控制。 单一+5V 供电,此时输入范围为 0~5V。 输出与 TTL 兼容。 工作温度范围-40~85。
10.6.2 ADC0808/0809 的组成及工作原理
如图 10-18 所示,ADC0808/0809 由两部分组成。 第一部分为 8 通道多路模拟开关以及相应的通道地址锁存与译码电路,可以实现 8 路模
拟信号的分时采集,3 个地址信号 A、B 和 C 决定哪一路模拟信号被选中并送到内部 A/D 转
换器中进行转换。C、B 和 A 为 000~111,分别选择 IN0~IN7。 第二部分为一个逐位逼近式 A/D 转换器,它由比较器、控制逻辑、三态输出缓冲器、逐
位逼近寄存器以及开关树和 256R 梯型电阻网络组成。其中由开关树和 256R 梯型电阻网络构
第 10 章 MCS-51 与 D/A、A/D 的接口设计
·207·
成 D/A 转换器。
图 10-18 ADC0808/0809 原理图
控制逻辑用来控制逐位逼近寄存器从高位至低位逐位取“1”,然后将此数字量送 D/A 转
换输出一个模拟电压 Vs,Vs 与输入模拟量 Vx 在比较器中进行比较,当 Vs>Vx 时,该位 Di=0,若 Vs≤Vx 时,该位 Di=l。因此从 D7 至 D0 逐位逼近并比较 8 次,逐位逼近寄存器中的数字
量,即为与模拟量 Vx 所对应的数字量。此数字量送入输出锁存器,并同时发出转换结束信
号 EOC(高电平有效,经反相器后,可向 CPU 发中断请求),表示一次转换结束。此时,CPU发出一个输出允许命令 OE(高电平有效),即可读取数据。
10.6.3 ADC0808/0809 管脚功能
ADC0808/0809 的引脚如图 10-19 所示。 (1)IN0~IN7:8 个模拟量输入端。 (2)START:启动 A/D 转换,当 START 为高电平时,A/D 开始转换。 (3)EOC:转换结束信号。当 A/D 转换结束时,由低电平转为高电平。此信号可用作
A/D 转换是否完成的查询信号或向 CPU 请求中断的信号。 (4)OE(OUTPUT ENABLE):输出允许信号或称为 A/D 数据读信号。当此信号为高电
平时,可从 A/D 转换器中读取数据。此信号可作系统中的片选信号。 (5)CLK:工作时钟,最高允许值为 1.2MHz,可通过外接振荡电路改变频率,也可用
系统 ALE 分频获得,当 CLK 为 640kHz 时,转换时间为 100μs。 (6)ALE:通道地址锁存允许,上升沿有效,锁存 C、B、A 通道地址,则选中的通道
的模拟输入送 A/D 转换器。 (7)A、B、C:通道地址输入,C 为最高,A 为最低。 (8)D0~D7:数字量输出线。 (9)VREF(+),VREF(-):正负参考电压,用来提供 D/A 转换器的基准参考电压。一
般 Vref(+)接+5V 高精度参考电源,VREF(-)接模拟地。 (10)Vcc,GND:电源电压 Vcc 接+5V,GND 为数字地。
MCS-51 系列单片机原理与接口技术
·208·
ADC0808/0809 的操作时序如图 10-20 所示。
图 10-19 ADC0808/0809 引脚 图 10-20 ADC0808/0809 时序
从时序图中可以看出,地址锁存信号 ALE 在上升沿将三位通道地址锁存,相应通道的模
拟量经多路模拟开关送到 A/D 转换器。启动信号 START 上升沿复位内部电路,START 信号
的下降沿启动 A/D 转换。此时转换结束信号 EOC 呈低电平状态,由于逐位逼近需要一定过
程,所以,在此期间模拟输入量应维持不变,比较器要一次次进行比较,直到转换结束。此
时转换结束信号 EOC 变为高电平,若 CPU 发出输出允许信号 OE(高电平),则可读出数据。
一次 A/D 转换的过程就完成了。ADC0808/0809 具有较高的转换速度和精度,受温度影响小,
且带有 8 路模拟开关,因此,用在测控系统中是比较理想的器件。
10.6.4 8031 与 ADC0808/0809 接口设计
1.硬件接口设计 A/D 转换器与单片机的硬件接口一般有两种方法。第一种方法是通过并行 I/O 接口与
8031 单片机连接(例如 8155 或 8255),需占用两个并行口(其中一个口接 A/D 转换器数据
线,另一个口用来产生 A/D 转换器工作控制信号);第二种接口方法是利用 ADC0808/0809转换器三态输出锁存功能,直接与 8031 的总线相连接。如图 10-21 所示,在系统中把
ADC0808/0809 转换器当作外部 RAM 单元对待。 系统中 ADC0808/0809 转换器的片选信号由 P2.7 线选控制,其通道地址 IN0~IN7 分
别为 7FF8H~7FFFH。当 8031 产生 写信号时,由一个或非门产生转换器的启动 START和地址锁存信号 ALE(高电平有效),同时将地址总线送出的通道地址 A、B、C 锁存,模
拟量通过被选中的通道送到 A/D 转换器,并在 START 下降沿时开始逐位转换,当转换结束
时,转换结束信号 EOC 变为高电平。经反相器可向 CPU 发中断请求,当 8031 产生 读
信号时,由一个或非门产生 OE 输出允许信号(高电平有效),使 A/D 转换结果读入 8031单片机。图 10-21 中设 8031 的晶振为 6MHz,分频后 ALE 为 1MHz 并作为转换器的时钟信
号 CLK。
第 10 章 MCS-51 与 D/A、A/D 的接口设计
·209·
图 10-21 8031 与 ADC0808/0809 转换器接口电路
2.ADC0808/0809 转换器程序设计方法 根据测量系统要求不同以及 CPU 忙闲程度,通常多采用 3 种软件编程控制方式:程序查
询方式、延时方式和中断控制方式。 (1)程序查询方式 对 A/D 转换器而言,程序查询方式就是条件传送 I/O 方式。在接入模拟量之后,发出一
个启动 A/D 转换命令,查询 P3.2( INT0 )引脚电平是否为“0”(A/D 转换器数据是否准备
就绪)的方法来读取 A/D 转换器的数据,否则继续查询,直到 P3.2( INT0 )引脚电平为“0”。这种方法较好地协调了 CPU 与 A/D 转换器在速度上的差别,通常用于检测回路较少,且 CPU工作不十分繁忙的情况下。
【例】模拟量由通道 0 输入,转换成对应的数字量之后存入内部 RAM 的 10H 单元中。 程序清单:
MOV R0,#10H ;置数据缓冲区指针 MOV DPTR,#7FFFH ;置 IN7 通道地址 MOVX @DPTR,A ;IN7 接 A/D,并启动 A/D JB P3.2,$ ; INT0 为高,则继续查询 MOVX A,@DPTR ; INT0 为低则数据读入 A MOV @R0,A ;存入 10H 单元
【例】求通道 7 模拟量 10 次采样的算术平均值,并存入内部 RAM 的 10H 单元中。 程序清单:
CLR A MOV R2,A MOV R3,A ;清除工作单元 R3、R2 MOV R7,#10 ;作采样次数计数器
MCS-51 系列单片机原理与接口技术
·210·
MOV DPTR,#7FFFH ;选 IN7 通道 LOOP1:MOVX @DPTR,A ;启动 A/D 转换
JB P3.2,$ ;等待 A/D 转换结束 MOVX A,@DPTR :采样 ADD A,R2 :加低 8 位 MOV R2,A ;存低 8 位 MOV A,R3 ;取高 8 位 ADDC A,#0 ;加 CY MOV R3,A ;存高 8 位 DJNZ R7,LOOP1 ;未完则继续. MOV R7,#3 ;R7 作移位计数器
LOOP2:CLR C ;清除 CY MOV A,R3 RRC A MOV R3,A MOV A,R2 RRC A MOV R2,A DJNZ R7,LOOP2 ;R3、R2 内容右移三次即除 8 MOV 10H,A ;存算术平均值
这种取 8 次采样平均值的方法,可以消除干扰,使采样数据更稳定可靠。 (2)延时方式 这种方式实际是无条件传送 I/O 方式,当向 A/D 转换器发出启动命令后,即进行软件延
时,延时时间取决于进行一次 A/D 转换所需的时间,此时 A/D 转换器的数据肯定转换完毕,
从 A/D 转换器中读取数据即为采样值。若 8031 的晶振为 6MHz,ALE 为 1MHz,A/D 转换时
间小于 100μs,则延时程序如下: MOV Rn,#25 ;延时常数 DJNZ Rn,$
为了确保转换完成,延时时间一定要大于 A/D 转换时间。 (3)中断采样方式 不论采用查询方式,还是采用延时方式,CPU 大部分时间都消耗在查询或延时等待上,
这在多回路的采样检测并且 CPU 工作很忙的测控系统中,不宜采用。在中断方式中,CPU启动 A/D 转换后,可以继续执行主程序。当 A/D 转换结束时,发出转换结束信号 EOC,该
信号经反相器接 8031 的 P3.2( INT0 )引脚,向 CPU 发出中断请求。CPU 响应中断后,即
可读入数据并进行处理。 【例】根据图 10-21 所示的接口电路连接图,采用中断方式对 IN0 通道的模拟输入量依次
采样 16 个点,存放在内部数据存储器 80H~8FH 单元中待用。 【解】程序分为 3 部分。 ①初始化程序:对中断寄存器和各工作单元初始化。 ②主程序:启动 A/D 转换、控制通道地址/数据存储器地址修改。
第 10 章 MCS-51 与 D/A、A/D 的接口设计
·211·
③中断服务程序:读取 A/D 转换器数据、送存数据。 程序清单如下:
ORG 0000H LJMP START ORG 03H LJMP INT0P
;初始化程序 ; START:MOV R0,#80H ;RAM 首地址
MOV R7,#16 ;采样点数 MOV SP,#3FH ;设堆栈区 SETB IT0 ;边沿触发 SETB EX0 ; INT0 开中断 SETB EA ;CPU 开中断
:主程序 MAIN0:MOV DPTR,#7FF8H ;A/D 通道首址 MAIN:CLR P0 ;清 P0
MOVX @DPTR,A ;启动 A/D 转换 DJNZ R7,MAIN ;16 个点未完,则继续 ;中断处理程序
INT0P:PUSH ACC ;进栈 SETB P0 ;置位 P0 MOVX A,@DPTR ;读 A/D 转换数据 MOV @R0,A ;A/D 数据送存 RAM INC R0 ;地址加“1” POP ACC ;退栈 RETI ;返回
【例】图 10-22 所示为 8031 与 ADC0809 的另一种接法,注意 0809 的操作时序,按查询
方式编制 IN0 通道采集程序段。 【解】在图 10-22 所示中,ADC0808/0809 转换器的片选信号仍由 P2.7 线选控制,端口地
址 7FFFH。当 8031 产生WR 写信号时,则由 U4A 产生地址锁存信号 ALE(高电平有效),
将数据线上送出的模拟量通道地址 A、B、C 锁存,被选中的模拟量送到 A/D 转换器;同时
再由 U5C 产生转换器的启动 START(低电平有效)信号,并开始逐位转换。当转换结束时,
转换结束信号 EOC 变高电平。经反相器 U5A 可向 CPU 发中断请求。当 8031 产生RD 读信
号时,由 U4B 和 U5B 产生 OE 输出允许信号(高电平有效),读取 A/D 转换结果。图 10-22所示中设 8031 的晶振为 6MHz,ALE 为 1MHz,用作转换器的时钟信号 CLK。
MCS-51 系列单片机原理与接口技术
·212·
图 10-22 8031 与 ADC0808/0809 转换器接口电路
程序如下: MOV DPTR,#7FFFH ;送 0809 端口地址 MOV A,#7FF8H ;送 IN0 通道地址 MOVX @DPTR,A ;锁存通道地址并启动 A/D NOP NOP JB P3.2,$ ; INT0 为高,则继续查询 MOVX A,@DPTR ;数据读入 A MOV 80H,A ;存入 80H 单元
注意:图 10-21 与图 10-22 所示是两种不同的接法,A/D 通道地址分别从地址总线和数据总线送
出,因此编程操作方法也不同。
10.7 MCS-51 单片机与 12 位 A/D 转换器接口技术
有一些测控系统对精度要求比较高,因此,前面所述的 8 位 A/D 转换器往往难以满足要
求,需要更多位数的 A/D 转换器,如 10 位、11 位、12 位 A/D 转换器。本节将以 AD574 为
例介绍 12 位 A/D 转换器的性能、结构、原理、接口技术及程序设计方法。AD574 是 AD 公
司的产品,是 12 位逐位逼近式带三态输出缓冲器的 A/D 转换器,它可以直接与 8 位或 16 位
微机总线连接。AD574 有 6 个等级:AD574J、K 和 L 专门适用于温度在 0~70的范围内的
情况;AD574S、T 和 U 则适用于温度在-55~+125范围内的情况,所有 AD574 都采用 28脚双列直插式封装。
第 10 章 MCS-51 与 D/A、A/D 的接口设计
·213·
10.7.1 AD574 的技术指标
分辨率:12 位。 非线性误差:±(1/2)LSB。 模拟输入(两个量程):双极性±5V、±10V,单极性 0~10V、0~20V。 供电电源:VLOGIC逻辑电源+5V,VCC(+12V/+15V),VEE(-12V/-15V)。 内部参考电平 10.00±0.1(max)V。 转换时间 25μs。 低功耗,390mW。
10.7.2 AD574 结构及工作原理
1.AD574 结构 AD574 的原理图如图 10-23 所示。
图 10-23 AD574 原理图
从图 10-23 所示中可以看出,AD574 由两部分组成,一部分是模拟电路,另一部分是数
字电路。其中模拟电路由高性能的 12 位 D/A 转换器 AD565(快速、单片结构、电流输出型、
建立时间 200ns)和参考电压组成。数字电路由控制逻辑电路、逐位逼近寄存器和三态输出
缓冲器组成。控制逻辑用以发起/停止复位信号,并控制转换过程。其转换原理与 ADC0809基本相同,也采用逐位逼近式原理工作。
2.AD574 引脚功能 AD574 引脚功能如图 10-24 所示。 (1)DB0~DB11:12 位数据线。 (2) :片选线,低电平有效。 (3)CE:片使能,高电平有效。
MCS-51 系列单片机原理与接口技术
·214·
图 10-24 AD574 引脚
CS、CE 均有效时,AD574 才能操作,否则处于禁止操作状态。 (4) CR/ :读出和启动转换控制线:当 CR/ =0 时,启动 AD574 转换;当 CR/ =1 时,
读 AD574 转换结果。 (5) 8/12 :为数据格式选择端。当 8/12 =1 时,12 位数据线一次读出,主要用于 16 位
微机系统; 8/12 =0 时,可与 8 位机接口。AD574 采用向左对齐的数据格式。 8/12 与 A0 配
合,使 12 位数据分两次读出:A0=0 时,读高 8 位;A0=1 时,读低 4 位(数据低半字节附
加零)。请注意, 8/12 不能用 TTL 电平控制,必须用+5V 或数字地控制。 (6)A0:为字节选择线。A0 引脚有两个作用,选择字节长度和与 8 位机接口时用于选
择读出字节。转换之前若 A0=1,则 AD574 按 8 位 A/D 转换,转换时间为 10μs;若 A0=0,则按 12 位 A/D 转换,转换时间为 25μs,这与 8/12 的状态无关。读操作中,A0=0,高 8 位数
据有效;而 A0=1,则低 4 位数据有效。但 8/12 =1(接+5V)时,则 A0 的状态不起作用。
以上控制信号的组合控制功能如表 10-3 所示。
表 10-3 AD574 控制信号真值表
CE A0 工作状态 0 × × × × 禁止 × 1 × × × 禁止 1 0 0 × 0 启动 12 位转换 1 0 0 × 1 启动 8 位转换 1 0 1 接 1 脚(+5V) × 12 位并行输出有效 1 0 1 接 15 脚(地) 0 高 8 位并行输出有效 1 0 1 接 15 脚(地) 1 低 4 位加上尾随 4 个 0 有效 (7)STS:转换结束信号。当启动 A/D 转换后,STS 信号变高电平,表示正处于转换状
态,转换完成时 STS 变低电平,该信号可向 CPU 发中断请求或供 CPU 查询用。 (8)10VIN、20VIN:模拟输入端。 (9)REFIN、REFOUT、BIPOS:参考输入、参考输出、双极性增益补偿调节端。 (10)Vcc、VEE、VL:工作电源,接+15V(12V),-15V(-12V),+5V。
第 10 章 MCS-51 与 D/A、A/D 的接口设计
·215·
(11)DC、AC:数字地与模拟地。 3.AD574 的控制时序 图 10-25 所示是 AD574 转换器的控制时序波形图。
图 10-25 AD574 控制时序
由图 10-25(a)所示启动转换时序可见:只有当 CE=1、CS=0 且 TR/ 为低电平时,才
能开始启动转换。在控制程序中,应先让 TR/ 为低电平,然后使 CE 或CS变为有效,否则将
产生不必要的读操作,此时数据线将呈高阻状态。 图 10-25(b)所示为 AD574 读操作时序图。在转换器被选中的情况下,使 CR/ =1,即
可读出转换结果。
10.7.3 AD574 转换器的应用
AD574 有单极性和双极性两种工作方式,可根据模拟输入信号的性质来选择。 1.单极性输入 单极性模拟量输入有两种量程,0~10V 量程使用引脚 13 和 9;0~20V 量程使用引脚 14
和 9,如图 10-26(a)所示。图中电位器 Wl(100kΩ)用作满量程调整,W2(100kΩ)用作
零位调整。
图 10-26 单极性与双极性输入
MCS-51 系列单片机原理与接口技术
·216·
2.双极性输入 双极性输入也有两种量程:-5V~+5V 量程使用引脚 13、9 和 12;-10V~+10V 量程使用
引脚 14、9 和 12,如图 10-26(b)所示。图中 Wl、W2 均为 100Ω电位器,用来调整满量程
和零位。
10.7.4 AD574 与单片机的接口及程序设计
1.硬件接口设计 根据 AD574 的控制信号真值表与控制时序,可以很容易地设计出 AD574 与 8031 单片机
的接口电路,其接口电路如图 10-27 所示。
图 10-27 AD574 与 8031 接口电路
其中,AD574 的输出是三态锁存器,因而可直接与 8031 单片机数据总线接口。该电路
是 12 位向左对齐的数据输出格式,AD574 的低 4 位 DB3~DB0,接到 8031 的 D7~D4 上;
AD574 的高 8 位 DB11~DB4 接到 8031 的 D7~D0 上。可分两次读出数据,第一次读高 8 位,
第二次读低 4 位。为了便于位寻址查询,AD574 的标志 STS 接 8031 单片机的 INT0 。 根据真值表可知 AD574 共有 5 根控制线。
8/12 :常接地,与 8 位机接口。 CE:由WR 和RD 信号通过一个与非门控制,不论是读操作还是写操作,CE 均为“1”,
片使能有效。 CS:由地址线 P27 控制,当 P27=0 时,片选有效。
CR/ :由地址线 A1 控制,当 Al=0 时,启动 A/D 转换,当 A1=1 时,读取 A/D 转换数
据。 A0:由地址线 A0 控制,当 A0=0 时,读高 8 位,当 A0=1 时,读低 4 位。 因此,AD574(12 位)启动地址为 7FFCH,高 8 位读取地址为 7FFEH,低 4 位读取地
址为 7FFFH。
第 10 章 MCS-51 与 D/A、A/D 的接口设计
·217·
2.程序设计 12 位 A/D 转换器与 8031 单片机的程序设计方法,与 8 位 A/D 转换器的程序设计方法一
样,也可采用 3 种方法,即程序查询方式、延时方式和中断控制方式。由于 AD574 转换器的
速度较快,所以大都采用程序查询方法。 查询法程序清单如下:
MOV DPTR,#7FFCH ;(12 位)A/D 启动地址 MOV R1,#80H ;结果存放地址 MOVX @DPTR,A ;启动 A/D 转换 JB INT0 ,$ ;查询 A/D 转换是否结束 MOV DPTR,#7FFEH MOVX A,@DPTR ;读取高 8 位数 MOV @R1,A ;存高 8 位数 INC DPTR ;低 4 位地址 INC R1 ;存放地址+1 MOVX A,@DPTR ;读取低 4 位数 AND A,#F0H ;屏蔽无关位 MOV @R1,A ;存 A/D 低 4 位数
在上面程序中,若将 JB INT0 ,$指令改为 ACALL DLY35(延时 35μs 子程序)则
程序变为延时方式,此时不必用 INT0 查询 STS 的状态。若采用中断方式,要相应地编写
中断初始化程序和中断服务子程序。
10.8 习题
1.什么是 D/A 转换器,试简述其工作原理。 2.D/A 变换的技术指标有哪些?分别指的是什么? 3.DAC0832 与 80C51 单片机连接时有哪些控制信号?其作用是什么? 4.什么是双缓冲方式?在什么情况下要使用D/A转换器的双缓冲方式?试以DAC0832
为例画出该方式的接口电路。 5.在一个晶振位 12MHz的80C51系统中,接一片ADC0809,其地址位0EFF8~0EFFFH。
试画出其接口电路。并编写定时采样 0~3 通道的程序。设采样频率为每次 2ms,每个通道
采 50 个数。把所采的数按 0、1、2、3 通道的顺序存放在以 2000H 为首地址的片外存储区
内。
第第 1111 章章 应应用用系系统统设设计计与与开开发发
单片机应用系统是指以单片机为核心,配以一定的外围电路和软件,能实现某种或几种
功能的应用系统。它由硬件部分和软件部分组成。一般来说,应用系统所要完成的任务不同,
相应的硬件配置和软件配置也就不同。为了保证系统可靠工作,在软、硬件的设计中,还要
考虑其抗干扰能力。
11.1 应用系统设计
应用系统设计包括总体设计、硬件设计和软件设计。
11.1.1 总体设计
设计系统时,首先要对应用系统进行全面的分析和研究,论证后制订出总体方案,然后
再对总体方案具体分析,建立数学模型,确定任务。 1.需求分析 对系统要完成的任务、涉及的对象、硬件资源和工作环境进行周密的调查研究,明确各
项指标要求,在综合考虑的基础上,对各项指标给出符合实际的明确定义。 2.建立数学模型 设计者还应对测控对象的物理过程和计算任务进行全面分析,并从中抽象出数学表达
式,即建立数学模型。数学模型应真实地描述该项目的测控过程,数学模型应该精确,并尽
可能简单。 3.机型和器件的选择 根据系统的目标、复杂程度、可靠性、精度、速度和价格等方面的要求,选择性价比比
较合理的单片机机型。 元器件的选择要符合系统的精度、速度和可靠性等方面的要求。 4.硬件和软件功能划分 系统的硬件配置和软件的设计是紧密联系的,而且在某些场合,硬件和软件还有一定的
互换性。多用硬件可以提高工作速度,减少软件开发的工作量,但硬件成本较高;若用软件
代替某些硬件功能,可以减少开支,但却增加了软件研制的复杂性。因此,在总体设计时,
必须权衡利弊,合理搭配软、硬件的比重。
11.1.2 应用系统的硬件电路设计
在硬件设计时,既要考虑硬件系统的基本配置,又要考虑选用什么样的元器件。元
第 11 章 应用系统设计与开发
·219·
器件的性能对硬件的可靠性影响很大。元器件产品一般分为军用产品、工业产品和商业
产品。这些产品在性能和技术指标方面有较大差异,一般来说,军用产品性能 好,但
价格贵;商用产品性能较差,但价格便宜;而工业产品居中。另外,同类产品不同型号
之间,性能与技术指标也有一定的差别,例如,8031、8035 单片机优于 Z-80 微处理器,
而 8031 单片机又优于 8035 单片机。因此,用户选用时应根据实际需要合理选择,既要
考虑硬件系统的可靠性、运行速度、抗干扰能力,又要考虑成本。 下面简单说明设计 MCS-51 单片机硬件系统时需要考虑的问题。
(1)单片机芯片的选择。在 MCS-51 系列单片机中有许多产品,如 8031/8051/8751、AT89C51、AT89C2051、80C31/80C51/87C51、8032/8052 以及 83C252/80C252/87C252 等。
这些系列产品在结构原理方面基本相同,但在性能指标方面各不相同。因此,用户在选用
时,应根据实际需要合理选择。由于 8051 单片机内部具有 4KBROM 存贮器,可用来固
化用户的系统程序,但 ROM 存贮器中的信息须在厂方生产时写入,用户不能自行写入,
这给使用者带来很大不便。8751 单片机内部有 4KBEPROM 存贮器。用户可根据需要自行
写入,同时还可以加密,但其价格比较昂贵。8031 内部虽然没有程序存贮器,但可外扩
EPROM 存贮器,且价格优于其他产品,所以得到广泛采用。AT89C51 和 AT89C2051 内
部分别有 4KB 和 2KB 的闪速存贮器,给产品设计带来了很大的方便,因而备受欢迎,特
别是 AT89C2051,体积小,更受青睐。其中名称中间带 C 的产品为低功耗产品,比没带
C 的产品要贵一些。 (2)数据存贮器的选择。数据存贮器可先用 6116、6264、62256 等芯片。若容量要求不
大,可使用 I/O 接口芯片 8155 的内部 RAM。 (3)I/O 接口的选择。在 8031 单片机内部,设置了 4 个并行 I/O 接口和一个串行通信接
口。在硬件设计时,这些接口均可供用户使用,但对于较大的用户系统,这些接口就不够用
了,需要进行外部扩展。例如,在许多单片机开发机中,使用并行 I/O 接口 8155 与键盘和显
示器连接,使用 8255 与打印机等外围设备连接。8155 和 8225 是外部接口常用的芯片。在选
用 8155 时,用户除获得两个 8 位、1 个 6 位并行 I/O 接口外,还可获得 256 个字单元的 RAM存贮器和 1 个 14 位定时器/计数器。对于串行通信接口,也可由外部扩展,可选用 8251、8273或 8274 等芯片。
(4)系统速度匹配。系统速度不仅对硬件系统的可靠性有直接的影响,还影响到硬件成
本和设计费用。8031 单片机的时钟频率可在 1.2~12MHz 之间任意选择。因此,在不影响系
统总功能前提下,时钟频率选择低一些好。这样,可以降低系统对其他元器件的要求,有利
于降低成本,提高可靠性。如果单片机的时钟频率较高,一定要查阅器件手册,选择与主机
速度相匹配的元器件。 (5)负载能力。8031 的外部扩展能力很强,但内部 I/O 接口的负载能力有限,有时不能
满足系统的需要,如 P0 可驱动 8 个 TTL 电路,其他口仅能驱动 3 个 TTL 电路。为了保证硬
件系统的可靠性,在实际使用时,若负载较重,就要增设驱动器,来提高驱动负载的能力。
例如,P0 口外接双向总线驱动器 74LS245,P2 口、PSEN 、ALE 端外接 74LS244 或相当的
门电路。
MCS-51 系列单片机原理与接口技术
·220·
11.1.3 应用系统的软件设计
在进行应用系统的总体设计时,软件设计和硬件设计应统一考虑。当系统的电路设计定
型后,软件的任务也就明确了。 系统中的应用软件是根据系统功能要求设计的。一般地讲,软件的功能可分为两大类。
一类是执行软件,它能完成各种实质性的功能,如测量、计算、显示、打印、输出控制等;
另一类是监控软件,它专门用来协调各执行模块和操作者的关系,在系统软件中充当组织调
度角色。设计人员在进行程序设计时应从以下几个方面加以考虑。 (1)根据软件功能要求,将系统软件分成若干个相对独立的部分。设计出合理的软件总
体结构,使其清晰、简捷、合理。 (2)各功能程序实行模块化、子程序化。这样既便于调试、链接,又便于移植、修改。 (3)在编写应用软件之前,应绘制出程序流程图。这不仅是程序设计的一个重要组成部
分,而且是决定成败的关键部分。从某种意义上讲,多花一份时间来设计程序流程图,可以
节约几倍源程序编辑、调试时间。 (4)要合理分配系统资源,包括 ROM、RAM、定时器/计数器、中断源等,其中
关键的是片内 RAM 分配。对 8031 来讲,片内 RAM 指 00H~7FH 单元,这 128 个字节
的功能不完全相同,分配时应充分发挥其特长,做到物尽其用。例如在工作寄存器的 8个单元中,R0 和 R1 具有指针功能,不要移为它用;20H~2FH 这 16 个字节具有位寻址
功能,用来存放各种标志位、逻辑变量、状态变量等;设置堆栈区时应事先估算出子程
序和中断嵌套的级数及程序中栈操作指令使用情况,其大小应留有余量。若系统中扩展
了 RAM 存储器,应把使用频率 高的数据缓冲器安排在片内 RAM 中,以提高处理速
度。当 RAM 资源规划好后,应列出一张 RAM 资源详细分配表,以备编程查用方便。 (5)要在程序的有关位置处写上功能注释,以提高程序的可读性。
11.1.4 调试与固化
1.上机调试 上机调试程序是检验程序正确性的一个重要环节。调试时,应在单片机开发系统上先对
程序进行分块调试,对入口参数和变量预赋初值,观察运行结果。如果执行结果和预想的不
一致,可采用设置断点或单步运行的方法,找出错误并修改错误。 2.系统模拟调试 系统模拟调试是把已调好的各程序模块,按照总体设计要求联成一个完整的程序,并与
所设计的硬件系统进行联机调试。系统模拟调试仍借助开发系统进行。在系统模拟调试时,
可能会有某些支路上的程序模块,因受条件制约而不具备相应的入口参数。这时,调试人员
应创造条件,进行模拟调试。每调试好一个程序模块,就把它接到主程序结构的指定位置上,
直到 后一个程序模块调试完毕并与主程序连接。 3.在线仿真调试 模拟调试一般在实验室进行。但是,现场环境往往与实验室环境不同,模拟的外围设备
和实际的外围设备之间也存在差异。因此,还要在现场进行在线仿真调试。
第 11 章 应用系统设计与开发
·221·
仿真是用开发系统的 CPU,替代被开发系统(又叫目标系统)的 CPU 进行工作,即用
开发系统的资源仿真目标机。开发系统提供的 CPU 称为仿真 CPU。它与目标系统的 CPU 对
目标系统的控制作用和工作过程,几乎完全一样。用户可以通过开发系统控制仿真 CPU 的运
行,并观察运行的结果和所产生的问题,以便现场修改。 在线仿真是指仿真 CPU 运行和控制的硬件环境,使其与目标机的实际运行环境完全一
样。在线仿真调试是用开发系统在生产现场实际在线调试。在实际环境、实际外围设备下调
试的程序,将完全合乎实际的要求。
11.1.5 程序固化
在线仿真调试完毕后,借助开发系统中的编程器,将调试完毕的应用程序写入 EPROM芯片中。因写入 EPROM 中的程序和数据不可修改,且停电后也不会丢失,所以称为程序固
化。把固化后的程序插入目标系统,目标系统就可以现场独立运行。但在系统真正投入使用
前,还应进行一段时间的试运行。通过试运行,可以进一步发现程序和硬件电路的问题和不
足,进一步观察和检测软硬件系统能否经受实际环境的考验,是否真正满足实际要求。不满
足实际要求的硬件和软件,要更换修改,直至满足实际要求。
11.1.6 硬件抗干扰措施
来自供电系统、通过导线传输、电磁耦合等产生的电磁干扰信号,是单片机系统工作不
稳定的重要根源。下面简单地介绍常见的干扰源和相应的抗干扰措施。 1.电源噪声及其抑制方法 电源噪声主要是从供电系统引入系统的,常规抑制电源噪声干扰措施有如下 6 种。 (1)安装电源低通滤波器,并用带屏蔽层的电源变压器,与其他供电电路相隔离,线路
如图 11-1 所示。 (2)交流电引进线应尽可能短,引进接口靠近变压器和低通滤波器,防止交流 50Hz 信
号对系统的干扰。 (3)电源变压器的容量留有一定余地。 (4)采用性能优良的直流稳压线路,增大输入/输出滤波电容,减少电源波纹系数。 (5)逻辑电路、模拟电路的布线尽量分开,使供电电源各有良好的退耦电路。 (6)系统中逻辑地、模拟地应一点相连,外壳地线和公共地线应分开走线,若允许直接
相连,应在某一点可靠地相连,否则用 1~10μF 的电容相连。 2.输入/输出通道的干扰及其抑制方法 输入/输出通道是 CPU 与外部设备、被控对象进行信息交换的渠道。由输入/输出通道引
进的干扰主要是公共地线引起的,其次是受到静电噪声和电磁波干扰引起的。常用的抗干扰
措施有如下 3 种。 (1)使用双绞线。双绞线抗共模干扰的能力较强,可以作为接口连接线。图 11-2 给出了
双绞线用于接口连接线的示意图。
MCS-51 系列单片机原理与接口技术
·222·
图 11-1
图 11-2
(2)使用光隔离电路。在噪声电平较大的地方,光电隔离器作为数字量、开关量的输入
/输出隔离电路,效果良好。 图 11-3 所示为几种光隔离耦合的电路。
(3)终端阻抗匹配。当数字信号进行远距离传送时,可以使用平衡输出的驱动器和
平衡输入的接收器,使阻抗匹配,以提高信号的质量。图 11-4 所示为平衡输入/输出的
参考电路。 3.电磁场干扰及其抑制方法 若系统外部存在的电磁场的干扰源或系统控制的对象本身就是电磁场干扰源(如控制电
机转速、控制继电器动作等情况),那么强烈的电磁感应也将影响系统的可靠性。电磁场干扰
可以采用屏蔽的方法加以解决。
第 11 章 应用系统设计与开发
·223·
图 11-3
(1)对干扰源进行电磁屏蔽(如变压器、继电器等)。 (2)对整个系统进行电磁屏蔽,传输线采用屏蔽线。
图 11-4
11.1.7 软件的抗干扰设计
软件抗干扰就是采用软件编程的方法抑制或剔除干扰信号。 1.看门狗的应用 看门狗也被称为程序运行监视器,能有效地防止单片机程序系统在不可预测的干扰作用
下产生的程序执行紊乱,即程序跑飞。看门狗启动后,它就监视程序循环运行的时间,若发
现超过正常的循环时间,则认为系统陷入了死循环,此时,看门狗会自动将单片机程序复位。 2.软件陷阱与指令冗余 单片机系统如果受到干扰,程序指针值会被改变,往往将操作数作为指令来执行。这时
若 CPU 遇到的是一个单字节指令,程序就能正确执行这个单字节的指令,之后的指令也不会
错位,这样程序就又恢复正常运行。所以,在关键的地方适当插入一些 NOP 空操作单字节指
令,可以有效地抑制程序受到的外界干扰,这就是指令冗余的一种方式。 通常,不在调试期间考虑指令冗余。在调试收尾阶段,程序基本上调试成功了,这时,
根据程序的大小和单片机程序存储器空间的大小,在一些对程序流向起决定性作用的指令之
前插入两条以上的 NOP 指令,以保证跑飞错位的程序尽快恢复。以 80C51 系列单片机为例,
MCS-51 系列单片机原理与接口技术
·224·
在如下指令之前考虑加上 NOP 指令: RET、LCALL、SCALL、LJMP、SJMP、BR、JBC、JBS、JNST、JST、JNH、JH、JGH、
JLE、JNC、JC、JNVT、JVT、JNV、JV、JGE、JLT、JNE。 如果跑飞的程序指针不在程序区,或是跑飞后很难执行到冗余指令就需要用到软件陷
阱。一般的软件陷阱用如下的 3 条语句构成。 NOP NOP LJMP ERROR 容易看出,这段程序使跑飞的程序强制进入出错处理子程序。软件陷阱一般放置在程序
断点之后,程序正确执行时不可能到达的地方,如下几种地方都需要放置软件陷阱。 程序各个模块之间,RET 指令结束之后,下一个程序模块开始前的地方。 未用的中断向量地址。 未用的大片程序存储器地址空间。 数据表格结束的后面。 软件陷阱和指令冗余是用软件抑制干扰,以把干扰对程序运行的影响减到 小。
11.2 单片机开发系统开发工具
单片机本身只是一个电子元件,只有当它和其他器件、设备有机地组合一起,并配置适
当的工作程序(软件)后,才能构成一个单片机应用系统,完成规定的操作,因此,单片机
的开发包括硬件和软件两个部分。 单片机本身没有自开发功能(通用计算机系统具有这种功能,用户可以在上面研制应用
软件或对系统进行扩展),必须借助于开发工具来排除目标系统样机中的硬件故障,生成目标
程序,并排除程序错误,当目标系统调试成功以后,还需要用开发工具把目标程序固化到单
片机的内部或外部 EPROM 芯片中。 单片机内部功能部件多、结构复杂、外部测试点(即外部引脚)少,因此不能全靠万用
表、示波器等工具像调试简单电子产品(例如晶体管收音机等)那样,测试单片机内部和外
部电路的状态。单片机的开发工具通常是一个特殊的、功能完备的计算机系统—开发系统
(或称为仿真器)。
11.2.1 单片机开发系统的构成
单片机开发系统是开发单片机应用系统的必备工具。单片机开发系统也是一种计算机系
统,通常由一台系统机、一个通用在线仿真器和一个通用编程器组合而成。现在,开发系统
一般将通用在线仿真器和通用编程器组合在一起,构成一台通用开发器。一套通用的单片机
开发系统如图 11-5 所示。
第 11 章 应用系统设计与开发
·225·
图 11-5 通用单片机开发系统
图 11-5 中的 PC 机为系统机,它通过 RS-232C 串行口与开发器相连。开发器通过仿真插
头与用户目标系统相连。下面介绍单片机开发系统的功能。
11.2.2 单片机开发系统的功能
单片机开发系统应具有对用户程序进行输入、编辑、汇编和调试的功能,此外,还必须
具备在线仿真功能。辅助设计功能是衡量单片机开发系统性能高低的重要标志。 1.程序输入和编辑 利用开发系统中的 PC 机运行开发编辑软件,开发系统可以对用户程序进行输入、删除
和编辑等。有的开发系统自身带小键盘和 LED 数码显示管,甚至通用键盘和液晶显示器,以
便使开发系统本身具有开发能力,这时,一般要使用机器语言或汇编语言。 2.对用户程序进行汇编、连接和装载 开发系统能够把用户源程序编译成可执行的目的代码。通常,对源程序的汇编和连接,
应在开发系统的 PC 机上进行,并通过 RS-232C 串行通信口装载到通用在线仿真器中。 3.对用户程序进行调试 开发系统具有对用户程序进行调试的功能。开发系统能使用户有效地控制目标程序的运
行,以检查程序运行的结果,并对硬件故障和软件错误进行定位。因此,开发系统应具有单
步运行、设置断点运行和连续运行的功能,具有对目标系统状态读出和修改的功能;以及跟
踪程序运行等功能。 (1)设置断点运行 设置断点运行是为调试程序设置若干个断点,让程序带断点运行。每当程序运行到一个
断点处,便停止向下运行,而将运行的中间结果及某些寄存器的内容显示出来。这样,可以
缩小查找错误的范围。 (2)单步运行 单步运行是程序每执行一条指令,便将运行的中间结果和某些寄存器的内容显示出来,
以监视每条指令的执行结果,查找错误并将错误定位在具体的指令上。 (3)连续运行 连续运行是从第一条指令,到 后一条指令的全程连续运行。 (4)对目标系统状态读出和修改 单片机开发系统具有读出和修改目标系统状态的功能。当 CPU 停止执行目标系统程序
后,用户借助开发系统可方便地读出或修改目标系统所有资源的状态,以检查运行结果和了
MCS-51 系列单片机原理与接口技术
·226·
解设置的初始参数等。 4.反汇编功能 单片机开发系统还具有反汇编功能,能将编译生成的目标程序反汇编成汇编语言在程序
调试过程中经常要用到。 5.跟踪功能 高性能的单片机开发系统具有逻辑分析仪的功能,可跟踪存储器目标系统总线上的地
址、数据和控制信息的状态变化,并能同步记录总线上数据信息。用户还可根据需要显示所
跟踪的信息或某一位总线上状态变化的波形。 6.程序固化功能 调试完单片机应用系统的程序后,必须将其固化到 EPROM 中。因此,单片机开发系统
具有将程序固化到 EPROM 芯片的功能。有些开发系统还具有固化 EEPROM 的功能。 7.单片机开发系统的程序设计语言 单片机开发系统的程序设计语言有机器语言、汇编语言和高级语言。 机器语言只能在非常简单的开发系统中使用。机器语言的设计、输入、修改和调试都非
常繁锁,因此,利用它只能开发非常简单的应用系统。 汇编语言与硬件系统关系紧密,比机器语言灵活,且易于优化,用汇编语言设计的程序
占内存空间少,因此单片机中常用汇编语言进行程序设计。但使用汇编语言编程有一定的难
度和复杂性,只有对单片机的指令非常熟悉,并具有一定的汇编语言程序设计经验,才能设
计出功能较复杂的应用程序。 高级语言编程方便,易于掌握,且通用性好。只要掌握开发系统提供的高级语言,就可
以直接用该语言编写程序。MCS-51 系列单片机开发系统所使用的高级语言有 C-51、PL/M51和 MBASIC-51 语言等。用高级语言编写控制程序,在实用性、质量和结构紧凑等方面,均
有一定难度。
11.2.3 单片机开发器介绍
目前国产通用单片机开发器品种较多,如 SICE 系列(复旦大学研制)、DVCC 系列
(启东计算机厂制造)、KDV 系列(中国科大研制)、MICE(珠海万利电子有限公司制造)、
伟福 E2000(南京伟福实业有限公司)和 TDS51 开发及教学实验系统(西安唐都科教仪
器公司)。具体使用方法可参照相应产品的说明书。
11.3 习题
1.什么是单片机应用系统?在单片机应用系统设计中,应考虑哪几方面的问题? 2.应用系统的调试可分为几个步骤?各有什么作用? 3.如何提高应用系统的抗干扰性?可采用哪些措施? 4.单片机的开发系统应该具有哪些功能? 5.单片机的开发语言有哪些?各有什么特点?
附附录录 AA MMCCSS--5511 系系列列单单片片机机指指令令表表
附表 1 按照功能排列的指令表 数据传送指令
对标志位影响 序号 助记符 指令功能
CY AC OV P 操作码
1 MOV A,Rn A←Rn × × × √ E8H~EFH 2 MOV A,direct A←(dnect) × × × √ E5H 3 MOV A,@Ri A←(Ri) × × × √ E6H,E7H 4 MOV A,#data A←data × × × √ 74H 5 MOV Rn,A Rn←A × × × × F8H~FFH 6 MOV Rn,direct Rn←(direct) × × × × A8H~AFH 7 MOV Rn,#data Rn←data × × × × 78H~7FH 8 MOV direct,A direct←A × × × × F5H 9 MOV direct,Rn direct←Rn × × × × 88H~8FH 10 MOV direct1,direct2 directl←(direct2) × × × × 85H 11 MOV direct,@Ri direct←(Ri) × × × × 86H,87H 12 MOV direct,#data direct←data × × × × 75H 13 MOV @Ri,A (Ri)←A × × × × F6H,P7H 14 MOV @Ri,direct (Ri)←(direct) × × × × A6H,A7H 15 MOV @Ri,#data (Ri)←data × × × × 76H,77H 16 MOV DPTR,#data DPTR←datal6 × × × × 90H 17 MOVC A,@A+DPTR A←(A+DPTR) × × × √ 93H 18 MOVC A,@A 十 PC A←(A+PC) × × × √ 83H 19 MOVX A,@Ri A←(Ri) × × × √ E2H,E3H 20 MOVX A,@DPIR A←(DPTR) × × × √ E0H 21 MOVX @Ri,A (Ri)←A × × × √ F2H,F3H 22 MOVX @DPTR,A (DPTR)←A × × × × F0H 23 PUSH direct SP←SP+1,(direct)→SP-l × × × × C0H 24 POP direct Direct←(SP),SP→SP-1 × × × × D0H 25 XCH A,Rn A←→Rn × × × × C8H,CFH 26 XCH A,direct A←→(direct) × × × √ C5H 27 XCH A,@Ri A←→(Ri) × × × √ C6H,C7H 28 XCHD A,@Ri A3←→(Ri)3-0 × × × √ D6H,D7H
算术运算指令 对标志位影响
序号 助记符 指令功能 CY AC OV P
操作码
1 ADD A,Rn A←A+Rn √ √ √ √ 28H~2FH 2 ADD A,direct A←A+(direct) √ √ √ √ 25H 3 ADD A,@Ri A←A+(Ri) √ √ √ √ 26H,27H 4 ADD A,#data A←A+data √ √ √ √ 24H 5 ADDC A,Rn A←A+Rn+CY √ √ √ √ 38H~3FH 6 ADDC A,direct A←A+(direct)+CY √ √ √ √ 35H 7 ADDC A,@Ri A←A+(Ri)+CY √ √ √ √ 36H,37H 8 ADDC A,#data A←A+data+CY √ √ √ √ 34H 9 SUBB A,Rn A←A-Rn-CY √ √ √ √ 98H~9FH 10 SUBB A,direct A←A-(direct)-CY √ √ √ √ 95H 11 SUBB A,@Ri A←A-(Ri)-CY √ √ √ √ 96H,97H
MCS-51 系列单片机原理与接口技术
·228·
12 SUBB A,#data A←A-data-CY √ √ √ √ 94H 13 INC A A←A+1 × × × √ 04H 14 INC Rn Rn←Rn+1 × × × × 08H~0FH 15 INC direct Direct←(direct)+1 × × × × 05H 16 INC @Ri (Ri) ←(Ri)+1 × × × × 06H,07H 17 INC DPTR DPTR←DPTR+1 × × × × A3H 18 DEC A A←A-1 × × × √ 14H 19 DEC Rn Rn←Rn-1 × × × × 18H~1FH 20 DEC direct direct←(direct)-1 × × × × 15H 21 DEC @Ri (Ri) ←(Ri)-1 × × × × 16H,17H 22 MUL AB BA←A×B 0 × √ √ A4H 23 DIV AB A÷B=A…B 0 × √ √ 84H 24 DA A 对 A 进行 BCD 调正 √ √ √ √ D4H
逻辑运算和移位指令 对标志位影响
序号 助记符 指令功能 CY AC OV P
操作码
1 ANL A,Rn A←A∧Rn × × × √ 58H~5FH 2 ANL A,direct A←A∧(direct) × × × √ 55H 3 ANL A,@Ri A←A∧(Ri) × × × √ 56H,57H 4 ANL A,#data A←A∧data × × × √ 54H 5 ANL direct,A direct←direct∧A × × × × 52H 6 ANL direct,#data direct←(direct)∧data × × × × 53H 7 ORL A,Rn A←A∨Rn × × × √ 48H~4FH 8 ORL A,direct A←A∨(direct) × × × √ 45H 9 ORL A,@Ri A←A∨(Ri) × × × √ 46H,47H 10 ORL A,#data A←A∨data × × × √ 44H 11 ORL direct,A direct←direct∨A × × × × 42H 12 ORL direct,#data direct←(direct) ∨data × × × × 43H 13 XRL A,Rn A←A⊕Rn × × × √ 68H~6FH 14 XRL A,direct A←A⊕(direct) × × × √ 65H 15 XRL A,@Ri A←A⊕(Ri) × × × √ 66H,67H 16 XRL A,#data A←A⊕data × × × √ 64H 17 XRL direct,A direct←(direct) ⊕A × × × X 62H 18 XRL direct,#data direct←(direct) ⊕data × × × × 63H 19 CLR A A←0 × × × √ E4H 20 CPL A A← × × × × F4H 21 RL A
× × × × 23H
22 RR A
× × × × 03H
23 RLC A
√ × × √ 33H
24 RRC A
√ × × √ 13H
25 SWAP A
× × × × C4H
逻辑运算和移位指令 对标志位影响
序号 助记符 指令功能 CY AC OV P
操作码
1 AJMP addr11 PC10~PC0←addr11 × × × × &0(注) 2 LJMP addr16 PC←addr16 × × × × 02H
附录 A MCS-51 系列单片机指令表
·229·
3 SJMP rel PC←PC+2+rel × × × × 80H 4 JMP @A+DPTR PC←(A+DPTR) × × × × 73H
5 JZ rel 若 A=0,则 PC←PC+2+rel若 A≠0,则 PC←PC+2 × × × × 60H
6 JNZ rel 若 A≠0,则 PC←PC+2+rel若 A=0,则 PC←PC+2 × × × × 70H
7 CJNE A,direct,rel
若 A≠ (direct),则 PC←PC+3+rel 若 A= (direct),则 PC←PC+3 若 A≥(direct),则 CY=0;否则 CY=1
√ × × × B5H
8 CJNE A,#data,rel
若 A ≠ data , 则 PC ←PC+3+rel 若 A=data,则 PC←PC+3若 A≥data,则 CY=0;否
则 CY=1
√ × × × B4H
9 CJNE Rn,#data,rel
若 Rn ≠ data ,则 PC ←PC+3+rel 若 Rn=data,则 PC←PC+3若 Rn≥data,则 CY=0;否
则 CY=1
√ × × × B8H~BFH
10 CJNE @Ri,#data,rel
若 (Ri) ≠ data , 则 PC ←PC+3+rel 若(Ri)=data,则 PC←PC+3若(Ri)≥data,则 CY=0;否
则 CY=1
√ × × × B6H,B7H
11 DJNZ Rn,rel 若 Rn-1 ≠ 0 , 则 PC ←PC+2+rel 若 Rn-1=0,则 PC←PC+2
× × × × D8H~DFH
12 DJNZ direct,rel
若 (direct)-1≠0,则 PC←PC+3+rel 若 (direct)-1=0,则 PC←PC+2
× × × × D5H
13 ACALL addr11
PC←PC+2 SP←SP+1,(SP)←PCL
SP←SP+1,(SP)←PCH PC10~PC0←addr11
× × × × &1(注)
14 LCALL addr16
PC←PC+3 SP←SP+1,(SP)←PCL
SP←SP+1,(SP)←PCH
PC15~PC0←addr16
× × × × 12H
15 RET PCH←(SP),SP←(SP)-1 PCL←(SP),SP←SP-1 × × × × 22H
16 RETI PCH ←(SP),SP←(SP)-1 PCL←(SP),SP←SP-1 × × × × 32H
17 NOP PC-PC+1,空操作 × × × × 00H 位操作指令
对标志位影响 序号 助记符 指令功能
CY AC OV P 操作码
1 CLR C CY←0 √ × × × C3H 2 CLR bit Bit←0 × × × × C2H
MCS-51 系列单片机原理与接口技术
·230·
3 SETB C CY←1 1 × × × D3H 4 SETB bit Bit←1 × × × × D2H 5 CPL C CY← √ × × × B3H
6 CPL bit Bit← × × × × B2H 7 ANL C,bit CY←CY∧(bit) √ × × × 82H 8 ANL C,/bit CY←CY∧ √ × × × B0H 9 ORL C,bit CY←CY∨(bit) √ × × × 72H 10 ORL C,/bit CY←CY∨ √ × × × A0H 11 MOV C,bit CY←(bit) √ × × × A2H 12 MOV bit,C Bit←CY × × × × 92H
13 JC rel 若 CY=1,则 PC←PC+2+rel若 CY=0,则 PC←PC+2 × × × × 40H
14 JNC rel 若 CY=0,则 PC←PC+2+rel若 CY=1,则 PC←PC+2 × × × × 50H
15 JB bit,rel 若(bit)=1,则 PC←PC+3+rel若(bit)=0,则 PC←PC+3 × × × × 20H
16 JNB bit,rel 若(bit)=0,则 PC←PC+3+rel若(bit)=1,则 PC←PC+3 × × × × 30H
17 JBC bit,rel 若(bit)=1,则 PC←PC+3+rel且 bit←0 若(bit)=0,则 PC←PC+3
× × × × 10H
注:&0=a10a9a800001B √:表示对标志位产生影响
&1= a10a9a810001B ×:表示不影响标志位
附表 2 按照字母顺序排列的指令表 序号 助记符 指令码 字节数 机器周期数
1 ACALL addr11 &1 addr7-0(注) 2 2 2 ADD A,Rn 28H~2FH 1 1 3 ADD A,direct 25H direct 2 1 4 ADD A,@Ri 26H~27H 1 1 5 ADD A,#data 24H data 2 1 6 ADDC A,Rn 38H~3FH 1 1 7 ADDC A,direct 35H direct 2 1 8 ADDC A,@Ri 36H~37H 1 1 9 ADDC A,#data 34H data 2 1 10 AJMP addr11 &0 addr7-0(注) 2 2 11 ANL A,Rn 58H~5FH 1 1 12 ANL A,direct 54H data 2 1 13 ANL A,@Ri 56H~57H 1 1 14 ANL A,#data 54H data 2 1 15 ANL direct,A 52H direct 2 1 16 ANL direct,#data 53H direct data 3 2 17 ANL C,bit 82H bit 2 2
附录 A MCS-51 系列单片机指令表
·231·
续表 序号 助记符 指令码 字节数 机器周期数
18 ANL C,/bit B0H bit 2 2 19 CJNE A,direct,rel B5H direct rel 3 2 20 CJNE A,#data,rel B4H data rel 3 2 21 CJNE Rn,#data,rel B8H~BFH data rel 3 2 22 CJNE @Ri,#data,rel B6H~B7H data rel 3 2 23 CRL A E4H 1 1 24 CRL C C3H 1 1 25 CRL bit C2H bit 2 1 26 CPL A F4H 1 1 27 CPL C B3H 1 1 28 CPL bit B2H bit 2 1 29 DA A D4H 1 1 30 DEC A 14H 1 1 31 DEC Rn 18H~1FH 1 1 32 DEC direct 15H direct 2 1 33 DEC @Ri 16H~17H 1 1 34 DIV AB 84H 1 4 35 DJNZ Rn,rel D8H~DFH rel 2 2 36 DJNZ direct,rel D5H direct rel 3 2 37 INC A 04H 1 1 38 INC Rn 08H~0FH 1 1 39 INC direct 05H direct 2 1 40 INC @Ri 06H~07H 1 1 41 INC DPTR A3H 1 2 42 JB bit,rel 20H bit rel 3 2 43 JBC bit,rel 10H bit rel 3 2 44 JC rel 40H rel 2 2 45 JMP @A+DPTR 73H 1 2 46 JNB bit,rel 30H bit rel 3 2 47 JNC rel 50H rel 2 2 48 JNZ rel 70H rel 2 2 49 JN rel 60H rel 2 2 50 LCALL addr16 12H addr15-8addr7-0 3 2 51 LJMP addr16 02H addr15-8addr7-0 3 2 52 MOV A,Rn E8H~EFH 1 1 53 MOV A,direct E5H direct 2 1 54 MOV A,@Ri E6H~E7H 1 1 55 MOV A,#data 74H data 2 1 56 MOV Rn,A F8H~FFH 1 1 57 MOV Rn,direct A8H~AFH direct 2 1 58 MOV Rn,#data 78H~7FH data 2 1 59 MOV direct,A F5H direct 2 1 60 MOV direct,Rn 88H~8FH direct 2 1 61 MOV direct2,direct1 85H direct1direct2 3 2 62 MOV direct,@Ri 86H~87H direct 2 2 63 MOV direct,#data 75H direct data 3 2 64 MOV @Ri,A F6H~F7H 1 1 65 MOV @Ri,direct A6H~A7H direct 2 2 66 MOV @Ri,#data 76H~77H data 2 1 67 MOV C,bit A2H bit 2 2 68 MOV bit,C 92H bit 2 2
MCS-51 系列单片机原理与接口技术
·232·
续表 序号 助记符 指令码 字节数 机器周期数
69 MOV DPTR,@data16 90H addr15-8addr7-0 3 2 70 MOVC A,@A+DPTR 93H 1 2 71 MOVC A,@A+PC 83H 1 2 72 MOVX A,@Ri E2H~E3H 1 2 73 MOVX A,@DPTR E0H 1 2 74 MOVX @Ri,A F2H~F3H 1 2 75 MOVX @DPTR,A F0H 1 2 76 MUL AB A4H 1 4 77 NOP 00H 1 1 78 ORL A,Rn 48H~4FH 1 1 79 ORL A,direct 45H direct 2 1 80 ORL A,@Ri 46H~47H 1 1 81 ORL A,#data 44H data 2 1 82 ORL direct,A 42H direct 2 1 83 ORL direct,#data 43H direct data 3 2 84 ORL C,bit 72H bit 2 2 85 ORL C,/bit A0H bit 2 2 86 POP direct D0H direct 2 2 87 PUSH direct C0H direct 2 2 88 RET 22H 1 2 89 RETI 32H 1 2 90 RL A 23H 1 1 91 RLC A 33H 1 1 92 RR A 03H 1 1 93 RRC A 13H 1 1 94 SETB C D3H 1 1 95 SETB bit D2H bit 2 1 96 SJMP rel 80H rel 2 2 97 SUBB A,Rn 98H~9FH 1 1 98 SUBB A,direct 95H direct 2 1 99 SUBB A,@Rn 96H~97H 1 1 100 SUBB A,#data 94H data 2 1 101 SWAP A C4H 1 1 102 XCH A,Rn C8H~CFH 1 1 103 XCH A,direct C5H direct 2 1 104 XCH A,@Ri C6H~C7H 1 1 105 XCHD A,@Ri D6H~D7H 1 1 106 XRL A,Rn 68H~6FH 1 1 107 XRL A,direct 65H direct 2 1 108 XRL A,@Ri 66H~67H 1 1 109 XRL A,#data 64H data 2 1 110 XRL direct,A 62H direct 2 1 111 XRL direct,#data 63H direct data 3 2
注:&0=a10a9a800001B
&1= a10a9a810001B
附附录录 BB 习习题题答答案案
第 1 章 单片机概述
1.单片机是指集成了一个计算机系统的芯片,主要包括微处理器(CPU)、存储器(RAM、
ROM)和各种输入、输出接口(包括定时器/计数器、并行 I/O 接口、串行口、A/D 转换器以
及脉冲调制器 PWM 等)。单片机又称单片微控制器。 2.单片机的主要特点是集成度高、存储量大、速度快、抗干扰性强、指令丰富。 3.单片机主要应用领域包括家用电器领域、办公自动化领域、工业自动化领域、智能
仪器仪表与集成智能传感器领域、汽车电子与航空航天电子系统等。 4.单片机的主要发展方向包括如下几个方面:1.改进系统的 CPU,提高处理能力;2.增
大存储器容量以及采用 FLASH 和 EEPROM 存储器;3.增加片内 I/O 的驱动能力、功能以
及添加特殊功能的 I/O 口;此外还有使单片机集成外围电路以及降低单片机的功耗和加宽单
片机的供电范围。 5.MCS-51 系列中 8031、8051、8751 的区别主要在存储器方面:8031 片内不带程序存
储器 ROM;8051 片内有 4KB 一次性的 ROM,一次性写入用户程序后将不能在更改。8751与 8051 基本一样,但 8751 片内有 4KB 的 EPROM,用户可以将自己编写的程序写入单片机
的 EPROM 中进行现场实验与应用。
第 2 章 MCS-51 系列单片机的基本结构
1.80C51 单片机按功能来分主要由微处理器(CPU)、存储器、I/O 端口、定时器/计数
器和中断系统 5 部分组成。CPU 是单片机最核心的部分,主要完成运算和控制功能;80C51中共有 256B 的 RAM(其中用户可用的为 128B)可存储程序运行时的变量和数据、4KB 的
ROM 用于存放程序和用户数据;有 4 个 8 位的 I/O 端口,实现数据的并行输入、输出;2 个
16 位的定时器/计数器,实现定时和计数功能;5 个中断源(外部两个、内部 3 个)可以实现
用户的中断请求。 2.80C51 单片机有 4 个 I/O 端口,每个端口都是 8 位双向口,共占 32 个引脚。每个端
口都包括一个锁存器、一个输出驱动器和输入缓冲器。通常称 4 个端口为 P0~P3。在无片外
扩展存储器系统中,这 4 个端口都可以作为双向通用 I/O 端口使用。在具有片外扩展存储器
的系统中,P2 口作为高 8 位地址线,P0 口分时作为低 8 位地址线和双向数据总线。 3.80C51 开机复位后,CPU 使用的是第 0 组工作寄存器,其地址为 00~07;CPU 通过
对程序状态字 PSW 中 RS1 和 RS2 的设置来确定和改变当前工作寄存器组。 4.时钟周期又称为状态周期:由单片机片内振荡电路 OSC 产生的振荡周期经二分频产
生,是时序中最小的时间单位。机器周期定义为实现特定功能所需时间,或完成某一规定操
作所需的时间,其中 80C51 的机器周期时间是固定不变的,均为 6 个时钟周期(即 12 个振
荡周期);指令周期是时序中的最大时间单位,定义为执行一条指令所需的时间。当振荡频率
为 8MHz 时,80C51 单片机的时钟周期为 0.125μs。
MCS-51 系列单片机原理与接口技术
·234·
5.当由于程序运行出错或程序进入死循环状态而使系统处于死锁状态时,需要按复位
键或由看门狗电路重新启动系统。 6.许多涉及到 I/O 口的操作,实际上只是涉及口锁存器的读、写和改操作。这些指令都
是一些逻辑运算指令、置位/清除指令、条件转移指令以及将 I/O 口作为目的地址的操作指令。
如果在指令中,某个 I/O 口被指定为源操作数,则该指令为读引脚操作指令。 7.单片机复位状态指当 80C51 的复位端 RST 输入两个机器周期以上的高电平信号时,
单片机出现复位状态。在复位状态下,PC 指针为 0000H。复位对片内 RAM 的数据没有影响。
但上电复位时,由于是重新供电,RAM 在断电时数据丢失,上电复位后为随机数。SFT 复位
状态表现如下:I/O 端口全部为 FFH 状态;栈指示器 SP=07H;所有的 SFR 的有效位均为零。
第 3 章 指令系统
1.80C51 系列单片机以 MCS-51 系列的 8051 为基核,采用 CHMOS 工艺,其指令系统
与 MCS-51 单片机的指令系统完全相同。但是在一些产品中,由于引脚的减少,不能外扩存
储器等因素的影响,MOVX 类的指令是无效的,相应地,ACALL、LCALL、AJMP 以及 LJMP等指令的使用也受到限制。
2.80C51 指令系统有 7 种寻址方式。 (1)寄存器寻址:寻址空间为片内数据存储器的 00H~1FH; (2)直接寻址:寻址空间为 00H~1FH 中的数据区和 80H~FFH 中的 SFT 区; (3)间接寻址:寻址空间为片内数据存储器的 00H~FFH 和片外数据存储器的 0000H~
FFFFH 空间; (4)立即寻址:寻址空间为程序存储器; (5)位寻址:寻址空间为片内数据存储器 20H~2FH 单元中的 128 位和 SFR 中可位寻址
的位单元; (6)基址变址寻址:寻址空间为程序存储器; (7)相对寻址:寻址空间为程序存储器。实例略。 3.操作数是指令操作所需要的数据、地址或符号。通常右边的操作数为源操作数,左
边的为目的操作数。如: MOV A , #20H ;立即数 20H 送入累加器 A 中
80C51 指令系统中操作数大多为两个,少数为一个操作数,也有个别指令不需要操作数。 4.依据题意编程如下: MOV R0, #20H MOVX A, @R0 XCH A, R1 MOVX @R0, A 5.方法 1:CLR C
RLC A 方法 2:CLR C
MOV R0, A ADD A, R0
附录 B 习题答案
·235·
方法 3:MOV B, #2 MUL A,B
6.@Ri 是一个 8 位的地址指针,要访问片外 16 位地址空间,需要把片外数据存储器的
16 位地址分为高 8 位和低 8 位地址,将低 8 位地址送入 Ri(I=0,1)中,而将高 8 位地址通
过 P2 口直接输出,然后执行 MOVX 指令即可: MOV P2, #高 8 位地址 MOV Ri, #低 8 位地址 ;i=0,1 MOVX A, @Ri ;读片外数据存储器 MOVX @Ri, A ;写片外数据存储器 7.参考程序如下: MOV R0, #20H ;指向数据区的首地址 MOVE1:MOVX A, @R0 ;取外部 RAM 中的数据 MOV @R0, A ;存入片内 RAM 中 INC R0 CJNE R0, #41H,MOVE1 ;结束? MOV R0, #20H MOV A, #0FFH ;填充数据区 RET
第 4 章 汇编语言程序设计
1.在单片机领域,目前使用最广泛的语言是汇编语言,汇编语言比机器语言易懂,便
于维护,是计算机能提供给用户的最快而且最有效的语言,也是能利用计算机所有硬件特性
并能直接控制硬件的惟一一种语言。对于汇编语言,单片机不能直接执行,必须要先转换成
用二进制代码表示的机器语言程序,计算机才能识别和执行。 2.根据题意编程如下: (1) MOV A, #12H ADD A, #34H ADD A, #0E7H XCH A, B ADDC A, #00H
XCH A, B ADD A, #10H
(2) MOV A, #0CDH ADD A, #18H SUBB A, #37H SUBB A, #46H
3.设正数、负数和零分别存放在 30H、31H 和 32H 单元中,依题意编程如下: MOV 30H, #0 MOV 31H, #0
MCS-51 系列单片机原理与接口技术
·236·
MOV 32H, #0 MOV DPTR, #1000H ;数据区首地址 MOV R1, #32H ;数据区长度
LOOP0:MOVX A, @DPTR INC DPTR CJNE A, #0, LOOP1 INC 32H SJMP LOOP3 LOOP1: JC LOOP2 INC 30H SJMP LOOP3 LOOP2: INC 31H LOOP3:DJNZ R1, LOOP0 SJMP $ 4.设单片机晶振采用 6MHz。 延时 1s 子程序如下:
DELAY_1S: MOV R2, #100 DELAY1S_1: MOV R3, #10 DELAY1S_2: MOV R4, #125 ;1ms 延时设定值 DELAY1S: NOP NOP DJNZ R4, DELAY1S DJNZ R3, DELAY1S_2 DJNZ R2, DELAY1S_1 RET 延时 1min 子程序如下: DELAY_1M: MOV R1, #60 DELAY1M_1: LCALL DELAY_1S DJNZ R1, DELAY1M_1 RET 延时 1h 子程序如下: DELAY_1H: MOV R0, #60 DELAY1H_1: LCALL DELAY_1M DJNZ R0, DELAY1H_1
RET 5.设 R2 为字节数;R0 为被减数低位地址指针,并且程序执行完成后,R0 存放差的高
位字节地址指针;R1 位减数低位地址指针。依题意编程序如下: CLR C SUB_M: MOV A, @R0 SUBB A, @R1
附录 B 习题答案
·237·
MOV @R0, A INC R0 INC R1 DJNZ R2, SUB_M ;够减 JNC NO_SUBM ;不够减 LCALL SUB_ERROR RET NO_SUBM: DEC R0 RET SUB_ERROR: ;错误处理
第 5 章 中断系统原理与应用
1.中断就是指通过硬件来改变程序的运行方向。在计算机程序执行过程中,由于某种
原因,需要中止当前程序而去执行相应的处理程序,待处理结束后,再回来继续执行被中断
了的原程序。这种程序在执行过程中由于外界的原因而被中间打断的情况称为中断。在 80C51单片机中,中断能实现以下功能:(1)能实现中断及返回;(2)能实现优先权排队;(3)能实现中
断嵌套。 2.一般的主程序和中断服务程序都可能会用到累加器、PSW 寄存器以及其他的一些寄
存器。如 CPU 在中断服务程序中用到了上述寄存器时,就会破坏它原来寄存器中的内容,这
样一旦中断服务程序结束,将会造成主程序的混乱。因而在进入中断服务程序后,一般需要
先保护现场。保护的方法一般是把累加器、PSW 寄存器以及其他一些与主程序有关的寄存器
压入堆栈,在中断服务程序返回后再恢复现场(寄存器出栈)。 3.80C51 单片机的中断系统具有两个中断优先级。中断优先级的设定是由专用寄存器
IP 统一管理,由软件设置每个中断源为高优先级或低优先级,并可实现两级中断的嵌套。若
扩充中断源,可以采用中断和查询相结合扩充外中断源的方法来确定中断的优先级。 4.在中断请求有效并且中断打开的情况下,80C51 单片机并不能立即响应中断,因为在
计算机内部,中断表现为 CPU 的微查询操作。CPU 在每个机器周期的 S6 状态中,查询中断
源,并且按优先级管理规则来处理同时请求的中断源,在下一个机器周期的 S1 状态中,响
应最高级的中断请求。因此,在以下情况中,中断还需要继续等待:(1)CPU 正在处理相同
或更高优先级的中断;(2)多机器周期指令中还没有执行到最后一个机器周期;(3)正在执
行中断系统的 SFR 操作,如 RETI 指令以及访问 IE/IP 等操作时要延后一条指令。 5.在中断响应中 CPU 的自主操作是指 CPU 不依赖指令控制的内部操作行为。响应中断
时 CPU 有以下一些自主操作:(1)置位相应的优先级状态触发器;(2)中断原标志清零;(3)中断断点地址装入堆栈保护;(4)中断入口地址装入 PC。在中断返回时,CPU 产生以下自
主操作:(1)优先级状态触发器清零;(2)断点地址送入 PC。响应中断时的自主操作,使
CPU 暂时停止当前程序的运行,转入中断服务程序。中断返回时的自主操作使 CPU 结束中
断服务程序的执行,返回到原来的程序继续执行。 6.采用定时器 0 定时。定时时间为 100ms,用 P1.0 作为输出,设 P1.0 为高时灯灭。依
MCS-51 系列单片机原理与接口技术
·238·
据题意,编程如下: ORG 0000H LJMP EX ORG 000BH LJMP TIMER0_SUB ORG 0030H
EX: MOV TMOD, #01H MOV TH0, #03CH MOV TL0, #0B0H SETB ET0 SETB EA MOV R2, #00H SETB TR0 LJMP $ TIMER0_SUB: PUSH PSW INC R2 CJNE R2, #04H, SUB1 SETB P1.0 SUB1: CJNE R2, #10, TEND CLR P1.0 MOV R2, #0 TEND: MOV TH0, #03CH MOV TL0 #0B0H SETB TR0 POP PSW RETI
第 6 章 定时器/计数器
1.80C51 单片机内部有两个 16 位可编程定时/计数器:T0 和 T1。由两个 8 位专用寄存
器 TH0、TL0 和 TH1、TL1 组成,80C51 单片机的定时/计数器有 4 种工作方式:方式 0 是一
个 13 位的定时器/计数器;方式 1 是一个 16 位的定时器/计数器;方式 2 是一个能重置初值
的 8 位定时器/计数器,具有自动恢复初值功能,适合做较精确的定时脉冲信号发生器;方式
3 只适用于定时器 T0,定时器 T0 在方式 3 下被拆成两个独立的 8 位计数器 TL0 和 TH0。 2.80C51 定时器/计数器方式 0 的 13 位计数器是按 5 位预分频定标器和 8 位计数器设置
的。在 80C51 中 THi、Tli 两个 8 位计数器构成的 13 位计数中,TLi 为低 5 位,THi 为高 8位。该计数器的计数初值是按 13 位减法所得的数据值。例如,设系统时钟为 fosc,要实现时
间 t 的定时,则计数初值 m=213-t×fosc/l2。 3.在 80C51 单片机的定时器/计数器方式寄存器 TMOD 中,GATE 是控制方式选择位。
当 GATE=0 时,计数器由内部 TRi 位控制定时器/计数器的开启和停止;当 GATE=1 时,计
附录 B 习题答案
·239·
数器由 Tri 和外部引脚 INTi 共同控制启、停。要通过 INT0 引脚来控制定时器/计数器 T0 的
启、停,必须在方式寄存器 TMOD 中置 GATE 为 1:MOV TMOD, #0DH 。并且定时器/计数器可由外部引脚 INTi 控制启、停的特性可用来对外部脉冲信号宽度进行测量。
4.设系统时钟频率为 6MHz,依题意编程如下: MOV TMOD, #15H ;定时器为定时方式 1 ;定时器 0 为计数方式 1 LOOP: MOV TH0, #0FCH ;定时器 0 初值 1000 MOV TL0, #018H
SETB TR0 ;启动定时器 0 JNB TF0, $ ;查询计数溢出 CLR TR0 ;关闭定时器 0 CLR TF0 ;清除溢出标志 MOV TH1, #0FCH ;定时器 1 赋初值 2ms MOV TL1, #18H ;启动定时器 1 SETB TR1 JNB TF1, $ CLR TR1 CLR TF1 LJMP LOOP
5.采用定时器/计数器方式 1 可以得到最大量程(因为方式 1 的长度为最大:16 位),
通过如下设置可以测量脉冲宽度:将外部脉冲引至 INT0 引脚上,设 T0 为定时器方式 1,GATE门控为 1,TR0 为 1:控制字 TMOD 为#09H,定时初值 TH0=#00H,TL0=#00H。参考程序如
下: START: MOV TMOD, #09H MOV TL0, #00H MOV TH0, #00H LOOP1: JB P3.2, LOOP1 SETB TR0 LOOP2: JNB P3.2, LOOP2 LOOP3: JB P3.2, LOOP3 CLR TR0 MOV A, TL0 MOV R4, A MOV A, TH0 MOV R3, A RET 由于定时器方式 1 的长度为 16 位,启最大计数值为 65535,即正脉冲的宽度最大值不能
超过 65535 个机器周期。系统时钟频率为 6MHz,则允许测量的最大脉冲宽度为:65535×2μs=131.070ms。
MCS-51 系列单片机原理与接口技术
·240·
第 7 章 串行口
1.在通信中,有 4 种数据传输方式:单工、半双工、全双工和多工操作。单工传输指
数据只能按一个固定方向传送,且是非交互式的;半双工传输允许通信双方既可发送又可接
收,只是不能同时进行;全双工传输允许通信双方同时进行发送和接收;多工传输方式指使
用多路复用器或多路集中器专用通信设备,使这些设备通过一个信道(即传输信号的线路)
划分为若干个频带或使用时间复用技术实现多路信号同时共享信道的功能。 2.串行通信即将所传输的数据的各个位按照顺序的一位一位的发送或接收。串行通信
可分为同步通信和异步通信两种。异步通信中的数据或字符是一帧一帧地传送的,每传送一
帧具有固定的格式,通行双方只需要按照约定的帧格式来发送或接收数据,硬件结构比同步
通信方式简单,此外异步通信方式还能利用校验位来检测错误。控制 MCS-51 单片机串行口
工作的控制寄存器共有两个:特殊功能寄存器 SCON 和 PCON,其具体功能参见 7.2 节。 3.依题意,可设该异步通信接口的每个字符由 1 位起始位、8 位数据位、1 个停止位、
无奇偶校验位组成,则其传送波特率为: 10bit×1200/60=200bit/s; 4.最高波特率: TH1=0FFH TL1=0FFH 则: 最高波特率为:2/32×6000000/(12×(256-255))bit/s=31250bit/s 最低波特率: TH1=00H TL1=00H 则: 最低波特率为:1/32×6000000/(12×(256-0))bit/s=61bit/s 5.依题意:编程如下: ORG 0000H AJMP MAIN ;转主程序 ORG 0023H ;串行中断入口 AJMP INTT ;转中断服务程序 MOV SP, #60H MAIN: MOV SCON, #80H ;设串行口方式 2 MOV PCON, #80H ;设波特率 MOV R0, #20H ;数据块首地址 MOV R7, #0FH ;数据长度 SET ES ;使能串行口中断 SETB EA ;使能 CPU 中断 MOV A, @R0 ADD A, #00H MOV C, P MOV TB8, C MOV SBUF, A SJMP $ 中断服务程序:
附录 B 习题答案
·241·
INTT: CLR TI INC R0 MOV A, @R0 ADD A, #00H MOV C, P MOV TB8, C MOV SBUF, A ;发送数据 DJNE R7, NEXT CLR ES NEXT: RETI END 6.当多机通信时,需要充分利用单片机的多机通信控制位 SM2。当从机 SM2=1 时,从
机只接收主机发出的地址帧(第 9 位,TB8/RB8=1),对于数据帧不接收,而当 SM2=0 时,
可以接收主机发出的所有信息。其通信过程如下:①将所有从机的 SM2 位置 1,即所有从机
都处于只接收地址帧的状态;②主机发送一帧地址信息,其中 8 位地址,第 9 位表示是地址
帧;③所有从机接收到地址帧后,进行中断处理,把接收到的地址与自身地址相比较,地址
相符合时置 SM2=0,不相符合时维持 SM2=1;④由于被寻址的从机已使 SM2=0,可以接收
主机随后发送来的信息,实现主机与被寻址从机的双机通信;⑤被寻址的从机通信完毕后,
置 SM2=1,恢复多机系统原有的状态。
第 8 章 MCS-51 单片机的存储器扩展
1.在 80C51 系统扩展中,虽然程序存储器和数据存储器共用 16 位地址线和 8 位数据线, 但由于数据存储器的读写是由RD(P3.7)和WR(P3.6)信号控制,而程序存储器是由
读选通信号 PSEN 控制。因此,程序存储器和数据存储器两者虽然共处于同一地址空间,但
它们控制信号不同,所以不会发生干扰。 2.8031 单片机与外部程序存储器之间的连线包括地址总线、数据总线和控制总线,如
下图所示,为其一般的电路连接图。
8031 的 P0 口和 P2 口的 16 根 I/O 线输出地址码、其中 P2 口与 EPROM 高 8 位地址线及
MCS-51 系列单片机原理与接口技术
·242·
片选CE连接,作为高 8 位地址线;P0 口作为时分复用地址/数据线,分别与外接地址锁存器
10~17 端口连接及 EPROM 的数据线 O0~O7 连接,锁存器的输出线作为低 8 位地址线。8031的EA 口接地,PSEN 与 EPROM 的输出允许OE连接,ALE 与外部地址锁存器 CLK 端口连
接。 3.80C51 单片机在访问外部程序存储器时,首先通过地址总线给出地址信号,选中一个
存储单元作为访问对象,然后由控制总线发出读选通信号,在读选通信号的作用下,外部程
序存储器把指定单元的内容送至数据总线,单片机通过对数据总线的采样(读数据总线)获
得该单元的内容,完成一次外部程序存储器的访问过程,其时序图如下所示:
4.首先要根据应用系统容量要求选择 EPROM 芯片,使应用系统电路尽量简化,同时在
满足容量要求时尽可能选择大容量芯片,以减少芯片组合数量。目前大容量芯片价格日趋便
宜,因此采用较大容量芯片从长远的经济效益看也有好处;其次,要选择好能满足应用系统
应用环境要求的芯片型号。例如在确定选择 8K 的 EPROM 芯片后,根据不同的应用参数在
2764 中选择相应的型号规格芯片。最后,选用的锁存器不同,电路连接可能不同。目前使用
最多的几种锁存器管脚不一定兼容。最后还应充分考虑芯片管脚的兼容性。 5.略。
第 9 章 I/O 接口扩展设计及应用
1.80C51 单片机 I/O 口的扩展方法主要有:并行总线扩展方法和串行总线扩展方法,其
中并行总线总线扩展方法是指数据通过单片机的 P0 口输人/输出,为了区分不同的外设.每
个 I/O 口都应有自己的地址。I/O 口的地址占用外部数据存储器的地址空间,因此在进行 I/O口扩展时,需要全面考虑 I/O 口和外部数据存储器的地址分配。串行总线扩展方法是指利用
51 单片机内置串行口的同步移位寄存器工作方式进行 I/O 口扩展。由于数据是通过串行口传
输的,因此传输速度较慢,并且必须进行串行一并行数据的转换 2.8255 有 3 种基本工作方式:方式 0(基本输入输出)、方式 1(选通输入输出)和方
式 2(双向传送)。3 种工作方式由写入控制字寄存器的方式控制字来控制。方式 0 是一种基
本的输入/输出工作方式。在这种方式下,3 个端口都可以由程序设置为输入或者输出,没有
固定的用于应答的联络信号。方式 1 是一种选通式输入/输出工作方式。A 口和 B 口皆可独立
地设置成这种工作方式。在方式 1 下,8255A 的 A 口和 B 口通常用于传送和它们相连外设的
附录 B 习题答案
·243·
I/O 数据,C 口用作 A 口和 B 口的应答联络线,以实现中断方式传送 I/O 数据。方式 2 只有
A 口才能设定,在方式 2 下,PA7~PA0 为双向 I/O 总线。当作为输入总线使用时,PA7~PA0受
ASTB 和 IBFA 控制,其工作过程和方式 1 输入时相同;当作为输出总线使用时,PA7~PA0受 AOBF 和 AACK 控制,其工作过程和方式 1 输出时相同。
3.输入时钟频率为 500KHz,则其周期为 2μs。则 10ms 的定时时间需要的计数初值为
5000。设 8155 控制口地址为 EF00H,则编程如下: MOV DPTR, #0EF04H ;低 8 位地址 MOV A, #88H ;5000D=1388H MOVX @DPTR, A ;计数器低 8 位赋值 INC DPTR MOV A, #53H ;高 6 位赋值 MOVX @DPTR, A MOV DPTR, #0EF00H ;控制字地址 MOV A, #0C9H MOVX @DPTR,A 4.略。 5.设计硬件接口电路如下所示:
参考程序如下:(其中 DLT 为延时 2ms 函数) DIR: MOV R0, #79H ;置显示缓冲区首地址 MOV R3, #01H ;置位选码初值 MOV A, R3
LOOP: MOV DPTR, #7F01H ;送 A 口地址 MOVX @DPTR, A INC DPTR ;指向 B 口地址 MOV A, @R0 ;取被显示的数据
MCS-51 系列单片机原理与接口技术
·244·
ADD A, #12H ;形成查表的编译地址 MOVC A, @A+PC ;求初显示代码 JNB PSW.S, DIR1 ;判断是否显示小数点 SETB ACC.7 ;显示小数点 DIR1: MOVX @DPTR, A ;输出显示代码 ACALL DLT ;延时 INC R0 MOV A, R3 JB ACC.5, LOOP1 ;判断 6 位是否显示完毕 RL A ;形成下一位代码 MOV R3, A AJMP LOOP
LOOP1:RET DB 3FH, 06H, 5BH, 4FH, 66H, 6D DB 7DH, 07H, 7FH, 6FH, 77H, 7CH DB 39H, 5EH, 79H, 71H DLF: MOV R7, #04H DLT1:MOV R6, #0FFH DLT2:DJNZ R6, #DLT2 DJNZ R7, #DLT1 RET 6.略。
第 10 章 MCS-51 与 D/A、A/D 的接口设计
1.在计算机控制的实时控制系统中,有些被控对象需要用模拟量来控制,模拟量在此
指连续变化的电量。此时需要将数字量转换为相应的模拟量,以便操纵控制对象。这一过程
即为 D/A 变换。能实现 D/A 变换的器件称为 D/A 转换器或 DAC。二进制数是由各位代码组
合起来的,每位代码都有一定的权。为了将数字量转换成模拟量,应将每一位代码按权大小
转换成相应的模拟输出分量,然后根据叠加原理将各代码对应的模拟输出分量相加,其总和
就是与数字量成正比的模拟量,由此完成 D/A 转换。 2.D/A 转换器的指标很多,其中主要的有如下几个方面:分辨率、建立时间、转换精度。
其中分辨率指输入的单位数字量变化引起的模拟量输出的变化,是对输入量变化敏感程度的
描述。通常定义为满刻度值与 2n之比(n 为 D/A 转换器的二进制位数)。二进制位数越多,
分辨率越高;建立时间是描述 D/A 转换速度快慢的一个参数,用于表明转换速度。其值为从
输入数字量到输出达到终值误差±(1/2)LSB(最低有效位)时所需的时间;理想情况下,转
换精度与分辨率基本一致,位数越多精度越高。但由于电源电压、参考电压电阻等各种因素
存在着误差。严格讲精度与分辨率并不完全一致。只要位数相同,分辨率则相同,但相同位
数的不同转换器精度会有所不同。 3. DAC0832 与 80C51 单片机连接时的控制信号主要有 ILE、CS 、WR1、WR2 、XFER 。
附录 B 习题答案
·245·
其作用分别如下:ILE 时数据锁存允许控制信号输入端,高电平有效;CS 是片选信号输入端,
低电平有效;WR1是第一级锁存写选通端(低电平有效):当WR1为低电平时,用来将输入
数据传送到输入锁存器;当WR1为高电平时,输入锁存器中的数字被锁存:当 ILE 为高电平,
又必须是CS 和WR1同时为低电平时,才能将锁存器中的数据进行更新。以上 3 个控制信号
构成第一级输入锁存;WR2 第二级锁存写选通(低电平有效):该信号与XFER 配合,可使
锁存器中的数据传送到 DAC 寄存器中进行转换;XFER 是数据传输控制信号输入端,低电
平有效。 4.有些 D/A 转换器(如 DAC0832)的内部具有两级缓冲结构,即芯片内部有一个 8 位
输入寄存器和一个 8 位 DAC 寄存器。这样的双缓冲结构,可以使 DAC 转换输出前一个数据
的同时将下一个数据传送到 8 位输入寄存器,以提高 D/A 转换的速度。而且能够使多个 D/A转换器在分时输入数据之后同时输出模拟电压。DAC0832 的双缓冲方式的接口电路图略。
5.接口电路略。参考程序如下: MOV R1, #50 ;设采样次数 MOV R5, #20H ;数据存放首地址 MOV R6, #00H EX10A:MOV R2, #04H ;采样通道数 MOV R3, #0EFH MOV R4, #0F8H EX10B: MOV DPH, R3 MOV DPL, R4 MOVX @DPTR, A NOP JB INT1, $ ;等待转换完成 MOVX A, @DPTR ;将转换结果读入 INC R4 MOV DPH, R5 MOV DPL, R6 MOVX @DPTR, A ;保存结果 INC DPTR ;修改地址 MOV R5, DPH ;保存地址 MOV R6, DPL LCALL DLY_2MS ;调延时 2ms 子程序 DJNZ R2, EX10B ;4 路未完,继续 DJNZ R1, EX10A ;50 次转换未完,继续 LJMP $
第 11 章 应用系统设计与开发
1.单片机应用系统是指以单片机为核心,配以一定的外围电路和软件,能实现某种或
几种功能的应用系统。它由硬件部分和软件部分组成。在单片机应用系统设计中,主要应该
MCS-51 系列单片机原理与接口技术
·246·
考虑硬件设计和软件设计两个方面的问题,其中硬件设计的任务是根据总体设计的要求,在
所选择的单片机的基础上,确定系统扩展所要用的存储器、I/O 电路、A/D 电路以及有关的
外围电路等,然后设计出系统的电路原理图;软件设计主要是设计出一个合理的软件结构,
一边采用模块化的程序结构。 2.应用系统的调试可分为以下 3 个步骤:上机调试、系统模拟调试以及在线仿真调试。
其中,上机调试程序是检验程序正确性的一个重要环节。调试时,应在单片机开发系统上先
对程序进行分块调试,对入口参数和变量赋初值,观察运行结果;系统模拟调试是把已调好
的各程序模块,按照总体设计要求联成一个完整的程序,并与所设计的硬件系统进行联机调
试;而在线仿真调试则是指应用系统的调试环境不是实验室而是现场环境,现场环境往往与
实验室环境不同,模拟的外围设备和实际的外围设备之间也存在差异,因此,采用在线仿真
调试可以增加系统在实际现场中运行的可靠性。 3.单片机应用系统在实际工作中,可能会受到各种外部和内部的干扰,使系统工作产
生错误,为了减少这种错误,常需要采取提高系统可靠性的各种措施:在硬件方面,主要有
对供电电源采用的抗干扰措施(如用代屏蔽层的电源变压器、加电源低通滤波器和使电源变
压器的容量留有余地等)、输入/输出通道的抗干扰措施(如采用光电隔离电路、采用双绞线
以及终端阻抗匹配等)以及抗电磁场干扰措施(如对干扰源进行电磁屏蔽和对整个系统进行
电磁屏蔽等)。此外还应在设计时提高元器件的可靠性。在软件抗干扰方面,主要有充分利用
看门狗电路(用来对程序进行监视,防止程序跑飞)和设置软件陷阱与增加指令冗余等措施。 4.单片机开发系统应具有对用户程序进行输入、编辑、汇编和调试的功能。此外,还
必须具备在线仿真功能。辅助设计功能是衡量单片机开发系统性能高低的重要标志。具体来
说,作为一个基本的单片机开发系统,应该具有如下一些功能:程序输入和编辑、对用户程
序进行汇编、连接和装载、对用户程序进行调试(主要包括程序的设置断点运行、单步运行、
连续运行、对目标系统状态读出和修改等)、反汇编功能、跟踪功能以及程序固化功能等 5.单片机开发系统的程序设计语言有机器语言、汇编语言和高级语言 3 种:机器语言
是计算机能够识别的惟一语言,由于机器语言程序的设计、输入、修改和调试都非常麻烦只
能在非常简单的开发系统中使用,因此,利用它只能开发非常简单的应用系统。汇编语言比
机器语言使用灵活,且程序便于优化,与硬件系统关系紧密,用汇编语言设计的程序占内存
空间少。单片机中常用汇编语言进行程序设计。但使用汇编语言编程有一定的难度和复杂性,
只有对单片机的指令非常熟悉,并具有一定的汇编语言程序设计经验,才能设计出功能较复
杂的应用程序。高级语言编程方便,易于掌握,且通用性好。只要掌握开发系统提供的高级
语言,就可以直接用该语言编写程序。MCS-51 系列单片机开发系统所使用的高级语言有
C-51、PL/M51 和 MBASIC-51 语言、C 语言等。用高级语言编写控制程序,但在实用性、质
量和结构紧凑等方面,均有一定难度。综合考虑汇编语言和高级语言的优缺点,也可以在高
级语言中嵌入部分的汇编语言。