高职高专系列教材...

196

Transcript of 高职高专系列教材...

Page 1: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a
Page 2: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

中国高等职业技术教育研究会推荐

高职高专系列教材

单片机原理及接口技术

董晓红 主 编

邓福军 副主编

邱士安 主 审

西安电子科技大学出版社

2 0 0 4

Page 3: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

内 容 简 介

本书以 AT89C51 为主线介绍了单片机的原理与应用、 AT89C51 汇编语言及程序设计,

并列举了大量应用实例。

全书共分为 10 章,内容主要包括单片机基础知识、AT89C51 的内部结构和原理、指

令系统、汇编语言程序设计、系统扩展、串行通信、A/D 转换、D/A 转换及接口技术等。

本书内容简洁实用,讲解通俗易懂,并有大量应用实例,可作为高职高专院校电子应

用类专业相关课程的教材,也可作为单片机应用开发技术人员的参考书。

图书在版编目(CIP)数据 单片机原理及接口技术 / 董晓红主编. —西安:西安电子科技大学出版社,2004.8

(高职高专系列教材)

ISBN 7

Ⅰ 单 Ⅱ 董 Ⅲ ① 单片微型计算机—理论—高等学校:技术学校—教材 ② 单片微型计

算机—接口—高等学校:技术学校—教材 Ⅳ

中国版本图书馆 CIP 数据核字(2004)第 062407 号

策 划 马武装

责任编辑 王晓杰 马武装

出版发行 西安电子科技大学出版社西安市太白南路 号

电 话 邮编

经 销 新华书店

印刷单位 西安兰翔印刷厂

版 次 年 月第 版 年 月第 次印刷

开 本 毫米× 毫米 印张

字 数 千字

印 数 ~ 册

定 价 元

·课

XDUP 1697001-1

如有印装问题可调换

本社图书封面为激光防伪覆膜,谨防盗版。

Page 4: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

前 言

本教材是由中国高等职业技术教育研究会与西安电子科技大学出版社共同

策划、组织的高职高专 IT 类专业系列教材之一。全书以 AT89C51 单片机为主

线介绍了单片机的原理与接口技术,详细介绍了 AT89C51 汇编语言及程序设计,

并列举了大量应用实例。本教材的主要特点是内容新,具有较强的实践性。为

了便于学习,部分章节附有实验供读者参考,每一章后附有大量习题。

本书语言精练,内容深入浅出、通俗易懂,便于自学。

全书共分为 10 章,内容主要包括单片机基础知识、AT89C51 的内部结构和

原理、指令系统、汇编语言程序设计、中断概念和应用、定时器应用、系统扩

展技术、串行通信、并行 I/O 口、A/D 转换、D/A 转换等单片机接口技术以及

系统的开发和应用。

参与本教材编写工作的教师多年来均一直从事单片机教学和单片机系统开

发工作,具有丰富的教学经验和系统开发实践经验。本教材由成都航空职业技

术学院董晓红担任主编,并编写了第 3、4 章;大连铁道学院邓福军担任副主编,

并编写了第 1、2、5、6、9 章;沈阳航空工业学院张国栋编写了第 10 章;成都

航空职业技术学院张春林编写了第 7、8 章。全书由成都电子高等技术专科学校

邱士安主审。另外,本书中的部分插图、文字录入工作由成都航空职业技术学

院付国良同学完成,在此一并表示衷心的感谢。

由于编者水平有限,难免有疏漏和不妥之处,敬请读者批评指正。

编 者

2004 年 4 月

Page 5: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

1

目 录

第 1 章 单片机基础知识 .............................1 1.1 单片机概述 ...............................................1

1.1.1 微处理器、微型计算机和

单片机的概念.....................................1

1.1.2 单片机的发展状况 .............................1

1.1.3 ATMEL89 系列单片机简介................2

1.2 微型计算机中数的表示方法

及数制间的转换 ........................................3

1.2.1 微型计算机中的常用数制..................3

1.2.2 数制间的转换.....................................4

1.3 二进制数的运算 .......................................6

1.3.1 算术运算 ............................................6

1.3.2 逻辑运算 ............................................8

1.4 微机的码制和编码....................................8

1.4.1 原码、反码和补码 .............................8

1.4.2 微型机中常用的编码 ....................... 10

习题与思考题.................................................. 12

第 2 章 AT89C51 单片机结构和原理.... 14 2.1 AT89C51 单片机的结构.......................... 14

2.1.1 中央处理器(CPU)............................. 15

2.1.2 存储器.............................................. 17

2.1.3 I/O 端口............................................ 17

2.1.4 定时器/计数器.................................. 17

2.1.5 中断系统 .......................................... 18

2.1.6 内部总线 .......................................... 18

2.2 AT89C51 单片机引脚及其功能 .............. 18

2.2.1 I/O 端口功能 .................................... 19

2.2.2 电源线.............................................. 22

2.2.3 外接晶体引脚................................... 22

2.2.4 控制线.............................................. 22

2.3 AT89C51 存储器 ..................................... 22

2.3.1 程序存储器 ...................................... 23

2.3.2 数据存储器 ...................................... 23

2.4 AT89C51 单片机工作方式 ......................27

2.4.1 复位方式 ..........................................27

2.4.2 程序执行方式...................................28

2.4.3 省电方式 ..........................................28

2.4.4 EPROM 编程和校验方式 .................28

2.5 AT89C51 时钟电路与时序 ......................30

2.5.1 振荡器与时钟电路 ...........................30

2.5.2 时序..................................................31

习题与思考题..................................................33

第 3 章 AT89C51 指令系统 .....................35 3.1 指令系统简介 .........................................35

3.2 寻址方式.................................................35

3.2.1 符号注释 ..........................................35

3.2.2 寻址方式 ..........................................36

3.3 AT89C51 指令系统 .................................38

3.3.1 数据传送类指令 ...............................38

3.3.2 算术运算类指令 ...............................42

3.3.3 逻辑操作与移位指令 .......................45

3.3.4 控制转移指令...................................47

3.3.5 位操作类指令...................................50

3.4 实验 ........................................................51

习题与思考题..................................................55

第 4 章 汇编语言程序设计 .......................58

4.1 计算机语言概述......................................58

4.1.1 机器语言 ..........................................58

4.1.2 汇编语言 ..........................................58

4.1.3 高级语言 ..........................................59

4.2 汇编语言源程序的设计与汇编 ...............59

4.2.1 汇编语言格式...................................59

4.2.2 程序设计步骤...................................60

4.2.3 源程序的汇编...................................60

4.2.4 伪指令 ..............................................61

4.3 汇编语言程序设计..................................63

Page 6: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

2

4.3.1 顺序程序设计................................... 63

4.3.2 分支程序设计................................... 64

4.3.3 循环程序设计................................... 65

4.3.4 子程序设计 ...................................... 67

4.4 实用程序举例 ......................................... 68

4.4.1 延时.................................................. 68

4.4.2 代码转换 .......................................... 69

4.4.3 数据处理 .......................................... 70

4.4.4 算术运算 .......................................... 72

4.5 实验 ........................................................ 74

习题与思考题.................................................. 76

第 5 章 中断系统 ........................................ 78 5.1 中断概述................................................. 78

5.2 AT89C51 中断系统 ................................. 78

5.2.1 中断源及中断系统构成.................... 78

5.2.2 中断标志与中断控制 ....................... 79

5.2.3 中断请求的响应、撤除及返回 ........ 82

5.3 中断系统的应用 ..................................... 85

习题与思考题.................................................. 87

第 6 章 定时器/计数器 .............................. 89 6.1 定时器/计数器的结构及工作原理 .......... 89

6.1.1 定时器/计数器的结构 ...................... 89

6.1.2 定时器/计数器的工作原理............... 89

6.2 定时器/计数器的控制 ............................. 90

6.2.1 方式控制寄存器............................... 90

6.2.2 工作方式 .......................................... 91

6.3 定时器/计数器的应用 ............................. 93

6.3.1 初始化.............................................. 93

6.3.2 初值的计算 ...................................... 93

6.3.3 应用举例 .......................................... 94

6.4 实验 ........................................................ 98

习题与思考题.................................................. 99

第 7 章 AT89C51 单片机系统扩展 ...... 101

7.1 AT89C51 最小应用系统........................ 101

7.2 AT89C51 单片机的外部扩展性能......... 102

7.3 程序存储器的扩展................................ 102

7.3.1 28C16 程序存储器概述 .................. 103

7.3.2 单片 28C16 的扩展电路 ................. 104

7.3.3 多片 28C16 的扩展方法 ............... 104

7.4 数据存储器的扩展................................ 106

7.4.1 并行传送数据存储器的扩展方法... 106

7.4.2 串行传送数据存储器的扩展方法... 107

7.5 I/O 口的扩展......................................... 111

7.5.1 简单 I/O 口的扩展.......................... 111

7.5.2 可编程 I/O 口的扩展 ...................... 112

7.6 实验 ...................................................... 117

习题与思考题................................................ 119

第 8 章 AT89C51 系统接口技术........... 120 8.1 键盘接口技术 ....................................... 120

8.1.1 行列式非编码键盘的工作原理 ...... 120

8.1.2 单片机对非编码键盘的控制方式... 121

8.2 LED 显示器接口技术 ........................... 126

8.2.1 LED 显示器的结构原理 ................. 126

8.2.2 LED 显示器的显示方式 ................. 127

8.3 A/D 转换器及接口技术 ........................ 129

8.3.1 A/D 转换器概述 ............................. 129

8.3.2 A/D 转换器的主要技术指标 .......... 129

8.3.3 AT89C51 单片机与

ADC0809 接口应用........................ 130

8.3.4 AT89C51 与 MC14433 接口应用.... 133

8.4 D/A 转换器及接口技术 ........................ 136

8.4.1 D/A 转换器的主要技术指标 .......... 136

8.4.2 D/A 转换器与单片机的接口 .......... 137

8.5 步进电机与单片机的接口..................... 141

8.5.1 步进电机的基本工作原理 .............. 141

8.5.2 步进电机的运行方式 ..................... 141

8.5.3 步进电机与单片机的接口 .............. 142

8.6 实验 ...................................................... 144

习题与思考题................................................ 146

第 9 章 串行接口及串行通信技术........ 147 9.1 串行通信基础知识................................ 147

9.1.1 并行通信和串行通信 ..................... 147

9.1.2 异步通信和同步通信 ..................... 147

9.1.3 串行通信的制式 ............................. 149

9.1.4 串行通信数据的校验 ..................... 150

9.2 AT89C51 的串行接口............................ 150

9.2.1 串行接口的结构及功能.................. 151

9.2.2 串行通信的工作方式 ..................... 153

Page 7: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

3

9.2.3 多机通信 ........................................ 155

9.3 AT89C51 串行接口的应用与编程......... 156

9.3.1 工作方式 0 的应用 ......................... 157

9.3.2 工作方式 1 的应用 ......................... 159

9.3.3 工作方式 2 与工作方式 3 的应用... 159

9.4 PC 机与单片机间的串行通信 ............... 161

9.4.1 RS-232C 总线标准......................... 161

9.4.2 RS-232C 接口电路......................... 162

习题与思考题................................................ 164

第 10 章 单片机系统的开发与应用 ..... 165

10.1 单片机系统的开发设计 ...................... 165

10.1.1 总体设计 ...................................... 165

10.1.2 硬件设计 ...................................... 166

10.1.3 软件设计 ...................................... 167

10.1.4 系统的仿真调试与运行................ 168

10.2 单片机应用系统的开发工具 ............... 169

10.2.1 单片机开发系统的功能................ 169

10.2.2 开发系统的类型 ........................... 169

10.3 单片机开发系统应用实例................... 170

10.3.1 数据采集与显示电路的设计 ........ 170

10.3.2 数码管数字时钟电路的设计 ........ 177

习题与思考题................................................ 186

附录 ................................................................. 187

参考文献 ........................................................ 189

Page 8: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 1 章 单片机基础知识 -1-

第 1 章 单片机基础知识

1.1 单 片 机 概 述

1.1.1 微处理器、微型计算机和单片机的概念

电子计算机高速发展到今天,通常可分为巨型机、大型机、中型机、小型机和微型机

五类。它们在系统结构和基本工作原理方面并无本质的区别,只是在体积、性能和应用领

域方面有所不同。其中微型计算机以其体积小、重量轻、功耗低、功能强、价格低、可靠

性强的优点而得到广泛应用。本书重点介绍的单片机就是微型计算机的一种。为了更好地

学习和掌握单片机,我们先从微型计算机的基本概念方面加以简单介绍。

1. 微处理器 MP(Micro Processor)

微处理器就是传统计算机的 CPU,是集成在同一块芯片上的具有运算和逻辑控制功能

的中央处理器,简称 MP,它是构成微型计算机系统的核心部件。

2. 微型计算机 MC(Micro Computer)

以微处理器为核心,再配上存储器、I/O 接口和中断系统等构成的整体,称为微型计

算机。它们可集中装在同一块或数块印刷电路板上,一般不包括外设和软件。

3. 微型计算机系统 MCS(Micro Computer System)

这是指以微型计算机为核心,配上外围设备、电源和软件等,构成能独立工作的完整

计算机系统。

4. 单片微型计算机(Single Chip Microcomputer)

单片机是将微处理器、存储器、I/O(Input/Output)接口和中断系统集成在同一块芯片上,

具有完整功能的微型计算机,这块芯片就是其硬件。软件程序存放在片内或片外扩展的只

读存储器内。由于其构成都集成在一块芯片上,故又称为单片机。

1.1.2 单片机的发展状况

自从 1974 年美国仙童公司研制出世界上第一台微型计算机 F8 开始,单片机就以其集

成度高、功能强、可靠性高、体积小、功耗低、价格廉、使用灵活方便等一系列优点得到

迅速的发展,其应用也十分广泛,特别是在过程控制、智能化仪器、变频电源、集散控制

系统等方面得到了充分的应用。单片机的发展很快,每隔二三年就要更新换代一次,其发

展过程大致可分为以下几个阶段。

(1) 第一代单片机(1974~1976 年):这是单片机发展的起步阶段。这个时期生产的单

Page 9: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-2- 单片机原理及接口技术

片机其特点是制造工艺落后,集成度较低,而且采用双片形式,典型的代表产品有 Fairchild

公司的 F8 系列机和 Intel 公司的 3870 系列机。

(2) 第二代单片机(1976~1978 年):这一阶段生产的单片机已是单块芯片,但其性能

低、品种少、寻址范围有限、应用范围也不广。最典型的产品是 Intel 公司的 MCS-48 系

列机。

(3) 第三代单片机(1979~1982 年):这是 8 位单片机的成熟阶段。这一代单片机和前

两代相比,不仅存储容量大、寻址范围广,而且中断源、并行 I/O 口、定时器/计数器的个

数都有了不同程度的增加,同时它还新集成了全双工串行通信接口电路。在指令系统方面

普遍增设了乘除法和比较指令。这一时期生产的单片机品种齐全,可以满足各方面的需要。

代表产品有 Intel 公司的 MCS-51 系列机,Motorola 公司的 MC6801 系列机等。

(4) 第四代单片机(1983 年以后):这一阶段 8 位单片机向更高性能发展,同时出现了

工艺先进、集成度高、内部功能更强和运算速度更快的 16 位单片机,它允许用户采用面向

工业控制的专用语言,如 C 语言等。代表产品有 Intel 公司的 MCS-96 系列机和 NC 公司的

HPC16040 系列机等。

最近几年的单片机发展处于 8 位机和 16 位机并行发展的状态,它们都在向高性能、高

运算速度、增加自身程序存储能力的方向发展。虽然出现了 32 位单片机,但在应用方面仍

然是 8 位机和 16 位机占主导地位。

1.1.3 ATMEL89 系列单片机简介

ATMEL89 系列(以下简称 AT89)单片机是美国 ATMEL 公司生产的 8 位高性能单片机,

其主要技术优势是内部含有可编程 Flash 存储器,用户可以很方便地进行程序的擦写操作,

在嵌入式控制领域中被广泛的应用。AT89 系列单片机与工业标准 MCS-51 系列单片机的指

令组和引脚是兼容的,因而可替代 MCS-51 系列单片机使用。AT89 系列单片机可分为标准

型、低档型和高档型三种类型。表 1-1 列举出 AT89 系列单片机的概况。

表 1-1 AT89 系列单片机概况

型 号 AT89C51 AT89C52 AT89C1051 AT89C2051 AT89S8252

档次 标准型 低档型 高档型

Flash/KB 4 8 1 2 8

片内 RAM/KB 128 256 64 128 256

I/O/条 32 32 15 15 32

定时器/个 2 3 1 2 3

中断源/个 6 8 3 6 9

串行接口/个 1 1 1 1 1

M 加密/级 3 3 2 2 3

片内振荡器 有 有 有 有 有

EEPROM/KB 无 无 无 无 无

低档型是功能最弱的型号,只能应用于要求不高的场合。高档型只有一种型号

Page 10: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 1 章 单片机基础知识 -3-

AT89S8252,是功能最强的型号,它的主要特点在于多了一个 2 KB 的 EEPROM,从而提

高了存储容量,可应用于较复杂的控制场合。而标准型是功能较强的型号,其应用也最为

广泛。因而,本书将以 AT89C51 为主介绍 AT89 系列单片机。

1.2 微型计算机中数的表示方法及数制间的转换

微型计算机的基本功能就是进行大量的算术运算和逻辑操作。但它只能识别二进制数,

即所有运算和操作都是以二进制形式进行的,所以二进制数及其编码是所有计算机的基本

语言。其基本信息只有“0”(低电平)和“1”(高电平)两种,但二进制数在表示信息时位数

较多,书写和识读不方便,因而在软件编程时又常采用十六进制数表示。这两种数制与我

们习惯使用的十进制数都不同,为了更好地学习计算机技术,我们必须先了解各种数制之

间的关系、转换的方法和运算的规则等基础知识。

1.2.1 微型计算机中的常用数制

微型计算机中常用的数制有三种,即十进制数、二进制数和十六进制数。

1.十进制数

十进制数是我们最熟悉的一种进位计数制,其主要特点是:

(1) 它由 0、1、2、3、4、5、6、7、8、9 不同的基本数码符号构成,基数为 10。

(2) 进位规则是“逢十进一”,一般在数的后面加符号 D 表示十进制数。

所谓基数,在数学中指计数制中所用到的数码的个数。例如,十进制数用 0~9 十个数

码表示,则基数为 10;二进制数用 0、1 两个数码表示,则基数为 2。十进制数计数规则是

“逢十进一”,当它的某位计满 10 时,就要向它邻近的高位进一。

任何一个十进制数都可以展开成幂级数形式。

[例 1.1] 154.69=1×102+5×101+4×100+6×101+9×102 式中,102、101、101、102 称为十进制数各位的“权”,10 为其基数。由此可看出,一个

十进制数的大小不仅和构成它的每个数码本身的数值有关,而且还和这些数码在数中的位

置有关。

2.二进制数

二进制数是计算机内的基本数制,其主要特点是:

(1) 任何二进制数都只由 0 和 1 两个数码组成,其基数是 2。

(2) 进位规则是“逢二进一”。一般在数的后面用符号 B 表示这个数是二进制数。

二进制数同样可以用幂级数形式展开。

[例 1.2] 101.11B=1×22+0×21+1×20+1×21+1×22=5.75D

其中,22、21、20、21、22 为二进制数各位的“权”,基数为 2。

3.十六进制数

十六进制数是微型计算机软件编程时常采用的一种数制,其主要特点是:

(1) 十六进制数由 16 个数符构成:0、1、2、⋯、9、A、B、C、D、E、F,其中 A、

B、C、D、E、F 分别代表十进制数的 10、11、12、13、14、15,其基数是 16。

Page 11: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-4- 单片机原理及接口技术

(2) 进位规则是“逢十六进一”。一般在数的后面加一个字母 H 表示是十六进制数。十

六进制数也可以展成幂级数的形式。

[例 1.3] 将十六进制数 111.01H 展成幂级数并转化为十进制数表达式。

111.01H=1×162+1×161+1×160+0×161+1×162=273.0039D

其中,162、161、160、161、162 为十六进制数各数位的“权”,基数为 16。

采用十六进制数描述一个二进制数特别简短。一个四位二进制数只需用一位十六进制

数表示,特别在二进制数位较长时,其优点更加明显。因而在目前的计算机应用中普遍采

用十六进制数表示。

1.2.2 数制间的转换

微型计算机内部采用二进制数操作,软件编程时一般采用十六进制数,而人们日常习

惯使用十进制数,因而要求计算机能对不同数制的数进行转换。软件编程人员也必须熟悉

这些数制间的转换方法。

1.二进制数与十六进制数的转换

1) 二进制数转化成十六进制数

采用四位二进制数合成一位十六进制数的方法,以小数点开始分成左侧整数部分和右

侧小数部分。整数部分从右向左每四位一组,最后不足四位的在左侧以 0 补足。小数部分

从左向右四位一组,最后不足四位时在右面以 0 补足。然后每组用十六进制数码表示,并

按序相连即是十六进制数。

[例 1.4] 把 101011.1011011 转换为十六进制数。

0 0 1 0 1 0 1 1.1 0 1 1 0 1 1 0 B =2B.B6H

2 B B 6

2) 十六进制数转换成二进制数

将十六进制数的每位分别用四位二进制数码表示,然后把它们连在一起即为对应的二

进制数。

[例 1.5] 将 2AC9H 和 12.5H 转换为二进制数。

2AC9H=0010 1010 1100 1001B

12.5H=0001 0010.0101B

2. 二进制数与十进制数间的转换

1) 二进制数转换成十进制数

将二进制数按权展开后相加即得到对应的十进制数。

[例 1.6] 1011.01B=1×23+1×21+1×20+1×22=11.25D

2) 十进制数转化成二进制数

十进制数的整数部分和小数部分转化成二进制数的方法不同,要将它们分别转换,然

后将结果合并到一起即得到对应的二进制数。

(1) 十进制整数转成二进制整数的常用方法是“除 2 取余法”,即用 2 连续去除要转换

的十进制数和所得的商,直到商小于 2 为止,依次记下各个余数,然后按最先得到的余数

为最低位,最后得到的余数为最高位依次排列,就得到转换后的二进制整数。

Page 12: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 1 章 单片机基础知识 -5-

[例 1.7] 将十进制数 121 转化成二进制数。

余数

2 121 1 最低位

2 60 0

2 30 0

2 15 1

2 7 1

2 3 1

1 1 最高位

则 121=1111001B。

(2) 十进制小数转换成二进制小数的常用方法是“乘 2 取整法”,即用 2 连续去乘要转

换的十进制小数部分和前次乘积后的小数部分,依次记下每次乘积的整数部分,直到小数

部分为 0 或满足所需要的精度为止,然后按最先得到的整数为二进制小数的最高位,最后

得到的为最低位依次排列,就得到转换后的二进制小数。

[例 1.8] 将十进制小数 0.5877 转换成二进制小数。

0.5877 整数

× 2

1.1754 1 最高位

0.1754

× 2

0.3508 0

× 2

0.7016 0

× 2

1.4032 1

0.4032

× 2

0.8064 0 最低位

则 0.5877≈0.10010B。

3.十六进制数和十进制数间的转换

1) 十六进制数转换成十进制数

将十六进制数按权展开后相加即得到对应的十进制数。

[例 1.9] 2DE1H=2×163+13×162+14×161+1×160=11745D

2) 十进制数转换成十六进制数

与二进制相似,十进制整数和小数要分别转换。

(1) 十进制整数转换成十六进制整数的方法是“除 16 取余法”,即用 16 连续去除要转

换的十进制整数和所得的商,直到商小于 16 为止,依次记下各个余数,然后按最先得到的

余数为最低位,最后得到的余数为最高位依次排列,就得到所转换的十六进制数。

Page 13: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-6- 单片机原理及接口技术

[例 1.10] 将十进制数 2456 转换成十六进制数。

余数

16 | 2456 8 最低位

16 | 153 9

9 9 最高位

则 2456D=998H。

(2) 十进制小数转换成十六进制小数的常用方法是“乘 16 取整法”,即用 16 连续去乘

要转换的十进制小数部分和前次乘积的小数部分,依次记下每次乘积的整数部分,直到小

数部分为零或满足所需要的精度为止,然后按最先得到的整数为十六进制小数的最高位,

最后得到的为最低位依次排列,就得到所转换的十六进制小数。

[例 1.11] 将十进制小数 0.171875 转换成十六进制小数。

0.171875 取整数

× 16

2.750000 2 最高位

0.750000

× 16

12.000000 12 (写作 C) 最低位

则 0.171875=0.2CH。

1.3 二进制数的运算

在微型计算机中,二进制数只有 0 和 1 两种状态,因而其运算特别简单,二进制运算

一般分为算术运算和逻辑运算两种。算术运算包括加、减、乘、除运算,逻辑运算包括与、

或、非、异或运算。

1.3.1 算术运算

1. 加法运算

运算规则为:0+0=0 、1+0=0+1=1、1+1=10(向高位有进位)。

[例 1.12] 求二进制数 10010010 与 11001011 的和。

1 0 0 1 0 0 1 0 被加数

+ 1 1 0 0 1 0 1 1 加数

1 0 1 0 1 1 1 0 1 和

二进制数相加时应注意低位的进位。

2. 减法运算

运算规则为:0-0=0、1-0=1、1-1=0、0-1=1(向高位借 1 当作 2)。

[例 1.13] 求二进制数 10110111 与 10011101 的差。

1 0 1 1 0 1 1 1 被减数

- 1 0 0 1 1 1 0 1 减数

0 0 0 1 1 0 1 0 差

Page 14: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 1 章 单片机基础知识 -7-

二进制相减时应注意低位向高位的借位。

3. 乘法运算

运算规则为:0×0=0、0×1=1×0=0、1×1=1。

两个二进制数相乘与两个十进制数相乘类似,用乘数的每一位分别去乘被乘数的每一

位,所得结果的最低位与相应乘数位对齐,最后把所有结果对应相加,便得到最后的乘积。

这些中间结果又称部分积。

[例 1.14] 求二进制数 1011 与 1101 的积。

1 0 1 1 被乘数

× 1 1 0 1 乘数

1 0 1 1

0 0 0 0

1 0 1 1

1 0 1 1

1 0 0 0 1 1 1 1 积

从上面的运算竖式可看出,乘法运算实质上是由“加法”(被乘数相加)和“移位”(部

分积左移对齐乘数位)两种操作来实现的。

4. 除法运算

除法运算是乘法运算的逆运算。与十进制类似,从被除数最高位开始取出与除数相同

的位数,减去除数。够减商记为 1,不够减商记为 0,然后把被除数的下一位移到余数上,

继续前面减除数操作,直到被除数的所有位都下移完为止。

[例 1.15] 用二进制数 10110111 除以二进制数 110,求商和余数。

0 1 1 1 1 0

1 1 0 1 0 1 1 0 1 1 1

1 1 0

1 0 1 0

1 1 0

1 0 0 1

1 1 0

1 1 1

1 1 0

1 1

则 10110111B÷110B=11110B,余 11B。

在上面进行的除法运算中,实质上是由减法、移位和判断三种操作实现的。即先让被

除数左移一位,然后从移出的最高位或余数中减去除数,若够减则商为 1,并从中减去除

数;若不够减则商为 0,继续左移被除数的最高位到余数中,如此重复上述过程,直到被

除数全部左移完为止。

综上所述,二进制算术运算中的加、减、乘、除四种运算,可由加、减和移位三种操

作来完成,而计算机内部只设有加法器而无减法器,因此需要将减法运算转化为加法运算。

这需要其他方面的知识。这样,微型机中二进制数的四则运算实际上就只由加法和移位两

Page 15: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-8- 单片机原理及接口技术

种操作来实现了。

1.3.2 逻辑运算

微型机内二进制信息的逻辑运算由专门的逻辑电路完成。

1. 逻辑与运算

逻辑与常用符号“∧”表示,运算规则为:0∧0=0,1∧0=0,0∧1=0,1∧1=1。两个

位数相同的二进制数进行逻辑与时,只是对应位进行与运算。

[例 1.16] 求二进制数 10110110 和 01101010 相与的结果。

1 0 1 1 0 1 1 0

∧ 0 1 1 0 1 0 1 0

0 0 1 0 0 0 1 0

2. 逻辑或运算

逻辑或又称为逻辑加,常用符号“∨”表示,其运算规则为:0∨0=0,1∨0=1,

0∨1=1,1∨1=1。两个位数相同的二进制数进行逻辑或运算时,只是对应位进行或运算。

[例 1.17] 求二进制数 00111010 与 01010100 相或的结果。

0 0 1 1 1 0 1 0

∧ 0 1 0 1 0 1 0 0

0 1 1 1 1 1 1 0

3. 逻辑非运算

逻辑非运算又称逻辑取反,常用运算符号“-”表示,运算规则为: 0 =1,1=0。一个

二进制数的逻辑非运算是对每位进行取反操作。 [例 1.18] 对二进制数 11001100 取反。

11001100 =00110011

4. 逻辑异或运算

逻辑异或又称半加,是不考虑进位的加法,常用运算符号 ⊕ 表示。

其运算规则为:0 ⊕ 0=1 ⊕ 1=0,1 ⊕ 0=0 ⊕ 1=1。两个位数相同的二进制数进行逻辑异

或运算时,只是对应位进行异或运算。

[例 1.19] 求二进制数 10100110 与 11101001 相异或的结果。

1 0 1 0 0 1 1 0

⊕ 1 1 1 0 1 0 0 1

0 1 0 0 1 1 1 1

综上所述,二进制数的逻辑运算都是逐位进行的,没有进位和借位操作。

1.4 微机的码制和编码

1.4.1 原码、反码和补码

在微型计算机中,参与算术运算的数基本表示形式是机器数。所谓机器数就是已经数

Page 16: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 1 章 单片机基础知识 -9-

码化的带符号数。在 8 位微型计算机中约定,最高位 D7 用来表示符号,而其他 7 位用于

表示数值。如图 1-1 所示,D7=0 表示正数,D7=1 表示负数。

例如:+76 的机器数为 01001100B,-76

的机器数为 11001100B,由数值位表示的数值

称为机器数的真值。

在微型计算机中,为了运算方便,机器数

通常有三种表示方法:原码、反码和补码。

1.原码

在微型计算机中,原码就是机器数的原始形式。最高位为符号位,0 表示正数,1 表示

负数,其余位表示数值。一个数的原码标记方法是将该数用方括号括起来,在方括号右下

角加一个“原”字来表示。例如: [+6]原=00000110B,[-6]原=10000110B。

在微型计算机中,0 是一个非常特别的数,它有+0 和-0 之分,因而其原码表示也不同,

在 8 位微型计算机中:[+0]原=0000000B,[-0]原=10000000B,8 位二进制数原码表示的范围

为-127~+127。

2.反码

微型计算机中二进制数的反码有正数反码和负数反码之分,求法也很简单。正数的反

码和原码相同;负数反码的符号位与负数原码的符号位相同。数值位是原码数值按位取反。

反码的标记方法与原码类似,在方括号右下角添加一个“反”字表示。

例如:[+6]反=00000110B [-6]反=11111001B

[+0]反=00000000B [-0]反=11111111B

3.补码

微型计算机中,二进制数补码的概念我们可以先通过钟表对时的例子加以解释。例如,

现在的正确时间为下午 3 点钟,而某块手表却错误地指向早上 7 点钟,为了校准手表,可

采取两种方法,一种是顺时针拨 8 个小时,另一种是逆时针拨 4 个小时,两种的结果是相

同的。这样可得到两个数学算式:

(1) 顺拨时是加法运算:7+8=12(自动丢失)+3=3。

(2) 逆拨时是减法运算:7-4=3。

当时针顺拨经过 12 点后重新从 0 开始(12 点又称 0 点),即 12 点自动丢失,这个自动

丢失的数(12)在数学上称为模,这种带模的加法称为按模 12 的加法。

上述两个数学表达式中,7-4 的减法和 7+8 按模 12 的加法是等价的。这样,我们就可

以把 7-4 的减法运算转化为加法运算 7+8=3(模 12),这里称+8 和-4 是互补的,+8 称为-4

的补码(模 12)。它们的数学关系为:[X]补=模+X。

8 位二进制数满 256 便向高位进位,256 自动丢失,因此,8 位二进制数的模为 28=256。

在微型计算机中,如果加法器的字长是 n,则最高位进位时会自动丢失模值 2n。因此,

加法器既能做加法运算,也能用补码变减法为加法来运算。其内部不设专用减法器,使微

型机内部结构简化。

8 位二进制数中,正数和负数的补码求法不同。具体方法如下:

(1) 正数的补码与正数的原码相同,一般表达式为:[X]补=X(X>0)。

D1D2D3D4D5D6D7 D0

符号位 数值位

图 1-1 8 位机器数结构

Page 17: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-10- 单片机原理及接口技术

例如:[+3]补=00000011B

(2) 负数的补码由它的绝对值求反加 1 后得到,一般表达式为[X]补= |X| + 1。

例如:[-3]补= |3| − +1=11111100B+1=11111101B (3) 0 的补码只有一种,为 [+0]补=[-0]补=00000000B

对于 8 位二进制数,补码表示的范围为-128~+127。

[例 1.20] 求 Y=88-63。

[Y]补=[88-63]补=[88]补+[-63]补

[88]补=01011000B

[-63]补= |63| − +1= 11000001B 则[Y]=[88]+[-63]。

0 1 0 1 1 0 0 0

+ 1 1 0 0 0 0 0 1

1 0 0 0 1 1 0 0 1

在 8 位机中,和只保留 8 位,其运算结果为:[Y]补=00011001B=25D。由 D7=0 说明 Y

为正数,即采用补码的运算结果与直接运算的结果 Y=8863=25 相同。

1.4.2 微型机中常用的编码

人们习惯用键盘上的数字(十进制数)、字母(26 个英文字母)和符号等与计算机之间进行

数据和信息的交换,而计算机只能识别二进制数,因此,必须事先为这些数字、字母和符

号进行二进制编码(用二进制数表示),以便计算机对它们加以识别和处理。微型计算机中

常用的二进制编码形式有 BCD 码和 ASCII 码两种,下面分别加以介绍。

1.BCD 码

BCD 码是将每一位十进制数用二进制数编码,它保留了十进制的权,数字则用二进制

数表示,因而也称为二-十进制数。一般用标识符[⋯]BCD 表示。BCD 码种类较多,如 8421

码、2421 码、格雷码等,其中最常用的编码为 8421 码。

1) 8421 码编码方法

8421 码编码原则是每位十进制数用 4 位二进制数来表示,8、4、2、1 代表 4 位二进制

数每一位的权。8421 码名称也由此而得。十进制数共有 0~9 十个数字,而 4 位二进制数

共有 16 种组合。8421 码用其中 0000B~1001B 组合表示 0~9 十个十进制数。而 1010B~

1111B 六个编码舍去不用。它们之间的对应关系如表 1-2 所示。

表 1-2 8421 码与十进制数的对应关系

十进制数 BCD 码 十进制数 BCD 码

0 0000B 7 0111B

1 0001B 8 1000B

2 0010B 9 1001B

3 0011B 10 0001 0000B

4 0100B 11 0001 0001B

5 0101B 12 0001 0010B

6 0110B 13 0001 0011B

Page 18: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 1 章 单片机基础知识 -11-

从表 1-1 中可看出,10 以上的十进制数至少需要二位 8421 码字(8 位二进制数)组合在

一起来表示。需要注意的是,由 BCD 码构成的 BCD 数,它不是一个真正的二进制数(二进

制数逢二进位),而是以 4 个一组二进制形式表示的逢十进位的二-十进制数。

例如:十进制数 31 的 BCD 码和对应二进制数分别为[31]BC D=0011 0001B,

31=0001 1111B 因而不能将 BCD 码误认为二进制数。BCD 码与二进制数之间也不能直接转

换,通常要先转换成十进制数。

2) BCD 码的运算

BCD 码用 4 位二进制数表示 0~9 十个十进制数,但 4 位二进制数可表示 16 种状态。

因而有六种状态在 BCD 编码中为非法码。这样在 BCD 码的运算中必须进行修正才能得到

正确的结果。

(1) BCD 码加法运算:两个 BCD 码相加的原则是“逢十进位”,其和也是一个 BCD 数。

但计算机只能进行二进制加法,4 位二进制数是“逢十六进位”,不可能进行“逢十进位”。

因此,在进行 BCD 码加法时,必须对二进制加法的结果进行修正。

两个 BCD 码相加时,若各位的和均在 0~9 之间,则其加法运算规则同二进制数加法

规则一样;若和的低 4 位大于 9 或低 4 位向高 4 位有进位(和大于 15),则低 4 位加 6 修正;

若高 4 位大于 9 或高 4 位的最高位有进位,则高 4 位加 6 修正。

[例 1.21] 已知 X=(48)BCD,Y=(69) BCD,用 BCD 码求 X+Y。

0 1 0 0 1 0 0 0 B = 4 8

+ 0 1 1 0 1 0 0 1 B = 6 9

1 0 1 1 0 0 0 1 B

+ 0 1 1 0 B (低 4 位有进位加 6 修正)

1 0 1 1 0 1 1 1 B

+ 0 1 1 0 (高 4 位大于 9 加 6 修正)

1 0 0 0 1 0 1 1 1 B = 1 1 7

可见,修正后的正确结果为 117。

(2) BCD 码减法运算:BCD 码作减法运算时也需要修正。修正的原则是:低 4 位出现

非法码(大于 9)或低 4 位向高 4 位有借位,则低 4 位减 6 修正;高 4 位出现非法码(大于 9)

或高 4 位最高位有借位,则高 4 位减 6 修正。

[例 1.22] 已知 BCD 码 X=58,Y=28,求 X-Y。

0 1 0 1 1 0 0 0 B = 5 8

- 0 0 1 0 1 0 0 1 B = 2 9

0 0 1 0 1 1 1 1 B ⋯⋯(低 4 位同时出现非法码和借位)

- 0 1 1 0

0 0 1 0 1 0 0 1 B = 2 9

需注意的是,当低 4 位同时出现非法码和借位时,只修正一次。

2. ASCII 码

在微型计算机中,除了处理数字信息外,还要处理大量字母和符号信息。这些字母和

符号统称为字符,它们也必须用特定规则进行二进制编码,以供微型计算机识别和处理。

Page 19: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-12- 单片机原理及接口技术

目前,广泛应用于微型计算机中的国际通用标准编码是 ASCII 码。ASCII 码(American

Standard Coded for Information Interchange)是“美国信息交换标准代码”的简称。它由 7 位

二进制数码构成,可表达 27=128 个字符,其中包括 96 个图形字符和 32 个控制字符。ASCII

码见附录所示。

7 位 ASCII 码分成两组:高 3 位一组表示符号列序,低 4 位一组表示符号的行序。要

确定某个字符的 ASCII 码,可先在 ASCII 码表中查出位置,然后根据该位置将其所对应的

高 3 位(列码)和低 4 位(行码)组合在一起,就是所需的 ASCII 码。例如字母 X,它位于表的

第 6 列、第 9 行,对应的高 3 位组是 101,低 4 位组是 1000,则符号 X 的 ASCII 码是

1011000B(即 58H)。

习题与思考题

1.1 什么是单片微型计算机?它与微处理器、微型计算机、微型计算机系统有何

区别?

1.2 单片机的发展分为哪几个阶段?各阶段的特点是什么?

1.3 AT89 系列单片机分为几类?各类的主要技术特点是什么?都有哪些型号?

1.4 微型计算机中常用的数制有几种?计算机内部采用哪种数制?

1.5 十六进制数能被计算机直接执行吗?为什么要用十六进制数?

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

(1) 125 (2) 0.525 (3) 121.687 (4) 47.945

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

(1) 10110101 (2) 0.10110010 (3) 0.1010 (4) 1101.0101

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

(1) ABH (2) 28.07H (3) ABC.DH (4) 0.35FH

1.9 已知下列各组二进制数 X、Y,试求 X+Y、X-Y、X×Y 和 X÷Y。

(1) X=10101110B ,Y=1001B (2) X=101101B ,Y=1010B

(3) X=11010011B ,Y=1110B (4) X=11001110B,Y=110B

1.10 将下列各组十六进制数转换成二进制数,然后分别完成逻辑与、逻辑或、逻辑

非、逻辑异或运算。

(1) 23H 和 BCH (2) ABH 和 76H (3) CDH 和 8FH (4) 10H 和 67H

1.11 在 8 位二进制计算机数中,正负数如何表示?

1.12 什么叫机器数? 机器数的表示方法有几种?

1.13 写出下列各十进制数的原码、反码和补码。

(1) +28 (2) +69 (3) -125 (4) -54

1.14 什么是 BCD 码?BCD 码与二进制数有何区别?

1.15 写出下列各十进制数的 BCD 码。

(1) 34 (2) 59 (3) 1983 (4) 270

Page 20: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 1 章 单片机基础知识 -13-

1.16 已知下列各组数据,用 BCD 码求下列 X+Y 和 X-Y。

(1) X=36,Y=26 (2) X=100,Y=44

(3) X=27,Y=79 (4) X=51,Y=88

1.17 什么是 ASCII 码?查表写出下列字符的 ASCII 码。

(1) A (2) 7 (3) b (4) @

(5) = (6) ? (7) G (8) 回车 CR

Page 21: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-14- 单片机原理及接口技术

第 2 章 AT89C51 单片机结构和原理

本章通过介绍 AT89C51 单片机内部硬件结构、引脚功能、程序存储器和 CPU 时序等

基础知识,使读者对 89 系列单片机为用户所提供的硬件资源及各种应用特性有较全面的了

解,为今后的学习和应用打下基础。

2.1 AT89C51 单片机的结构

AT89 系列单片机在结构上基本相同,只是在个别模块和功能上有些区别。图 2-1 是

AT89C51 单片机的内部结构框图。它包含了作为微型计算机所必需的基本功能部件,各功

能部件通过片内单一总线连成一个整体,集成在一块芯片上。为了更详细地了解 AT89C51

内部结构和工作原理,现将其分成中央处理器(CPU)、存储器、I/O 端口、定时器/计数器、

中断系统和内部总线六部分加以介绍。

P0驱动器 P2驱动器

P0锁存器 P2锁存器RAMRAM地址寄存器

BACC TMP1

TMP2

PSW

P1驱动器

P1锁存器

P3驱动器

P3锁存器

OSC

定时控制逻辑电路

指令寄存器

PCONSCONTMODTCON

T2CONTH0 TL0 TH1

TH2 TL2 RCAP2H*

RCAP2L*

中断、串行口,定时器逻辑

TL1

SBUF IE IP

Flash

程序地址 寄 存 器

缓冲器

PC 1加 器

程序计数器

DPTR

P0.0~P0.7 P2.0~P2.7

ALU

SP

P1.0~P1.7 P3.0~P3.7

PSENALE

RST

EA

XTAL1 XTAL2

VCC

GND

* AT89C52只在 中有

图 2-1 AT89C51 内部结构框图

Page 22: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 2 章 AT89C51 单片机结构和原理 -15-

2.1.1 中央处理器(CPU)

CPU 是单片机内部的核心部件,是一个 8 位二进制数的中央处理单元,主要由运算器、

控制器和寄存器阵列构成。

1. 运算器

运算器用来完成算术运算和逻辑运算功能,它是 AT89C51 内部处理各种信息的主要部

件。运算器主要由算术逻辑单元(ALU)、累加器(ACC)、暂存寄存器(TMP1、TMP2)和状态

寄存器(PSW)组成。

(1) 算术逻辑单元(ALU):AT89C51 中的 ALU 由加法器和一个布尔处理器组成(图中未

具体画出)。它不仅可以对 8 位二进制变量进行与、或、非、异或等逻辑运算,加、减、乘、

除的四则运算,还具有运算结果判断、数据传送、程序转移等功能。它是运算器的核心

部件。

(2) 累加器(ACC):用来存放参与算术运算和逻辑运算的一个操作数或运算的结果。

(3) 暂存寄存器(TMP1、TMP2):用来存放参与算术运算和逻辑运算的另一个操作数,

它对用户不开放。

(4) 状态寄存器(PSW):PSW 是一个 8 位标志寄存器,用来存放 ALU 操作结果的有关

状态。PSW 中各位状态通常是操作过程中自动形成的,但也可以由用户根据需要由位操作

指令加以改变,PSW 各位定义如表 2-1 所示。

表 2-1 PSW 各位定义表

位编号 PSW7 PSW6 PSW5 PSW4 PSW3 PSW2 PSW1 PSW0

位定义 CY AC F0 RS1 RS0 OV — P

位地址 D7H D6H D5H D4H D3H D2H D1H D0H

① 进位标志位 CY:表示累加器 A 在加减运算过程中其最高位 A7 有无进位或借位。

若有则 CY=1,若没有则 CY=0。CPU 在进行移位操作时也会影响这个标志位。

② 辅助进位位 AC:表示累加器 A 在加减运算时低 4 位(A3)有无向高 4 位(A4)进位或

借位。若有则 AC=1,若没有则 AC=0。

③ 用户标志位 F0:是用户定义的一个状态标志位,根据需要可以用软件来使它置位

或清除。

④ 寄存器选择位 RS1、RS0:AT89C51 共有四组,每组八个工作寄存器 R0~R7。编

程时用于存放数据或地址。但每组工作寄存器在内部 RAM 中的物理地址不同。RS1 和 RS0

的四种状态组合就是用来确定四组工作寄存器的实际物理地址的。RS1、RS0 状态与工作

寄存器 R0~R7 的物理地址关系如表 2-2 所示。

表 2-2 工作寄存器组 R0~R7 的物理地址

RS1 RS0 工作寄存器组号 R0~R7 的物理地址

0 0

0 1

1 0

1 1

0

1

2

3

00H~07H

08H~0FH

16H~17H

18H~1FH

Page 23: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-16- 单片机原理及接口技术

单片机上电复位后,RS1、RS0 的状态为 00。故 R0~R7 对应的是 0 组的物理地址 00~

07H。若要改变 RS1、RS0 的状态,可用位操作指令或数据传送指令。

⑤ 溢出标志位 OV:当执行算术指令时,由硬件自动置位或清零,表示累加器 A 的溢

出状态。

⑥ 奇偶标志位 P:用于指示运算结果中 1 的个数的奇偶性,若累加器 A 中 1 的个数为

奇数,则 P=1;若 1 的个数为偶数,则 P=0。

[例 2.1] 试分析执行加法指令,完成 FFH 与 01H 相加后,PSW 各位的状态。

MOV A, # 0FFH

ADD A, # 01H

执行上述加法指令时的人工算式是:

1 1 1 1 1 1 1 1 B

+ 0 0 0 0 0 0 0 1 B

1 0 0 0 0 0 0 0 0 B

上述加法中,最高位有进位,CY=1;次高位也有进位,OV=0;低 4 位向高 4 位有进

位,AC=1;F0、RS1、RS0 不受影响,P=0,则 PSW 的值为 C0H。

2. 控制器

控制器是单片机内部按一定时序协调工作的控制核心,是分析和执行指令的部件。控

制器主要由程序计数器 PC、指令寄存器 IR、指令译码器 ID 和定时控制逻辑电路等构成。

程序计数器 PC 是专门用于存放现行指令的 16 位地址的。CPU 就是根据 PC 中的地址

到 ROM 中去读取程序指令码和数据,并送给指令寄存器 IR 进行分析。每取出现行指令的

一个字节后,PC 就自动加 1,即(PC)+1→PC,指向下一个要读取字节的地址。当遇到转移

指令或子程序调用指令时,PC 内容会被指定的地址取代,实现程序转移。所以,需要执行

程序的机器码,必须在程序执行前预先一条条地按顺序放到程序存储器 ROM 中,并使 PC

中的初始地址为程序第一条指令的内存地址。

指令寄存器 IR 用于存放 CPU 根据 PC 地址从 ROM 中读出的指令操作码。

指令译码器 ID 是用于分析指令操作的部件,指令操作码经译码后产生相应于某一特定

操作的信号。

定时控制逻辑中定时部件用来产生脉冲序列和多种节拍脉冲。控制逻辑根据指令译码

器产生的操作信号,按一定时间顺序发出一系列节拍脉冲控制信号来完成指令所规定的全

部操作。

3.寄存器阵列

寄存器阵列是单片机内部的临时存储单元或固定用途单元,包括通用寄存器组和专用

寄存器组。

通用寄存器组用来存放过渡性的数据和地址,提高 CPU 的运行速度。

专用寄存器组主要用来指示当前要执行指令的内存地址,存放特定的操作数,指示指

令运行的状态等。例如前面介绍的 PC、PSW、累加器 A 等。其他专用寄存器将在后面的

相关章节中介绍。

Page 24: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 2 章 AT89C51 单片机结构和原理 -17-

2.1.2 存储器

AT89C51 单片机内部有 256 个字节的 RAM 数据存储器和 4 KB 的闪存程序存储器

(Flash),当不够使用时,可分别扩展为 64 KB 外部 RAM 存储器和 64 KB 外部程序存储器。

它们的逻辑空间是分开的,并有各自的寻址机构和寻址方式。这种结构的单片机称为哈佛

型结构单片机。

程序存储器是可读不可写的,用于存放编好的程序和表格常数。

数据存储器是既可读也可写的,用于存放运算的中间结果,进行数据暂存及数据缓冲等。

2.1.3 I/O 端口

AT89C51 单片机对外部电路进行控制或交换信息都是通过 I/O 端口进行的。单片机的

I/O 端口分为并行 I/O 端口和串行 I/O 端口,它们的结构和作用并不相同。

1.并行 I/O 端口

AT89C51 有四个 8 位并行 I/O 端口,分别命名为 P0 口、P1 口、P2 口和 P3 口,它们

都是 8 位准双向口,每次可以并行输入或输出 8 位二进制信息。也可以按位操作进行输入

或输出信息。每个并行 I/O 端口内部都有一个 8 位数据输出锁存器(即特殊功能寄存器 SFR

中的 P0~P3),一个输出驱动器和一个 8 位输入缓冲器。因此,CPU 进行数据输出时可以

将数据锁存,进行数据输入时可以得到缓冲。

当 AT89C51 无需扩展功能,由自身资源构成最小控制系统时,这四个端口都可以作为

普通的输入/输出口使用。但当 AT89C51 扩展外部存储器或使用外部中断、外部计数等功

能时,这四个口的功能又各不相同,详细情况将在 2.2 节中介绍。

2.串行 I/O 端口

AT89C51 有一个全双工的可编程串行 I/O 端口,它利用了 P3 口的第二功能,即将 P3.1

引脚作为串行数据的发送线 TXD,将 P3.0 引脚作为串行数据的接收线 RXD。在串行口控

制寄存器 SCON,电源及波特率选择寄存器 PCON 和串行数据缓冲器(它们都是特殊功能寄

存器)的控制下,每次只能发送或接收一位二进制信息。这样,CPU 内部的 8 位并行二进制

数必须变成一位一位的串行数据才能通过 TXD 发送出去。同理,从 RXD 接收的数据也是

一位一位的串行数据,必须转化为并行数据后才能供 CPU 使用。

AT89C51 串行 I/O 口的发送和接收可以单独进行,也可以同时进行,详细情况在第 9

章中介绍。

2.1.4 定时器/计数器

AT89C51 内部有两个 16 位可编程定时器/计数器,简称为定时器 0(T0)和定时器 1(T1),

T0 和 T1 分别由两个 8 位寄存器构成,其中 T0 由 TH0(高 8 位)和 TL0(低 8 位)构成,T1 由

TH1(高 8 位)和 TL1(低 8 位)构成。TH0、TL0、TH1、TL1 都是 SFR 中的特殊功能寄存器(见

表 2-4)。

T0 和 T1 在定时器控制寄存器 TCON 和定时器方式选择寄存器 TMOD 的控制下

(TCON、TMOD 为特殊功能寄存器),可工作在定时器模式或计数器模式下,每种模式下又

有不同的工作方式。当定时或计数溢出时还可申请中断。详细情况参见第 6 章。

Page 25: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-18- 单片机原理及接口技术

2.1.5 中断系统

单片机中的中断是指 CPU 暂停正在执行的原程序转而为中断源服务(执行中断服务程

序),在执行完中断服务程序后再回到原程序继续执行。中断系统是指能够处理上述中断过

程所需要的部分电路。

AT89C51 的中断系统由中断源、中断允许控制器 IE、中断优先级控制器 IP、定时器控

制器 TCON(中断标志寄存器)等构成,IE、IP、TCON 均为 SFR 特殊功能寄存器(见表 2-2)。

AT89C51 的中断源(产生中断请求信号的源泉)有五个。它们分别是两个外部中断源 INT0、

INT1,中断信号从 P3.2、P3.3 引脚输入;三个内部中断源:定时器 0 溢出中断、定时器 1

溢出中断、串行口中断。每个中断源都有固定的中断服务程序入口地址。详细情况在第 5

章介绍。

2.1.6 内部总线

总线是用于传送信息的公共途径。总线可分为数据总线、地址总线、控制总线。单片

机内的 CPU、存储器、I/O 接口等单元部件都是通过总线连接到一起的。采用总线结构可

以减少信息传输线的根数,提高系统可靠性,增强系统灵活性。

AT89C51 单片机内部总线是单总线结构,即数据总线和地址总线是公用的。内部所有

单元电路都挂在总线上,它们之间的信息传递都经过内部总线,并采用分时操作、分时使

用的方法,所以,不会引起信息冲突或抢占总线的问题。

2.2 AT89C51 单片机引脚及其功能

AT89C51 有 40 条引脚,与其他 51 系列单片机引脚是兼容的。这 40 条引脚可分为 I/O

端口线、电源线、控制线、外接晶体线四部分。其封装形式有两种:双列直插封装(DIP)

形式和方形封装形式,如图 2-2 所示。

1234567891011121314151617181920

4039383736353433323130292827262524232221

(T2)P1.0(T2EX)P1.1

P1.2P1.3P1.4P1.5P1.6P1.7RST

(RXD)P3.0(TXD)P3.1

(T0)P3.4(T1)P3.5

XTAL2XTAL1

GND

(TNT0)P3.2(TNT1)P3.3

(WR)P3.6(RD)P3.7

VCCP0.0(AD0)P0.1(AD1)P0.2(AD2)P0.3(AD3)P0.4(AD4)P0.5(AD5)P0.6(AD6)P0.7(AD7)

P2.7(A15)P2.6(A14)P2.5(A13)P2.4(A12)P2.3(A11)P2.2(A10)P2.1(A9)P2.0(A8)

EA/VPP

ALE/PROGPSEN

P1.5P1.6P1.7RST

(RXD)P3.0NC

(TXD)P3.1(INT0)P3.2(INT1)P3.3

(T0)P3.4(T1)P3.5

P0.4(AD4)P0.5(AD5)P0.6(AD6)P0.7(AD7)EA/VPPNCALE/PROGPSENP2.7(A15)P2.6(A14)P2.5(A13)

7891011121314151617

3938373635343332313029

18

19

20

21

22

23

24

25

26

27

28

P1

.4P

1.3

P1

.2P

1.1

(T2EX

)

P1

.0(T

2)N

CV

CC

P0

.0(A

D0

)P

0.1

(AD

1)

P0

.2(A

D2

)P

0.3

(AD

3)

(WR

)P3

.6(R

D)P

3.7

XT

AL

2X

TA

L1

GN

DN

C(A

8)P

2.0

(A9

)P2

.1(A

10

)P2

.2(A

11

)P2

.3(A

12

)P2

.4

65

43

21

44

43

42

41

40

(a) (b) 图 2-2 AT89C51 封装和引脚分配图

(a) 双列直插式封装;(b) 方形封装

Page 26: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 2 章 AT89C51 单片机结构和原理 -19-

在图 2-2 中,引脚 1 和引脚 2(方形封装为引脚 2 和引脚 3)的第二功能仅用于 AT89C52,

NC 为空引脚。下面分别叙述这些引脚的功能。

2.2.1 I/O 端口功能

在 AT89C51 中有四个双向并行 I/O 端口 P0~P3。每个端口都有八条端口线,共 32 条

线,并都配有端口锁存器、输出驱动器和输入缓冲器。用于 CPU 与外部设备之间交换信息。

但由于每个端口的结构各不相同,因此它们在功能和用途上有较大的差别。

1.P0 口

P0 口有八条端口线,命名为 P0.0~P0.7,其中 P0.0 为低位,P0.7 为高位。每条线的

结构组成如图 2-3 所示。它由一个输出锁存器,两个三态缓冲器,输出驱动电路和输出控

制电路组成。P0 口是一个三态双向 I/O 口,它有两种不同的功能,用于不同的工作环境。

D

CL

Q

Q

P0.X

锁存器

MUX

T2

T1

VCC

控制/地址 数据

读锁存器

内部总线

写锁存器

读引脚

P0.X

图 2-3 P0 口位结构图

当 AT89C51 无需扩展外部存储器时,P0 口可作为普通的 I/O 口使用。这时控制信号为

0(低电平),模拟转换开关 MUX 处于下方,将锁存器的 Q 端与输出级 T2(场效应管)的栅极

接通。同时,因与门输出为 0,输出级中的场效应管 T1 处于截止状态。端口为漏极开路的

电路。CPU 向 P0 端口输出数据时,写脉冲加到锁存器的 CL 上,其上升沿将内部总线传送

给 D 端的数据取反后出现在 Q 端,又经 T2 反相,这样在 P0 引脚上出现的数据正好是 D 端

的写入数据。但在开漏极状态下,要使 P0 引脚真正反应 D 端写入状态,必须外接上拉电

阻。因为当 D 端写入“1”时,T1、T2 都处于截止状态,P0 引脚处于高阻抗悬浮状态。并

没有真正的反应出 D 端的“1”状态,当外接上拉电阻后,P0 引脚与 D 端的写入状态才完

全相同。P0 口的输出能力可驱动八个 TTL 电路。 当 CPU 想从 P0 口读入外部输入数据(输入口)时,必须先向 P0 口写入“1”,然后再读,

因为该信号加到 T2 漏极的同时又加到一个三态缓冲器上,如果此前该口 D 端锁存过“0”

数据,则 T2 是导通的,这样引脚上输入的“1”就被钳位在“0”状态,而无法使端口呈高

阻输入状态,造成读取错误。如果先向端口锁存器写入“1”,使 T2 截止,则外输入的“1”

就可进入到缓冲器中。因此 P0 口作 I/O 口使用时,是一个准双向口。

P0 口的第二功能是当 AT89C51 需要扩展外部存储器时,P0 口作地址/数据总线使用。

此时,CPU 控制信号为 1(高电平),MUX 处于上方,场效应管 T1、T2 都由地址/数据总线

Page 27: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-20- 单片机原理及接口技术

控制工作,而且是互补输出状态。P0 口为第二功能时,不能再作它用,数据的输出和读入

都是在 CPU 内部总线的控制下有条不紊地进行。

2. P1 口

P1 口有八条端口线,命名为 P1.0~P1.7,每条线的结构组成如图 2-4 所示。P1 口是一

个准双向口,只作普通的 I/O 口使用,其功能与 P0 口的第一功能相同。作输出口使用时,

由于其内部有上拉电阻,所以不需外接上拉电阻;作输入口使用时,必须先向锁存器写入

“1”,使场效应管 T 截止,然后才能读取数据。

D

CL

Q

Q

P1.X

锁存器

读锁存器

内部总线

写锁存器

读引脚

VCC

P1.X

T

图 2-4 P1 口位结构图

3. P2 口

P2 口有八条端口线,命名为 P2.0~P2.7,每条线的结构如图 2-5 所示。P2 口也是一个

准双向口,它有两种使用功能:一种是当系统不扩展外部存储器时,作普通 I/O 口使用,

其功能和原理与 P0 口第一功能相同,只是作为输出口时不需外接上拉电阻;另一种是当系

统外扩存储器时,P2 口作系统扩展的地址总线口使用,输出高 8 位的地址 A7~A15,与 P0

口第二功能输出的低 8 位地址相配合,共同访问外部程序或数据存储器(64 KB),但它只确

定地址并不能像 P0 口那样还可以传送存储器的读写数据。

D

CL

Q

Q

P2.X

锁存器 MUXT

VCC控制

内部上拉电阻

读锁存器

内部总线

写锁存器

读引脚

P2.X

地址

图 2-5 P2 口位结构图

4. P3 口

P3 口有八条端口线,命名为 P3.0~P3.7,每条线的结构如图 2-6 所示。P3 口是一个多

用途的准双向口。第一功能是作普通 I/O 口使用,其功能和原理与 P1 口相同。第二功能是

作控制和特殊功能口使用,这时八条端口线所定义的功能各不相同,如表 2-3 所示。

Page 28: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 2 章 AT89C51 单片机结构和原理 -21-

D

CL

Q

Q

P3.X

锁存器

读锁存器

内部总线

写锁存器

读引脚

VCC

P3.X

T

内部上拉电阻

第二输出功能

第二输入功能

图 2-6 P3 口位结构图

表 2-3 P3 口各位的第二功能

P3 口密位 第二功能 功 能

P3.0

P3.1

P3.2

P3.3

P3.4

P3.5

P3.6

P3.7

RXD

TXD

INT0

INT1

T0

T1

WR

RD

串行数据接收口

串行数据发送口

外中断 0 输入

外中断 1 输入

计数器 0 计数输入

计数器 1 计数输入

外部 RAM 写选通信号

外部 RAM 读选通信号

在 P3 口的引脚信号输入通道中有两个缓冲器,第二功能的输入信号取自第一个缓冲

器(上边)的输出端。普通输入信号取自第二个三态缓冲器(下边)的输出端。AT89C51 单片机

上电复位时,所有 I/O 口的复位值均为 1。

5.I/O 口的读写

P0~P3 口都可作为普通 I/O 口来使用。当作为输入口使用时,必须先向该口的锁存器

中写入“1”,然后再从读引脚缓冲器中读入引脚状态,这样的读入结果才正确(前面已分析

过)。当作为输出口使用时,可能要经常修改输出口各引脚的状态,为此在 AT89C51 单片

机的指令系统中,设置有“读-修改-写”指令。例如,逻辑与指令“ANL P1,A”就属

于这类指令。该指令的执行过程是:CPU 先读入 P1 上的数据,然后与累加器 A 中的数据

按位进行逻辑与操作,最后将与的结果送回 P1 口,完成对 P1 口各位状态的修改。这类指

令中,读入 P1 口的数据是前一次写入 P1 口输出锁存器的数据,而不是 P1 口的实际状态,

两者不一定相同。例如,用 P1 的一根线去驱动一个晶体管的基极,当向此口线写“1”时,

晶体管导通,并把引脚上的电平拉成低电位“0”。这时若从引脚上读取数据(引脚缓冲器),

会错读成“0”,而不是先前输出的“1”。为此,在 P0~P3 口的每一根线的结构上都设有

Page 29: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-22- 单片机原理及接口技术

一个读锁存器缓冲器(结构图中上边的缓冲器),当执行这类执令时,读入的数据是锁存器

的输出状态。

2.2.2 电源线

AT89C51 单片机的电源线有以下两种:

(1) VCC:+5 V 电源线。

(2) VSS:接地线。

2.2.3 外接晶体引脚

AT89C51 单片机的外接晶体引脚有以下两种:

(1) XTAL1:片内振荡器反相放大器的输入端和内部时钟工作的输入端。采用内部振

荡器时,它接外部石英晶体和微调电容的一个引脚。采用外部振荡器时,它是外部时钟的

输入端。

(2) XTAL2:片内振荡器反相放大器的输出端,接外部石英晶体和微调电容的另一端。

采用外部振荡器时,该引脚悬空。

2.2.4 控制线

AT89C51 单片机的控制线有以下几种:

(1) RST:复位输入端,高电平有效。当振荡器运行时,在该引脚上出现两个机器周期

的高电平将使单片机复位。

(2) ALE/ PROG :地址锁存允许/编程线。当访问外部存储器时,ALE 线上输出一个高

电位脉冲,将 P0 口输出片外存储器低 8 位地址锁存到外部专用地址锁存器中。即使不访问

外部存储器,ALE 端仍以不变的频率(1/6 振荡器频率)输出脉冲序列,该脉冲序列可作外部

时钟源或定时脉冲源使用。在对 AT89C51 片内 Flash 存储器编程时,该引脚用于输入编程

负脉冲( PROG)。

(3) PSEN :外部程序存储器的读选通线。当 AT89C51 访问外部程序存储器时,每个

机器周期两次 PSEN 有效(即输出两个负脉冲),用于选通片外 ROM。

(4) EA /VPP:片外 ROM 允许访问端/编程电源端。若 EA =1,则先访问内部程序存储

器;若 EA =0,则只允许 CPU 访问外部程序存储器(地址 0000H~FFFFH)。在 Flash 存储器

编程时,该引脚用于施加编程电压(芯片所要求的编程电压)。

2.3 AT89C51 存储器

AT89C51 单片机存储器结构采用哈佛型结构,即将程序存储器(ROM)和数据存储器

(RAM)分开,它们有各自独立的存储空间、寻址机构和寻址方式。其典型结构如图 2-7 所示。

Page 30: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 2 章 AT89C51 单片机结构和原理 -23-

1EA

内部

0FFFH

0000H 0EA

外部

= =

外部

FFFFH

1000H

内部RAM

专用寄存器

外部00H

80H7FH

00H 0000H

FFFFH

(a) (b)

图 2-7 AT89C51 存储器结构图

(a) 程序存储器地址分配;(b) 数据存储器地址分配

2.3.1 程序存储器

AT89C51 程序存储器有片内和片外之分。片内有 4 KB 字节的 Flash 程序存储器,地址

范围为 0000H~0FFFH。当不够使用时,可以扩展片外程序存储器,因程序计数器 PC 和程

序地址指针 DPTR 都是 16 位的,所以片外程序存储器扩展的最大空间是 64 KB,地址范围

为 0000H~FFFFH。无论片内还是片外扩展的程序存储器,两者的地址空间是统一的。

0000H~0FFFH 这 4 KB 的地址空间为片内和片外程序存储器所共有,或片内占用或片外占

用,但两者不能同时占用。为了加以区分,AT89C51 提供了一个专用的控制引脚 EA 。EA

引脚接高电平时,单片机程序从内部 ROM 开始执行,当 PC 值超出内部 ROM 的容量时,

会自动转向外部程序存储器空间。若 EA 引脚接低电平,则程序从外部扩展程序存储器的

0000H 地址开始取指执行,不管是否有内部 Flash 存储器。 在 64 KB 程序存储器空间中,有六个单元具有固定用途。第一个是 0000H 单元,因

AT89C51 复位后程序计数器 PC 的内容为 0000H,故 CPU 必须从 0000H 单元开始执行程序,

即 0000H 单元是整个系统程序的起始地址。而 0000H 单元与另一固定地址单元 0003H 之

间只有 3 个字节空间,因此,一般在 0000H 单元中存放一条绝对转移指令,用户编写的程

序从转移地址开始存放,这样做的目的是为了跳过其他五个中断入口地址(参阅第 5 章)。

当系统不使用中断时,则无需跳转,程序从 0000H 单元开始顺序存放即可。

在系统需要扩展外部程序存储器时,P0 口和 P2 口作为地址/数据总线使用。P0 口作为

地址/数据复用总线使用,它先输出 16 位地址的低 8 位(PC 程序计数器低 8 位)。当系统不

需扩展,只用内部 4 KB 的 Flash 存储器时,P0 口和 P2 口可作为普通 I/O 口使用。详细扩

展电路在后面章节中介绍。

2.3.2 数据存储器

AT89C51 数据存储器也有片内和片外之分。片内有 256个字节 RAM,地址范围为 00H~

FFH。片外数据存储器可扩展 64 KB 存储空间,地址范围为 0000H~FFFFH,但两者的地

址空间是分开的,各自独立的,结构分配如图 2-7(b)所示。访问的指令也各不相同,访问

Page 31: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-24- 单片机原理及接口技术

内部数据存储器时,用 MOV 指令;访问外部数据存储器时,用 MOVX 指令。

1. 片内数据存储器

AT89C51 单片机片内数据存储器可分为两部分:00H~7FH 单元空间的 128 字节为

RAM 区;80H~FFH 单元空间的 128 字节为专用寄存器(SFR)区。两部分的地址空间是连

续的。

(1) 片内 RAM 区:共 128 字节,它又可划分为通用寄存器区、位寻址区、普通 RAM

区,如图 2-8 所示。

7FH

普通 RAM 区

30H

2FH 7F 7E 7D 7C 7B 7A 79 78

2EH 77 76 75 74 73 72 71 70

2DH 6F 6E 6D 6C 6B 6A 69 68

2CH 67 66 65 64 63 62 61 60

2BH 5F 5E 5D 5C 5B 5A 59 58

2AH 57 56 55 54 53 52 51 50

29H 4F 4E 4D 4C 4B 4A 49 48

28H 47 46 45 44 43 42 41 40 位寻址区

27H 3F 3E 3D 3C 3B 3A 39 38

26H 37 36 35 34 33 32 31 30

25H 2F 2E 2D 2C 2B 2A 29 28

24H 27 26 25 24 23 22 21 20

23H 1F 1E 1D 1C 1B 1A 19 18

22H 17 16 15 14 13 12 11 10

21H 0F 0E 0D 0C 0B 0A 09 08

20H 07 06 05 04 03 02 01 00

1FH

18H

3 组

17H

10H

2 组

通用寄存器区

0FH

08H

1 组

07H

00H

0 组

图 2-8 AT89C51 内部 RAM 空间分配

① 通用寄存器区:00H~1FH 这 32 个单元为通用寄存器区,分为四组,每组占八个

Page 32: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 2 章 AT89C51 单片机结构和原理 -25-

RAM 单元,地址由小到大分别用代号 R0~R7 表示。通过设置程序状态字 PSW 中的 RS1、

RS0 状态来决定哪一组寄存器工作,如表 2-2 所示。不用的工作寄存器单元可作一般的

RAM 使用。

② 位寻址区:20H~2FH 这 16 个单元为位寻址区。它有双重寻址功能,既可以进行

位寻址操作,也可以同普通 RAM 单元一样按字节寻址操作。128 个位地址的分配如表 2-4

所示。

③ 普通 RAM 区:30H~7FH 这 80 个单元为普通 RAM 区。用于存放用户数据,只能

按字节存取。

④ 堆栈区:堆栈是片内 RAM 存储器中的特殊群体。

在 RAM 中专门划出一个连续存储区,用来暂

时存放子程序端口地址、中断端口地址和其他一些

需要保护的数据。这个连续区域可以是前面 128 字

节 RAM 中的任意一段连续区域(中间不能间断),由

使用者通过在初始化程序中设置堆栈指针寄存器 SP

的初始值来确定栈底位置,从而确定堆栈所在的区

域。堆栈区的长短根据需要而定。堆栈的结构如图

2-9 所示。

单片机复位后堆栈指针的初值为 07H,如果不

想占用寄存器区和位寻址区,可在程序初始化中修改 SP 的初值,例如,MOV SP,#30H,

则栈底被确定为 30H 单元,每向堆栈中存入(压入)一个数据,堆栈指针 SP 自动加 1,即(SP)+1

→(SP),指向原栈顶上方空余的存储单元。需要存入的数据依次压入,而 SP 始终指向栈顶。

从堆栈取出(弹出)数据时,只能取出栈顶存储器中的数据,然后 SP 自动减 1,即(SP)-1→

(SP),此时 SP 仍指向栈顶地址。先前被取出数据的那个存储单元,虽然其中内容仍为原数

据,但已作废,允许被刷新,下次新压入数据会覆盖原数据。总之,堆栈操作无论是存入

数据还是取出数据,均只能依次存入或依次取出,不能跳越,而且必须遵守“先进后出”

的原则。

(2) 专用寄存器区:片内 80H~FFH 这一区间,AT89C51 集合了一些特殊用途的寄存

器,一般称之为特殊功能寄存器 SFR。每个 SFR 占有一个 RAM 单元。它们离散地分布在

80H~FFH 地址范围内,如表 2-4 所示。

表 2-4 AT89C51 特殊功能寄存器 SFR 一览表

SFR 符号 地址 复位值(二进制) 功能名称

*ACC 0E0H 00000000 累加器

*B 0F0H 00000000 B 寄存器

*DSW 0D0H 00000000 程序状态字

SP 81H 00000111 堆栈指针

DPL 82H 00000000 数据寄存器指针(低 8 位)

DPH 83H 00000000 数据寄存器指针(高 8 位)

*P0 80H 11111111 P0 口锁存器

栈顶

栈底

(SP) 34B→

33H

32H

31H

30H

图 2-9 堆栈结构图

Page 33: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-26- 单片机原理及接口技术

续表

SFR 符号 地址 复位值(二进制) 功能名称

*P1 90H 11111111 P1 口锁存器

*P2 0A0H 11111111 P2 口锁存器

*P3 0B0H 11111111 P3 口锁存器

*IP 0B8H XXX00000 中断优先级控制寄存器

*IE 0A8H XX000000 中断允许控制寄存器

TMOD 89H 00000000 定时器/计数器方式控制寄存器

*TCON 88H 00000000 定时器/计数器控制寄存器

TH0 8CH 00000000 定时器/计数器 0 高字节

TL0 8AH 00000000 定时器/计数器 0 低字节

TH1 8DH 00000000 定时器/计数器 1 高字节

TL1 8BH 00000000 定时器/计数器 1 低字节

*SCON 98H 00000000 串行控制寄存器

SBUF 99H 不定 串行数据缓冲器

PCON 87H 0XXX0000 电源控制寄存器

没有被 SFR 占据的地址可能在片内并不存在。对这些地址读出时,通常会得到随机的

数据,而写入时将会有不确定的效应,因此软件设计时不要使用这些单元。特殊功能寄存

器通常用寄存器寻址,但也可以用直接寻址方式进行字节访问。其中 11 个寄存器还可进行

位寻址(表 2-4 中带*号的寄存器)操作,其位地址的分配如表 2-5 所示。

表 2-5 SFR 中的位地址分配

位地址 寄存器符号

D7 D6 D5 D4 D3 D2 D1 D0 字节地址

B F7 F6 F5 F4 F3 F2 F1 F0 F0H

ACC E7 E6 E5 E4 E3 E2 E1 E0 E0H

PSW D7 D6 D5 D4 D3 D2 D1 D0 D0H

IP BC BB BA B9 B8 B8H

P3 B7 B6 B5 B4 B3 B2 B1 B0 B0H

IE AF AC AB AA A9 A8 A8H

P2 A7 A6 A5 A4 A3 A2 A1 A0 A0H

SCON 9F 9E 9D 9C 9B 9A 99 98 98H

P1 97 96 95 94 93 92 91 90 90H

TCON 8F 8E 8D 8C 8B 8A 89 88 88H

P0 87 86 85 84 83 82 81 80 80H

2.片外数据存储器

AT89C51 单片机可扩展片外 64 KB 空间的数据存储器,地址范围为 0000H~FFFFH,

Page 34: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 2 章 AT89C51 单片机结构和原理 -27-

它与程序存储器的地址空间是重合的,但两者的寻址指令和控制线不同。程序存储器的访

问指令为 MOVC,控制线为 PSEN ,而片外数据存储器访问指令为 MOVX,读写控制线为

WR 、 RD 。所以,尽管地址重合,也不会造成混乱。 值得注意的是,数据存储器与 I/O 口及外围设备是统一编址的,即任何扩展的 I/O 口

以及外围设备地址均占用数据存储器地址,因此使用时要合理安排数据存储器地址空间。

数据存储器扩展的详细电路将在以后章节中介绍。

2.4 AT89C51 单片机工作方式

AT89C51 单片机有四种工作方式:复位方式、程序执行方式、省电方式和 EPROM 编

程与校验方式。

2.4.1 复位方式

单片机在开机时或在工作中因干扰而使程序失控或工作中程序处于某种死循环状态等

情况下都需要复位。复位的作用是使中央处理器 CPU 以及其他功能部件都恢复到一个确定

的初始状态,并从这个状态开始工作。AT89C51 单片机的复位靠外部电路实现,信号由

RESET(RST)引脚输入,高电平有效,在振荡器工作时,只要保持 RST 引脚高电平两个机

器周期,单片机即复位。复位后,PC 程序计数器的内容为 0000H,其他特殊功能寄存器的

复位状态如表 2-4 所示。片内 RAM 中内容不变。

复位电路一般有上电复位、手动开关复位和自动复位电路三种,如图 2-10 所示。

VCC

RST

VSS

89C51

5 V+

C10 µF

R8.2 kΩ

VCC

RST

VSS

89C51

5 V+

C10 µF

R8.2 kΩ

VCC

RST

P1.0

89C51

5 V+

WDI

MAX750

WDO

PESET

10 kΩ10 µF 1

2

(a) (b) (c)

1 kΩ

89C51

图 2-10 单片机复位电路图

(a) 上电复位电路;(b) 手动复位电路;(c) 自动复位电路

上电复位电路中考虑到振荡器有一定的起振时间,该引脚上高电平必须持续 10 ms 以

上才能保证有效复位。

手动复位电路在有按键按下时,由于电容充电产生一定时间的高电平,就可以使单片

机复位。

自动复位电路又称“看门狗”电路。当由于干扰而发生程序跑飞现象时,“看门狗”电

路能产生一个复位信号使单片机复位一次,使程序恢复正常运行。图 2-10(c)的工作原理是:

如果单片机在 1.6 s 之内不给“看门狗”输入引脚 WDI 输入正脉冲触发信号,且 WDI 引脚

不处于浮空状态,则“看门狗”的输出引脚 WDO 将由高电平变为低电平,由于微分电路

Page 35: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-28- 单片机原理及接口技术

作用,“与非”门输入引脚 1 由高电平转为低电平,然后又由于电容充电而使引脚 1 变为高

电平。引脚 1 电平的这种变化,使“与非”门输出一个正脉冲(与非门 2 脚正常为高电平),

使单片机产生一次复位。因此,我们在程序中每隔一个时间间隔(<1.6 s)由 P1.0 引脚输出一

个正脉冲触发 WDI,如果超出(1.6 s)时间 P 1.0 不发出触发正脉冲,说明程序已跑飞,必须

自动复位使程序恢复正常运行。

2.4.2 程序执行方式

程序执行方式是单片机的基本工作方式,也就是执行用户编写好并存放在 ROM 中的

程序。

2.4.3 省电方式

AT89 系列单片机提供了两种通过软件编程来实现的省电运行方式,即空闲方式和掉电

方式。省电方式可以使单片机在供电困难的环境中功耗最小,仅在需要正常工作时才正常

运行。单片机正常工作时消耗 10~20 mA 电流,空闲方式工作时消耗 1.75 mA 电流,掉电

方式工作时消耗 5~50 电流,可见在省电方式下单片机耗能很小。在空闲和掉电方式下,单片机内部硬件控制电路如图 所示。当 IDL 、PD 时,

为空闲工作方式,此时振荡器继续工作,时钟脉冲继续输出到中断系统、串行口及定时器

模块,而 却没有时钟信号停止工作。当 PD 、 IDL 时,为掉电工作方式,此时

振荡器停止工作,只有片内 和 中的内容被保存,片内其他功能部件都停止工作。

图中两种方式控制端 PD 、 IDL 是特殊功能寄存器 中的控制位 和 所对应触

发器的相应输出端,其状态可通过编程来改变。

时钟发生器

OSC

XTAL2 XTAL1

中断、串行口定时器

CPUPD

IDL

图 2-11 空闲和掉电方式内部电路图

当系统响应中断时则退出空闲方式,而硬件系统复位可以使系统从空闲方式或掉电方

式下退出。

2.4.4 EPROM 编程和校验方式

单片机内部有 的 存储器,它允许用户多次编辑和擦除,在各种开

发应用中,无论修改程序或记录数据都给使用者带来极大的方便。当 工作在 存储器编程方式时,具体有以下几种工作方式:签名字节读出、 存储器编程、程序校

Page 36: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 2 章 AT89C51 单片机结构和原理 -29-

验、编程加密和程序擦除。下面简单介绍一下每种工作方式。实际应用中这些工作方式一

般都是在单片机开发系统上进行的。

1.签名字节的读出

签名字节是生产厂家在生产 89 系列单片机时写入到存储器中的信息。信息内容包括生

产厂家、编程电压和单片机型号。这些信息一般也会印在单片机封装外壳的顶面(或底面),

但由于某些原因看不到封装表面的这些信息时,我们就要通过读取签名字节的方法来获得

这些信息,特别是编程电压。

2.Flash 存储器编程方式

这里的编程是指利用特殊手段将用户编写好的程序代码写入 AT89C51 片内 4 KB 字节

Flash 存储器的过程(89C52 方法相同)。编程前必须先确定编程电压。AT89 系列单片机只有

两种编程电压,一种是低压编程方式,用 5 V 电压;另一种是高压编程方式,用 12 V 电压。

这一编程电压可从器件封装表面读取或从签名字节中读取。

AT89C51 存储器编程时,必须在硬件上先建立好地址、数据和相应的控制信号,如图

2-12 所示。由图可知,编程单元地址加在 P1 口和 P2 口的 P2.0~P2.3 端;数据代码从 P0

口输入;引脚 P2.7、P3.6、P3.7、RST 接高电平;P2.6、PSEN 接低电平; EA /Vpp 加编程

电压;ALE/ PROG端输入编程负脉冲;晶振频率采用 4~20 MHz。在确认存储器已处于擦

除状态(单元内容全为 FFH)时,具体编程步骤如下: (1) 在地址线上输入要编程单元的地址。

(2) 在数据线上输入要写入的数据字节。

(3) 在 EA /Vpp 端加入编程电压(5 V 或 12 V)。

(4) 激活相应的控制信号。

(5) 在 ALE/ PROG端加入一个编程负脉冲,数据线上的数据字节就写入地址线上对应

的 Flash 存储器单元地址中了。 然后改变存储器单元的地址和要写入的数据,重复(1)~(5)的步骤,直到全部内容写入

EPROM 中。每个字节的写入周期是自动定时的,通常不大于 1.5 ms。

P1

P2.6

P2.7

P3.6

P3.7

XTAL2

XTAL1

GND

VCC

P0

ALE

RST

EA

PSEN

5 V+

编程代码

PROG

VIH

VPP(5 V/12 V)C1

C2

5 V+

A7 A0~

A11 A8~

地址0000H

0FFFH

P2.0

P2.3

图 2-12 Flash 编程硬件逻辑电路图

Page 37: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-30- 单片机原理及接口技术

3.程序的校验方式

程序校验方式是指对编程中写入的程序代码进行读出,并与程序写入前代码进行比较

验证的过程。校验只能在程序没有被加密的情况下进行。程序加密后不能直接校验,但可

通过观察它们的功能是否被实现来验证。

4.EPROM 加密方式

用户编写好的程序通过编程和校验无误,写入到 EPROM 中后,可进行加密保护以防

止非法读出受保护的应用软件。程序的加密是通过软件对加密位的编程来实现的。AT89 系

列单片机的加密位有三位,分别为 LB1、LB2、LB3。当加密位被编程后,Flash 存储器的

内容不能用校验方法进行读出,从而实现保密功能。当程序被擦除时,加密位也一起被擦

除,同时恢复 Flash 存储器的全部功能。

5.程序擦除工作方式

AT89C51 单片机的片内 Flash 存储器可多次编程,但在每次对程序存储器进行编程前

必须先执行擦除操作,使存储器单元内容变为全 FFH 状态(包括签名字节)。

2.5 AT89C51 时钟电路与时序

2.5.1 振荡器与时钟电路

单片机内各部件之间有条不紊的协调工作,其控制信号是在一种基本节拍的指挥下按

一定时间顺序发出的,这些控制信号在时间上的相互关系就是 CPU 时序。而产生这种基本

节拍的电路就是振荡器和时钟电路。

AT89C51 单片机内部有一个用于构成振荡器的单级反相放大器,如图 2-13 所示。

内部时钟电路

VCC

Q2

Rf

Q3

Q4

GND

XTAL2

Q1

D1

D2

R1XTAL1

PD

图 2-13 AT89C51 内部振荡器电路图

引脚 XTAL1 为反相器输入端,XTAL2 为反相器输出端。当在放大器两个引脚上外接

一个晶体(或陶瓷振荡器)和电容组成的并联谐振电路作为反馈元件时,便构成一个自激振

荡器,如图 2-14 所示。此振荡器由 XTAL1 端向内部时钟电路提供一定的频率时钟源信号。

另外振荡器的工作还可由软件控制,当对单片机内电源控制寄存器 PCON 中的 PD 位置 1

时,可停止振荡器的工作,使单片机进入省电工作状态,此振荡器称为内部振荡器。

Page 38: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 2 章 AT89C51 单片机结构和原理 -31-

内部时钟电路

GNDXTAL1

R1

Rf

VCC

C1 C2

XTAL2

石英晶体或陶瓷振荡器

( )外部

PD

图 2-14 内部振荡器等效电路图

单片机也可采用外部振荡器向内部时钟电路输入一固定频率的时钟源信号。此时,外

部信号接至 XTAL1 端,输入给内部时钟电路,而 XTAL2 端浮空即可,如图 2-15 所示。

AT89C51

XTAL2

XTAL1

GND

1

NC

外部振荡器信号

图 2-15 外部时钟电路图

片内振荡器的频率是由外接石英晶体的频率决定的,其频率值可在 4~24 MHZ 之间,

当频率稳定性要求不高时,可选用陶瓷谐振器。

片内振荡器对构成并联谐振电路的外接电容 C1 和 C2 要求并不严格,外接晶体时,C1

和 C2 的典型值为 30 pF 左右;外接陶瓷谐振器时,C1 和 C2 的典型值为 47 pF 左右。而且

在设计印刷电路板时,晶体(或陶瓷谐振器)和电容应尽可能安装得靠近单片机,以减少寄

生电容,保证振荡器的稳定性和可靠性。

2.5.2 时序

为了更好地说明 CPU 时序,我们首先介绍一下用来描述时序的一些周期的概念。

1.振荡周期

振荡周期指由单片机片内或片外振荡器所产生的,为单片机提供时钟源信号的周期(其

值为 1/fosc)。

2.时钟周期

时钟周期又称为状态周期 S,由内部时钟电路产生,是振荡周期的二倍。每个时钟周

期分为 P1 和 P2 两个节拍,前半周期 P1 节拍信号有效,后半周期 P2 节拍信号有效,每个节

拍完成不同的逻辑操作。

Page 39: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-32- 单片机原理及接口技术

3.机器周期

一个机器周期由六个状态周期(12 个振荡周期)组成,六个状态周期用 S1~S6 表示,每

一状态周期的两个节拍用 P1、P2 表示,则一个机器周期的 12 个节拍就可用 S1P1、S1P2、

S2P1、⋯、S6P1、S6P2 来表示。在每一节拍和每个机器周期中,单片机完成某些规定的操作,

一条指令的操作可在几个机器周期内完成。

4.指令周期

执行一条指令所占用的全部时间。一个指令周期通常由 1~4 个机器周期组成。若外接

晶振频率为 fosc=12 MHZ,则四个基本周期的具体数值为:

(1) 振荡周期=1/12 。 时钟周期。 机器周期。 指令周期~。单片机在正常工作时,是一条一条执行用户编写好的程序指令的,执行任何一条指令

时都分为取指令阶段和执行指令阶段。其指令周期长短也不相同,在 指令系统中,

指令字节长度为 ~ 个字节,按指令字节数和所需机器周期数不同,可将指令分为:单字

节单周期指令、单字节双周期指令、单字节四周期指令、双字节单周期指令、双字节双周

期指令和三字节双周期指令。这些指令在执行过程中的时序是不相同的。现将几种典型指

令时序作一简单介绍。时序的参考信号是振荡器信号和芯片 端信号。 引脚信号一般情况下是周期

性的,每个机器周期内在 12 和 42 时刻出现两次高电平,持续时间为一个时钟周期。只

在访问外部数据存储器的机器周期内, 信号有效一次,即执行 指令时,只在

12 时刻 有效。对于单字节单周期指令,如图 所示。系统从 12 时刻 第一次有效开始取

指令操作,从 中读出指令码一个字节,并锁存到指令寄存器 内,然后进行译码

和开始执行指令。在同一机器周期的 42 时刻 第二次有效,系统仍有读操作,但因

是单字节指令,所以被读进来的字节无效,程序计算器 也不加“”,指令在 62 时执

行完毕。对于双字节单周期指令,如图 所示。在 12 时刻开始从 中读取指令的第

一字节 第一次有效,并锁存到指令寄存器 内,然后对它进行译码,当知道它是双

字节指令后使 加“”,并在 42 第二次有效时刻读入指令的第二字节,最后在

62 时完成指令的执行。对于单字节双周期指令,如图 所示。在两个机器内发生四次读操作码的操作。

但当 第一次取指译码后,知道是单字节双周期指令,它自动使后三次读操作无效,同

时后三次 不执行加“”操作,并在第二机器周期的 62 时完成指令的执行。图 是指访问外部数据存储器指令 的时序图,它也是一个单字节双周期

指令,但与前面不同,在第二机器周期中不执行取指令操作少执行两次,而是对被选中

的外部数据存储器地址单元进行读出或写入数据的操作,而且在第二机器周期的 12 处不

出现 有效信号。

Page 40: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 2 章 AT89C51 单片机结构和原理 -33-

( )读下一个操作码 无效

P1P2 P1P2P1P2 P1P2P1P2 P1P2P1 P2P1P2P1P2 P1P2P1 P2P1P2S1 S2 S3 S4 S5 S6 S1 S2 S3 S4 S5 S6

P1P2 P1P2S1 S2

P1P2S3

P1P2S4

P1P2S5

P1P2S6

P1 P2S1

P1P2 P1P2S1 S2

P1P2S3

P1P2S4

P1P2S5

P1P2S6

P1 P2S1

P1P2 P1P2S1 S2

P1P2S3

P1P2S4

P1P2S5

P1P2S6

P1 P2P1P2S1 S2

P1P2S3

P1P2S4

P1 P2S5

P1P2S6

P1P2 P1P2S1 S2

P1P2S3

P1P2S4

P1P2S5

P1P2S6

P1 P2P1P2S1 S2

P1P2S3

P1P2S4

P1 P2S5

P1S6

读操作码 读第二操作码 ( )无效

读操作码 读第二字节 ( )无效

读操作码

读第二操作码 ( )无效

读操作码 无取指ALE无 信号

无取指

访问外部存储器

振荡器时钟

(XTAL1)

ALE

(a)

(b)

(c)

(d)

图 2-16 AT89C51 单片机典型指令时序图

(a) 单字节单周期指令;(b) 双字节单周期指令;

(c) 单字节双周期指令;(d) MOVX 单字节双周期指令时序

习题与思考题

2.1 AT89C51 单片机内部结构由哪几部分组成?

2.2 程序状态字 PSW 各位的定义是什么?

2.3 程序计数器 PC 的作用是什么?怎样工作?

2.4 P0~P3 口各有什么功能?P0 口用作普通 I/O 口使用时应注意什么?

2.5 AT89C51 单片机只用内部 Flash 存储器时, EA 引脚如何处理? 2.6 AT89C51 单片机存储器结构是怎样的(画图说明)?片内数据存储器共有多少字

Page 41: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-34- 单片机原理及接口技术

节?划分成几个区域工作?

2.7 在 AT89C51 单片机 ROM 空间中,0003H、000BH、0013H、001BH、0023H 有

什么特殊用途?

2.8 什么是堆栈?堆栈指针 SP 的初值是多少?堆栈工作必须遵守的原则是什么?

2.9 AT89C51 单片机的外 RAM 和外 ROM 使用相同的地址空间和同一条总线,那么

是否会在总线上出现读错和写错现象?为什么?

2.10 什么是对 I/O 口的“读—修改—写”操作?

2.11 单片机的复位方式有几种?复位后各寄存器、片内 RAM 的状态如何?

2.12 如何改变当前工作寄存器组?

2.13 AT89C51 单片机的省电运行方式有几种?如何进入和退出?

2.14 AT89C51 中 XTAL1 和 XTAL2 的功能是什么?采用外部时钟源时如何处理这两

个引脚?

2.15 什么是程序加密?

2.16 什么是振荡周期、时钟周期、机器周期、指令周期?它们之间关系如何?

2.17 什么是指令的时序?简述单字节双周期指令的执行过程,并画出时序图。

Page 42: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 3 章 AT89C51 指令系统 -35-

第 3 章 AT89C51 指令系统

AT89C51 的指令系统与 MCS-51 完全兼容,它具有很多的快速寻址方式,不仅可以进

行字节操作,还可进行位操作,特别适合控制应用。本章将介绍指令的寻址方式和每条指

令的功能及使用方法。

3.1 指令系统简介

AT89C51 单片机共有 111 条指令。其中,单字节指令 49 条,双字节指令 45 条,三字

节指令 17 条。在 111 条指令中,有 64 条是单机器周期指令,45 条双机器周期指令,两条

四机器周期指令。计算机执行指令时间的长短并不取决于指令所占存储器的字节数,而是

取决于所占用的机器周期数。

3.2 寻 址 方 式

在指令的执行过程中,需要一定的数据参与操作,在高级语言程序设计中,我们只需

要通过变量或数组等就可以对数据进行存、取操作,而并不关心这些数据存放的实际物理

地址。但在汇编语言程序设计中,就必须对系统的硬件环境十分清楚,知道每个操作数的

存放区域,对数据存取要给出数据所在的地址,因此存、取数据就转化成寻址问题。所谓

寻址方式,就是如何找到存放操作数的地址,把操作数提取出来的方法。牢固掌握寻址方

式,对学习单片机原理及程序设计有着重要的意义。

AT89C51 共有七种寻址方式:立即数寻址、直接寻址、寄存器寻址、寄存器间接寻址、

变址寻址、相对寻址和位寻址。

3.2.1 符号注释

在以后章节的学习过程中,经常用到一些符号,下面逐一介绍。

(1) Rn(n=0~7):表示八个通用寄存器 R0~R7。

(2) Ri(i=0,1):表示两个寄存器 R0、R1,它们常在间接寻址中作为 8 位地址指针。

(3) #DATA:表示 8 位立即数,即包含在指令中的 8 位常数,如#30 或#00110001B。

(4) #DATA 16:表示 16 位立即数,即包含在指令中的 16 位常数,如#2010H。

(5) direct:表示片内 RAM(含特殊功能寄存器)的直接地址。

(6) addr11:表示 11 位目的地址。

(7) addr16:表示 16 位目的地址。

(8) rel:表示带符号的 8 位地址偏移量。

Page 43: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-36- 单片机原理及接口技术

(9) bit:表示位地址。

(10) @:作为寄存器的前缀,表示间接寻址。

(11) (:表示中内容。:表示所指地址单元的内容。 :表示将箭头左边内容送入箭头右边。

3.2.2 寻址方式

1. 立即数寻址

立即数寻址是指操作数作为指令的一部分存放在程序存储器中,在取指令运行的同时,

直接获得该操作数。这类操作数可以是一字节或两字节操作数,应用时应在操作数前面加

“”号,以区别直接地址。例 3.1 MOV A,#30H ;单字节立即数 30H 送入累加器 A例 3.2 MOV A,30H ;30H 单元中的数送入累加器 A例 3.3 MOV DPTR,#2000H ;双字节立即数 2000H 送入 DPTR2.直接寻址

直接寻址是指在指令中直接给出操作数所在存储单元的地址。执行指令时,从该地址

中直接获取操作数。在 中,可直接寻址的单元为内部 低 个字节和所有的特殊功能寄存

器。对于特殊功能寄存器,既可以使用名字,也可以使用地址。但一般程序设计中都建议

使用名字,以便于程序的阅读和理解。例 3.4 MOV A,40H ;(40H)? A,将 40H 单元中的数据 3AH 送入累加器 A

该指令示意图如图 所示。例 3.5 MOV A,P0 ;(P0)? A

因为 为特殊功能寄存器,它的地址是 ,所以它又

等价于: ,。3.寄存器寻址

寄存器寻址是指把寄存器的内容作为操作数。寄存器

可以是通用寄存器 ~,也可以是 、、 等寄存器。例 3.6 MOV A,R1 ;将 R1 寄存器中的内容送入累加器 A 中

4.寄存器间接寻址

在寄存器间接寻址中,指令中的一个操作数是加了前缀“”的寄存器,“”表示

该寄存器中的内容是操作数的地址。执行指令时,计算机根据这个地址取出操作数完成相

应的操作,这种寻址方式称作寄存器间接寻址。在 中,可用于间接寻址的寄存器

是 、、。其中, 和 用于 位地址寻址, 用于 位地址寻址。可用于寄存器间接寻址的区域是内部 低 个字节~和外部

空间~。 既可以用于对片内 的寻址用 指令,也可以

用于对片外 寻址地址范围是 ~,用 指令。 的寻址范围可以

覆盖片外 的全部 区域。

3AH 3AH

A

RAM内部

40H

图 3-1 直接寻址示意图

Page 44: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 3 章 AT89C51 指令系统 -37-

[例 3.7] 将片内 RAM 20H 单元的内容 58H 用间接寻址方式送入累加器 A。

MOV R0,#20H

MOV A,@R0

执行该指令时,R0 只是一个地址指针,因为 R0 的内容是 20H,所以操作数是从内部

RAM 20H 单元获得的。该指令的示意图如图 3-2 所示。

58H 58H

A

RAM内部

20H20H

R0

图 3-2 间接寻址示意图

[例 3.8] 将片外 RAM 2000H 单元的内容送入累加器 A。

MOV DPTR,#2000H

MOVX A,@DPTR

5.变址寻址(基址寄存器+变址寄存器)

变址寻址是指以寄存器的内容作为基地址,然后在这个基地址的基础上加上地址偏移

量形成操作数的地址,并在这个地址中取出操作数。在变址寻址中只能用 DPTR 和 PC 作

为基址寄存器,累加器 A 作为偏移量寄存器。变址寻址用于读取程序存储器的数据,常用

于查表操作。例如执行“MOVC A,@A+DPTR”指令时,用累加器 A 的内容加上 DPTR

的内容作为一个地址,然后从这个地址中取出操作数送入累加器中。设累加器 A 的内容为

20H,DPTR 的值为 2000H,程序存储器 2020H 单元内容为 47H,则执行该指令后累加器 A

的值为 47H。其示意图如图 3-3 所示。在 AT89C51 中,可用于变址寻址的指令只有两个,

除上例外,还有一个是“MOVC A,@A+PC”。

2000H

20H

A

DPTR

指令执行前

2020H 47H 47H

A

ROM

指令执行后

图 3-3 变址寻址示意图

6.相对寻址

相对寻址是将程序计数器 PC 中的当前值与指令第二字节给出的偏移量相加,其结果

作为跳转指令的转移地址。相对寻址主要用于转移类指令,寻址范围是程序存储器。

7.位寻址

位寻址是指指令的操作数为 8 位二进制数的某一位,指令中给出的是操作数的位地址。

可用于位寻址的区域是片内 RAM 20H~2FH 单元和部分特殊功能寄存器(见表 2-4)。

访问片内 20H~2FH 单元 128 个位地址时,可直接使用位物理地址,如把片内 20H 单

元的最高位清零,可以使用 CLR 20H.7;访问特殊功能寄存器位地址时,除用位地址表示

Page 45: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-38- 单片机原理及接口技术

方法,还可用寄存器名字加位数表示,或直接用位名称,如 SETB D3H 等价于 SETB PSW.3

或 SETB RS0。

3.3 AT89C51 指令系统

AT89C51 单片机指令系统与广泛使用的 MCS-51 系列单片机指令系统完全兼容。虽然

它有 111 条指令,255 种指令代码,但是只要熟悉 42 种助记符,灵活地掌握各种指令的寻

址方式,那么学习和使用 AT89C51 的指令系统就是一件轻松的事情了。

AT89C51 指令系统可分为数据传送类、算术运算类、逻辑操作类、控制转移类和布尔

操作类等五类指令。

3.3.1 数据传送类指令

计算机在进行各种操作和运算时,CPU 需要操作数,这些操作数有的在累加器中,有

的在寄存器中,有的在存储器中,有的由单片机的外部设备提供。AT89C51 提供了丰富的

指令,使这些操作数能够进行传送,为计算机的各种运算提供数据。用到的助记符有 MOV、

MOVC、MOVX、XCH、XCHD、SWAP、PUSH、POP 共八种,数据传送类指令如表 3-1

所示。

表 3-1 数据传送类指令

类型 目的操

作数 助记符 操作码 功 能

A

MOV A,Rn

MOV A,@Ri

MOV A,#data

MOV A,direct

11101rrr

1110011i

74 data

E5 direct

A←Rn

A←((Ri))

A←data

A←direct

1

1

2

2

1

1

1

1

Rn

MOV Rn,A

MOV Rn,direct

MOV Rn,#data

11111rrr

10101rrr direct

01111rrr data

Rn←(A)

Rn←(direct)

Rn←data

1

2

2

1

2

1

Direct

MOV direct,A

MOV direct,Rn

MOV direct,direct

MOV direct,@Ri

MOV direct,#data

F5 direct

10001rrr direct

85 direct direct

1000011i direct

75 direct data

Direct←(A)

direct ←Rn

direct←direct

direct←((Ri))

direct←data

2

2

3

2

3

1

2

2

2

2

@R

MOV @Ri,A

MOV @Ri,direct

MOV @Ri,#data

1111011i

1010011i direct

0111011i data

((Ri))←(A)

((Ri))←(direct)

((Ri))←data

1

2

2

1

2

1

片内

RAM 传

送指令

DPTR MOV DPTR,#data 90 dataH dataL DPTR← data16 3 2

Page 46: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 3 章 AT89C51 指令系统 -39-

续表

类型 目的操

作数 助记符 操作码 功 能

A MOVX A,@Ri

MOVX A,@DPTR

1110001i

E0

A←((Ri))

A←((DPTR))

1

1

2

2

@Ri MOVX @Ri,A 1111001i (Ri)←(A) 1 2

片外

RAM 传

送指令 @DPTR MOVX @DPTR,A F0 (DPTR)←(A) 1 2

MOVC A,@A+PC 83 PC←(PC)+1

A←((A)+(PC)) 1 2 ROM 传

送指令 A

MOVC A,@A+DPTR 93 A? ((A)+(DPTR)) 1 2

交换

指令

XCH A,R n

XCH A,@Ri

XCH A,direct

XCHD A,@Ri

SWAP A

11001rrr

1100011i

C5 direct

1101011i

C4

A←→(Rn)

A←→((Ri))

A←→(direct)

A0~3←→((R i)) 0~3

A7~4←→A0~3

1

1

2

1

1

1

1

1

1

1

PUSH direct C0 direct SP←SP+1

(SP)←(direct) 2 2

堆栈

指令

POP direct D0 direct (direct)←(SP)

SP←(SP)-1 2 2

1.片内 RAM 传送指令

片内 RAM 传送指令功能是将源操作数的内容传送到目的操作数,而源操作数内容不

改变(源操作数、目的操作数概念参阅 4.2.1 节)。表中机器码格式中的 rrr=000~111,分别

表示某个工作寄存器组的 R0~R7 寄存器中的一个,程序状态寄存器 PSW 的 RS1、RS0 决

定了当前寄存器。表中指令操作除影响 PSW 中 P 的标志位外,其他任何标志位不受影响。

[例 3.9] 设(R1)=30H,(20H)=30H,(30H)=40H,分别执行以下指令,写出累加器 A

的运行结果。

运行结果

MOV A,#10H ;10H? A,(A)=10H

MOV A,R1 ;(R1)? A,(A)=30H

MOV A,20H ;(20H)? A,(A)=30H

MOV A ,@R1 ;(30H)? A,(A)=40H

2.外部 RAM 传送指令

外部 RAM 传送指令功能也是将源操作数的内容传送到目的操作数,而源操作数内容

不改变。只是在访问外部 RAM 时,目的操作数和源操作数总有一个在累加器 A 中,另一

Page 47: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-40- 单片机原理及接口技术

个在片外存储器中。DPTR 用于片外 16 位地址寻址,Ri 用于 16 位地址的低 8 位地址寻址。

执行 MOVX 指令能够产生读和写信号,执行其他任何指令都不会产生读写信号。

[例 3.10] 将片外 RAM 2000H 单元内容送入片内 RAM 20H 单元中。

MOV DPTR,#2000H

MOVX A,@DPTR ;片外 2000H 单元内容? 累加器 A

MOV 20H,A ;(A)? 片内 20H 单元

[例 3.11] 将片外 RAM 1000H 单元内容送入片外 RAM 3000H 单元。

MOV DPTR,#1000H ;地址指针指向 1000H

MOVX A,@DPTR ;将 1000H 单元内容送入 A

MOV DPTR,#3000H ;地址指针指向 3000H

MOVX @DPTR,A ;将累加器 A 的内容送入 3000H 单元

[例 3.12] 用间接寻址将片内 RAM 10H 单元内容送入片外 RAM 20H 单元。

MOV R0,#10H

MOV A,@R0 ;取片内单元数据

MOV R0,#20H

MOVX @R0,A ;送入片外地址单元

3.查表指令

MOVC 查表指令是指程序存储器内的查表指令,用来获取程序存储器数据表格中的数

据,并将获取的数据送入累加器 A 中。

“MOVC A,@A+DPTR”指令执行时,是将累加器 A 的值与 DPTR 的值相加得到一

个 16 位的地址,并将该地址指向的程序存储器单元的内容送入累加器 A 中。应用这条指

令时,先将被查数据的项数装入累加器 A 中,表头的起始地址送入 DPTR 中,指令执行后,

被查找的数据送入累加器 A 中。

“MOVC A,@A+PC”指令执行时,是将累加器 A 的值与程序指针 PC 的值相加得到

一个 16 位的地址,把该地址指向的程序存储器单元的内容送入累加器 A 中。应用这条指

令时,因为 PC 地址为将要执行的下一条指令地址,而不是数据表格起始地址,所以首先

将被查找数据的项数送入累加器 A 中,其次再用累加器 A 的内容加上 PC 地址单元到数据

表格起始地址单元的字节数即偏移量。指令执行时,用项数与累加器和的结果再与 PC 相

加作为被查找数的物理地址,根据这个物理地址取出被查找的数据送入累加器 A 中。

[例 3.13] 下面的程序从程序存储器 1000H 单元开始存放,写出执行下列程序后,累

加器 A、寄存器 R0 和程序指针 PC 的值。

1000H: MOV A,#01H ;01? A,数据项数送入累加器

1002H: ADD A,#0BH ;项数+偏移量 0BH? A,A 为 0CH

1004H: MOVC A,@A+PC ;PC 为 1005H,与 0CH 相加后,程序到 1011H 单元取

;数 04H 送入 A 中

1005H: MOV R0,A ;(A)? R0,PC 为 1006H

1010H: 02H

Page 48: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 3 章 AT89C51 指令系统 -41-

1011H: 04H

1012H: 06H

1014H: 08H

执行结果为(A)=04H,(R0)=04H,(PC)=1006H。

4.堆栈指令

堆栈是在内部 RAM 中开辟的一端相对固定,一端活动的存储空间,活动端称为栈顶,

固定端称为栈底,所有数据的存入和取出都从栈顶进行。堆栈主要用于进行数据保护。

在 AT89C51 中,堆栈是自底向上生成的,寄存器 SP 始终指向栈顶地址。复位时,SP

的初值为 07H,但这个初值可以通过“MOV SP,#DATA”语句来修改,以确定堆栈的使

用空间。

PUSH 指令用于把直接寻址的一个字节数压入栈顶。执行这条指令时,先将栈顶指针

SP 的值加 1,然后把直接寻址单元里的数存入到 SP 指向的单元中。

POP 指令用于把栈顶的内容送入直接寻址的一个单元中。执行这条指令时,先将堆栈

指针 SP 指向的单元内容弹出,并送入直接地址中,然后将 SP 的值减 1,SP 仍指向栈顶。

堆栈操作指令是直接寻址指令,因此要注意书写格式。当多个操作数执行堆栈指令时,

遵循先进后出的原则。

[例 3.14] 执行下列指令,注意累加器 A 的变化。

MOV SP,#63H ;设置堆栈初值

MOV A,#17H ;17H 送入 A

PUSH ACC ;将 17H 压入堆栈保存

RL A ;将累加器 A 的内容左循环一次

MOV R1,A ;(A)? R1

POP ACC ;将 17H 弹出并送入累加器中

从此例可以看出,堆栈具有保护数据的功能。虽然执行指令过程中,累加器 A 的值经过“RL

A”指令操作而改变,但因为有堆栈操作,执行 POP 指令后,累加器 A 的值仍为 17H。累

加器 A 进栈用 ACC 表示。

5.交换指令

(1) XCH 指令是将源操作数的值与目的操作数累加器 A 的值全字节交换;

(2) XCHD 指令是将源操作数与目的操作数累加器 A 低 4 位内容交换,而高 4 位不变;

(3) SWAP 指令是将累加器 A 的内容高 4 位和低 4 位互换。

[例 3.15] 设(A)=47H,(R0)=58H,(58H)=36H,分别执行下列指令,写出累加器 A 和

各寄存器的值。

执行结果

① XCH A,R0 ;(A)=58H,(R0)=47HH

② XCH A,@R0 ;(A)=36H,(58H)=47H

③ XCHD A, @R0 ;(A)=46H,(58H)=37H

④ SWAP A ;(A)=74H

Page 49: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-42- 单片机原理及接口技术

3.3.2 算术运算类指令

在 AT89C51 指令系统中,提供了加、减、乘、除及加法 BCD 码调整指令,虽然这类

指令(特别是加减指令)操作比较灵活,但它们全是单字节操作。若要进行多字节算术运算,

还需要单独编程。算术运算类指令见表 3-2 所示。

表 3-2 算术运算类指令

类型 助记符 操作码 功 能 对 PSW 的影响 字节

机器

周期

不带

进位

ADD A,Rn

ADD A,@Ri

ADD A,direct

ADD A,#data

00101rrr

0010011i

25H direct

24H data

A←(A)+(Rn)

A←(A)+((Ri))

A←(A)+(direct)

A←(A)+(data)

CY OV AC P

CY OV AC P

CY OV AC P

CY OV AC P

1

1

2

2

1

1

1

1

进位

加法

ADDC A,Rn

ADDC A,@Ri

ADDC A,direct

ADDC A,#DATA

00111rrr

0011011i

35H direct

34H data

A←(A)+(Rn)+CY

A←(A)+((Ri))+CY

A←(A)+(direct)+CY

A←(A)+(data)+CY

CY OV AC P

CY OV AC P

CY OV AC P

CY OV AC P

1

1

2

2

1

1

1

1

带进

位减

SUBB A,Rn

SUBB A,@Ri

SUBB A,direct

SUBB A,#data

10011rrr

1001011i

95 direct

94 data

A←(A)- (Rn) - CY

A←(A) - ((Ri))- CY

A←(A) - (direct) - CY

A←(A) - (data) - CY

CY OV AC P

CY OV AC P

CY OV AC P

CY OV AC P

1

1

2

2

1

1

1

1

加 1

INC A

INC Rn

INC @Ri

INC direct

INC DPTR

04

00001rrr

0000011i

05 direct

A3

A←(A)+1

Rn←(Rn)+1

(Ri)←((Ri))+1

direct←(direct)+1

DPTR←(DPTR)+1

P

无影响

无影响

无影响

无影响

1

1

1

2

1

1

1

1

1

2

减 1

DEC A

DEC Rn

DEC @Ri

DEC direct

14

00011rrr

0001011i

15 direct

A←(A) - 1

Rn←(Rn) - 1

(Ri)←((Ri) ) - 1

direct←(direct) - 1

P

无影响

无影响

无影响

1

1

1

2

1

1

1

1

乘法

除法

MUL AB

DIV AB

A4

84

BA←(A)*(B)

A←A 商,←余数

调整 对 进行十进制调整

1.不带进位加法指令

ADD 是不带进位的加法运算指令,其功能是将累加器 A 的内容与源操作数的内容相

加,结果送入累加器 A 中,源操作数指定单元的内容不变。该指令执行结果影响标志位

CY、OV、AC、P。

Page 50: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 3 章 AT89C51 指令系统 -43-

两个数相加时,可通过对 CY 的检测判断运算结果是否有进位,如果最高位有进位时,

CY 为 1,否则为 0。

若是两个有符号数相加,因为符号位要参加运算,就有可能产生溢出现象,即超出单

字节数所能表示的有符号数的最大范围(-128~+127)。从例 3-16 可知两个负数相加,结果

为正数 22H,显然不对,这就是溢出。CPU 判断溢出的方法是 OV=C7 ⊕ C6,即最高两位

不同时有进位或借位(OV=1)则溢出,否则(OV=0)不溢出。

[例 3.16] 设(A)=8DH,(R1)=95,则执行“ADD A,R1”后,其和为:

1 0 0 0 1 1 0 1

+ 1 0 0 1 0 1 0 1

1 0 0 1 0 0 0 1 0

即(A)=22H,(CY)=1,(OV)=1,(AC)=1,其中(CY)=1 表示最高位有进位;(AC)=1 表示位 3

向位 4 有进位;(OV)=1 表示若为有符号数加法,结果溢出。

2.带进位的加法指令

ADDC 指令功能是同时把源操作数所指出的内容、进位标志 CY 和累加器 A 的内容相

加,结果存入累加器 A 中。ADDC 指令一般用于多字节加法运算,在多字节加法运算中,

低字节加法结果可能产生进位,用 ADDC 指令可使高字节相加的同时加上低字节的进位。

该指令执行结果影响标志位 CY、OV、AC、P。

[例 3.17] 设(A)=79H,(R0)=54H,(CY)=1,执行指令“ADDC A,R0”后,其和为:

0 1 1 1 1 0 0 1

0 1 0 1 0 1 0 0

+ 0 0 0 0 0 0 0 1

1 1 0 0 1 1 1 0

即(A)=CEH,(CY)=0(无进位),(OV)=1,(AC)=0,(P)=1。

3.加 1 指令

该指令用于将操作数的内容加 1。该指令除影响奇偶标志位 P 外,不会对其他任何标

志位产生影响。

[例 3.18] 设(A)=07H,(R3)=45H,(R0)=20H,(20H)=09H,(DPTR)=00FFH,写出执

行下列指令后各存储单元的内容。

INC A

INC R3

INC @R0

INC DPTR

结果为(A)=08H,(R3)=46H,(R0)=20H,(20H)=0AH,(DPTR)=0100H。

4.带借位减法指令

SUBB 指令功能是将累加器 A 中内容减去源操作数的内容及进位 CY 的值,结果送入

累加器 A 中。该指令影响标志位 CY、OV、AC、P。

Page 51: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-44- 单片机原理及接口技术

通过 CY 可判断最高位是否有借位,若有借位,则 CY 置 1,否则为 0;若位 3 有借位,

则 AC 置 1,否则为 0;若两个操作数是有符号数相减,OV 为 1,表示差溢出,即结果超

出了范围。

[例 3.19] 设(A)=0D9H,(R7)=37H,(CY)=1,执行指令“SUBB A,R2”后,差为:

1 1 0 1 1 0 0 1

0 0 1 1 0 1 1 1

- 0 0 0 0 0 0 0 1

1 0 1 0 0 0 0 1

即(A)=0A1H,(CY)=0,(OV)=1,表示最高位无借位;若为有符号数减法,结果溢出。

5.减 1 指令

该指令用于将操作数的内容减 1。与 INC 指令相同,仅影响奇偶标志位 P。

[例 3.20] 设(A)=07H,(R3)=47H,(R0)=20H,(20H)=09H,(DPTR)=1000H,写出执

行下列指令后各存储单元的内容。

DEC A

DEC R3

DEC @R0

DEC DPTR

结果为:(A)=06H,(R3)=46H,(R0)=20H,(20H)=08H,(DPTR)=0FFFH。

6.乘法指令

乘法指令功能是将累加器 A 的内容和寄存器 B 的内容相乘,结果是 16 位二进制数。

其中高 8 位保存在寄存器 B 中,低 8 位保存在累加器 A 中。若乘积大于 0FFH,溢出标志

OV=1,否则为 0。例如,设(A)=C5H,(B)=08H,则执行指令“MUL AB”后,结果为(B)=03H,

(A)=28H,表示积(BA)=0328H,OV=1。

7.除法指令

除法指令功能是用累加器 A 的内容(被除数)除以寄存器 B 的内容(除数)。指令执行后,

商保存在累加器 A 中,余数保存在寄存器 B 中。相除之后,标志位 CY 一定为 0,OV 只

是在除数 B=0 时为 1,其他情况下都为 0。例如,设(A)=96H,(B)=10H,则执行指令“DIV

AB”后,结果为(A)=09H,(B)=06H;标志位 CY=0,OV=0。

8.十进制调整指令

“DA A”是一条对累加器 A 中的 BCD 码进行调整的指令。应用时必须跟在 ADD

或 ADDC 指令后面。因为当两个压缩的 BCD 码按二进制作加法运算时,其结果不一定是

压缩的 BCD 码,所以必须用 DA 指令进行调整(参阅第 1 章)。

[例 3.21] 设(A)=78H,R2=56H,其中 78H 和 56H 都为压缩的 BCD 码。执行指令:

ADD A,R2

DA A

结果如下:

Page 52: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 3 章 AT89C51 指令系统 -45-

0 1 1 1 1 0 0 0

+ 0 1 0 1 0 1 1 0

和 1 1 0 0 1 1 1 0

调整 + 0 1 1 0 0 1 1 0

1 0 0 1 1 0 1 0 0

从上例可以看出,执行第一条指令后累加器 A 的值为 0CEH,高低 4 位都大于 9,已

不是 BCD 码,因此需要给高低 4 位分别加 6 进行调整,即给累加器 A 加 66H 得到正确的

BCD 码。

3.3.3 逻辑操作与移位指令

这类指令主要包括与、或、异或、求反、清零、移位等操作指令。逻辑操作与移位指

令如表 3-3 所示。

表 3-3 逻辑操作与移位指令

类型 助记符 操作码 功 能 字节数 机器

周期

ANL A,Rn

ANL A,@Ri

ANL A,#data

ANL A,direct

ANL direct,A

ANL ditect,#data

01011rrr

0101011i

54 data

55 direct

52 direct

53 direct data

A←(A)∧(Rn)

A←(A)∧((Ri))

A←(A)∧data

A←(A)∧(direct)

Direct←(direct)∧(A)

Direct←(direct)∧data

1

1

2

2

2

3

1

1

1

1

1

2

ORL A,Rn

ORL A,@Ri

ORL A,#data

ORL A,direct

ORL direct,A

ORL direct,#data

01001rrr

0100011i

44 data

45 direct

42 direct

43 direct data

A←(A)∨(Rn)

A←(A)∨((Ri))

A←(A)∨data

A←(A)∨(direct)

Direct←(direct)∨(A)

Direct←(direct)∨data

1

1

2

2

2

3

1

1

1

1

1

2

异或

XRL A,Rn

XRL A,@Ri

XRL A,#data

XRL A,direct

XRL direct,A

XRL direct,#data

01101rrr

0110011i

64 data

65 direct

62 direct

63 direct data

A←(A)(Rn)

A←(A)((Ri))

A←(A)data

A←(A)direct

Direct←(direct)(A)

Direct←(direct)data

1

1

2

2

2

3

1

1

1

1

1

2

求反清 0 CPL A

CLR A

F4

E4

A← A

A←0

1

1

1

1

循环移位

RL A

RLC A

RR A

RRC A

23

33

03

13

A 左循环移一位

A 带进位左循环移一位

A 右循环移一位

A 带进位右循环移一位

1

1

1

1

1

1

1

1

Page 53: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-46- 单片机原理及接口技术

1.逻辑与指令

“与”指令是将源操作数与目的操作数按位相与,其结果送入目的操作数中。“与”

指令可以屏蔽操作数的某些位,即使操作数某些位清零,其他位保持不变。例如,设

(A)=10010111B,则执行“ANL A,#00110110B”指令后,A 的值为 00010110B。可以看

出,对于累加器 A,与零相与的位被清零,与 1 相与的位保持不变。

2.逻辑或指令

“或”指令是将源操作数与目的操作数按位相或,其结果送入目的操作数中。“或”

指令可以使操作数的数据位置 1,即使操作数某些位置 1,其他位保持不变。例如:设

(A)=10010111B,则执行 ORL A,#00110110B 指令后,A 的值为 10110111B。可以看出,

对于累加器 A,与 1 相或的位被置 1,与 0 相或的位保持不变。

3.逻辑异或指令

“异或”指令是将源操作数与目的操作数按位相异或,即不同为 1,相同为 0,其结果

送入目的操作数。“异或”指令可以使操作数的数据位取反,即使操作数某些位取反,其

他位保持不变。例如,设(A)=10010111B,则执行 XRL A,#00110110B 指令后,A 的值为

10100001B。可以看出,对于累加器 A,与 1 相异或的位被取反,与 0 相异或的位保持

不变。

4.累加器清零与取反指令

CLR A 指令功能是将累加器 A 的内容清零。CPL A 指令功能是将累加器 A 的内容按

位取反,即累加器 A 中各位 1 变 0,0 变 1。如设(A)=10010111B,执行 CPL A 指令后,

(A)=01101000B。

5.移位指令

AT89C51 移位指令有四种,都是对累加器 A 进行操作。这组移位指令只能对操作数移

一位,若要移多位,则要通过编写程序完成。

(1) RL A 的指令功能是将累加器 A 的内容左循环移位。如图 3-4 所示,累加器 A 的最

高位移入最低位,同时其他各位依次左移。

A7 A0 A7 A0CY

图 3-4 左循环移位指令示意图 图 3-5 带进位左循环移位指令示意图

(2) RLC A 的指令功能是将累加器 A 的内容和进位标志一起左循环移位。如图 3-5 所

示,累加器 A 的最高位移入进位位 CY,同时其他各位依次左移,CY 位移入累加器 A 的

最低位。

(3) RR A 的指令功能是将累加器 A 的内容右循环移位。如图 3-6 所示,累加器 A 的最

低位移入最高位,同时其他各位依次右移。

A7 A0

A7 A0CY

图 3-6 右循环移位指令示意图 图 3-7 带进位右循环移位指令示意图

Page 54: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 3 章 AT89C51 指令系统 -47-

(4) RRC A 的指令功能是将累加器 A 的内容和进位标志一起右循环移位。如图 3-7

所示,累加器 A 的最低位移入进位位 CY,同时其他各位依次右移,CY 位移入累加器 A

的最高位。

[例 3.22] 设(A)=01001101,(CY)=1,执行下列指令:

RL A ;(A)=10011010

RR A ;(A)=10100110

RLC A ;(A)=10011011,(CY)=0

RRC A ;(A)=10100110,(CY)=1

通过对操作数左右移位 N 次,还可使操作数扩大或缩小 2n 倍。如将(A)=00001000B 分

别循环左移(RL A)和循环右移(RR A)两次,则累加器 A 的值分别是 20H 和 02H,即分别扩

大和缩小了 4 倍。

3.3.4 控制转移类指令

控制转移类指令主要以改变程序计数器 PC 内容为目标,用来控制程序执行的流向。

它主要分为以下几类,如表 3-4 所示。

表 3-4 控制转移类指令

类型 助记符 操作码 功 能 字

机器

周期

无条件

转移

LJMP addr16

AJMP addr11

SJMP rel

JMP@A+DPTR

0 02 addr16

A10~A800001A7~A0

80 rel

73

PC←add16

PC←(PC)+2, PC100←add11

PC←(PC)+2+rel

PC←(A)+(DPTR)

3

2

2

1

2

2

2

2

无条件

调用及

返回

LCALL addr16

ACALL addr11

RET

RETI

12 addr16

A10~A810001A7~A0

22

32

PC←(PC)+3, SP=(SP)+1

(SP)←(PC)L, SP=(SP)+1

(SP)←(PC)H, PC←add16

PC←(PC)+2, SP=(SP)+1

(SP)←(PC)L, P=(SP)+1

(SP) ← (PC)H, PC100 ←

add11

子程序返回

中断返回

3

2

1

1

2

2

2

2

条件

转移

JZ rel

JNZ rel

CJNE A, #data,rel

CJNE A,direct,rel

CJNE Rn , #data,rel

CJNE @Ri, #data,rel

DJNZ Rn,rel

DJNZ direct,rel

60 rel

70 rel

B4 data rel

B5 direct rel

10111rrr data rel

1011011i data rel

11011rrr rel

D5 direct rel

(A)=0, PC←(PC)+2+rel

(A)?0, PC←(PC)+2+rel

(A)?data, 转移

(A)?(direct), 转移

(Rn)?(data), 转移

((Ri))?(data), 转移

(Rn)-1?0, 转移

(direct)-1?0, 转移

2

2

3

3

3

3

2

3

2

2

2

2

2

2

2

2

空操作 NOP 00 PC←(PC)+1 1 1

Page 55: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-48- 单片机原理及接口技术

1.无条件转移指令

无条件转移指令是指当程序执行到这条指令时,程序将无条件地转移到指令指向的地

址单元取指运行。

(1) AJMP 为短转移指令。这条指令提供一个 2 K 空间的 11 位地址。转移的目标地址

的 16 位中,高 5 位为取完 AJMP 指令后 PC 高 5 位的值,低 11 位由指令提供。因此,可

以这样理解这条指令:单片机将 64 K 程序存储器分成 32 个页面,每个页面 2 K 个字节。

使用这条指令时,要求 AJMP 指令后的 PC 地址必须和转移的目标地址在同一个页面内。

如对于指令“LP:AJMP L1”,设 L1=00010101101B(ADH),标号 LP 的值为 2345H,则

执行指令后,程序将转移到地址 20ADH 单元执行。

(2) LJMP 为长转移指令。当程序执行这条指令时,无条件地转移到指令提供的 16 位

地址上执行程序。这条指令可以转移到 64 K 程序存储器地址空间的任何地方。

(3) SJMP 为相对转移指令。指令中提供的是一个在-128~+127 范围内的相对偏移量,

执行指令时,用取完 SJMP 指令后的 PC 值加上相对偏移量作为转移的目标地址,程序无

条件地转移到目标地址执行。

以上三条指令在用汇编语言编写程序时,编程人员多用一个标号表示转移指令的目标

地址,机器汇编时会自动将它转换成正确的格式。在手工汇编时,编程人员就要根据每条

指令的功能,正确计算程序转移的目标地址。

(4) “JMP @A+DPTR”为间接转移指令,用它可实现分支转移。执行这条指令时,目

标地址是 DPTR 的内容与累加器 A 的内容之和,一般在使用这条指令时,DPTR 用来保存

转移表的起始地址,累加器 A 保存转移表的项数。因为 AJMP 为双字节指令,使用时要将

A 的值乘以 2。

[例 3.23] 设命令程序存放在起始地址为 JPTB 的转移指令表中,试编一程序,使计算

机按照命令编号 NUM 的值转去执行相应的命令程序。

MOV DPTR,#JPTB ;指向跳转表首地址

MOV A,NUM ;跳转表项数

RL A ;项数乘 2

JMP @A+DPTR ;散转至转移表

JPTB:AJMP CASE0

AJMP CASE1

AJMP CASE2

AJMP CASE3

这个例题的功能是:当 NUM 的值为 0 时,执行 AJMP CASE0 指令;当 NUM 的值为

1 时,执行 AJMP CASE1 指令;⋯⋯

2.有条件转移指令

有条件转移指令是指根据指令中给出的条件进行判断,若条件成立,则程序转向指定

的目的地址执行,否则顺序执行程序。有条件转移指令的目标地址都在相对于该指令的下

一条指令为-128~+127 的区域内。

Page 56: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 3 章 AT89C51 指令系统 -49-

1) 累加器判零指令

JZ 指令的功能是判断累加器 A 的值。若累加器 A 的值为 0,则程序转移到目标地址;

否则,顺序执行程序。

JNZ 指令的功能是判断累加器 A 的值。若累加器 A 的值不为 0,则程序转移到目标地

址;否则,顺序执行程序。

2) 比较转移指令

这组比较指令的功能是将目的操作数的内容和源操作数的内容进行比较。若不相等,

则程序转移到目标地址;否则,则顺序执行程序。

这组指令影响标志位 CY 的值。当目标操作数大于或等于源操作数时,则 CY 等于 0;

否则,则 CY 等于 1。

3) 减 1 条件转移指令

这组指令的功能是先将操作数的内容减 1,然后判断结果。如果不为 0,则转移到目标

地址;否则,则顺序执行程序。

这组指令影响操作数的值,它一般用于循环程序的设计。操作数通常用于存放循环次

数,每执行一次该语句,操作数的值被减 1,直到操作数的值为零,即程序结束循环时,

操作数的内容已为零。

3.空操作指令

执行这条指令除 PC 内容加 1 外,不影响任何标志位和其他寄存器。NOP 指令常用来

产生一个机器周期的延迟。

4.调用与返回指令

在程序设计中,有些如延时、显示等具有一定功能的程序在一个系统中常常被多次使

用,为了避免重复编写相同功能的程序,使程序编写和调试更加容易,通常把这些具有一

定功能的经常被反复使用的程序段作为子程序。在编程需要子程序功能时,只需直接调用

子程序即可。子程序的最后一句是返回指令,用于从子程序返回主程序。

1) 短调用指令

ACALL 指令的目标地址是 11 位。在调用子程序时,该指令与 AJMP 指令类似,要求

调用子程序的入口地址与 ACALL 指令后面指令的第一个字节在同一个 2 K 页面的程序存

储器区域中。CPU 执行该指令时,先将该指令的下一条指令的 16 位地址(断点值,即执行

完子程序后,返回时将要执行的指令地址)压入堆栈保存,然后加 2 后的指令高 5 位地址作

为子程序始址的高 5 位以及把该指令中的 11 位地址作为子程序始址的低 11 位,再转入该

子程序执行。

2) 长调用指令

LCALL 指令的目标地址是 16 位。可在 64 K 程序存储器区域范围内调用任何一个子

程序。CPU 执行该指令时,先将该指令的下一条指令的 16 位地址压入堆栈保存,然后将

子程序的入口地址送入 PC,从而开始执行子程序。

3) 返回指令

RET 是子程序返回指令。它使 CPU 从子程序返回到调用指令的下一条指令。它的主要

操作是把堆栈的中断点地址恢复到程序计数器 PC 中,从而使程序回到断点处继续执行。

Page 57: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-50- 单片机原理及接口技术

RETI 是中断返回指令,用来从中断服务子程序返回。它除了与 RET 一样具有将断点

地址送入 PC 功能外,还可以清除相应的中断状态寄存器。

3.3.5 位操作类指令

AT89C51 有一个完整的位处理机,用于对位地址进行操作,在 3.2 节中已经说明,只

有内部 RAM 20H~2FH 单元和单元地址能被 8 整除的特殊功能寄存器能够进行位操作,所

有的位操作都是直接寻址方式进行的。在位处理器中,位的传送和逻辑运算是通过进位标

志 CY 来完成的,CY 的作用相当于 CPU 中的累加器 A。

位操作指令共 17 条,如表 3-5 所示。

表 3-5 位操作指令

类型 助记符 操作码 功能 字节 机器周期

位传送 MOV C,bit

MOV bit,C

A2 bit

92 bit

C←(bit)

bit←C

2

2

1

2

位修正

CLR C

CLR bit

CPL C

CPL bit

SETB C

SETB bit

C3

C2 bit

B3

B2 bit

D3

D2 bit

C←0

bit←0

C← C

bit←(/bit)

C←1

bit←1

1

2

1

2

1

2

1

1

1

1

1

1

位逻辑

运算

ANL C, bit

ANL C, /bit

ORL C, bit

ORL C, /bit

82 bit

B0 bit

72 bit

A0 bit

C←C∧(bit)

C←C∧(/bit)

C←C∨(bit)

C←C∨(/bit)

2

2

2

2

2

2

2

2

判位转

JC rel

JNC rel

JB bit, rel

JNB bit, rel

40 rel

50 rel

20 bit rel

30 bit rel

C=1, 转

C=0, 转

(bit)=1, 转

(bit)=0, 转

2

2

3

3

2

2

2

2

JBC bit, rel 10 bit rel bit=1 转 bit←0 3 2

1.位数据传送指令

这组指令的功能是将源操作数位地址单元的值传送给目标操作数指向的位地址单元

中,源操作数内容不变。

[例 3.24] MOV C,07H ;将内部 RAM 20H 单元的最高位的值送入 CY 中

MOV P1.0, C ;将 CY 的值送入 P1 口的 D3 位

2.位修正指令

(1) CLR C 使进位标志位内容 CY 清零;

(2) CLR bit 使位地址单元内容清零;

(3) CPL C 使进位标志位内容取反;

Page 58: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 3 章 AT89C51 指令系统 -51-

(4) CPL bit 使位地址单元内容取反;

(5) SETB C 使进位标志位内容置 1;

(6) SETB bit 使位地址单元内容置 1。

3.位逻辑运算指令

(1) ANL C,bit 指令功能是把源操作数位的内容与目标操作数 CY 的内容进行与运

算,结果送入 CY 中;

(2) ANL C,/bit 指令功能是对源操作数位取反后,再与目标操作数进行与运算,结果

存入 CY 中,但不改变源操作数本身的值;

(3) ORL C,bit 指令功能是把源操作数位的内容与目标操作数 CY 的内容进行或运

算,结果送入 CY 中;

(4) ORL C,/bit 指令是对源操作数位取反后,再与目标操作数进行或运算,结果存入

CY 中,但不改变源操作数本身的值。

4.位条件转移类指令

位判断转移指令都是条件转移指令,转移的目标地址都是用相对偏移量表示的,转移

范围相对于该指令的下一条指令-128~+127 范围内。使用这些指令编程时,只用一个标号

或 16 位数来表示转移目标地址。

(1) JC 指令功能:若进位标志 CY 为 1,则转移到目标地址执行程序,否则顺序执行

程序;

(2) JNC 指令功能:若进位标志 CY 为 0,则转移到目标地址执行程序,否则顺序执行

程序;

(3) JB 指令功能:若位地址单元内容为 1,则转移到目标地址执行,否则顺序执行

程序;

(4) JNB 指令功能:若位地址单元内容为 0,则转移到目标地址执行,否则顺序执行

程序;

(5) JBC 指令功能:若进位标志 CY 为 1,则转移到目标地址执行程序,且将 CY 清零,

否则顺序执行程序。

3.4 实 验

实验 1 熟悉并使用传送类指令

1. 实验目的

(1) 了解实验设备的安装和分布。

(2) 熟悉实验设备的操作和使用。

(3) 掌握 89C51 传送类指令。

2.实验器材

单片机开发设备一套。

Page 59: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-52- 单片机原理及接口技术

3.实验步骤

(1) 仔细观察单片机开发实验设备,认识印制线路板上的程序存储器、数据存储器、

各主要接口电路及键盘、开关、数码管、显示器等输入、输出设备。

(2) 根据开发机使用说明,学习开发机的基本操作:开机、复位、数据存储器和特殊

功能寄存器数据的输入、修改和显示、程序的输入、调试及运行等。

(3) 观察复位键的功能:按下复位键,将 R0~R7、A、PSW、B 和 SP 都送入十六进制

数 FFH,再按下复位键后,读出上述寄存器内容,观察其结果有何变化。请反复操作两次。

(4) 学习 MOVX 和 XCH 指令的功能,可参考以下步骤:

① 输入下列程序。

ORG 2000H

MOV A,#55H

MOV DPTR,#0020H

MOVX @DPTR,A

MOV 20H,#0AAH

XCH A,20H

MOVX @DPTR,A

SJMP $

② 运行程序前观察 DPTR、A、内部 RAM 20H 单元和外部 RAM 20H 单元的值,然后

单步运行上述程序,再重新观察上述寄存器和存储器单元内容的变化。

③ 分析程序的运行结果,说明该程序的功能。

(5) 学习堆栈指令的功能,可参考以下步骤:

① 输入下列程序。

ORG 2000H

MOV A,#55H

MOV PSW,#0CCH

PUSH ACC

PUSH PSW

MOV A,#66H

MOV PSW,#77H

POP PSW

POP ACC

SJMP $

② 按复位键,观察 A、PSW、SP、07、08 和 09 单元的内容,再单步运行上述程序,

重新观察上述寄存器和堆栈区内容的变化。

4.思考与讨论

(1) 复位键的作用和功能。

(2) 堆栈有什么作用?

Page 60: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 3 章 AT89C51 指令系统 -53-

实验 2 熟悉并使用算术逻辑操作类指令

1.实验目的

(1) 熟悉算术运算类指令。

(2) 熟悉逻辑运算类指令。

(3) 掌握算术运算类指令对标志位的影响。

2.实验器材

单片机开发设备一套。

3.实验内容和步骤

(1) 学习加法指令,可参考以下步骤:

① 设 30H 和 32H 开头分别存放两个 16 位无符号二进制数(低 8 位在前,高 8 位在后),

输入下面完成两个数相加的程序。

ORG 2000H

MOV R0,#30H

MOV R1,#32H

MOV A,@R0

ADD A,@R1

MOV @R0,A

INC R0

INC R1

MOV A,@R0

ADDC A,,@R1

MOV @R0,A

SJMP $

② 阅读上述程序,分析程序执行过程。将被加数 1122H 和加数 3344H 分别送入内部

RAM 的相应单元,即(31H)=33H、(30H)=44H、(33H)=11H 和(32H)=22H。

③ 运行程序,观察 31H 和 30H 单元中的两数和以及进位 CY。

④ 将被加数和加数分别改为 8899H 和 AABBH,并送入相应存储单元,然后再观察两

数和以及进位 CY。

⑤ 人工分别求出以上数据之和,并与程序运行结果比较。

(2) 学习 MOVC 查表指令,可参考以下步骤:

① 输入下列完成(0~9)平方值的程序。

ORG 2000H

ADD A,#02H

MOVC A,@A+PC

SJMP $

DB 00H,01H,04H,09H,10H

DB 19H,24H,31H,40H,51H

Page 61: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-54- 单片机原理及接口技术

END

② 先给累加器 A 中送入一个数 3,然后分别采用单步和连续运行方法执行上面程序,

并观察累加器 A 中内容是否为 3 的平方。

③ 给累加器 A 分别重新赋初值 4、6、9 并运行上述程序,同时检查累加器 A 中内容

是否为初值的平方。

(3) 学习移位指令,可参考以下步骤:

① 以下程序是将无符号数扩大 6 倍程序。设扩大 6 倍的值不超过 255。输入下列程序:

ORG 2000H

CLR C

MOV A,30H

RL A

RL A

ADD A,30H

ADD A,30H

MOV 30H,A

SJMP $

END

② 给 30H 单元送一初值,注意不要超过 42。运行程序再观察 30H 单元的内容。

③ 分别重新给 30H 在 0~42 中赋初值,检查 30H 单元的内容,分析程序执行前后的

结果是否吻合。

4. 思考与讨论

(1) RL A 指令的功能是什么?若将一个数除以 8,程序如何编写?

(2) 仿造加法指令实验程序,完成三字节数加法。如编写程序,完成 345678H 与 876543H

的和。

(3) 如果是 BCD 码作加法,加法指令实验程序又将怎样改写?

实验 3 其他指令功能

1.实验目的

(1) 熟悉控制转移类指令。

(2) 熟悉位操作指令功能。

2.实验器材

单片机开发设备一套。

3.实验步骤

(1) 学习布尔运算程序,可以参考以下步骤:

① 该程序实现 AB 运算,设 A、B 分别存放在 00H、01H 单元中,结果存放在 02H 单

元中(00H、01H、02H 是位地址,属于内部 RAM 20H 的 D0、D1、D2)。操作前可给 20H

单元送入初值,例如送入 01H。输入下列程序:

MOV C,00H

Page 62: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 3 章 AT89C51 指令系统 -55-

ANL C,/01H

MOV 02H,C

MOV C,00H

CPL C

ANL C,01H

ORL C,02H

MOV 02,C

SJMP $

② 在程序“SJMP $”指令处设置断点,并检查结果。

(2) 学习数据块传送程序,可参考以下步骤:

① 输入下面程序完成将片内 RAM 30H 开始的 10 个单元中的内容传送到外部 RAM

1000H 开始的单元中。

ORG 0030H

MOV R0,#30H

MOV R7,#0AH

MOV DPTR,#1000H

LP:MOV A,@R0

MOV @DPTR,A

INC R0

INC DPTR

DJNZ R7,LP

SJMP $

END

② 在内部 RAM 30H~39H 单元中输入数据 AAH,在外部 RAM 1000H~1009H 单元

中输入数据 00H。

③ 单步执行程序,观察寄存器 R0、DPTR、R7 内容的变化。

④ 连续运行程序,并检查外部 RAM 1000H~1009H 单元的内容是否为 AAH,若是,

则表示程序运行正确。

习题与思考题

3.1 什么叫指令及指令系统?AT89C51 指令系统主要分为哪几类?

3.2 AT89C51 共有几种寻址方式?举例说明每种寻址方式的特点。

3.3 AT89C51 内部 RAM 低 128 个字节、特殊功能寄存器区、外部 RAM 分别有几种

寻址方式?举例说明。

3.4 写出下列指令的寻址方式和功能。

(1) MOV A,#50H (2) MOV A,R7

(3) MOV 30H,20H (4) MOVC A,@A+DPTR

Page 63: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-56- 单片机原理及接口技术

(5) MOV A,@R0 (6) SETB 27H

3.5 A=83H,R0=17H,(17H)=34H,问执行以下指令后,A 的值是什么?

ANL A,#17H

ORL 17H,A

XRL A,@R0

CPL A

3.6 若 (A)=34H , (R0)=56H , (R1)=78H , (56H)=20H , (R3)=AFH , (40H)=12H ,

(78H)=DCH,试写出下列指令独立执行后有关寄存器和存储器单元的内容。若指令影响标

志寄存器 PSW,则写出 PSW 中的内容。

(1) MOV A,@R0

(2) ANL 40H,#0FH

(3) ADD A,R3

(4) SWAP A

(5) DEC @R1

(6) XCHD A,@R1

3.7 判断下列指令是否正确,错误指令需写明原因并改正。

(1) MOV #20H,A

(2) CJNE @R0,#20H

(3) MOV @DPTR,A

(4) DA R1

(5) DIV A,R0

(6) DJNZ 20H,LP;LP 为标号

(7) SETB 7FH

(8) RRC B

(9) MOV 30H,40H

(10) PUSH #56H

3.8 已知 SP=60H,(A)=02H,(DPH)=20H,(DPL)=01H,用图示说明执行下列指令的

过程中,堆栈指针 SP 和堆栈中数据的变化。

PUSH ACC

PUSH DPH

PUSHI DPL

POP DPL

POP DPH

POP ACC

3.9 已知无符号数 X 和 Y 分别在外部 RAM 的 2000H 和 2001H 单元,试编写程序完

成如下操作并把结果 Z(小于 255)送入内部 RAM 20H 单元。

(1) Z=4X+3Y (2) Z=6X-2Y

3.10 已知片内 RAM 30H、31H 单元分别存放被除数和除数,编写程序使其相除,并

将商放在外部 RAM 20H 单元,余数放在外部 RAM 21H 单元。

Page 64: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 3 章 AT89C51 指令系统 -57-

3.11 写出满足下列要求的指令。

(1) 使 30H 单元中的内容低 4 位清“0”,其他位不变。

(2) 使 30H 单元中的内容高 2 位置“1”,其他位不变。

(3) 使 30H 单元中的内容高 3 位取反,其他位不变。

(4) 将 30H 单元中的所有位取反。

3.12 按下列条件编写程序,条件满足转到标号 LABEL 处,否则停机。

(1) A≥10 (2) A<10 (3) A≥10 (4) A>10

3.13 编写程序,将片外 RAM 1000H 地址开始的连续 100 个单元清零。

Page 65: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-58- 单片机原理及接口技术

第 4 章 汇编语言程序设计

程序设计是计算机应用的基础。本章主要介绍 AT89C51 单片机的汇编语言程序设计方

法,同时还将介绍一些具有代表性的应用实例。

4.1 计算机语言概述

让计算机完成一项任务,人们就要把这项任务分解成若干步计算机可执行的各种操作,

而其中每项操作对应着一条指令,通常把这种按人们要求编排的指令序列称为程序。程序

设计必须使用计算机能够识别的“语言”。计算机语言随着计算机的发展而发展,它的种类

很多,主要分为机器语言、汇编语言和高级语言。

4.1.1 机器语言

机器语言就是用二进制编码表示每条指令。因为计算机只能识别二进制数,所以计算

机能够直接执行用机器语言编出的机器码程序。不同种类的计算机,由于其内部结构不完

全相同,它的机器码指令也不一定相同。

例如,用单片机 AT89C51 机器码指令完成“9+5”的操作,所用的机器码指令如下:

01110100 00001001 ;该指令是将 9 存入累加器 A 中

00100100 00000101 ;该指令是将累加器 A 与 5 相加,并把结果存入累加器 A 中

如果将以上两条指令输入单片机中,就可以直接执行。显然,用机器码指令编写程序,

指令难记忆,程序可读性和移植性差,不易查错和修改,限制了计算机的使用和推广。

4.1.2 汇编语言

汇编语言是符号化的机器语言。它用一些容易理解和记忆的符号代替机器码指令,因

此又把汇编语言称为助记符语言,也就是说助记符指令与机器码指令是一一对应的。汇编

语言同机器语言一样,不同结构的计算机,它的汇编指令也不相同。上述“9+5”的例子用

AT89C51 汇编语言可写成:

MOV A,#09H

ADD A,#05H

对比机器码,汇编语言克服了机器语言的缺点,方便了用户记忆指令和编写程序,但

用汇编语言编写的源程序毕竟不是计算机能直接识别的机器码,需用汇编程序“翻译”成

机器码后方可执行。

采用汇编语言编写程序,可以直接访问和操作单片机中的寄存器及存储器单元,对数

据的处理表述的非常具体。因此,在计算机实时测试和控制领域中得到了广泛应用。

Page 66: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 4 章 汇编语言程序设计 -59-

4.1.3 高级语言

高级语言是接近自然语言和数学语言的算法语言,具有直观、通用等特点。相对于高

级语言,机器语言和汇编语言属于低级语言。用低级语言编写程序需要完全了解 CPU 硬件

结构,对程序设计人员要求较高,且程序不能移植。高级语言避免了低级语言的上述问题,

提高了编写程序的效率,使计算机的应用得到了普及。但高级语言必须经过编译程序编译

成目标代码后才能被 CPU 执行。

4.2 汇编语言源程序的设计与汇编

4.2.1 汇编语言格式

汇编语言直接面向机器,它的格式因机器不同而不同。下面介绍 AT89C51 汇编语言指

令格式,我们先看一段用 AT89C51 指令编写的汇编程序。

[例 4.1] 将 30H、31H 两个单元中的大数送入 A 中。

MOV A,30H

CJNE A,31H,BIG

BIG: JNC OVER ;30H 单元值大则结束

MOV A,31H ;31H 单元值小则送入累加器 A 中

OVER: RET

从例 4.1 中可以看出,AT89C51 单片机汇编语言指令格式如下:

[标号:] 操作码 操作数 [;注释]

其中[ ]的部分为可选项。下面结合程序对指令格式中的各部分逐一加以说明:

(1) 标号是表示该指令位置的符号地址。它以英文字母开始,由 1~8 个字母或数字组

成,其后必须跟“:”,通常在子程序或转移指令的目标地址处使用标号。标号不能使用

汇编语言已有的助记符、寄存器、伪指令符号,且同一程序段中不能使用相同的标号。例

4.1 中的“BIG”、“OVER”都是标号。

(2) 操作码指出了指令所要实现的操作功能。如例 4.1 中的“MOV” 用来完成数据的

传送,“CJNE”用于操作数的比较,“INC”用于给操作数加 1 等。

(3) 操作数指出了参与操作的数据来源(源操作数)和操作结果存放的目的单元(目的操

作数)。指令可以由一个或多个操作数组成,操作数与操作数之间用“,”分隔,操作数可

以是立即数,也可以是寄存器或直接地址。不同的指令,操作数的表示方式也不相同。例

4.1 中的 30H、31H、累加器 A 都是操作数。

操作数中的立即数可以是二进制数、八进制数、十六进制数和十进制数。在汇编程序

设计中,大多数采用十六进制数,若十六进制操作数以字符 A~F 中的某个开头时,还要

在其前面加一个前导“0”,以区别字符 A~F。

(4) 注释是对一条指令或一段程序的解释和说明,目的是方便程序的阅读。程序运行

时对注释不进行任何操作。由于汇编语言的可读性较差,系统开发或应用编程时,注释是

Page 67: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-60- 单片机原理及接口技术

非常必要的,它可以方便程序的修改和维护。注释必须以“;”开头,例 4.1 中“;”后

面的内容都是注释。

4.2.2 程序设计步骤

计算机要按照一定的步骤和要求执行各种操作以完成任务,因此,程序设计人员必须

用计算机能够识别的指令来设计编排这些步骤。我们把这种用计算机指令完成指定的操作

过程称作程序设计。程序设计分为下面四个步骤:

1.分析问题,确定算法

这是程序设计中最重要的一步。设计人员必须认真、仔细地考虑系统需要解决的各种

问题以及将来系统功能的进一步扩展,明确知道程序要解决的问题和接收、处理、发送的

数据范围以及使用什么样的算法。当数据较多时,还应考虑内部数据存储器和外部数据存

储器的分配。当程序功能较复杂时,则要采用模块化程序设计。总之,这部分是整个程序

设计的基础。

2.画流程图

流程图是用各种图形、符号、有向线段来直观地表示程序执行的步骤和顺序。它可使

人们通过流程图的基本线索,对全局有完整的了解。一个较大系统软件,既要有主流程图,

用于反映各模块之间的关系,也要有局部流程图,用于反映某个模块的具体实现过程。

3.编写源程序代码

根据流程图用汇编语言指令实现流程图的每一个步骤,从而编写出汇编语言的源程序。

4.调试、测试程序

调试是利用仿真器等开发工具,采用单步、设断点、连续运行等方法排除程序中的错

误,完善程序的功能。当程序具有多个模块时,应先单独调试每个模块,然后将所有模块

合在一起联调。

当程序编写调试完成后,还要结合整个系统进行综合功能的测试,检查是否达到用户

要求,对不符合要求的地方,还要对程序进一步修改,直到完全正确、符合系统要求为止。

4.2.3 源程序的汇编

我们知道,用汇编语言编写的源程序,计算机不能直接运行,必须将源程序转换成计

算机可识别的机器码,这种将源程序转换成机器码的过程称为汇编。汇编分为手工汇编和

机器汇编。

1.手工汇编

手工汇编是通过手工方式查指令编码表,逐个把助记符指令“翻译”成机器码的过程。

手工汇编在计算偏移量地址和程序修改方面非常不方便,一般只在小程序和条件所限时才

使用。

2.机器汇编

机器汇编是在机器上使用汇编程序自动地进行源程序的汇编,最后得到机器码表示的

目标程序。在分析现成产品芯片中的程序时,要将机器语言程序翻译成汇编语言程序,该

Page 68: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 4 章 汇编语言程序设计 -61-

过程称为反汇编。

汇编与反汇编过程如图 4-1 所示。

( )汇编 汇编程序

( )反汇编 汇编程序

源程序( )汇编语言

目标码( )机器语言

图 4-1 汇编和反汇编示意图

4.2.4 伪指令

伪指令不是真正的汇编语言指令,在汇编时,它没有对应的机器码,也不产生目标程

序。伪指令的作用是对汇编过程进行一定控制,令其执行一些特殊操作。常用的伪指令有

如下几条。

1. ORG 汇编起始伪指令

格式:ORG 16 位地址

功能:规定该指令后面的源程序汇编后所产生的目标程序存放的起始地址。

[例 4.2] ORG 0030H

MAIN:MOV A,#00H

ORG 指令既规定了标号 MAIN 的地址是 0030H,也规定了 ORG 后的一系列指令汇编

后机器码从 0030H 地址开始存放。

在一个源程序中,ORG 可多次使用,用来规定不同程序段的不同起始地址。使用 ORG

指令时,规定每个程序段的起始地址可以不连续,但必须从小到大。

2. END 汇编结束伪指令

格式:END

功能:通知汇编程序结束汇编。汇编时遇到 END 指令,则结束所有汇编工作,而 END

之后的所有指令将不予处理。

3. EQU 赋值伪指令

格式:字符名称 EQU 数或汇编符号

功能:用于把数或汇编符号赋给字符名称。在实际应用中,通常把经常使用的数值、

符号定义为一个有意义的字符名称,编写程序时使用这些字符名称,可以方便程序的阅读

和修改。

[例 4.3] COUNT EQU 34H

ADDE EQU 18H

MOV A,#COUNT ;34H? A

ADD A,ADDE ;(A)+(18H)? A

这里,COUNT 被赋值为 34H,ADDE 被赋值为 18H。

4. DATA 数值地址赋值伪指令

格式:字符名称 DATA 表达式

Page 69: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-62- 单片机原理及接口技术

功能:DATA 与 EQU 基本相同,即将 DATA 右边表达式的值赋给一个字符名称。二者

的区别是:EQU 必须先定义,后使用;而 DATA 可先使用后定义。因此,EQU 一般放在

程序的开始,而 DATA 可放在程序的任何地方。

5. DB 定义字节伪指令

格式:[标号:] DB 项或项表

功能:把项或项表中的数据存入程序存储器从标号开始的连续地址单元中。

[例 4.4] ORG 2000H

TAB1:DB 10H,23H

TAB2:DB “123”

汇编后 (2000H)=10H

(2001H)=23H

(2002H)=31H

(2003H)=32H

(2004H)=33H

其中,TAB1、TAB2 是二进制的标号地址,它们的值分别是 2000H 和 2002H。程序汇编时,

汇编程序自动将项或项表的数据依次存入以标号为起始地址的单元中。该例中的“123”作

为字符串以 ASCII 码的形式存放在程序存储器中。

6. DW 定义字伪指令

格式:[标号: ] DW 项或项表

功能:与 DB 类似,不同的是 DB 用来定义存放 8 位数据,而 DW 定义存放的是 16 位

数据。DW 伪指令使数据的高字节存放到低地址单元,低字节存放到高地址单元。

[例 4.5] ORG 1000H

TAB:DW 1200H,4567H

汇编后 (1000H)=12H

(1001H)=00H

(1002H)=45H

(1003H)=67H

7. DS 预留存储区伪指令

格式:[标号:]DS 表达式

功能:从标号指定单元开始,定义一个大小为表达式的值的存储区,以备后用。

[例 4.6] ORG 3000H

DS 09H

DB 10H,20H

汇编后,从 3000 单元开始保留 9 个单元,然后从 3009H 按 DB 命令给内存单元赋值,即

(3009H)=10H,(300AH)=20H。

8. BIT 位地址赋值伪指令

格式:字符名 BIT 位地址

Page 70: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 4 章 汇编语言程序设计 -63-

功能:将位地址赋予字符名。

[例 4.7] M1 BIT 01H

M2 BIT P1.0

汇编后,01H 和 P1.0 的位地址 90H 分别赋给了 M1 和 M2。

4.3 汇编语言程序设计

由汇编语言编写的程序主要由顺序结构、分支结构和循环结构组成。对于初学者而言,

首先应掌握这三种结构的程序设计方法,其次再提高编程技巧,写出优秀的程序。

4.3.1 顺序程序设计

顺序程序设计是最基本的程序设计。它是按照指令排列的先后顺序依次执行,每条指

令都必须执行,且只执行一遍。顺序程序设计一般比较单一、简单,常常作为复杂程序的

一部分。

[例 4.8] 设有两个 16 位的双字节数,低 8 位分别存放在片内 20H、30H 单元中,高 8

位分别存放在片内 21H、31H 单元中,求这两个数的和,结果存放在 22H、21H、20H 单

元中。

AT89C51 只提供了单字节相加指令。因此若完成双字节加法,则先将低 8 位相加,其

值作为和的低 8 位,再用 ADDC 指令将两个数的高 8 位与低 8 位和的进位相加,其值作为

和的高 8 位,最后注意高 8 位进位的保存。

ORG 0030H ;设置程序存放的起始地址

MOV 22H,#00H ;22H 单元清零

MOV A,20H ;20H 中的低 8 位数送入 A

ADD A,30H ;两个数的低 8 位相加

MOV 20H,A ;低 8 位相加的结果送入 20H 中

MOV A,21H ;21H 中的高 8 位数送入 A 中

ADDC A,31H ;两个数的高 8 位数相加并加低 8 位进位

MOV 21H,A ;高 8 位相加的结果送入 21H 中

CLR A ;A 清零

ADDC A,#00H ;加上高位进位

MOV 22H,A ;保存最高位进位

RET

[例 4.9] 设 R2 寄存器中保存两个压缩的 BCD 码,试将它们拆开,并转换成 ASCII

码分别放在片内 RAM 11H(高位)和 10H(低位)单元中。

根据 ASCII 码表可知,0~9 的 BCD 数与 ASCII 码表只相差 30H。因此,本题只需将

R2 中的两个 BCD 数拆开,分别加上 30H 即可。

MOV A,R2 ;(R2)? A

ANL A,#0FH ;低位 BCD 数送 A

ORL A,#30H ;低位 BCD 数转换成 ASCII 码

Page 71: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-64- 单片机原理及接口技术

MOV 10H,A ;送 10H 单元保存

MOV A,R2

ANL A,#0F0H ;取高位 BCD 数

SWAP A ;高位 BCD 数送低 4 位

ORL A,#30H ;完成高 4 位 BCD 数的转换

MOV 11H,A ;送入 11H 单元保存

RET

4.3.2 分支程序设计

在程序设计过程中,有时要根据不同情况执行不同功能的程序段,这种根据程序要求

而改变程序执行顺序的设计,称为分支程序设计。分支程序设计分为无条件分支程序设计

和条件分支程序设计两类。无条件分支程序中含有 LJMP、AJMP 等无条件转移指令,执行

这类指令,程序将无条件转移,条件分支

程序中含有判零、比较、位控制等条件转

移指令。若条件满足,则转移到另一分支

执行程序;否则,按原程序继续执行。条

件分支程序体现了计算机执行程序时的分

析判断能力。

[例 4.10] 片外 RAM 2000H、2001H

单元分别存放两个数,判断这两个数是否

相等,如果相等,则位地址 7FH 置 1,否

则清零。

若判断两个数相等使用比较转移指令

就很容易实现该题中的要求,程序流程如

图 4-2 所示。在下面的程序清单中,请读

者考虑一下无条件转移指令 AJMP 的

作用。

程序如下:

ORG 0100H

MOV DPTR,#2000H ;地址指针指向片外 2000H 单元

MOVX A,@DPTR ;(2000H)? A

MOV R0,A ;A? R0

MOV DPTR,#2001H ;地址指针指向 2001H 单元

MOVX A,@DPTR ;(2001H)? A

MOV 30H,R0

CJNE A,30H,NE ;若两个数不相等,则转 NE

SETB 7FH ;若两个数相等,则 7FH 单元置 1

AJMP OVER ;转 OVER

开 始

A (2000H) R0 A← , ←

A (2001H)←

(A) (R0= ) ?

1置 清零

结 束

NY

图 4-2 判断两个数相等的程序流程图

Page 72: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 4 章 汇编语言程序设计 -65-

NE: CLR 7FH ;7FH 单元清零

OVER: RET

[例 4.11] 设 VAR 单元内有一自变量 X,请按

如下条件编程求函数值 Y 并存入 FUNC 单元中。

<−=>

=0X1

0X0

0X1

Y

分析:这是一个三分支条件转移程序。因为是

有符号数,通过 X 的最高位即符号位用累加器判零

指令和位控制条件转移指令来完成零和正负数的判

断。“-1”是用补码 FFH 表示的。程序流程图如图

4-3 所示。

程序如下:

ORG 0100H

VAR EQU 30H

FUNC EQU 31H

MOV A,VAR ;X? A

JZ DONE ;若 X=0,则转 DONE

JNB ACC.7,POSI ;若 X>0,则转 POSI

MOV A,#0FFH ;若 X<0,则-1? A,FFH 为-1 的补码

SJMP DONE ;转 DONE

POSI: MOV A,#01H ;1? A

DONE: MOV FUNC ,A ;存 Y 值

RET

4.3.3 循环程序设计

在程序中包含重复执行的程序段称为循环程序设

计。循环程序可以使程序结构性强、可读性好,从而

大大提高了程序质量。

如将 1~50 这 50 个整数分别送入内部 RAM 中地

址为 30H 开始的单元中,若用顺序结构,则需 50 个

传送指令“MOV direct,#data”,而用下面的循环结构

程序完成,显然简单、清晰、明了。程序流程图如图

4-4 所示。

程序如下:

MOV R7,#50 ;循环初始化

MOV R0,#30H

MOV A,#01

开 始

A X←

A 0 ?=

A 0 ?>

A 1←- A 1←

N

Y

N

Y

结 束

保存结果

图 4-3 按条件求函数 Y 的流程图

开 始

结 束

R7,数据块长度送R0首地址送

RAM送数据至内部

R0 R0 1← +

完成 ?N

Y

图 4-4 存放 50 个整数的程序流程图

Page 73: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-66- 单片机原理及接口技术

LOOP: MOV @R0,A ;循环处理

INC R0

INC A

DJNZ R7,LOOP ;循环控制

RET ;循环结束

结合上例可知,循环程序由循环初始化、循环处理、循环控制和循环结束四个部分组

成。循环初始化位于程序的开始,用于循环程序的准备工作。如设置循环次数,传送数据

的首地址及传送数据的初值;循环处理是指重复执行的工作程序段;循环控制用于控制循

环次数及判断循环是否结束,一般由条件转移语句(DJNZ、CJNE)等组成;循环结束用于存

放程序所得结果及根据程序需要对各工作单元初值的恢复。

[例 4.12] 统计单字节变量 X 中有多少位为 1,并存入 ONE 变量中。

使用带进位左循环移位指令和位判断转移指令,分别将 X 变量最高位移入进位标志位

CY 中并判断其值,若为 1,则将 ONE 单元加 1。这样重复操作八次即可。

ORG 1000H

X EQU 20H

ONE EQU 30H

MOV ONE ,#00H ;ONE 中初始值为 0

CLR C ;标志位 CY 清零

MOV A,X ;X? A

MOV R7,#08H ;R7 存放循环次数

L0: RLC A ;带进位左循环 1 位

JNC L1 ;CY 为 0 转 L1

INC ONE ;CY 为 1 给 ONE 单元加 1

L1: DJNZ R7,L0 ;循环控制

RET

[例 4.13] 在首地址为片外 RAM 2000H 数据缓冲区

中,连续存放 100 个非零的无符号单字节数,求出其中最

大的偶数。

用位操作指令 JB 对操作数最末位进行判断,若为 1

则是奇数,为 0 则是偶数。用 SUB 减法指令,通过标志

位 CY 可判断两个操作数的大小。程序流程图如图 4-5

所示。

程序如下:

ORG 1000H

MAX EQU 30H

MOV MAX ,#00H ;00? MAX

MOV R7,#64H ;存放循环次数

MOV DPTR,#2000H ;地址指针 DPTR 指向缓冲区首地址

L1: MOVX A,@DPTR ;从缓冲区中取数送入 A 中

开 始

结 束

R7←循环次数, MAX 0← , DPTR←首地址

取数

?偶 数

MAX ?>

MAX存入

修改地址

?完成

Y

N

N

N

Y

Y

图 4-5 求最大偶数的程序流程图

Page 74: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 4 章 汇编语言程序设计 -67-

JB ACC.0,ODD ;是奇数转至 ODD

MOV R1,A ;是偶数与 MAX 比较

SUBB A,MAX

JC ODD ;比 MAX 小转至 ODD

MOV MAX,R1 ;比 MAX 大则送入 MAX 单元

ODD:INC DPTR ;改变地址取下一个数

DJNZ R7,L1 ;控制循环

RET

4.3.4 子程序设计

子程序是指能完成明确任务、具有独立功能且能被其它程序反复调用的程序段。下面

先看一个例题。

[例 4.14] 设内部 RAM 20H、21H 单元中有两个数 a 和 b,编程求 c=a2+b2 并把 c 送入

内部 RAM 22H 单元。

该程序由两部分组成:主程序和子程序。主程序通过累加器 A 传送入口参数 a 和 b,

子程序用于求平方并将结果通过累加器 A 传送给主程序。

MOV A,20H ;a? A

ACALL SQR ;求 a2

MOV R0,A ;a2? R0

MOV A,21H ;b? A

ACALL SQR ;求 b2

ADD A,R0 ;a2+b2? A

MOV 22H,A ;存入 22H 单元

RET

SQR:ADD A,#01H ;地址调整

MOVC A,@A+PC ;查平方表

RET ;返回

TAB: DB 0,1,4,9,16

DB 25,36,49,64,81

从上例中,可以得出以下几点:

(1) 汇编语言子程序编写格式很简单,只需第一条指令要有标号,最后一条指令是

RET,其它可根据程序功能编写即可。标号经过汇编后,表示子程序的入口地址,RET 功

能是返回调用程序,它必不可少。

(2) 调用子程序是通过指令 ACALL(当然也可以使用指令 LCALL)实现的。调用子程序

时,计算机首先自动将主程序断点地址 PC 的值压入堆栈保存,其次将子程序入口地址送

入 PC,开始执行子程序,最后执行 RET 指令时,计算机将堆栈内容弹出送入 PC,即恢复

断点地址,则主程序从断点处继续执行。

(3) 调用子程序时,计算机只自动保护和恢复断点地址,其它寄存器和直接地址单元

的内容则需编程人员根据程序具体情况通过一些指令进行保护和处理。

Page 75: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-68- 单片机原理及接口技术

(4) 调用子程序时常常需要参数传递,即子程序从调用程序中获取数据进行处理,并

将处理完的数据结果送回主程序,参数传递不能为立即数,应该采用存储单元地址或寄存

器。如上例中在调用子程序 SQR 时,累加器 A 起着参数传递的作用。

4.4 实用程序举例

4.4.1 延时

在程序设计过程中,有时需要程序“等待”一会儿再去处理某些事情,称之为延时。

计算机延时实际就是让计算机反复执行一些空操作,这样就能起到拖延时间的作用。需要

执行空操作次数的多少,取决于延时时间的长短。

[例 4.15] 编写一段延时程序。

ORG 2000H ;周期数执行次数

, ;

: ;

, ;

该程序的延时时间与系统所用的晶振和程序中每条指令的机器周期及其执行次数 MT

有关。设系统晶振为 12 MHz,则可知一个机器周期为:

T=1s/(126延时时间

应用时给出需要的延时时间,就可求出 值。例

如用上例完成 延时,根据式可知,,将 代入程序例 循环次数 中,就

可完成 的延时程序设计。在例 中, 能表示的最大数为 ,因此

通过此程序完成的延时时间有限,若要获得更大的延时,

则需用双重循环或多重循环来实现。在双重循环延时程

序中有两个循环常数,一般先指定其中的一个,再计算

出另一个。双重循环延时程序流程如图 所示。例 4.16 用双重循环完成延时程序。程序如下:

MOV R0,#MT1 ;1

: , ;

: ;

, ;

, ;

开 始

R0 MI1←内循环数

R1 MI2←外循环数

NOP空操作

NOP空操作

R1 1 0 ?- =

R0 1 0 ?- =

结 束

N

N

Y

Y

图 双重循环延时程序流程图

Page 76: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 4 章 汇编语言程序设计 -69-

设晶振仍为 12 MHz,则上面程序的执行时间 T 为:

T=0.1 应用时,可根据所需的延时时间,先选定常数 。如取它的最大值 ,再根据式

计算出 ,最后将计算出的 值及常数 应用于例 就可以完成双循环延

时程序的设计了。

4.4.2 代码转换

单片机在测试、控制、通信等各种应用中经常会遇到代码转换问题。因为单片机计算

和处理问题使用的是二进制数,人们输入、输出数据时一般采用十进制数,而通常的显示

器和键盘等外设又采用的是 码,所以代码转换非常必要。下面介绍几种代码间的转

换程序。1.十六进制到 ASCII 码的转换

例 4.17 将 单元中的两个十六进制数转换成 码,低 位的 码保存

在 单元,高 位的 码保存在 单元。由 编码表可知,转换方法为:若十六进制数小于 ,则此数加 ,否则加上

就可以将十六进制数转换成 码。MOV A,20H ;(20H)? A

ANL A,0FH ;屏蔽高 4 位

ACALL CHANGE ;求低位十六进制数的 ASCII 码

MOV 21H,A ;保存低位十六进制数的 ASCII 码

MOV A,20H ;(20H)? A

ANL A,#0F0H ;屏蔽低 4 位

SWAP A ;高位十六进制数送低 4 位

ACALL CHANGE ;求高位十六进制数的 ASCII 码

MOV 22H,A ;保存高位十六进制数的 ASCII 码

RET

CHANGE: PUSH A ;操作数进栈保护

CLR C ;进位标志清零

SUBB A,#0AH ;与 10 比较

POP A ;取出操作数

JC NUM ;比 10 小转 NUM

ADD A,#07H ;大于等于 10 加 37H

NUM: ADD A,#30H ;加 30H

RET

2.单字节二进制数转换为 BCD 数

例 4.18 已知 单元存放一个二进制数,编程将它转换为 数,百位送入 单元的低 位,十位和个位分别送入 单元的高 位和低 位。

Page 77: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-70- 单片机原理及接口技术

本题只需将 20H 单元中的内容除以 100,得到的商就是百位 BCD 数,然后用余数除以

10,其结果中,商为十位 BCD 数,余数为个位 BCD 数。

ORG 0100H

FIRST DATA 30H

SECOND DATA 31H

MOV A,20H ;被除数送 A

MOV B,#64H ;除数 100 送 B

DIV AB ;A 除以 B

MOV FIRST,A ;百位 BCD 数送 FIRST

MOV A,B ;余数送 A

MOV B,#0AH ;除数 10 送 B

DIV AB ;A 除以 B

SWAP A ;十位 BCD 数送高 4 位

ORL A,B ;十位和个位 BCD 数组合成一个字节

MOV SECOND,A ;送入 SECOND 单元

SJMP $ ;结束

END

4.4.3 数据处理

1.查询

[例 4.19] 在外部 RAM 1000H 开始的地址单元中存放 30 个数据,找出其中的奇数存

入内部 RAM 20H 开始的存储单元中,并统计奇数的个数,存入 3FH 单元。

用位操作指令对操作数最低位进行判断,若为 1 即为奇数。本题中,DPTR 是片外数

据缓冲区地址指针,R0 是片内数据缓冲区地址指针。

ORG 0030H

MOV DPTR,#1000H ;指向片外缓冲区首地址

MOV R0,#20H ;指向片内缓冲区首地址

MOV R7,#30H ;循环次数送入 R7

MOV 3FH,#00H ;清零

LP: MOVX A,@DPTR ;取数

JNB ACC.0,EVEN ;偶数转 EVEN

MOV @R0,A ;奇数保存

INC R0 ;修改片内地址

INC 3FH ;修改统计个数

EVEN: INC DPTR ;修改片外地址

DJNZ R7,LP ;控制循环

RET

Page 78: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 4 章 汇编语言程序设计 -71-

2.排序

[例 4.20] 将片内 RAM 30H 开始的连续 16 个单元的数据按从小到大的顺序排序。

此题采用的是冒泡排序法,即对这 16 个数据组成的数据串,依次将相邻两数分别进行

比较,若后面的数小于前面的数,则比较的相邻两数互换,且置位地址单元 7FH 为 1。若

这组数据比较完后,相邻两数有交换(即交换标志位 7FH 为 1),则再重新进行两两比较,

直到 16 个数已从小到大排序,相邻两数比较后不再交换为止。交换标志位 7FH 用来控制

是否再需要重新两两比较。程序流程如图 4-7 所示。

开 始

R1数据块首址送 , 1 R7块长 送 ,交 换标志位清零

20H取相邻两数中前一个数送 单元

修改指针

A取相邻两数中后一个数送

?前数<后数

两数交换

交换标志位置位

R7 1 0 ?- =

1 ?交换标志=

结 束

N

Y

Y

N

N

Y

图 4-7 排序程序流程图

程序如下:

ORG 2000H

SORT: MOV R1,#30H ;指向数据块首地址

MOV R7,#10H ;数据块长度送 R7

CLR 7FH ;交换标志位清零

DEC R7 ;块长减 1 为比较次数

LOOP1: MOV A,@R1 ;取相邻两数中的前一个数

Page 79: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-72- 单片机原理及接口技术

MOV 20H,A

INC R1

MOV A,@R1 ;取相邻两数中的后一个数

CJNE A,20H,LOOP ;相邻两数比较

LOOP: JNC NEXT ;前者小于后者转至 NEXT

XCH A,20H ;前者大于后者,相邻两数互换

MOV @R1,A

DEC R1

MOV @R1,20H

INC R1 ;恢复数据块指针

SETB 7FH ;置 1 标志位

NEXT: DJNZ R7,LOOP1 ;所有相邻两数未比较完,转至 LOOP1

JB 7FH,SORT ;交换标志位为 1,转至 SORT

RET

4.4.4 算术运算

1.多字节 BCD 码加法

[例 4.21] 已知在 BLOCK1 和 BLOCK2 为始址的存储区中分别有长度为 N 字节压缩

的 BCD 码,请编写程序使它们相加并将和送入 BLOCK1 为始址的存储单元。

使用加法指令从低字节相加,因为是 BCD 码相加,还需用 DA 指令调整。

ORG 0100H

MOV R7,#N ;数据块长度送 R7

MOV R0,#BLOCK1 ;被加数始址送 R0

MOV R1,#BLOCK2 ;加数始址送 R1

CLR C ;CY 清零

LOOP: MOV A,@R0 ;被加数送 A

ADDC A,@R1 ;相加

DA A ;BCD 码调整

MOV @R0。A ;存和

INC R0 ;修改被加数地址指针

INC R1 ;修改加数地址指针

DJNZ R7,LOOP ;未加完,则转至 LOOP

JNC RTN ;最高位无进位转至 RTN

MOV @R0,#01H ;有进位则保存

RTN: RET

2.双字节无符号数乘法运算程序

Page 80: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 4 章 汇编语言程序设计 -73-

[例 4.22] 已知在寄存器 R4R5 和 R2R3 中分别存放有双字节的被乘数和乘数(R5、R3

存放低 8 位,R4、R2 存放高 8 位),试编程求积并存入 BLOCK 开始的连续四个存储单元(低

字节在前,高字节在后)。

AT89C51 乘法指令只能完成两个 8 位无符号数相乘,因此 16 位无符号数求积必须将

它们分解成四个 8 位数相乘来实现,其方法是边乘边加。原理和过程如图 4-8 所示。

a

c

b

d

R4

R2

R5

R3

+单元

+单元

+单元

单元

图 4-8 双字节无符号数乘法原理图

图中 ab 为 16 位被乘数,cd 为 16 位乘数(a、c 代表高 8 位,b、d 代表低 8 位),而其

后跟 H 表示乘积后的高 8 位,跟 L 表示乘积后的低 8 位。

ORG 1000H

BLOCK EQU 30H

MOV R0,#BLOCK ;指向积单元首址

MOV A,R5

MOV B,R3

MUL AB ;b , ;保存 , , ;保存 , , ; , ; , , , ;进位 , ,

Page 81: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-74- 单片机原理及接口技术

MOV B,R2

MUL AB ;b , ; 与 、、进位累加 , , , ; 与 、进位累加 , , , ;保存进位 , , ; , ; 与 、、进位累加 , , , ; 与进位累加 ,

4.5 实 验

实验 1 分支和循环程序的设计与实现

1.实验目的

(1) 掌握分支程序编写方法。

(2) 掌握循环程序设计的方法和技巧。

(3) 学习程序调试的基本过程和方法。

2.实验器材

单片机开发设备一套。

3.实验步骤

1) 求最小偶数程序

编写程序,使其能找出内部 RAM 30H 为始址的连续 10 个存储单元中的最小偶数并存

入 3FH 单元。

(1) 参考[例 4.13]编写程序,检查无误后经机器汇编后输入单片机程序存储器中。

Page 82: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 4 章 汇编语言程序设计 -75-

(2) 在 30H 开始的连续 10 个存储单元中送入一组数,记住其中的最小偶数。

(3) 执行输入的程序,检测 3FH 单元中内容是否为最小偶数,若不是最小偶数,则用

设置断点或单步执行程序的办法排除程序中的错误,直至程序完全正确。

2) 查找并统计关键字程序

在内部 RAM 20H 开始的单元中连续存放 10 个数,查找数字零并统计其个数存入 2FH

单元。

(1) 参考[例 4.19]编写程序,检查无误后经机器汇编后输入单片机程序存储器中。

(2) 在 20H 开始的连续 10 个单元中送入一组数,记住零的个数。

(3) 执行上述程序,核对结果,若有问题,则用单步运行或设置断点的方法反复调试

程序,直到程序完全正确。

实验 2 代码转换程序设计与实现

1.实验目的

(1) 了解代码间转换原理。

(2) 掌握代码转换程序的设计方法和技巧。

(3) 掌握编写和运行子程序的方法。

(4) 进一步实践程序的调试和运行。

2.实验器材

单片机开发设备一套。

3.实验步骤

(1) 将任意一个 0~F 的 16 进制 ASCII 码数转

换为 4 位二进制数,可参考以下步骤:

① 根据流程图 4-9 编写程序,检查无误经机器

汇编后输入单片机内存。

② 在 20H 单元中送入一个数 37H,即 7 的

ASCII 码。

③ 执行上述程序,核对结果,若有问题,则用

单步运行或设置断点的方法反复调试程序,直到程

序完全正确。

④ 在 20H 单元送入 41H(A 的 ASCII 码),重复

第③步。

(2) 将片内 RAM 20H~29H 十个字节的十六进制数(每个字节有两个十六进制数)分别

转换成 ASCII 码存入片外 RAM 1000H 开始的单元。

① 参考[例 4.17]编写此程序,检查无误经汇编后送入单片机内存。

② 在 20H~29H 单元中送入一组数。

③ 执行上述程序,核对结果,若有问题,则用单步运行或设置断点的方法反复调试程

序,直到程序完全正确。

开 始

结 束

10 ?<

取 数

30H减37H减

N

Y

图 4-9 ASCII 码转成二进制数流程图

Page 83: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-76- 单片机原理及接口技术

④ 该程序也可分模块、分步骤调试。先调试运行子程序,再完成一个字节的 ASCII

码的转换,最后完成所有十个字节的 ASCII 码的程序调试和运行。

习题与思考题

4.1 程序设计主要分为哪几种?各有什么特点?

4.2 AT89C51 常用的汇编语言伪指令有哪些? 它们的作用是什么?

4.3 汇编语言程序设计分哪几个步骤? 每个步骤的主要任务是什么?

4.4 设内部 RAM 中存有两个有符号数 A 和 B,求 A 和 B 之差,若溢出,则将两数均

清零;否则,两数保持不变。

4.5 已知片内 30H 单元中存有一个 8 位无符号数。编程将它们乘 2,再存回原处。设

乘完结果不超出一个字节。

4.6 编写程序,把片外 RAM 从 2000H 开始连续存放的 8 个数据送到片内 30H 开始的

单元中。

4.7 已知片内 30H,31H 中存有一个 16 位的二进制数,高位在前,低位在后,请编

程将它们乘 2,再存回原处。设乘完结果不超出双字节。(提示:用带进位左移指令使双字

节数左移一位。)

4.8 若有两个无符号数 X、Y 分别存放在外部数据存储器 50、51 单元中,试编写一

个程序,实现 X,结果高 位存入片内 H单元,低8位存入片内 H单元。 统计片内 ~ 单元中所有大于 的数据的数目,并将结果放入片

外 单元中。 有 个单字节数据,连续存放在片外 开始的区域中,试求出这 个数

的总和,并将结果存入片内 开始的单元,低位先存。 编写程序,令其完成立即数 减去立即数 ,并把操作结果存入内部

的 和 单元, 单元存放差的低 位, 单元存放高8位。 设从片外 单元开始,连续存放 个有符号数。 试分别统计其正负数的个数,并将结果分别存放在片内 、 单元中。 将正、负数分别存放在片外 和 单元开始的区域中。 试编出把外部 的 单元中的内容和 单元中的内容相互交换的

程序。 设 ,,,试编程把累加器 中低 位送入 口高 位,

低 位不变,把累加器 中高 位送入 口低 位, 口高 位不变。 找出以内部 的 为始址的 个无符号数中的最小数并存入

单元。 将片内 单元开始的连续 个数按降序排序。 设无符号数 存放在内部 的 单元中,函数 存放在 单元中,

请按下面关系求出 值。

Page 84: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 4 章 汇编语言程序设计 -77-

>+<<

<<=

50X4X2

50X20X3

20X0X

Y

4.18 在内部 RAM 中,BLOCK 开始的存储区有 10 个单字节十进制数(压缩的 BCD 码),

编程求 BCD 数之和(和为三位 BCD 数),并把它们存放在 SUM 和 SUM+1 单元中(低字节在

SUM 单元)。

≤ ≤

Page 85: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-78- 单片机原理及接口技术

第 5 章 中 断 系 统

中断系统是单片机的重要组成部分,CPU 通过中断功能可以分时操作启动多个外部设

备同时工作、统一管理,并能迅速响应外部设备的中断请求,采集实时数据或故障信息,

对系统进行相应处理,从而使 CPU 的工作效率得到很大的提高。在实际应用中,单片机的

中断功能被广泛的采用。为了灵活掌握和使用单片机的中断技术,本章从基本概念出发,

将详细介绍 AT89C51 的中断系统。

5. 1 中 断 概 述

单片机接通电源后将循环执行我们编制好的程序(一般称为主程序),当有外部设备或

内部部件要求 CPU 为其服务时,计算机将被迫“中断”主程序的执行,并记录下暂停处程

序地址(断点地址),然后转去为外部设备服务,即执行中断服务程序;在中断程序执行完

毕后自动返回被迫中断主程序的地址,继续执行原主程序。这个过程称为单片机的中断。

引起中断原因的设备部件,或引起程序中断的事件称为中断源。单片机系统的中断源一般

有外部设备中断源、控制对象中断源、定时器/计数器中断源、故障中断源等。

一个单片机系统可能有多个中断源,而单片机 CPU 在某一时刻只能响应一个中断源的

中断请求,当多个中断源同时向 CPU 发出中断请求时,则必须按照“优先级别”进行排队,

CPU 首先选定其中中断级别高的中断源为其服务,然后按排队顺序逐一服务,完毕后返回

断点地址,继续执行主程序。这就是“中断优先级”的概念。这种中断源的优先级是单片

机硬件规定好的或软件事先设置好的。我们可以根据中断源在系统中的地位安排其优先

级别。

当单片机系统已经响应了某一中断请求,正在执行其中断服务时,系统中的其他中断

源又发出了中断请求,这时单片机是否响应呢?一般地说,优先级别同等或较低的中断请

求不能中断正在执行的优先级别高的中断服务程序,而优先级别高的中断请求可以中断

CPU 正在处理的优先级别低的中断服务程序,转而执行高级别的中断服务程序,这种情况

称为中断嵌套,待执行完后,先返回被中断的低级别的中断服务程序继续执行完,然后再

返回到主程序。

单片机系统中有一个专门用于管理中断源的机构,就是中断控制寄存器,我们可以通

过对它的编程来设置中断源的优先级别以及是否允许某中断源的中断请求等。

5.2 AT89C51 中断系统

5.2.1 中断源及中断系统构成

AT89C51 具有五个中断源,分为内部中断源和外部中断源。外部中断源有两个,通常

Page 86: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 5 章 中 断 系 统 -79-

指由外部设备发出中断请求信号,从 P3.2 和 P3.3(即 0INT 和 1INT )引脚输入单片机,用电

平或边沿触发两种方式申请中断。内部中断源有三个,两个定时器/计数器(T0,T1)中断源

和一个串行口中断源,T0 和 T1 的中断申请是在它们计数从全“1”变为全“0”溢出时自

动向中断系统提出的,串行口中断源的中断申请是在串行口每发送或接收完一个 8 位二进

制数后自动向中断系统提出的。AT89C51 的中断系统结构如图 5-1 所示。

高优先级

低优先级

IT0

TCON.0

IE0

EX0 PX0IE.0

TCON.1

IP.0

IT1

TCON.2

IE1

EX1PX1

IE.2TCON.3

IP.2

T0溢出 TF0

ET0PT0

IE.1TCON.5

IP.1

T1溢出 TF1

ET1PT1

IE.3TCON.7

IP.3

ESPS

IE.4IP.4

EA

IE.7

1≥RI

TISCON.0

SCON.1

TX

RX

查询次序

0INT2.3P

1INT3.3P

图 5-1 AT89C51 中断系统结构图

从图 5-1 中可看出,中断系统主要由中断标志、中断允许寄存器 IE、中断优先级寄存

器 IP 和相应的逻辑电路组成。

5.2.2 中断标志与中断控制

1.中断标志

AT89C51 在每一机器周期的 S5P2 时,对所有中断源都顺序地检查一遍,找到所有已

激活的中断请求后,先使相应的中断标志位置位,然后在下一个机器周期的 S1 状态时检测

这些中断标志位状态,只要不受阻断就开始响应其中最高优先级的中断请求。AT89C51 中

断标志位集中安排在定时器控制寄存器 TCON 和串行口控制寄存器 SCON 中,下面将作以

详细介绍。

1) 定时器控制寄存器 TCON

图 5-2 给出了定时器控制寄存器 TCON 各位的定义。

TCON TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0

位地址 8FH 8EH 8DH 8CH 8BH 8AH 89H 88H

图 5-2 定时器控制寄存器 TCON

Page 87: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-80- 单片机原理及接口技术

各位的作用如下:

(1) TF1(TCON.7):定时器 T1 溢出中断标志位,位地址为 8FH。当定时器 T1 产生溢

出时,由硬件自动置位,申请中断。待中断响应进入中断服务程序后由硬件自动清除。

(2) TR1(TCON.6):定时器 T1 的启停控制位,位地址为 8EH,TR1 状态靠软件置位或

清除。置位时,定时器 T1 启动开始计数工作,清除时 T1 停止工作。

(3) TF0(TCON.5):定时器 T0 溢出中断标志位,位地址为 8DH。其作用与 TF1 类同。

(4) TR0(TCON.4):定时器 T0 的启停控制位,位地址为 8CH,其他操作与 TR1 类同。

(5) IE1(TCON.3):外部中断 1INT 边沿触发中断请求标志位,位地址为 8BH。当 CPU

检测到 INT1(P3.3 脚)上有外部中断请求信号时,IE1 由硬件自动置位,请求中断;当 CPU

响应中断进入中断服务程序后,IE1 被硬件自动清除。

(6) IT1(TCON.2):外部中断 1INT 触发类型选择位,位地址为 8AH。IT1 状态可由软

件置位或清除,当 IT1=1 时,设定的是后边沿触发(即由高变低的下降沿)请求中断方式;

当 IT1=0 时,设定的是低电平触发请求中断方式。

(7) IE0(TCON.1):外部中断 0INT 边沿触发中断请求标志位,位地址为 89H。其功能

与 IE1 类同。

(8) IT0(TCON.0):外部中断 0INT 触发类型选择位,位地址为 88H。其功能与 IT1

类同。 2) 串行口控制寄存器 SCON

图 5-3 给出了串行口控制寄存器 SCON 各位的定义。其中只有 TI 和 RI 两位用来表示

串行口中断标志位,其余各位用于串行口其他控制(将在第 9 章中详细介绍)。

SCON SM0 SM1 SM2 REN TB8 RB8 TI RI

位地址 9FH 9EH 9DH 9CH 9BH 9AH 99H 98H

图 5-3 串行口控制寄存器 SCON

(1) TI:为串行口发送中断标志位,位地址为 99H。在串行口发送完一组数据时,TI

由硬件自动置位(TI=1),请求中断,当 CPU 响应中断进入中断服务程序后,TI 状态不能被

硬件自动清除,而必须在中断程序中由软件来清除。

(2) RI:为串行口接收中断标志位,位地址为 98H。在串行口接收完一组串行数据时,

RI 由硬件自动置位(RI=1),请求中断,当 CPU 响应中断进入中断服务程序后,也必须由软

件来清除 RI 标志。

通过上面的介绍我们可看出,中断源申请中断时首先要置位相应的中断标志位,CPU

检测到中断标志位之后才决定是否响应。而 CPU 一旦响应了中断请求,相应的标志位就要

清除。如果不清除,CPU 退出本次中断服务程序后还要再次响应该中断请求,造成混乱,

因此像串行口中断标志这种需要软件来清除中断标志位的中断源,在软件编程中应加以

注意。

2.中断控制

各中断源的中断标志被置位后,CPU 能否响应还要受到控制寄存器的控制,这种控制

寄存器在 AT89C51 中有两个,即中断允许控制寄存器 IE 和中断优先级控制寄存器 IP。下

面分别详细介绍。

Page 88: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 5 章 中 断 系 统 -81-

1) 中断允许控制寄存器 IE

AT89C51 设有专门的开中断和关中断指令,中断的开放和关闭是通过中断允许寄存器

IE 各位的状态进行两级控制的。所谓两级控制是指所有中断允许的总控制位和各中断源允

许的单独控制位,每位状态靠软件来设定。图 5-4 给出了中断允许控制寄存器 IE 各位的

定义。

IE EA — ET2 ES ET1 EX1 ET0 EX0

位地址 AFH — ADH ACH ABH AAH A9H A8H

图 5-4 中断允许控制寄存器 IE

(1) EA(IE.7):总允许控制位,位地址为 AFH。EA 状态可由软件设定,若 EA=0,禁

止 AT89C51 所有中断源的中断请求;若 EA=1,则总控制被开放,但每个中断源是允许还

是被禁止 CPU 响应,还受控于中断源的各自中断允许控制位的状态。

(2) ET2(IE.5):定时器 T2 溢出中断允许控制位,位地址是 ADH。若 ET2=0,禁止 T2

溢出中断;若 ET2=1,允许 T2 溢出中断。T2 定时器只有 89C52,8032 等芯片才有,AT89C51

没有这一定时器。

(3) ES(IE.4):串行口中断允许控制位,位地址是 ACH。若 ES=0,则串行口中断被禁

止;若 ES=1,则串行口中断被允许。

(4) ET1(IE.3):定时器 T1 的溢出中断允许控制位,位地址为 ABH。若 ET1=0,则禁

止定时器 T1 的溢出中断请求;若 ET1=1,则允许定时器 T1 的溢出中断请求。

(5) EX1(IE.2):外部中断 1INT 的中断请求允许控制位,位地址是 AAH。若 EX1=0,

则禁止中断请求;若 EX1=1,则允许中断请求。

(6) ET0(IE.1):定时器 T0 的溢出中断允许控制位,位地址是 A9H。其功能类同于 ET1。

(7) EX0(IE.0):外部中断 0INT 的中断请求允许控制位,位地址是 A8H。其功能类同

于 EX1。

AT89C51 在上电时或复位时,IE 寄存器的各位都被复位成“0”状态,因此 CPU 处于

关闭所有中断的状态,要想开放所需要的中断请求,则必须在主程序中用软件指令来实现。

IE 寄存器既有单元地址(A8H),各控制位又有各自的位地址(A8H~AFH),因而改变 IE 寄

存器各位的状态,既可以通过改变整个字节的形式,又可以通过位寻址方式直接改变某一

位的形式。例如,现在要开放外中断 0INT 的中断请求,则改变整个字节的指令可用:MOV

IE,#81H,用位寻址的指令可用:

SETB EA(AFH)

SETB EX0(A8H)

从中可看出,若要开放 0INT 中断请求,仅使 EX0=1 不行,还必须使 EA=1。如果 EA=0

则所有中断源都将被关闭。 2) 中断优先级寄存器 IP

AT89C51 的中断源优先级是由中断优先级寄存器 IP 进行控制的。五个中断源总共可分

为二个优先级,每一个中断源都可以通过 IP 寄存器中的相应位设置成高级中断或低级中

断,因此,CPU 对所有中断请求只能实现两级中断嵌套。IP 寄存器各位的定义如图 5-5

所示。

Page 89: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-82- 单片机原理及接口技术

IP — — PT2 PS PT1 PX1 PT0 PX0

位地址 — — BDH BCH BBH BAH B9H B8H

图 5-5 中断优先控制寄存器 IP

(1) —(IP.7,IP.6):保留位。

(2) PT2(IP.5):定时器 T2 中断优先级控制位,位地址是 BDH。PT2=1 为高优先级,

PT2=0 为低优先级。AT89C51 中没有定时器 T2。

(3) PS(IP.4):串行口中断优先级设定位,位地址是 BCH。PS=1 为高优先级,PS=0 为

低优先级。

(4) PT1(IP.3):定时器 T1 中断优先级控制位,位地址是 BBH。PT1=1 为高优先级,PT1=0

为低优先级。

(5) PX1(IP.2):外中断 1INT 优先级控制位,位地址为 BAH。PX1=1 为高优先级,PX1=0

为低优先级。

(6) PT0(IP.1):定时器 T0 中断优先级控制位,位地址为 B9H。其功能与 PT1 类同。

(7) PX0(IP.0):外部中断 0INT 优先级控制位,位地址为 B8H,其功能与 PX1 类同。 AT89C51 的五个中断源通过中断优先级寄存器 IP 的设置,可分为高级中断和低级中

断,一个正在响应的低优先级的中断会由于高优先级的中断请求而自动被中断,但不会由

于另一个低优先级的中断请求而中断;一个高优先级的中断不会被任何其他的中断请求所

中断。

如果同时收到两个不同优先级的请求,则较高优先级的请求被首先接收响应。如果同

样优先级的请求同时接收到,则内部对中断源的查询次序决定先接受哪一个请求,表 5-1

列出了同一优先级中断源的内部查询次序。

表 5-1 中断源的内部查询次序

中断源 中断标志 优先查询次序

外中断 0

定时器 T0 中断

外中断 1

定时器 T1 中断

串行口中断

IE0

TF0

IE1

TF1

RI+TI

这个查询次序决定了同一优先级内的第二优先结构,是一个辅助优先结构,但不能实

现中断嵌套。

5.2.3 中断请求的响应、撤除及返回

1.中断的响应

从前面介绍的中断允许控制寄存器 IE 中可看出,一个中断源发出请求后是否被 CPU

响应,首先必须得到 IE 寄存器的允许,即开中断。如果不置位 IE 寄存器中的相应允许控

制位,则所有中断请求都不能得到 CPU 的响应。

在中断请求被允许的情况下,某中断请求被 CPU 响应还要受下列条件的影响。

Page 90: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 5 章 中 断 系 统 -83-

(1) 当前 CPU 没有响应其他任何中断请求,则 AT89C51 在执行完现行指令后就会自动

响应该中断。

(2) CPU 正在响应某中断请求时,如果新来的中断请求优先级更高,则 AT89C51 会立

即响应新中断请求,从而实现中断嵌套;如果新来的中断请求与正在响应的中断优先级相

同或更低,则 CPU 必须等到现有中断服务完成以后,才会自动响应新来的中断请求。

(3) 在 CPU 执行 RETI 指令或访问 IE/IP 寄存器指令时,CPU 必须等到这些指令执行

完之后才能响应中断请求。

AT89C51 响应某一中断请求后要进行如下操作:

(1) 完成当前指令的操作。

(2) 保护断点地址,将 PC 内容压入堆栈。

(3) 屏蔽同级的中断请求。

(4) 将中断源入口地址(固定的)送入 PC 寄存器,自动转入相应中断程序入口地址。中

断源口地址如表 5-2 所示。

(5) 执行中断服务程序。

(6) 当执行到 RETI 指令时即结束中断,从堆栈中自动弹出断点地址到 PC 寄存器,返

回到先前断点处继续执行原程序。表 5-2 给出的中断源入口地址是固定的,不能更改。每

个入口地址之间彼此相隔八个存储单元,当中断服务程序较少时,可放在入口地址下的八

个单元中,如果放不下,则可将中断程序放在其他存储单元中,然后用一条转移指令转到

相应的中断程序处执行。例如,定时器 T0 的中断服务程序存放的首地址为 1000H,则可用

下述指令转入 T0 中断服务程序:

ORG 000BH

LJMP 1000H

表 5-2 AT89C51 中断入口地址表

中断源 中断程序入口地址

INT0 0003H

定时器 T0 000BH

INT1 0013H

定时器 T1 001BH

串行口中断 0023H

2.中断响应的时间

中断响应时间是指 CPU 从查询中断请求标志到转入中断服务程序入口地址所需要的

时间。

从前面介绍的中断响应过程可知,一个中断请求能否被 CPU 响应,受很多条件的影响,

倘若一个同级的或高优先级的中断正在响应中,则此中断等待响应的时间是不好估算的。

因此,这里我们只能给出系统只有一个中断源,它得到 CPU 响应的最短时间。

现以外部中断为例, 0INT 和 1INT 端的请求电平信号在每个机器周期的 S5P2 期间被

锁存到内部中断标志位 IE0 或 IE1,CPU 在下一个机器周期才会查询到这些值。如果请求

Page 91: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-84- 单片机原理及接口技术

有效,CPU 响应中断首先要执行一条硬件子程序调用指令,进入相应的中断服务程序入口,

调用指令需 2 个机器周期。这样从查询到中断标志位置位到开始执行中断服务程序的第一

条指令,中间要隔 3 个机器周期,这是中断请求被响应的最短时间。 如果申请中断时,CPU 正在执行最长指令(如 MUL 或 DIV,4 个周期指令),则附加等

待时间不会超过 3 个周期。若 CPU 正在执行 RETI 或访问 IE、IP 指令,则 AT89C51 需要

再执行一条指令后才会响应这个中断,附加等待时间不会超过 5 个周期(执行完 RETI 需等

一个周期,再完成一条指令所需最长时间为 4 个周期)。这样综合估算一个中断请求被 CPU

响应的时间在 3~8 个机器周期之间。

3.中断请求的撤除

中断源发出中断请求后,CPU 首先使相应的中断标志位置位,然后通过对中断标志位

的检测决定是否响应。而 CPU 一旦响应某中断请求后,在该中断程序结束前(RETI),必须

把它的相应的中断标志复位,否则 CPU 在返回主程序后将再次响应同一中断请求。

AT89C51 的中断标志位的清除(复位)有两种方法,即硬件复位和软件复位。串行口中

断请求,CPU 响应后,没有用硬件直接清除其中断标志 TI(SCON.1,发送中断标志)、

RI(SCON.0,接收中断标志)的功能,必须靠软件复位清除。因此在响应串行口中断请求后,

必须在中断服务程序中的相应位置通过指令将其清除(复位)。例如可使用以下指令:

CLR TI

CLR RI

或 ANL SCON, #0FCH

定时器 T0 和定时器 T1 的中断请求,CPU 响应后,自动由芯片内部硬件直接清除相应

的中断标志位 TF0 和 TF1,无需使用者采取其他任何措施。

外部中断请求的中断标志位 IE0 和 IE1 的激活方式有两种:负边沿激活和电平激活。

CPU 响应中断后,也是由 CPU 内部硬件自动清除相应的中断标志。但由于 CPU 对 0INT 和

0INT 引脚上的外来信号没有控制,因而被清除的中断标志有可能再次被激活,从而重复

引起中断请求,必须采用其他措施来克服这种情况。

对于负边沿激活方式,如果 CPU 在一个周期中对 INTX (X 代表 1 或 0)端的采样值为

高电平,而下一个周期的采样值为低电平,则将 IEX 置位。CPU 响应中断后自动将 IEX 复

位,因外部中断源在 CPU 执行中断服务程序时不可能再在 INTX 上产生一个负边沿而使

IEX 重新置位,所以不会再次引起中断请求。

对于电平激活方式,如果 CPU 检测到 INTX 上为低电平,而将 IEX 置位,申请中断,

CPU 响应后自动复位中断标志 IEX。但如果外部中断源的低电平不能及时撤除的话,在 CPU

执行中断服务程序时,检测到 INTX 上的低电平时又会使 IEX 置位,本次中断结束后又会

引起中断请求。这种情况一般不希望发生,为了使本次中断请求彻底撤除,一般可借助外

部电路的辅助手段。如图 5-6 可实现这一功能,外部中断请求信号不直接加在 INT0 端,而

是加在 D 触发器的 CP 端。当外部中断源产生正脉冲中断请求时,由于 D 端接地,Q 端被

复位成“0”状态,使 0INT 端出现低电平,激活中断标志 IE0(置 1)。89C51 响应中断后,

在中断服务程序中可采用下列指令在 P1.0 端输出一个负脉冲来撤除 0INT 上的低电平中断

请求。

Page 92: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 5 章 中 断 系 统 -85-

ANL P1,#0FEH

ORL P1,#01H

CLR IE0

上述指令中第二条、第三条是十分必要的,第二条指令不但使 0INT 上的低电位变成

高电位,撤除了中断,而且使 D 触发器可以再次接受中断请求正脉冲信号。第三条指令用

于清除可能已被重复置位的中断标志位 IE0,使本次中断请求被彻底撤除。

89C51

INT0

P1.0

D

CPSD

Q

图 5-6 清除外部中断请求电路

4.中断返回

AT89C51 响应中断后,自动执行中断服务程序。在中断服务程序中,只要遇到 RETI

指令(不论在什么位置),单片机就结束本次中断服务,返回原程序。因此,在中断服务程

序的最后必须有一条 RETI 指令,用于中断返回。

5.3 中断系统的应用

AT89C51 中断功能的应用主要包括两方面的内容:一是各中断源的合理运用和相应硬

件电路的设计,二是初始化程序和中断服务程序的编写。下面通过几个应用举例加以理解。

[例 5.1] 利用外中断实现程序的单步执行。

AT89C51 内部有 4 KB 字节的 Flash 存储器,用户编写好的程序用简单的程序写入器很

容易写入和擦除,在没有开发系统的条件下,利用外中断实现程序的单步运行为用户调试

程序带来一定的方便。

程序单步执行的原理是:当 CPU 正在执行某中断服务时,一个新的同等优先级的中断

请求是不会得到响应的,而且在执行 RETI 指令返回后,还必须多执行一条指令才能接受

新的中断请求。利用这一特点,就可以实现程序的单步执行。具体方法如下:

将外中断 0INT 设为电平触发方式,则在中断服务程序的末尾编写如下几条指令即可。 JNB P3.2 ,¥ ;等待变高

JB P3.2 ,¥ ;等待变低

RETI ;中断返回

通常 0INT 端(P3.2)保持低电平,则 CPU 进入外部中断 0INT 的服务程序,并在 JNB

处等待 0INT 端变高电平。当 0INT 端出现一个正脉冲(由低到高,再到低)时,程序就会往

下执行,由 RETI 指令返回用户程序,执行一条用户指令后又立刻再次响应中断。执行中

断服务程序,以等待 0INT 端出现的下一个正脉冲,这样在 0INT 端每出现一次正脉冲,用

户程序就被执行一条,如此重复就可实现程序单步执行。简单的硬件电路如图 5-7 所示。

Page 93: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-86- 单片机原理及接口技术

89C51

单稳态电路5 V+ 0INT

图 5-7 单步执行程序硬件电路图

[例 5.2] 利用定时器作外部中断源。

AT89C51 内部有两个定时器/计数器,当它们选择为计数器工作方式时,T0(P3.4)或

T1(P3.5)引脚上发生的负跳变将使 T0 或 T1 计数器加 1 计数。利用此特性,将 P3.4、P3.5

作为外部中断请求输入线,将 T0 或 T1 计数初值设定为满量程(#0FFH)。当 T0、T1 引脚上

的电平发生负跳变时,计数器加 1 计数溢出,引起中断,因而可当作外中断使用,以计数

器 T0 为例,初始化程序如下:

MOV TMOD,#06H ;置 T0 为工作方式 2

MOV TL0 ,#0FFH ;置 T0 计数初值

MOV TH0 ,#0FFH

SETB EA ;开 CPU 中断

SETB ET0 ;允许 T0 中断

SETB TR0 ;启动 T0 计数

END

T0 为方式 2 工作时,溢出产生中断后,TH0 的内容 OFFH 自动送入 TL0 中,使 TL0

恢复初值 OFFH,可再次接收下一个中断请求。

[例 5.3] 扩展外部中断源:在变频调速器中都设有过流(OC)、过压(OV)、欠压(UV)、

过热(OH)这四种故障保护,当任一故障发生时,都要立刻停机处理,避免故障范围扩大。

这种情况必须采用中断方式,使单片机立刻响应中断处理。试设计其硬件电路和软件程序。

根据要求,四个故障相当四个中断源,可利用中断查询方法,将四个中断源归结为一

个中断请求,同时四个故障信号引到 P1 口的四个输入端,然后在中断程序中查询 P1 口,

确定是哪一个故障申请的中断。电路如图 5-8 所示。一旦发生故障,单片机必须响应中断,

因此,该中断必须设置成最高级中断。在中断程序中可以显示故障信息。

P1.3

P1.2

P1.1

P1.0

AT89C51

1≥OCOVUVOH

1INT

图 5-8 扩展 4 个外中断源电路

Page 94: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 5 章 中 断 系 统 -87-

主程序和中断服务程序如下:

ORG 0000

AJMP ZCX1 ;转主程序

NOP

ORG 0013H

AJMP INT1 ;转中断程序

NOP

ORG 0100H

ZCX1: MOV SP,#30H ;置堆栈指针

MOV IP,#04H ;设 1INT 为最高级

CLR IT1 ;设 1INT 为电平触发

SETB EA ;开中断

SETB EX1

ZCX2:其他处理程序

AJMP ZCX2

ORG 0200H

INT1: PUSH PSW ;保护现场

PUSH ACC

MOV A,P1 ;读入 P1 口低 4 位状态

ANL A,#0FH

JNB ACC0,X1 ;是 OC 中断吗?不是则转移

ACALL XY1 ;调 OC 处理子程序

X1: JNB ACC1,X2 ;是 OV 中断吗?不是则转移

ACALL XY2 ;调 OV 处理子程序

X2JNB: ACC2,X3 ;是 UV 中断吗?不是则转移

ACALL XY3 ;调 UV 处理子程序

X3: JNB ACC3,X4 ;是 OH 中断吗?不是则转移

ACALL XY4 ;调 OH 处理子程序

X4: POP ACC

POP PSW

RETI

XY1: OC 处理子程序(略)

RET

习题与思考题

5.1 什么叫中断?单片机采用中断有什么好处?

Page 95: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-88- 单片机原理及接口技术

5.2 什么叫中断源?AT89C51 有哪几个中断源?写出其固定入口地址。

5.3 什么叫中断嵌套?中断嵌套遵循的原则是什么?AT89C51 单片机本身能实现几

级嵌套?

5.4 AT89C51 中与中断有关的特殊功能寄存器有几个?它们各自的功能是什么?

5.5 AT89C51 单片机外中断的触发方式有几种?它们有什么区别?电平触发时,如何

防止 CPU 重复响应同一外中断?

5.6 什么是中断优先级?AT89C51 能设置几个优先级?同一级别的中断源同时发出

中断请求,CPU 先响应哪一个?怎样确定?

5.7 一个中断请求被响应必须满足什么条件?

5.8 AT89C51 响应某一中断请求后要进行哪些操作?

5.9 若系统只有一个中断源,则中断响应须等待的最短时间和最长时间各是多少?等

待时间长的原因都有哪些?

5.10 概述一个中断响应的全部过程。

5.11 现想用两个外中断源 0INT 和 1INT 实现中断嵌套控制, 0INT 为高级中断,边沿

触发方式; 1INT 为低级中断,电平触发方式,试编写其初始化程序。

5.12 现有四台外围设备 X1~X4 需向 AT89C51 申请中断,而 AT89C51 只有 0INT 和

P1 口可供使用,试设计相应的电路并编写程序。

Page 96: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 6 章 定时器/计数器 -89-

第 6 章 定时器/计数器

AT89C51 单片机内有两个 16 位二进制定时器/计数器,简称定时器 0(T0)和定时器 1(T1),

它们均可用于定时、延时、对外部事件记数、分频及事故记录等。

6.1 定时器/计数器的结构及工作原理

6.1.1 定时器/计数器的结构

定时器/计数器 T0、T1 的逻辑结构如图 6-1 所示。

TCON(88H)

CPU

中断

溢出

启动

TH1 TL1

(8DH) (8BH)

TH0 TL0

(8CH) (8AH)

TMOD(89H)

溢出

工作方式启动

工作方式

T1定时器 T0定时器T1(P3.5) T0(P3.4)

图 6-1 AT89C51 定时器/计数器逻辑结构图

由图可知,两个 16 位定时器/计数器分别由两个 8 位特殊功能的寄存器组成,即 T0 由

TH0 和 TL0 组成;T1 由 TH1 和 TL1 组成,它们可以通过 MOV 指令用于存放定时或计数

初始设定值。每个定时器都可由软件设置成定时器模式或计数器模式,在这两种模式下,

又可单独设定为方式 0、方式 1、方式 2、方式 3 四种工作方式。定时器/计数器的启/停也

是由软件通过控制寄存器 TCON 来控制的。

6.1.2 定时器/计数器的工作原理

定时器/计数器是一个二进制的加 1 寄存器,当启动后就开始从所设定的计数初始值开

始加 1 计数,寄存器计满回零时能自动产生溢出中断请求。但定时与计数两种模式下的计

数方式却不相同,定时器模式时,每个机器周期寄存器增 1,即寄存器对机器周期计数。

因为一个机器周期有 12 个振荡周期,所以计数频率是晶体振荡器频率的 1/12,如晶体振荡

频率为 6 MHZ,则定时器模式的计数频率为 1/2 MHZ,计数周期为 T=1/(6 MHZ×1/12)=2。

计数器模式时,该寄存器在相应的外部输入脚 和 上出现从 到 的变化时

增 计数,由于寄存器只在每个机器周期的 期间采样外部输入信号,这样,需要

Page 97: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-90- 单片机原理及接口技术

个机器周期辨认一次 1 到 0 的变化。所以对外部输入信号,最大的计数频率是振荡器频率

的 1/24,且外部输入信号的高低电平保持时间均需大于一个机器周期。

定时器/计数器是单片机中工作相对独立的部件,当将其设定为某种工作方式并启动

后,它就会独立进行计数,不再占用 CPU 的时间,直到计满溢出,才向 CPU 申请中断处

理。它是一个工作效率高且工作灵活的部件。

6.2 定时器/计数器的控制

AT89C51 内部定时器/计数器是独立可编程器件,使用时可以先通过初始化程序确定其

工作模式和工作方式,然后才能在实用程序的适当位置控制其工作。

6.2.1 方式控制寄存器

AT89C51 对内部定时器/计数器的控制主要是通过 TMOD 和 TCON 两个特殊功能寄存

器的编程来实现的。

1.工作方式寄存器 TMOD

特殊功能寄存器 TMOD 用于控制 T0 和 T1 的工作方式,低 4 位用于控制 T0,高 4 位

用于控制 T1,8 位格式如图 6-2 所示。TMOD 的地址为 89H,其各位状态只能通过 CPU 的

字节传送指令来设定而不能用位寻址指令改变,复位时各位状态为 0。

GATE M1 M0 GATE M1 M0

T1控制 T0控制

TMOD

(89H)TC/ TC/

图 6-2 定时器方式控制寄存器 TMOD 格式

TMOD 各位的控制功能说明如下:

(1) M0、M1:工作方式控制位。2 位可形成四种二进制编码,可控制产生四种工作方

式,如表 6-1 所示。

表 6-1 T0、T1 工作方式选择

M1 M0 工作方式 计数器功能

0 0 方式 0 13 位计数器

0 1 方式 1 16 位计数器

1 0 方式 2 自动重装初值的 8 位计数器

1 1 方式 3 T0:分为两个 8 位独立计数器;T1:停止计数 (2) C/ T :模式控制选择位。C/ T =0 为定时器模式,C/ T =1 为计数器模式。

(3) GATE:门选通位。当 GATE=0 时,只要使 TCON 中的 TR0(或 TR1)置 1,就可启

动定时器 T0(或 T1)工作。当 GATE=1 时,只有 0INT (或 1INT )引脚为高电平且 TR0(或 TR1)

置 1 时,定时器才能启动工作。

Page 98: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 6 章 定时器/计数器 -91-

2.定时器控制寄存器 TCON

TCON 是一个 8 位寄存器,用于控制定时器的启动/停止以及标志定时器溢出中断申请。

TCON 的地址为 88H,既可进行字节寻址又可进行位寻址。复位时所有位被清零。各位定

义如图 6-3 所示。图中 TR0 和 TR1 分别用于控制 T0 和 T1 的启动与停止,TF0 和 TF1 用

于标志 T0 和 T1 是否产生了溢出中断请求,详细说明请参阅 5.2 节。

TCON

位地址 8FH

TF1 TR1

8EH 8DH

TF0 TR0

8CH

IE1 IT1 IE0 IT0

8BH 8AH 89H 88H

5见第 章

0 T0 1 T0:停 计数; : 启动

0 T0 1 T0: 无溢出; : 溢出中断

0 T1 1 T1:停 计数; : 启动

0 T1 1 T1: 无溢出; : 溢出中断 图 6-3 定时器控制寄存器 TCON 各位定义

定时器/计数器 T0 和 T1 是在 TMOD 和 TCON 的联合控制下进行定时或计数工作的,

其输入时钟和控制逻辑可用图 6-4 综合表示。

晶振 TCON

TC/

1T0T

1TF0TF

&

&

&

TCONTR0/1

TMODGATE 1≥

1=

溢出中断

INT1P3.3/0INT/2.3P

图 6-4 T0 和 T1 输入时钟与控制逻辑图

6.2.2 工作方式

定时器/计数器 T0 和 T1 通过 C/ T 可设置成定时或计数两种工作模式。在每种模式下

通过对 M1、M0 的设置又有四种不同的工作方式,T0 和 T1 在方式 0、方式 1、方式 2 下

工作情况是相同的,只在方式 3 工作时,两者情况不同。 下面将详细介绍四种工作方式下的定时器逻辑结构及工作情况。

1.工作方式 0

方式 0 时,定时器/计数器被设置为一个 13 位的计数器,这 13 位由 TH 的高 8 位和 TL

中的低 5 位组成,其中 TL 中的高 3 位不用,如图 6-5 所示。

当 TL0 的低 5 位计满溢出时,向 TH0 进位,当计数器的值为全“1”时,下次的增 1

计数将使计数器复位为全“0”,此时 TH0 溢出使中断标志位 TF0 置为“1”,并申请中断。

当中断被禁止时(ET0=0),可通过查询 TF0 位是否置位来判断 T0 是否计数结束。若要使 T0

再次计数,CPU 必须在中断服务程序或程序的其它位置重新装入初值。

Page 99: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-92- 单片机原理及接口技术

晶振

低 位

&1≥

1

0INT/2.3P

0TC/ =

1TC/ =

图 6-5 定时器/计数器 T0 在方式 0 下的逻辑结构图

图 6-5 中的其他逻辑控制功能如下:

(1) 当 C/ T =0 时,T0 选择为定时器模式,对 CPU 内部机器周期加 1 计数,其定时时

间为:T=(213-T0 初值)×机器周期。

(2) 当 C/ T =0 时,T0 选择为计数器模式,对 T0(P3.4)脚输入的外部电平信号由“1”

到“0”的负跳变进行加 1 计数。

(3) 当 GATE=0 时,或门的另一输入信号 0INT 将不起作用,仅用 TR0 来控制 T0 的启

动与停止。

(4) 当 GATE=1 时, 0INT 和 TR0 同时控制 T0 的启/停。只有当两者都为“1”时,定

时器 T0 才能启动计数。 定时/计数器 T1 在方式 0 下工作时的逻辑结构图与 T0 类似。

2.工作方式 1

方式 1 时,定时器/计数器被设置为一个 16 位加 1 的计数器,该计数器由高 8 位 TH

和低 8 位 TL 组成。定时器/计数器在方式 1 下的工作情况与在方式 0 下时的基本相同,差

别只是计数器的位数不同。

3.工作方式 2

方式 2 时,定时器/计数器被设置成一个 8 位计数器 TL0(或 TL1)和一个具有计数初值

重装功能的 8 位寄存器 TH0(或 TH1)。逻辑结构如图 6-6 所示。当计数器 TL0(或 TL1)从计

数初值加 1 计数并溢出时,除了把相应的溢出标志位 TF0(或 TF1)置“1”外,同时还将 TH0

(或 TH1)中的计数初值重新装入 TL0(或 TL1)中,使 TL0(或 TL1)又重新开始计数。在重装

过程中 TH0(或 TH1)中的数值保持不变。如果在 TH0(或 TH1)中由软件改为新的计数初值,

则下次向 TL0(或 TL1)中重装时将装入新的计数初值。

晶振 0TC/ =

&1≥1

0INT/2.3P

1TC/ =

溢出中断

图 6-6 定时器/计数器 T0 在方式 2 下的逻辑结构图

4.工作方式 3

定时器/计数器 T0 和 T1 在前三种工作方式下,其功能是完全相同的,但在方式 3 下,

Page 100: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 6 章 定时器/计数器 -93-

T0 与 T1 的功能相差很大。当 T1 设置为方式 3 时,它将保持初始值不变,并停止计数,其

状态相当于将启/停控制位设置成 TR1=0,因而 T1 不能工作在方式 3 下。当将 T0 设置为方

式 3 时,T0 的两个寄存器 TH0 和 TL0 被分成两个互相独立的 8 位计数器,其逻辑结构如

图 6-7 所示。其中 TL0 使用了 T0 的所有控制位:C/ T ,GATE、TR0、 0INT 和 TF0,其工

作情况与方式 0 和方式 1 类同。而 TH0 被规定只能用作定时器,对机器周期计数,而不能

对外部事件脉冲计数,TH0 的启/停控制借用了 TR1,溢出中断使标志位 TF1 置位,并申请

中断。

晶振 位

&1≥1

0INT/2.3P

0TC/ =

1TC/ =

中断

中断

图 6-7 定时器/计数器 T0 在方式 3 下的逻辑结构图

当把 T0 设置为工作方式 3 时,T1 虽然不能工作在方式 3 下,但可设置为方式 0、方

式 1、方式 2 下工作。由于 TR1 和 TF1 已被 TH0 占用,因而 T1 只能由控制位 C/ T 的模式

切换来控制运行,而且不能产生溢出中断申请,这时 T1 适于用在不需要中断控制的定时

器场合,比如用于作串行口的波特率发生器等。

6.3 定时器/计数器的应用

单片机上电复位后,TMOD、TCON 等特殊功能寄存器都处于清零状态,因而要想使

定时器/计数器按使用者需要正确工作,必须先进行初始化设置和计数初值的确定等工作。

6.3.1 初始化

初始化的内容如下:

(1) 根据设计需要先确定定时器/计数器的工作模式及工作方式,然后将相应的控制字

送入 TMOD 寄存器中。

(2) 计算出计数初始值并写入 TH0、TL0、TH1、TL1 中。

(3) 通过对中断优先级寄存器 IP 和中断允许寄存器 IE 的设置,确定计数器的中断优先

级和是否开放中断。

(4) 给定时器控制寄存器 TCON 送命令字,控制定时器/计数器的启动和停止。

6.3.2 初值的计算

定时器/计数器 T0、T1 不论是工作在计数器模式还是定时器模式下,都是加 1 计数器,

因而写入计数器的初始值和实际计数值并不相同,两者的换算关系如下:设实际计数值为

Page 101: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-94- 单片机原理及接口技术

C,计数最大值为 M,计数初始值为 X,则 X=M-C。其中计数最大值在不同工作方式下的

值不同,具体如下:

(1) 工作方式 0:M=213=8192。

(2) 工作方式 1:M=216=65 536。

(3) 工作方式 2:M=28=256。

(4) 工作方式 3:M=28=256。

这样,在计数器模式和定时器模式下,计数初值都是 X=M-C(十六进制数)。

定时器模式下对应的定时时间为

T=C·T=(M-X)T 式中,T为单片机的机器周期(T为晶振时钟周期的 12 倍)。

6.3.3 应用举例

[例 6.1] 单片机晶振 fosc=6 MHz,利用定时器 T1 定时中断方法产生周期为 4 ms 的

方波,并由 P1.0 端输出。

根据要求,要想在 Pl.0 端产生周期为 4 ms 的方波信号,只需使其输出电位每隔 2 ms

取反一次即可。这样由 T1 定时 2 ms,每隔 2 ms 产生一次中断,CPU 响应中断后,在中断

服务程序中使 P1.0 取反。

因此选 T1 工作在定时器模式,C/ T =0;由于时间不长,采用工作方式 0,M1M0=00;

由 TR1 控制启/停,GATE=0。因 T0 不用,只要不工作在方式 3 即可。由此 TMOD 的控制

字可定为 00H。 时间常数 2 ms 对应的计数初值 X 为

T=12/fosc=(12/6)×106 s=2 -13-×3×6

转化为十六进制为

在方式 的 位计数值中, 占高 位,低 位是 的低 位, 高 位不

用,填 即可,因此计数初值的实际写入值为 ,即 ,

。主程序及中断服务程序如下:

ORG 0000H

AJMP INITZ ;转主程序

NOP

ORG 001BH ;T1 中断入口

MOV TL1, #18H ;中断服务程序送定时初值

MOV TH1,#0E0H

CPL P1.0 ;R1.0 取反

RETI ;中断返回

ORG 0052H

Page 102: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 6 章 定时器/计数器 -95-

INITZ: MOV SP,#15H ;建立堆栈指针

MOV TMOD,#00H ;设置 T1 工作方式

MOV TL1,#18H ;置 T1 初值

MOV TH1, #0E0H

SETB EA ;CPU 开中断

SETB ET1 ;允许 T1 中断

SETB TR1 ;启动 T1

AD1: MOV A,#00H

AJMP AD1

[例 6.2] 单片机晶振 fosc=12 MHZ,利用定时器 T0、T1 产生周期为 200 ms 的方波,

并由 P1.0 端输出。

方法 1:由要求可知,只要使 P1.0 每隔 100 ms 取反一次即得周期为 200 ms 的方波信

号。这样就需要一个 100 ms 的定时器。当 fosc=12 MHZ 时,T0(或 T1)在工作方式 1 下的最

大定时时间为 65.536 ms,所以一个定时器不能满足需要,采用 T0、T1 各定时 50 ms,顺

序定时的方法可达到 100 ms 的要求,因而我们选 T0、T1 为定时器模式,工作在方式 1 下,

启/停控制由 TR0、TR1 完成。GATE=0,这样 TMOD 的控制字为 11H。对应 50 ms 计数初

值 X 为

H0CB3D536 15

000 50536 651012/12

10502X

6

316

==

−=×

×−= −

即 TL0=TL1=0B0H,TH0=TH1=3CH。

T0、T1 顺序定时可采用中断方法实现,也可采用查询方式实现,这里假定 CPU 不做

其它工作,采用查询法编写程序如下:

ORG 0052H

STI: MOV TMOD,#11H ;设置 T0、T1 为定时器,方式 1 工作

AD1: MOV TL0,#0B0H ;送 T0 初值

MOV TH0,#3CH

SETB TR0 ;启动 T0 进行 50 ms 定时

AD2: JBC TF0,AD3 ;查询 TF0 是否溢出

SJMP AD2

AD3: CLR TR0 ;停止 T0 定时

CLR TF0

MOV TL1,#0B0H ;送 T1 定时初值(50 ms)

MOV TH1,#3CH

SETB TR1 ;启动 T1

AD4: JBC TF1,AD5

STMP AD4

AD5: CLR TR1 ;停止 T1

Page 103: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-96- 单片机原理及接口技术

CLR TF1 ;清溢出标志

CPL P1.0 ; P1.0 取反

AJMP AD1

方法 2:用一个定时器 T0(或 T1),通过软件控制完成。即将定时器 T0 定时 50 ms,定

时器溢出两次,P1.0 被取反一次。

ORG 0052H

MOV R7, #02H

STI: MOV TM0D,#01H ;设置 T0、T1 为定时器,方式 1 工作

AD1: MOV TL0,#0B0H ;送 T0 初值

MOV TH0,#3CH

SETB TR0 ;启动 T0 进行 50 ms 定时

AD2: JBC TF0,AD3 ;查询 TF0 是否溢出

SJMP AD2

AD3: DJNZ R7,AD1

CLR TR0 ;停止 T0 定时

CPL P1.0 ;P1.0 取反

MOV R7,#02H

AJMP AD1

[例 6.3] 单片机晶振 fosc=12 MHZ,利用定时器/计数器测量某一外部脉冲信号频率,

要求连续测量五次,取其平均值作为实测值。

根据题意,利用定时器/计数器 T0、T1 联合工作可实现这一要求。选 T0 为计数器模

式,工作在方式 2 下,其输入端 P3.4(T0)接收外部脉冲信号,每次计数 10 个脉冲计满时,

产生中断请求。选 T1 为定时器模式,工作在方式 1,T0 开始一次计数的同时启动 T1 开始

定时,T0 中断时在其服务程序中停止 T1 定时,这时 T1 定时值即为 10 个计数脉冲所需时

间,两者之比即为被测频率,连续测量五次算出其平均值,即实现题中要求。

根据上面对 T0、T1 功能的设定,TMOD 的控制字为 16H,T0 的计数初值为

X=28-10=246=F5H,T1 的定时初值为 00H。

主程序及中断服务程序如下:

ORG 0000H

AJMP MAINT

ORG 000BH

AJMP INTZ1

ORG 0100H

MAINT: MOV SP,#15H

MOV TMOD,#16H

MOV TH0,#0F5H

MOV TL0,#0F5H

MOV R2, #05H

Page 104: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 6 章 定时器/计数器 -97-

MOV R1, #20H

SETB EA

SETB ET0

ORL TCON,#50H ;启动 T0,T1

AD1: MOV A, R2

JNZ AD2

计算频率值并输出显示

AD2: STMP AD1

ORG 0052H

INTZ1: ANL TCON,#0AFH ;停止 T0,T1

MOV @R1, TL1

INC R1

MOV @R1,TH1

MOV TL1,#00H

MOV TH1,#00H

DJNZ R2, L1

RETI

L1: ORL TCON,#50H

INC R1

RETI

上述程序实现一次测试后即停止测试,如要再测一次,可采用复位或其它方法给出一

个再测指令即可。

[例 6.4] 单片机晶振 fosc=6 MHz,设定时器 T0 工作在方式 3,利用 TL0 和 TH0 两个

独立的定时器在 P1.0 端产生一个占空比为 200 的矩形脉冲波。根据题意,让 和 分别定时 和 ,采用中断方式交替启动 和

定时,并对 端交替取反就可实现题中要求。因 ,则 定时初值为 , 定时初值为 。 的启停由

控制,溢出标志为 。主程序和中断服务程序如下:ORG 0000H

AJMP ZCXK1 ;转主程序

ORG 000BH

AJMP ZD0 ;转 TL0 中断程序

ORG 001BH

AJMP ZD1 ;转 TH0 中断程序

ORG 0100H

Page 105: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-98- 单片机原理及接口技术

ZCXK1: MOV SP,#70H ;置堆栈栈底

MOV TMOD,#03H ;设 T0 工作方式

MOV TL0,#9CH ;置 TL0、TH0 初值

MOV TH0,#38H

CLR P1.0 ;P1.0 端清零

SETB ET0 ;开 T0 中断

SETB ET1 ;开 T1 中断

SETB EA ;开总中断

SETB TR1 ;启动 TH0 定时开始

DENG1: AJMP DENG1 ;等待中断

ZD0: SETB TR0 ;启动 TL0 定时

CLR TR1 ;关闭 TH0 定时

CPL P1.0 ;P1.0 取反

MOV TH0,#38H ;重装 TH0 初值

RETI ;中断返回

ZD1: SETB TR1 ;启动 TH0 定时

CLR TR0 ;关闭 TL0 定时

CPL P1.0 ;P1.0 取反

MOV TL0,#9CH ;重装 TL0 初值

RETI ;中断返回

6.4 实 验

1. 实验目的

(1) 掌握 AT89C51 单片机内部定时器/计数器工作模式和工作方式的选择以及初始化编

程的方法。

(2) 深入理解中断处理的全过程及中断初始化程序、中断服务程序的设计方法。

(3) 学习并掌握相关指令的使用。

2.实验器材

(1) 单片机仿真器一台。

(2) +5 V 直流稳压电源一台。

(3) 双踪示波器一台,信号发生器一台。

3. 实验内容

(1) 选择定时器 T1 工作在方式 0 或方式 1 下,采用查询方式编程,使 P1.0 端输出如图

6-8 所示的波形。

Page 106: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 6 章 定时器/计数器 -99-

180 ms

20 ms 40 ms 60 ms 60 ms

P1.0

图 6-8 实验内容 1 波形图

(2) 选择定时器 T0 工作在计数模式、方式 2 下,使 T0 对信号发生器输出给 P3.4(T0)

端的方波信号进行计数,计五个脉冲使 T0 溢出产生中断,并在 P1.0 端输出一个 5 分频于

输入脉冲的方波信号,波形如图 6-9 所示。

P3.4

P1.0

图 6-9 实验内容 2 波形图

4. 实验步骤

(1) 确定相关特殊功能寄存器的控制字并计算两种情况下的计数初值。

(2) 编写相应程序并译为目标程序。

(3) 输入程序、调试程序、运行程序,直到通过示波器可以观察到正确波形为止。

5.思考题

(1) 体会定时器/计数器的不同工作方式的特点。

(2) 比较查询方式和中断方式的不同点。

(3) 将实验内容 1 用中断方式,实验内容 2 用查询方式,编写相关程序。

习题与思考题

6.1 AT89C51 中有几个定时器/计数器?是加 1 计数还是减 1 计数?

6.2 定时器/计数器有几种工作模式?每种工作模式中又有几种工作方式?它们之间

有何区别?

6.3 定时器/计数器的定时频率和计数频率怎样确定?对外部计数频率有何限制?

6.4 控制寄存器 TMOD 和 TCON 各位的定义是什么?怎样确定各定时器/计数器的工

作方式?

6.5 在工作方式 3 中,定时器/计数器 T0 和 T1 的应用有什么不同?

6.6 已知单片机时钟频率 fosc=6 MHz,当要求定时时间为 2 ms 或 5 ms,定时器分别

工作在方式 0、方式 1 和方式 2 时,定时器计数初值各是多少?

6.7 已知 AT89C51 时钟频率 fosc=6 MHz,试利用定时器编写程序,使 P1.0 输出如图

6-10 所示的连续矩形脉冲。

Page 107: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-100- 单片机原理及接口技术

P1.0

40 µs 120 µs

图 6-10 P1.0 端输出波形

6.8 设外部脉冲由 0INT (P3.2)端输入,试编写利用门控位 GATE 和定时器 T0 测试脉

冲宽度的程序。 6.9 一个定时器的定时时间有限,试设计几种能实现较长时间(超过一个定时器的定时

时间)定时的方案。

6.10 已知 AT89C51 时钟频率 fosc=6 MHZ,试编写程序,利用 T0 工作在方式 3,使

P1.0 和 P1.1 分别输出 和 的方波。 软件定时有什么优点?一般用于什么场合?

Page 108: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 7 章 AT89C51 单片机系统扩展 -101-

第 7 章 AT89C51 单片机系统扩展

通常情况下,利用 AT89C51 的最小应用系统可以发挥单片机的体积小、价格低等优点。

但是,在单片机的绝大部分应用中,最小应用系统所提供的可用资源往往不能满足需要。

因此,在单片机应用系统的设计中经常需要系统扩展。系统扩展是单片机系统应用与开发

的基础,它需要我们熟练掌握。

7.1 AT89C51 最小应用系统

从本质上讲,单片机本身就是一个最小应用系统。由于晶振、开关等器件无法集成到

芯片内部,这些器件又是单片机工作所必需的器件,因此,由单片机与晶振电路及由开关、

电阻、电容等构成的复位电路就是单片机的最小应用系统。如图 7-1 所示,AT89C51 片内

有 Flash 程序存储器,由它构成的最小应用系统简单可靠。由于集成度高的原因,最小应

用系统只能是基本控制单元。换句话说,AT89C51 的最基本工作条件离不开晶振电路和复

位电路,这也是所有单片机必需的两个基本电路。

P2.0P2.1P2.2P2.3P2.4P2.5P2.6P2.7

P0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.7

P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7

3938373635343332

2122232425262728

12345678

XTAL2

XTAL1

RST

10

11

12

13

14

15

16

17

18

19

9+

31

VCC

AT89C51

INT0 P3.2

INT1 P3.3

P3.0 RXD

P3.1 TXD

P3.4 T0

P3.5 T1

WR P3.6

RD P3.7

EA

C1

C2

1 kΩ

8.2 kΩ

10 µF

图 7-1 AT89C51 最小应用系统

最小应用系统在实际应用中往往不能满足要求。一般情况下,系统都少不了如显示、

Page 109: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-102- 单片机原理及接口技术

键盘等基本单元电路,所以最小应用系统和它们之间的接口电路是必不可少的。在实际系

统设计中,需要在最小应用系统的基础上扩展各种接口电路。因此必须了解单片机的外部

扩展能力,才能正确地扩展接口,使应用系统稳定可靠。

7.2 AT89C51 单片机的外部扩展性能

单片机是通过片外引脚进行系统扩展的。目前的单片机都是三总线结构,即地址总线

(AB)、数据总线(DB)、控制总线(CB)。下面将对这三组总线的扩展性能作以介绍。

1. 地址总线(AB)

地址总线用来传送存储单元或外部设备的地址。AT89C51 由 P0 口提供低 8 位地址线。

由于 P0 口同时又作为数据口,地址数据是分时控制输出,所以低 8 位地址必须用锁存器锁

存。也就是在 P0 口加一个锁存器,锁存器的输出就是低 8 位地址。锁存器的锁存控制信号

是由单片机 ALE 控制信号提供的,当 ALE 下降沿时将低 8 位地址锁存。

地址总线高 8 位由 P2 口直接输出。P0、P2 口在作为地址总线使用时就不能再用作一

般的 I/O 口,这在系统扩展时一定要注意。地址总线的宽度是 16 位,寻址范围是 216=64 KB,

地址范围是 0000H~FFFFH。

2. 数据总线(DB)

数据总线用来传送数据和指令码,AT89C51 由 P0 口提供数据线,其宽度为 8 位,该

口为三态双向口。单片机与外部交换数据、指令、信息几乎都是由 P0 口传送。

3. 控制总线(CB)

控制线用来传送各种控制信息。AT89C51 用于系统扩展的控制线有 WR 、RD 、PSEN 、

ALE、EA。 RD / WR 信号用于扩展片外数据存储器的读写控制。当使用 MOVX 类指令对

片外数据存储器读写时,自动产生 RD / WR 信号。 PSEN 用于扩展片外程序存储器的读控

制。读取片外程序存储器时单片机不产生 RD 信号。ALE 的下降沿使 P0 口输出的地址锁存。

EA 用于选择片内或片外程序存储器。 EA =0 时,不论是否有片内程序存储器,只访问外

部程序存储器, EA =1 时,系统从内部程序存储器开始执行程序。

7.3 程序存储器的扩展

在单片机的实际设计中,存储器的扩展所使用的存储器绝大部分都是半导体存储器,

如早期的 EPROM、EEPROM,近年来使用比较多的 FLASH、NVSRAM、MPRAM 等也都

属于半导体存储器。半导体存储器的发展十分迅速,无论是在容量上,还是在存取速度上

都在日新月异地变化,出现了许多适合各种系统设计应用的半导体存储器。特别是各类单

片机在嵌入式系统中的广泛应用,使其发展又进入了一个广阔的领域。存储器按数据传送

方式分为并行传送和串行传送。为了适应更复杂的信息处理的需要,常常需要寻找一些新

的数据存储方式来简化系统设计和提高数据通信的速率。这样就出现了多端口存储器

(MPRAM)、FIFO 存储器、VRAM 存储器等。这就给存储器的扩展提出了新的要求。尽管

存储器种类繁多,但是只要掌握了基本的单片机扩展存储器的原理和方法,很多问题都会

Page 110: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 7 章 AT89C51 单片机系统扩展 -103-

迎刃而解。下面以 28C16 为例介绍程序存储器的扩展方法。

7.3.1 28C16 程序存储器概述

AT89C51 内部本身具有 4KB 的 FLASH,当程序量超过 4 KB 时,扩展外部程序存储器

才有实际意义。AT89C51 的最大外部扩展范围是 64 KB,减去内部 4 KB,实际为 60 KB。

1. 并行 EEPROM28C16 的特点

28C16 是一种采用 CMOS 工艺制成的 2 K×8 位可用电擦除的可编程只读存储器。其

读写不需要外加任何元器件。读访问时间可为 150~250 ns,在写入之前自动擦除;一个字

节的擦除和写访问时间为 200 ns~1 ms;工作电流为 30 mA,备用状态时只有 100 ;电

源电压为单一的;三态输出,与 电平兼容。引脚图见图 。

A7A6A5A4A3A2A1A0D0D1D2GND

VCCA8A9

A10

D7D6D5D4D3

242322212019181716151413

123456789

101112

WEOE

CE

图 7-2 28C16 引脚图

2. 引脚说明

~:地址线; ~:数据线; CE :片选线低电平有效; CE ,本芯片被选中工作,否则,本芯片不被选中

工作; WE :写允许低低电平有效; OE :输出允许低电平有效; CC: 电源; :接地端。

3. 工作方式

工作方式选择如表 所示。表 7-1 28C16 工作方式选择

工作方式 CE OE WE 输入/输出

后备

字节写

字节擦除

写禁止

写禁止

输出禁止

L

H

L

L

X

X

X

L

X

H

12 V

X

L

H

H

X

L

L

H

X

X

数据输出

高阻

数据输入

高阻

高阻

高阻

高阻

Page 111: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-104- 单片机原理及接口技术

7.3.2 单片 28C16 的扩展电路

图 7-3 采用一片 28C16 的扩展程序存储器。由于 89C51 内部有 4 KB 的程序存储器,

只有当片内 4 KB 存储器不够用时,才考虑扩展片外程序存储器。扩展存储器主要注意以

下三个方面:

(1) 地址总线的连接:28C16 有 2 KB 的存储空间 11 根地址线,而 89C51 有 64 KB 的

寻址空间 16 根地址线。在低位地址线一一对应连接完后(低 8 位地址与 74LS373 的 Q0~

Q7 相连),AT89C51 剩余的高位地址线可以空着不连接,见图 7-3。

(2) 数据总线的连接:28C16 与 AT89C51 的数据总线都是 8 位,所以从 D0~D7 与

89C51 的 P0.0~P0.7 依次对应连接即可。

(3) 存储器片选端的连接:存储器片选端的连接是非常重要的,如果单片机扩展了多

片存储器,它的连接往往是单片机剩余的高位地址线,这样就决定了各个存储器在系统中

的地址范围。由于我们只是一片存储器的扩展,所以片选端 CE 直接接地就可以了。

此外,28C16 的 OE 端与 AT89C51 的 PSEN 相连, WE 端直接接电源正端即可。

对于 AT89C51,因为数据线和低 8 位地址线都是 P0 口提供,数据线和地址线是分时

使用的,所以如图 7-3 所示,将 AT89C51 的 P0 口与锁存器 74LS373 的 D0~D7 相连,ALE

端与 74LS373 的 GE 端相连,利用 ALE 的下降沿可将低 8 位地址锁存。

P2.7(A15)P2.6(A14)P2.5(A13)P2.4(A12)P2.3(A11)P2.2(A10)P2.1(A9)P2.0(A8)P0.7(A7)P0.6(A6)P0.5(A5)P0.4(A4)P0.3(A3)P0.2(A2)P0.1(A1)P0.0(A0)

3536373839

30

29

89C51

D7D6D5D4D3D2D1D0

Q7Q6Q5Q4Q3Q2Q1Q0

A7A6A5A4A3A2A1A0

A10A9A8

D7D6D5D4D3D2D1D0

181714138743

191615129652

323334

2827262524232221

678

19222312345

171615141311109

21

28C1674HC373

GE

ALE

11118

21

VCC

EA PSEN31

OE

OE

WE

CE

图 7-3 一片 28C16 程序存储器扩展连接图

7.3.3 多片 28C16 的扩展方法

在多片存储器扩展电路中,片选端的接法有两种,分别是线选法和地址译码法。

1. 线选法

由于 28C16 是 2 K 个字节的存储器,所以它的地址线是 A0~A10,共 11 根。与 16 根

地址线的 89C51 相连,还剩五根高位地址线。这五根高位地址线可以分别用来连接 28C16

的片选端。这样最多可接五片 28C16。每片都有自己的寻址范围且地址不会重叠。如果不

需要扩展,多余的高位地址线也可以空着不连。图 7-4 就是采用线选法用三片 28C16 扩展

Page 112: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 7 章 AT89C51 单片机系统扩展 -105-

存储器的电路图,按照未用地址线 P2.3 和 P2.4 以低电平“0”计算,三片 28C16 的地址范

围分别是:28C16(1)为 C000H~C7FFH,28C16(2)为 A000H~A7FFH,28C16(3)为 6000H~

67FFH。

从以上的地址分配可以看出,采用线选法三片 28C16 的地址是不连续的,很多地址空

间空闲没用,但是扩展方法比较简单,只需直接连接片选端到高位地址即可。

G

OE

74LS373

A0 A7~ A8 A10~28C16(2)

D0 D7WE OE CE

A0 A7~ A8 A10~28C16(3)

D0 D7WE OE CE

1≥

P2.7P2.6P2.5

P2.2 P2.0~ALE

74LS08

3

8 8 8

33

8

8

89C51EA

WEP0

RD

PSEN

A0 A7~ A8 A10~28C16(1)

D0 D7WE OE CE

D0

D7

Q0

Q7

8

图 7-4 线选法多片 28C16 程序存储器扩展连接图

2. 地址译码法

如果采用线选法扩展存储器,可用的高位地址线有限。用少量的高位地址线扩展多片

存储器,常常采用地址译码法。地址译码法只需在线选法的基础上加译码器就可以了。具

体电路图如图 7-6 所示。

译码器芯片 74LS138 是 3 位选择输入线,8 位译码输出线。所以最多能接八个芯片的

片选端。图 7-5 是该芯片的引脚图,表 7-2 是该芯片的真值表。

表 7-2 74LS138 真值表

G1 A2G B2G C B A 7Y 6Y 5Y 4Y 3Y 2Y 1Y 0Y

1 0 0

1 0 0

1 0 0

1 0 0

1 0 0

1 0 0

1 0 0

1 0 0

其他状态

0 0 0

0 0 1

0 1 0

0 1 1

1 0 0

1 0 1

1 1 0

1 1 1

× × ×

1 1 1 1 1 1 1 0

1 1 1 1 1 1 0 1

1 1 1 1 1 0 1 1

1 1 1 1 0 1 1 1

1 1 1 0 1 1 1 1

1 1 0 1 1 1 1 1

1 0 1 1 1 1 1 1

0 1 1 1 1 1 1 1

1 1 1 1 1 1 1 1

在图 7-6 中,28C16(1)的地址范围是 0000H~07FFH,28C16(2)的地址范围是 0800H~

0FFFH,28C16(3)的地址范围是 1000H~17FFH。从地址分配可以看出三片 28C16 的地址

是连续的,没有浪费地址空间,可扩展的芯片较多。

74LS138

12345678

161514131211109

VCCY0

Y1

Y2Y3

Y4

Y5

Y6

ABC

G2A

G2BG1Y7

GND

图 7-5 74LS138 引脚图

Page 113: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-106- 单片机原理及接口技术

A0 A7~ A8 A10~28C16(3)

D0 D7WEOE CE

A0 A7~ A8 A10~28C16(2)

D0 D7WEOE CE

A0 A7~ A8 A10~28C16(1)

D0 D7WEOE CE

D0

D7

Q0

Q7

G

CBA

Y0Y1Y2

Y7G2A

G2B G1

5 V+

1≥

P2.5P2.4P2.3

P2.2 P2.0~ALE

P0

89C51

WE

RD

PSEN 74LS08

3

83

8 8

8

8 8 8

8

3 3

74LS373

图 7-6 译码法程序存储器扩展连接图

7.4 数据存储器的扩展

在 AT89 系列单片机的产品中,片内数据存储器的容量一般为 128~256 个字节。当片

内 RAM 不够用时,就需要扩展外部 RAM,因为地址线有 16 根,所以最大可扩展 64 KB。

7.4.1 并行传送外部数据存储器的扩展方法

单片机和数据存储器的连接方法与程序存储器的连接方法大致相同,主要区别在控制

信号上。地址线、数据线均与程序存储器的连接方法一致。因为数据存储器既要读又要写,

所以必须有控制读写的信号线。而一般作为数据存储器的 RAM,都有读写信号线。应用时

只需将存储器的读信号线 RD 、写信号线 WR 与单片机的相应 RD 、 WR 相连就行了。如

果只扩展一片, CE 端可以直接接地;如果有多片,每片 RAM 的 CE 跟程序存储器的扩展

方法中介绍的 CE 连接一样。图 7-7 是单片 SRAM6116(2 K 位的扩展连接图。

P2.2P2.1P2.0P0.7P0.6P0.5P0.4P0.3P0.2P0.1P0.0

AT89C51

74LS373

1716232221

D7D6D5D4D3D2D1D0

Q7Q6Q5Q4Q3Q2Q1Q0GE OE

6116

3233343536373839

191615129652

181714138743

202119222312345678

D7D6D5D4D3D2D1D0

A10A9A8A7A6A5A4A3A2A1A0ALE

11 1

171615141311109

31EA

RDWR

CE

30

18

OEWE

图 7-7 AT89C51 与 6116 接口连接图

Page 114: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 7 章 AT89C51 单片机系统扩展 -107-

当访问外部数据存储器时,只能使用 MOVX 类指令,将外部程序存储器的内容读进片

内累加器 A 时,使用指令 MOVX A,@DPTR(或 MOVX A,@Ri),单片机产生读信号;

而将片内累加器 A 的内容送入片外存储器时,使用指令 MOVX @DPTR,A(或 MOVX A,

@Ri),单片机产生写信号。

7.4.2 串行传送数据存储器的扩展方法

近年来随着嵌入式应用系统的迅速发展,为了适应多种应用场合,出现了许多基于 I2C

总线的串行器件,像串行半导体存储器这类器件,它们的特点有两个:一是体积小,硬件

扩展方便;二是价格低廉。它们已经广泛用于多种控制电路中,掌握这类器件的应用方法

是很重要的。下面以二线制 I2C CMOS 串行 EEPROM24C01 为例,讲述串行外部数据存储

器的扩展方法。

下面对串行 EEPROM AT24C01A 作以简单介绍。

1) 一般特性

AT24C01 是一种采用 CMOS 工艺制成的 128 位串行可电擦除的可编程只读存储器,

自动擦除时间不超过 ,典型时间为 。具有字节写入和页写入两种写入方式。擦

除写入周期寿命一般可达 万次以上。采用单一 电源,低功耗工作电流。三态输出

与 电平兼容。 采用二线制 2 总线结构可以与具有 2 总线结构的单片机或

者模拟 2 总线传输方式的单片机直接接口,同时还具有硬件写保护功能。 引脚图及说明 引脚图见图 ,各引脚功能如下::串行时钟端,用于对输入和输出数据的

同步。:串行数据地址输入或输出端,串行双

向数据输入、输出端。:写保护,硬件数据保护端接地时可对整个存储器进行正常读写,接电源时具

有写保护功能。、、:片选输入。CC:电源端,接 电源。SS:接地端。 芯片操作 功能描述: 支持 2 双向二线制串行总线及其传输规约。在串行

系统中,必须有一片可以产生串行时钟的主器件控制,通常这个主器件就

是单片机,控制其总线访问及产生“启动”和“停止”信号。对 写操作时,单片

机是发送器,串行 是接收器,而在读操作时则相反。进行哪一种操作方式则由单

片机确定。 总线特性:2 双向二线制串行总线协议定义只有在总线处于“非忙”状态时,数

据传输才能被初始化。在数据传送期间,只要时钟线为高电平,数据线都必须保持稳定,

数据才有效。否则数据线上的任何变化都被当作“启动”或“停止”信号。图 是定义

的串行总线状态示意图。

8

7

6

5

A0

A1

A2

VSS

1

2

3

4

VCC

WP

SCL

SDA

图 7-8 AT24C01A 引脚图

Page 115: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-108- 单片机原理及接口技术

SCL

SDA

A B D

启动信号

#数据电平稳定数据才有效

#数据在此期间变化

停止信号

D C A

图 7-9 AT24C01A 总线状态图

① A 段:总线非忙状态,在此期间 SDA、SCL 都保持高电平。

② B 段:启动数据传输,当 SCL 为高电平时,SDA 由高电平变为低电平的下降沿被

认为是“启动”信号,只有出现了启动信号后,其他命令才有效。

③ C 段:停止数据传输,当 SCL 为高电平时,SDA 低电平的上升沿被认为是“停止”

信号。随着“停止”信号的出现,所有外部操作都结束。

④ D 段:数据有效,在出现“启动”信号以后,

SCL 为高电平且数据线稳定,这时数据线的状态表

示要传送的数据。

另外,每当 EEPROM 接收到一个字节的数据

后,通常需要发出一个应答信号,单片机必须产生

一个与这个应答信号相联系的额外的时钟脉冲。

(3) 芯片寻址:当芯片接收到“启动”信号后,

需要接收一个 8 位的控制字,控制字的格式如图 7-10 所示。

A2、A1、A0 三位地址与引脚上的 A2、A1、A0 的接法(接 VCC=1,接 VSS=0)相比较,

如果一致,该芯片被选通。所以一个总线上总共可以挂八个 AT24C01A。

(4) 字节编程方式:在这种方式下,微处理器发送 EEPROM 存储单元地址和一个字节

数据至 EEPROM。微处理器发出“启动”信号后。紧跟着选 4 位 I2C 总线器件特征编码 1010

和三位 EEPROM 芯片地址以及写状态的 WR/ 位( WR/ = 0)到总线上。被寻址的 EEPROM

发出一个应答信号后,微处理器紧跟着发送一个字节的 EEPROM 存储单元的地址。当又一

次接收到应答信号后再发送要写入一个字节的数据。当 EEPROM 再一次发出应答信号后微

处理器接收到该信号,立刻发“停止”信号,这个“停止”信号就激活内部编程周期,把

接收到的 8 位数据写入指定的 EEPROM 存储单元。字节写入的帧格式见图 7-11。

S 1 0 1 0 X X XSDA线

主机启动 控制字节

应答

存储单元地址

应答

数据

应答

停止

P

WR/

图 7-11 AT24C01A 字节写入帧格式

(5) 读操作:读操作分三种情况,即读当前地址存储单元的数据,读指定地址存储单

元的数据,读连续存储单元的数据。下面介绍读指定地址存储单元的数据,其余两种方式

1 0 1 0 A2 A1 A0W

R

D7 D6 D5 D4 D3 D2 D1 D0

I2C总线特征码 芯片地址1:读操作

0:写操作

图 7-10 AT24C01A 控制字

Page 116: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 7 章 AT89C51 单片机系统扩展 -109-

参见有关书籍。

这种方式下微处理器需先发送芯片地址和指定单元地址,在得到应答信号后,再发送

“启动”信号,之后再发送芯片地址。并使用 WR/ =1 的控制信号,当 EEPROM 发出应答

信号后,就串行输出数据。当一帧数据读完后发送非应答信号(即发高电平)紧接着发送“停

止”信号。这种方式见图 7-12。

S 1 0 1 0 X X XSDA线

主机

启动 控制字

应答

存储单元指定地址

应答

数据

非应答

停止

P

启动 控制字

应答

1WR/ =0WR/ =

S 1 0 1 0 X X X

图 7-12 读 AT24C01A 指定地址存储单元数据的帧格式

(6) AT89C51 与 AT24C01A 接口电路:因为 89C51 不带 I2C 总线,所以必须用 I/O 口

来模拟 I2C 总线的工作时序。也就是将 AT24C01A 的 SDA、SCL 直接接到 P1 口的任何两

根线上,以便使单片机按 I2C 总线的时序通过这两根线相互传送数据。AT24C01A 的 WP

接地,既可以写又可以读。A0、A1、A2 接地,芯片地址就是 000。硬件接口见图 7-13。

AT89C51

X1

X2 5 V+

5 V+

AT24C01A

VCC

SDASCLWP

A2A1A0VSS

5 V+5 V+5 V+

10 kΩ10 kΩ

567

3214

P2.0

P2.1

P2.2

P2.3

P2.4

P2.5

P2.6

P2.7

P0.0

P0.1

P0.2

P0.3

P0.4

P0.5

P0.6

P0.7

RST

EA

P1.0P1.1

8

图 7-13 AT89C51 与 AT24C01A 的硬件接口连接图

软件编程非常关键,一定要注意 P1.0、P1.1 的时序应严格符合 I2C 总线时序,否则

AT24C01A 将不能正常工作。以下给出用单片机模拟 I2C 总线时序的程序,此程序向

AT24C01A 指定地址写入一个字节数据。30H 单元放要写入 AT24C01A 数据的地址,R0 放

要写入的数据。

程序如下:

WROM: SETB P1.0

LCALL DELAY

SETB P1.1

Page 117: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-110- 单片机原理及接口技术

LCALL DELAY

CLR P1.0

LCALL DELAY

CLR P1.1

LCALL DELAY

MOV R2,#08H ;送写控制字

MOV A,#0A0H

WM2: LCALL WRITE

LCALL DELAY

SETB P1.1

LCALL DELAY

CLR P1.1

LCALL DELAY

MOV R2,#08H ;送写入数据的首地址

MOV A,30H

LCALL WRITE

LCALL DELAY

SETB P1.1

LCALL DELAY

CLR P1.1

LCALL DELAY

MOV R2,#08H ;连续放一个字节的数据

MOV A,R0

LCALL WRITE

CLR P1.0

LCALL DELAY

SETB P1.1

LCALL DELAY

CLR P1.1

LCALL DELAY

WM: SETB P1.1 ;给出停止信号

LCALL DELAY

SETB P1.0

LCALL DELAY

RET

WRITE: CLR C ;写入数据子程序

RLC A

MOV P1.0,C

LCALL DELAY

SETB P1.1

Page 118: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 7 章 AT89C51 单片机系统扩展 -111-

DJNE R2,WRITE

RET

DELAY: MOV R3,#1FH ;延时子程序

DELY: DJNE R3,DELY

RET

7.5 I/O 口 的 扩 展

AT89C51 单片机共有四个 8 位并行 I/O 口,但有时这些 I/O 口不能完全提供给用户。

在实际应用系统设计中,往往供用户使用的 I/O 口是不够的,因此常常需要进行 I/O 口的

扩展。

单片机扩展的 I/O 口有两种基本类型,即简单 I/O 口扩展和可编程 I/O 口的扩展。前

者功能单一,多用于简单外设的输入输出;后者功能丰富,有的扩展芯片内部还有定时器、

RAM 等,应用范围广,但接口芯片相对价格昂贵。

7.5.1 简单 I/O 口的扩展

只要根据“输入三态,输出锁存”的原则,选择 74 系列的 TTL 电路或 MOS 电路就能

组成简单的扩展电路,如 74LS244、74LS273、74LS373、74LS377 等芯片都能组成输入、

输出接口。

对于 AT89C51 单片机,外部 I/O 接口和外部 RAM 是统一编址的,也就是说它们共用

64 K 存储空间。每个扩展 I/O 接口相当于一个扩展的外部单元,因此,访问外部接口就如

同访问外部 RAM 一样,用的都是 MOVX 指令,MOVX 指令产生的 RD 、WR 信号可以对

I/O 口进行读写。图 7-14 给出了一个用 8 位三态缓冲器 74LS244 作为输入口和八 D 锁存器

74LS273 作为输出口组成的简单 I/O 口扩展电路。

74LS273

D0D1D2D3D4D5D6D7

Q0Q1Q2Q3Q4Q5Q6Q7

D0D1D2D3D4D5D6D7

74LS244

Q0Q1Q2Q3Q4Q5Q6Q7

CLRCLK

1≥

1≥

AT89C51

G

P2.0

WR

RD

200 Ω+

Ω

OE

图 7-14 简单 I/O 口扩展图

Page 119: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-112- 单片机原理及接口技术

在图 7-14 中,输出电路控制采用 P2.0 和 WR 的组合信号。当 P2.0 和 WR 都为 0 时,

或门输出为 0,将 P0 口数据锁存到 74LS273,其 Q 端控制发光二极管 LED;当某个 Q 端

为 0 时,与其相连的发光二极管被点亮。

输入电路控制采用 P2.0 和 RD 的组合信号,当 P2.0 和 RD 都为 0 时,或门输出为 0,

选通 74LS244,将外部信号传到数据总线;当某键被按下时,与其相连的输入线为 0,无

键按下时为全 1。

尽管输入、输出两个扩展口都用 P2.0 作为控制线,地址空间相同,但是两个接口分别

用 RD 、 WR 信号控制,所以不会发生冲突。由于当 P2.0 为低电平时接口才能被选通,所

以输入、输出接口地址都是 FEFFH。

按照图 7-14,若让某一个按键按下,对应的发光二极管亮,程序如下:

LOOP: MOV DPTR,#0FEFFH ;置 I/O 口地址

MOVX A,@DPTR ;产生 RD 读入键值

MOVX @DPTR,A ;产生 WR 输出信号

AJMP LOOP ;循环

7.5.2 可编程 I/O 口的扩展

在单片机接口中,经常使用一些结构复杂的接口芯片,以完成各种复杂的操作,这类

芯片一般具有多种功能。在使用前,必须由 CPU 对其编程初始化,以设定工作方式,然后

才能使芯片按设定的方式进行操作,这类芯片也称为可编程接口芯片。

可编程接口芯片根据功能的差异种类也很多,常用的可编程接口芯片有并行接口

8155、8255,串行通信接口 8251,定时/计数器 8253 等。

如何正确使用这些芯片,使之成为单片机的扩展接口,除了保证正确的硬件线路连接

外,关键在于控制字的设定与修改,下面通过 8255 介绍这类芯片的使用。

1.8255 的内部结构 8255 是一个可编程并行 I/O 口芯片,由以下四个逻辑结构组成,逻辑结构图如图 7-15

所示。

数据总线驱动

/读 写

控制

逻辑

A组控制

B组控制

A组

A口

A 组

A 口

A 组

C 口

B 组

C 口

B 组

B 口

PA7 PA0~

PC7 PC4~

PC4 PC0~

PB7 PB0~

8

4

4

8

D7 D0~

RD

WR

CS

A1

A0

RESET

图 7-15 8255 内部结构框图

Page 120: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 7 章 AT89C51 单片机系统扩展 -113-

(1) 数据总线驱动器:具有双向三态的 8 位驱动器,用于和单片机数据总线相连,以

实现单片机与 8255 数据的传送。

(2) 并行 I/O 端口:共有三个并行端口,分别是 A 口、B 口、C 口。

(3) 读写控制逻辑:用于管理所有的数据、控制字或状态字的传送。

(4) A 组、B 组控制块:用于接收来自读、写控制逻辑命令和内部数据总线的控制字,

并向对应口发出操作命令。A 组控制 A 口及 C 口的高 4 位,B 组控制 B 口及 C 口的低 4 位。

2.8255 的引脚介绍

8255 是一个具有 40 个引脚的 DIP 封装的芯片,引脚图见图 7-16。

1234567891011121314151617181920

4039383736353433323130292827262524232221

PA4PA5PA6PA7WRRESETD0D1D2D3D4D5D6D7VCCPB7PB6PB5PB4PB3

PA3PA2PA1PA0RDCS

GNDA1A0

PC7PC6PC5PC4PC0PC1PC2PC3PB0PB1PB2

图 7-16 8255 引脚图

引脚功能介绍如下:

(1) PA0~PA7:A 口,具有 8 位数据输出锁存器/缓冲器和一个 8 位数据输入锁存器。

它是最灵活的输入输出寄存器,具有基本 I/O 方式、选通 I/O 方式和双向总线三种工作方

式,工作方式的选择是通过程序设定来完成的。

(2) PB0~PB7:B 口,具有 8 位数据输出锁存器/缓冲器和 8 位数据输入缓冲器(不锁

存)。可编程为基本 I/O 方式和选通 I/O 方式,但不能双向输入、输出。

(3) PC0~PC7:C 口,具有 8 位数据输出锁存器/缓冲器和 8 位数据输入缓冲器(不锁

存),该口可分为两个 4 位口使用,它除了作为输入/输出口外,还可以作为 A 口、B 口选

通工作方式操作时的状态控制信号。

(4) RD :读控制端,低电平有效,允许从 8255 读取数据或状态字。

(5) WR :写控制端,低电平有效,允许向 8255 写入数据或控制字。

(6) SC :片选端,低电平有效。

(7) A0、A1:口地址选择端,通过 A0、A1 可选中 8255 的四个寄存器,每个寄存器口

地址见表 7-3。

(8) RESET:复位控制端,当 RESET=1 时,8255 复位,通常与单片机的复位端直接相

连。复位状态使控制寄存器被清除,所有端口(A、B、C)为输入方式。

3.8255 的操作方式

8255 的全部工作状态是通过读/写控制逻辑和工作方式选择来实现的。

Page 121: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-114- 单片机原理及接口技术

1) 读/写控制逻辑操作选择

由单片机输出的地址线 A0、A1 及 RD 、WR 、 SC 来选择口的操作状态,具体说明如

表 7-3 所示。 表 7-3 8255A 控制信号功能表

A1 A0 RD WR CS 输入操作(读)

0 0 0 1 0 A 口→数据总线

0 1 0 1 0 B 口→数据总线

1 0 0 1 0 C 口→数据总线

(a)

A1 A0 RD WR CS 输出操作(写)

0 0 1 0 0 数据总线→A 口

0 1 1 0 0 数据总线→B 口

1 0 1 0 0 数据总线→C 口

1 1 1 0 0 数据总线→控制口

(b)

A1 A0 RD WR CS 禁止操作

× × × × 1 数据总线为三态

1 1 0 1 0 非法条件

× × 1 1 0 数据总线为三态

(c)

2) 8255 三种工作方式的功能

8255 有三种工作方式,分别是方式 0、方式 1 和方式 2,它们是通过程序对控制口送

控制字来选择的,下面分别介绍三种工作方式:

(1) 方式 0:基本 I/O 方式。8255 在这种工作方式下,输入、输出数据时不需要任何选

通信号,通常用于无条件输入、输出数据的外设接口。A、B、C 口都可以设定为这种工作

方式,作为输出口时,数据被锁存,作为输入口时,数据不锁存。

(2) 方式 1:单向选通 I/O 方式。方式 1 在输入、输出数据时,需要发送和接收联络信

号,以保证数据可靠传送。8255 只有 A 口和 B 口可以设定为这种工作方式,此时,C 口则

作为 A 口、B 口的控制和联络信号。其中,C 口的高 4 位作为 A 口的控制联络信号,低 4

位作为 B 口的控制联络信号,这时 A、B 口的输入、输出数据均能被锁存。联络线的详细

定义参阅相关资料,这里不再详述。

(3) 方式 2:双向总线方式。这种工作方式与方式 1 类似,主要区别是方式 2 数据传送

是双向的,而方式 1 为单向,8255 只有 A 口能设置为方式 2。

3) 8255 的编程选择控制字

8255 的传输方式和工作方式的选择是通过对控制口输入控制字的方式实现的。8255

的控制字有两种:方式选择控制字和 C 口位操作控制字。

方式选择控制字为 8 位,每一位都有固定含义,用于选择每个口的工作方式和数据传

输方向,具体定义见图 7-17。

Page 122: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 7 章 AT89C51 单片机系统扩展 -115-

B组

C 4口的低 位1:输入0:输出

B口1:输入0:输出

工作方式选择0 0:方式1 1:方式

A组

C 4口的高 位1:输入0:输出

A口1:输入0:输出

工作方式选择00 0:方式01 1:方式1X 2:方式

工作方式标志1:有效

D7 D6 D5 D4 D3 D2 D1 D0

图 7-17 8255 方式选择控制字

位控制字用于对 C 口进行位操作。C 口不仅在方式 0 下具有并行数据传输功能,还可

以进行位操作。把一个置“1”或置“0”的控制字送入 8255 的控制口,就能把 C 口的某

一位置 1 或清 0 而不影响其他位的状态,位操作控制字格式见图 7-18。

置位或复位

0:复位1:置位

D7 D6 D5 D4 D3 D2 D1 D0

位选择

D3D2D1 C口

000001010011100101110111

PC0PC1PC2PC3PC4PC5PC6PC7

控制选择

0:位操作

没用

图 7-18 8255 C 口置/复位控制字

Page 123: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-116- 单片机原理及接口技术

4.AT89C51 与 8255 的接口电路

在 89C51 单片机的 I/O 口上扩展 8255 芯片,硬件连接图比较简单。在图 7-19 中,8255

的片选 CS及口地址选择线 A0、A1 分别由单片机的 P0.7、P0.0、P0.1 经地址锁存后提供,

故 8255 的 A、B、C 口及控制口的地址分别为 FF7CH、FF7DH、FF7EH、FF7FH(当然这不

是惟一的连接方法,与单片机不同的地址线相连,8255 的口地址也不会相同)。数据线直接

与单片机的数据线相连, RD 、 WR 也直接连在单片机的 RD 、 WR 端。

89C5174LS373

8255

PC0PC1PC2PC3PC4PC5PC6PC7

PB0PB1PB2PB3PB4PB5PB6PB7

PA0PA1PA2PA3PA4PA5PA6PA7

D0D1D2D3D4D5D6D7

D0D1D2D3D4D5D6D7

Q0Q1Q2Q3Q4Q5Q6Q7

G OE

ALE

WR

RD

WR

RD

RESET

A1A0P0.0

P0.1P0.2P0.3P0.4P0.5P0.6P0.7

CS

图 7-19 8255 与 AT89C51 连接图

[例 7.1] 如图 7-19 所示,用 8255 扩展单片机并行 I/O 口并读、写数据。要求 8255 工

作在方式 0,且 A 口作为输入,B 口、C 口作为输出。

分析:从图 7-19 可知,8255 的 A、B、C、控制口的地址分别为 FF7CH、FF7DH、FF7EH、

FF7FH。编程时,应先按题目要求对 8255 初始化设置每个口的工作方式,然后再使数据输

入、输出。程序如下:

MOV A,#90H ;A、B、C 口方式 0,A 口输入,B 口、C 口输出

MOV DPTR,#0FF7FH;

MOVX @DPTR,A ;方式控制字→控制寄存器

MOV DPTR,#0FF7CH

MOVX A,@DPTR ;从 A 口读取数据

MOV DPTR,#0FF7DH

MOV A,#DATA1

MOVX @DPTR,A ;将数据 DATA1 从 B 口输出

MOV DPTR,#0FF7EH

MOV A,#DATA2

MOVX @DPTR,A ;将数据 DATA2 从 C 口输出

[例 7.2] 对 C 口的位操作,把 PC5 置 1,再把 PC5 复位,程序如下:

MOV DPTR,#0FF7FH ;控制口地址→DPTR

MOV A,#0BH ;PC5 置 1 的控制字→A

Page 124: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 7 章 AT89C51 单片机系统扩展 -117-

MOVX @DPTR,A ;控制字→控制口,PC5=1

MOV A,#0AH ;PC5 复位的控制字→A

MOVX @DPTR,A ;控制字→控制口,PC5=0

7.6 实 验

1. 实验目的

(1) 学会使用 AT89C51 扩展口。

(2) 了解可编程接口芯片的各种功能,掌握各种工作方式的编程和使用方法。

2. 实验设备和器材

(1) AT89C51 开发实验设备一台。

(2) 8255A 芯片一块。

(3) 开关八个。

(4) 10 kO 与 300 kO 电阻各八个。

(5) 发光二极管八个。

(6) 连接导线若干。

3. 实验内容和步骤

1) 硬件连接

本实验用 A 口作为输入口,连接八个开关,B 口作为输出口,去点亮发光二极管。编

程实现用 A 口开关的状态(闭合、断开)去控制发光二极管的亮、灭。连接图如图 7-20 所示。

因此,各口的地址确定为:PA 为 7FFCH、PB 为 7FFDH、PC 为 7FFEH、控制口为 7FFFH。

AT89C51 8255

74LS377

D0D1D2D3D4D5D6D7

Q0Q1

OE

3233343536373839

181714138743

11

27282930

98

31323334

356

365

G

5 V+31

9281617

30

25

1

ALE

P27

EA

D0D1D2D3D4D5D6D7

A0A1

PA0

PA1

PA2

PA3

PA4

PA5

PA6

PA7

PB0

PB1

PB2

PB3

PB4

PB5

PB6

PB7

RDWR

RSET

RDWR

RSETCS

5 V+

5 V+300 Ω

Ω

图 7-20 8255 实验连接图

Page 125: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-118- 单片机原理及接口技术

2) 软件编程

(1) 要求 8255A 工作在方式 0,实现用 A 口开关的状态,控制 B 口 LED 的亮、灭。参

考程序如下:

ORG 0000H

LJMP 0030H

ORG 0030H

MOV DPTR,#7FFFH ;置控制口地址

MOV A,#90H ; A 口输入,B 口输出控制字

MOVX @DPTR,A

LP0: MOV DPTR,#7FFCH ;置 A 口地址

MOVX A,@DPTR

MOV 30H,A ;存 A 口状态值

MOV DPTR,#7FFDH ;置 B 口地址

MOV A,30H

MOVX @DPTR,A ;从 B 口输出 A 口状态

AJMP LP0

(2) 以下程序不用 A 口作为输入,与开关状态无关,要求从 B 口循环输出不同的值。

ORG 0000H

LJMP 0030H

ORG 0030H

LP0: MOV DPTR,#7FFFH

MOV A,#90H

MOVX @DPTR,A

LP1: MOV A,#7EH

LCALL LP2

MOV A,#0BDH

LCALL LP2

MOV A,#0DBH

LCALL LP2

MOV A,#0E7H

LCALL LP2

AJMP LP1

LP2: MOV DPTR,#7FFDH

MOVX @DPTR,A

LCALL DELY

RET

DELY: MOV R7,#0F0H

DL: MOV R6,#0FFH

DL1: DJNZ R6,DL1

Page 126: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 7 章 AT89C51 单片机系统扩展 -119-

DJNZ R7,DL

RET

4. 思考

(1) 编制一个对 PA 口按键次数进行计算,用 LED 显示计算结果的程序。

(2) 如果不要开关,能否使用发光二极管的电阻?会出现什么现象?

(3) 整理实验数据,写出报告,谈谈体会和建议。

习题与思考题

7.1 什么是 AT89C51 单片机的最小应用系统?

7.2 在 AT89C51 扩展系统中,程序存储器与数据存储器共用 16 位地址线和 8 位数据

线,为什么两个存储空间不会冲突?

7.3 利用一片 74LS138,用全译码方式,设计一个外部扩展 8 片 6116 的扩展电路,

写出各个芯片的地址空间。

7.4 用串行传送方式,在 AT89C51 上扩展 2 片 AT24C01A,画出硬件连接图,编程向

每片传送 100 个数据。

7.5 8255 芯片有哪几个主要部分?各部分的功能如何?

7.6 设计一个由 8255A 口输出发光二极管,B 口输入键盘数据的系统,按任意一个键,

相应的发光二极管点亮,画出原理图并编写出相关程序。

Page 127: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-120- 单片机原理及接口技术

第 8 章 AT89C51 系统接口技术

在构成一个单片机应用系统时,由于应用系统的多样性、复杂性,经常需要根据应用

系统的特定功能配置相应的外部设备,这就存在外设与单片机如何连接和处理相关信息的

问题。而这类技术问题就是通常所说的接口技术。

单片机在应用中需要面临很多不同的信号、设备和环境,如接收外部数据就有开关量、

数字量、模拟量之分,控制外设则有强电、弱电、高频设备、低频设备之分,还有应用的

环境、应用的对象等等。尽管如此,但是一般的单片机应用系统也都由一些基本的接口电

路组成。掌握了这些基本单元的接口方法,对一些特定外设的接口技术就能迎刃而解。本

章将介绍单片机应用系统中常用的一些接口技术。

8.1 键盘接口技术

在单片机应用系统中,键盘是实现人机对话的主要手段之一。为了控制系统的工作状

态,人们需要通过键盘或按键向系统输入数据或发送命令。

键盘分为编码键盘和非编码键盘两种。编码键盘本身除了按键以外,还包括产生按键

码的硬件电路。只要按下编码键盘的某一个键,就能产生这个键的代码,又称为键码,与

此同时还产生一个脉冲信号,以通知 CPU 接收键码。编码键盘的优点是使用方便,程序简

单,其缺点是使用的硬件复杂。非编码键盘的键码是靠相应的程序获取的。非编码键盘不

需要附加硬件电路,在单片机应用系统中得到了广泛的使用。下面主要介绍行列式非编码

键盘的原理与应用。

8.1.1 行列式非编码键盘的工作原理

行列式键盘又叫矩阵键盘,如图 8-1 所示,按键设置在行列的交叉点上,如用 2×2 的

行列结构可构成四个键的键盘,4×4 的行列结构可构成 16 个键的键盘。在按键数量较多

时,矩阵键盘可节省 I/O 口线。

在系统中使用非编码键盘,需要通过程序首先完成两方面功能,一个是确定按键是否

被按下,另一个是获取被操作按键的代码。为完成这两方面的功能,人们通常采用行列扫

描法,即先发送扫描字,然后读取行、列状态来判断是否有键按下并获取按键的代码(具体

过程参阅例 8.1)。

对于非编码键盘需要解决的另一个问题是消除机械抖动。在单片机应用系统中使用的

按键一般都是机械按键,它的接通与断开是通过机械触点完成的,由于机械触点的弹性作

用,在闭合和断开的瞬间会有抖动过程。按键的过程如图 8-2 所示。因此单片机接收按键

时必须消除键抖动,才能使按键的开关状态稳定可靠地输入。消除按键抖动有软件、硬件

两种方法。常用的是软件延时方法去抖动。

Page 128: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 8 章 AT89C51 系统接口技术 -121-

P1.7

P1.6

P1.5

P1.4

AT89C51

5 V+

5 V+

5.1 kΩ

Ω

图 8-1 矩阵键盘与 AT89C51 接口连接图

键按下

前沿抖动 键稳定 后沿抖动

图 8-2 键闭合及断开时的电压抖动

综上所述,对于非编码键盘,按键处理程序应具有如下四个功能:

(1) 判断键盘上有无键按下。

(2) 去除键的机械抖动。

(3) 求按下键的键码。

(4) 闭合一次,只进行一次键功能操作。

8.1.2 单片机对非编码键盘的控制方式

单片机对键盘的控制方式有查询方式、定时扫描方式和定时中断方式。在应用系统中,

单片机既要完成各项工作,又要扫描键盘来及时处理按键的功能。因此在应用中采用什么

样的控制方式和工作方式需要根据系统的实际情况来决定。

1. 查询方式

这种方式是指在单片机完成其它工作后的空余时间,调用键盘扫描子程序,来响应键

盘输入的要求,在执行键功能程序时,CPU 不再响应键输入要求。查询方式只有在 CPU

空闲时才调用键盘查询子程序,因此,在应用系统软件方案设计时,要考虑这种键盘查询

程序应能满足键盘响应要求。

[例 8.1] 用查询法按图 8-1 读取行列键盘键码,并将键码存入内部 RAM 32H 单元。

图中 P1.4~P1.7 用于控制行线,P1.0~P1.3 用于控制列线。行、列线通过上拉电阻接

+5 V,没有键按下时,被钳在高电平状态。通过发送扫描字确定键码,具体方法如下:

(1) 由列线输出 0,然后读入 P1 口的值存入内部 RAM 30H 单元。

Page 129: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-122- 单片机原理及接口技术

(2) 由行线输出 0,然后读入 P1 口的值存入内部 RAM 31H 单元。

(3) 把 30H 的低 4 位与 31H 的高 4 位的值相加存入累加器 A。

(4) 最后判断累加器 A 的值,如果累加器 A 的数据全为 1,说明无键按下,否则说明

有键按下,且累加器 A 的数据就是被按下键的键值(程序中对累加器 A 取反,目的是用 JNZ

指令判断是否有键按下)。如图中圆圈所指键的键值为 10111110B。

键扫描程序如下:

BOAD: LCALL BOADD

JNZ BOAD1 ;无键按下转 BOAD

LCALL DELAY ;调延时子程序

AJMP BOAD ;继续扫描键盘

BOAD1: LCALL DELAY ;消除键抖动(延时子程序略)

LCALL BOADD ;确认是否有键按下

JNZ BOAD2

LCALL DELAY

SJMP BOAD ;转键扫描

BOAD2: CPL A

MOV 32H,A ;取键值

BOAD3: LCALL DELAY

LCALL BOADD

JNZ BOAD3 ;等待键松开

B2: RET ;返回

;获取键值子程序

BOADD: MOV P1,#0FH ;置行线为 0

MOV A,P1

MOV 30H,A

MOV P1,#0F0H ;置列线为 0

MOV A,P1

MOV 31H,A

ANL 30H,#0FH ;取列值

MOV A,30H

ANL 31H,#0F0H ;取行值

ADD A,31H ;行值加列值

CPL A ;A 全 0 无键按下

RET

2. 定时扫描工作方式

定时扫描工作方式是利用单片机内部定时器产生定时中断,CPU 响应中断后对键盘进

行扫描,当有键按下时,转入键功能的处理程序。

定时扫描在本质上是中断方式,只不过是定时扫描键盘,以中断的方式处理键盘,它

的硬件电路与编程扫描工作方式相同。

Page 130: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 8 章 AT89C51 系统接口技术 -123-

3. 中断工作方式

单片机应用系统工作时,并不经常需要键输入。因此,无论是编程工作方式或是定时

工作方式,CPU 经常处于空扫描状态。为了进一步提高 CPU 的效率,可以采用中断扫描

工作方式,即当键盘有键按下时向系统产生中断请求,系统响应中断并对键盘进行关中断、

消除键抖动、键识别、键处理等一系列操作。

图 8-3 是 AT89C51 利用中断扫描方式实现的一个 2×8 矩阵式键盘的硬件接口电路。

16 个按键构成二行八列,二条行线分别连接 0INT (P3.2)和 1INT (P3.3)端,八条列线连接到

P1.0 ~P1.7。初始化时,先将 P1 口输出为全“0”,则在无键按下时, 0INT 和 1INT 端为

高电平,不会引起中断请求。当有任何一个键按下时, 0INT 或 1INT 端变为低电平,并向

CPU 发出中断请求,当 CPU 开放外中断时,就会响应该中断请求,进入中断服务程序。

在中断服务程序中,先关闭中断,因为在扫描 P1 口的过程中,还会引起 0INT 或 1INT 引

脚信号的变化,如不关中断可能引起混乱。然后逐一扫描 P1.0~P1.7 端线,消除抖动处理。

最后确定被按下的键并读入键值,退出中断。这样每一个按键都相当于一个外部中断源。

这种中断扫描方式也可用于类似的扩展外部中断源场合。

P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.0

AT89C51

0INT

1INT

S9

S1

S10

S2

S11

S3

S12

S4

S13

S5

S14

S6

S15

S7

S16

S8 5 V+

图 8-3 利用中断扩展 2×8 键盘电路图

通过前面的原理分析可知,完成键盘管理的程序主要有主程序和中断服务程序,主程

序主要完成初始化和键值处理任务,中断服务程序主要完成键盘扫描和键值读入任务。对

应的程序流程图如图 8-4 所示(INT1 中断流程图与 INT0 类似,略)。

程序如下:

ORG 0000H

LJMP BEGIN ;转主程序

ORG 0003H

LJMP WZD0 ;转外中断 0 程序

ORG 0013H

LJMP WZD1 ;转外中断 1 程序

BEGIN: ORG 0100H

MOV SP,#60H ;设置堆栈

MOV R1,#00H ;R1 存放键值

Page 131: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-124- 单片机原理及接口技术

SETB IT1 ;设 INT0、INT1 为边沿触发

SETB IT0

SETB EA ;开中断

SETB EX0

SETB EX1

MOV P1,#00H

键值处理程序(略)

其它主程序(略)

WZD0: PUSH PSW ;保护现场

PUSH A

CLR EX0 ;关中断 INT0

LCALL DELAY ;调延时程序去抖动

JNB P3.2,WZD01 ;再次确认是 INT0 中断吗

SETB EX0 ;不是,则恢复现场退出中断

POP A

POP PSW

RETI

WZD01: MOV A,#01H ;置 S1 键的键值为 1

MOV P1,#0FEH ;扫描 P1.0

JNB P3.2,KEYR1 ;是 S1 键则转移

INC A ;不是 S1 键,键值加 1

MOV P1,#0FDH ;扫描 P1.1,以下同 P1.0 类似

JNB P3.2,KEYR1

INC A

MOV P1,#0FBH

JNB P3.2,KEYR1

INC A

MOV P1,#0F7H

JNB P3.2,KEYR1

INC A

MOV P1,#0EFH

JNB P3.2,KEYR1

INC A

MOV P1,#0DFH

JNB P3.2,KEYR1

INC A

MOV P1,#0BFH

Page 132: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 8 章 AT89C51 系统接口技术 -125-

JNB P3.2,KEYR1

INC A

MOV P1,#7FH

JNB P3.2,KEYR1

LJMP KEYR2

KEYR1: MOV R1,A ;将键值存入 R1 中

KEYR2: CLR IE0 ;清中断标志(因扫描中可能使 IE0 置位)

SETB EX0 ;开中断 INT0

POP A ;恢复现场

POP PSW

RETI ;中断返回

WZD1: ⋯ ;外中断 1 程序与中断 0 相似(略)

DELAY: ⋯ ;延时程序(略)

开 始

SP设置堆栈

为边沿触发

设置

INT1 INT0、

开中断

键值处理等待中断

中断 INT0

保护现场

INT0关中断

? INT0 中断吗

S1 ?是 键吗

S2 ?是 键吗

S1读入 键值

S2读入 键值

S8 ?是 键吗S8读入 键值

开中断,恢复现场

中断返回

(a) (b)

Y

Y

Y

Y

N

N

N

N

图 8-4 中断方式扩展键盘流程图

(a) 主程序流程图;(b) INT0 中断服务程序流程图

Page 133: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-126- 单片机原理及接口技术

8.2 LED 显示器接口技术

在单片机应用系统中,使用的显示器主要有 LED(发光二极管)和 LCD(液晶显示器)。

这两种显示器成本低廉,配置灵活,与单片机接口方便。下面主要介绍 LED 显示器。

8.2.1 LED 显示器的结构原理

LED 显示器用发光二极管显示字段,分为共阴极和共阳极两种。图 8-5 给出了八段 LED

数码显示器的结构图和原理图。图 8-5(a)是八段共阴极 LED 显示器,它将八个发光二极管

阴极共地。当某发光二极管要点亮时,只需在该发光二极管的阳极加高电平即可。图 8-5(b)

是八段共阳极 LED 显示器,它的操作与共阴极相反。LED 显示器也有七段的,它只比八

段 LED 少一只发光二极管 DP,其它结构与八段 LED 完全相同。

dp c abdefg

dp c abdefg

5 V+

a

d

gf b

ce

g f GNDa b

e d GNDc dp

(a) (b) (c)

图 8-5 七段 LED 显示器

(a) 共阴性;(b) 共阳性;(c) 管脚配置

根据 LED 显示器的结构原理可知,通过数据线按照图 8-6 给每段提供不同的数据,LED

显示器就能组成不同的字符,我们把数据线上的数据称为“字形码。显然,不同的字符需

要不同的字形码。例如,用共阴极的数码管显示“”,数码管的 、、、、、 段送高

电平,、 段送低电平,对应的字形码数据格式就应该是 。也就是说在数

据线上送数据 ,选通的对应数码管上就可以显示数据“”。共阴极的字形码与显示字

符的对应关系如表 所示,当然共阳极的字形码根据这个原理也很容易写出来。

dp g f e d c b a

D7 D6 D5 D4 D3 D2 D1 D0

图 8-6 字形码数据格式

Page 134: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 8 章 AT89C51 系统接口技术 -127-

表 8-1 共阴极 LED 数码管字形码表

字形码 3F 06 5B 4F 66 6D 7D 07 7F 6F

显示字符 0 1 2 3 4 5 6 7 8 9

8.2.2 LED 显示器的显示方式

在实际应用中,一般都使用若干个数码管构成一个 N 位的显示器,N 位的显示器需要

两个电压才能点亮,一个是数码管公共端电压,另一个是 a~sp 各引脚的电压,引脚电压

提供的字形码控制显示器的字形,公共端电压位控制显示位的亮与灭。LED 显示器必须有

来自这两方面的控制,才能显示所需要的多种字符信息。根据这种工作原理,AT89C51 对

LED 数码管的显示控制可以分为静态和动态两种。

1.静态显示方式

在静态显示方式中,各位的共阴或共阳极连接在一起接地或接+5 V,每位的段选线(a~

dp)与一个 8 位并行口相连。如图 8-7 所示,它是一个 4 位的静态显示电路,之所以称之为

静态显示电路,是由于显示器的各位相互独立,而且各位的显示字符一经确定,相应的输

出将维持不变,直到显示另一个字符为止。由于每一位数码管段选码都用一个独立的 8 位

I/O 口控制,因此在同一时间里,每一位显示的字符可以各不相同且显示亮度较高,但当位

数较多时,因为占用的 I/O 口线较多,往往不采用静态显示方式。

I/O(1)

ba dc fe dpg

I/O(2)

ba dc fe dpg

I/O(3)

ba dc fe dpg

I/O(4)

G/VCC G/VCC G/VCC G/VCC GND/ 5 V+

ba dc fe dpg

图 8-7 4 位 LED 静态显示电路图

2. 动态方式

为了克服静态显示方式的缺点,节省 I/O 口线,人们常常使用动态显示方式。它将所

有数码管的 a、b、c、d、e、f、g、sp 引线并联在一起,由一个 8 位 I/O 口控制,而公共端

由另一个 I/O 口控制。应用时,轮流送入每个 LED 的字形码与位选码,利用人的视觉暂留

现象来显示各位的字符。图 8-8 是一个 8 位 LED 动态显示电路图,这种显示方式在现实中

用得比较广泛,该方式能稳定显示的关键在于不断循环送出的字形码和位选码要有 1~5 ms

的延时时间,且这个间隔时间不宜太长,否则会引起闪烁现象。动态显示方式的亮度不如

静态显示方式。这种巡回扫描显示器的操作需要靠程序来控制。

Page 135: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-128- 单片机原理及接口技术

ba dc fe dpg ba dc fe dpg ba dc fe dpg ba dc fe dpg ba dc fe dpg ba dc fe dpg ba dc fe dpg ba dc fe dpg

D7 D6 D5 D4 D3 D2 D1 D0

I/O(2)

I/O(1)

图 8-8 8 位 LED 动态显示电路图

[例 8.2] 根据图 8-9 编写程序显示内部 RAM 50H~57H 单元中的数据。

8255

PB7PB6PB5PB4PB3PB2PB1PB0

PA7PA6PA5PA4PA3PA2PA1PA0

WRRD

D5D4D3D2D1D0

D6D7

Q7Q6Q5Q4Q3Q2Q1Q0

D7D6D5D4D3D2D1D0

OE

WRRD

P0.5P0.4P0.3P0.2P0.1P0.0

P0.6P0.7

ALE

AT89C51

8 8 8 8 8 8 8 8

8(a,b,c,d,e,f,g,dp)

G

A1A0

CS

74

LS

37

3

图 8-9 AT89C51 与动态显示 LED 接口连接图

图 8-9 是用 8255A 对 8 位动态显示器的接口电路。图中 LED 为八段共阴数码管,A 口

输出字形码,B 口输出位选码,片选端直接接地。根据图中连接可知,8255A 的 A 口地址

为 FFFCH,B 口地址为 FFFDH,控制口地址为 FFFFH,由于 A、B 口均为输出,因此控

制字为 80H。下面是一个动态显示内部 RAM 50H~57H 单元数据的子程序。

DIR: MOV A,#10000000B ;设置 8255 的工作方式,A、B 口为输出

MOV DPTR,#0FFFFH ;8255 的命令口地址送 DPTR

MOVX @DPTR,A

MOV R0,#50H ;50H~57H 为显示缓冲区

MOV R3,#7FH ;第一位的位选码

MOV A,R3

SCAN: MOV DPTR,#0FFFDH ;指向 B 口

MOVX @DPTR,A ;位选码送 B 口

MOV A,@R0 ;取显示数据

MOV DPTR,#TAB ;取字形码表首址

MOVC A,@A+DPTR ;取字形码

MOV DPTR,#0FFFCH ;指向 A 口

Page 136: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 8 章 AT89C51 系统接口技术 -129-

MOVX @DPTR,A ;字形码送 A 口

ACALL DL1ms ;调延时 1 ms 子程序

INC R0 ;指向下一显示数据单元

MOV A,R3

JNB ACC.0,ED ;8 位显示完,退出

RR A ;指向下一位

MOV R3,A

AJMP SCAN ;继续显示下一位

ED: RET

TAB: DB 3FH,06H,5BH,4FH,66H ;共阴 0~F 的字型码表

DB 6DH,7DH,07H,7FH,6FH

DL1ms: MOV R7,#01H ;延时 1 ms 子程序

DL0: MOV R6,#0FFH

DL1: DJNZ R6,DLI

DJNZ R7,DLO

RET

8.3 A/D 转换器及接口技术

在单片机的实时测控和智能仪表等应用系统中经常需要检测连续变化的模拟量,如温

度、压力、流量、速度等,而单片机只能接收和处理离散的数字量。因此用单片机检测模

拟量就需要一种接口电路能将连续的模拟量转换成离散的数字量输入到单片机中进行处

理,从而实现模拟量变换成数字量的接口器件,称为模数(A/D)转换器。

A/D 的转换技术与原理,有关课程已经讲得很多了,本节中将重点讲述常用 A/D 转换

芯片和单片机的接口技术,这也是设计应用系统必须掌握的一个重要环节。

8.3.1 A/D 转换器概述

在大规模集成电路高速发展的今天,由于计算机控制技术在工程领域内的广泛应用,

A/D 转换器在应用系统中占据着重要的地位。为了满足各种不同的检测及控制任务的需要,

大量结构不同,性能各异的 A/D 转换电路应运而生。尽管 A/D 转换器的种类繁多,但目前

广泛使用的还是逐次比较式和双积分式。

逐次比较方法是一种采用对分搜索原理来实现 A/D 转换的方法,它转换速度快,但精

度稍差。双积分式 A/D 转换是一种间接 A/D 转换技术,它先将模拟电压转换成用计数脉冲

数表示的积分时间,然后将代表模拟输入电压大小的脉冲数转换成二进制或 BCD 码输出,

双积分方法所需时间长,转换速度一般比较慢,但它的精度高、抗干扰性好。

8.3.2 A/D 转换器的主要技术指标

A/D 转换器的主要技术指标如下:

(1) 分辨率:指对输入模拟量变化的灵敏度。习惯上用输出二进制的位数或 BCD 码位

Page 137: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-130- 单片机原理及接口技术

数表示。例如,分辨率为 12 位的二进制 A/D 转换器是指该转换器的输出数据可以用 2 的

12 次方个数进行量化,如果用百分数来表示,则其分辨率为

0.0244%100%4096

1100%

2

1100%

2

112N

=×=×=×

也就是说一个满刻度为 10 V的 12 位 A/D 转换器能够分辨输入电压变化的最小值为 2.4 mV。

(2) 转换精度:指与数字输出量所对应的模拟输入量的实际值与理论值之间的差值。

精度有绝对精度和相对精度两种表示方法。

(3) 转换速率:指能够重复进行数据转换的速度,即每秒转换的次数,而完成一次 A/D

转换所需的时间(包括稳定时间),为转换速率的倒数。

8.3.3 AT89C51 单片机与 ADC0809 接口应用

1. ADC0809 内部结构及特性

ADC0809 是 8 位逐次比较式 A/D 转换器,其内部包括 8 位 A/D 转换器,8 路模拟开关、

三态输出锁存器以及地址译码器等。它可分别对 8 路 0~5 V 模拟量输入信号进行转换。输

出量有三态锁存缓冲,可直接连到单片机的数据总线上。图 8-10 是 ADC0809 的内部结

构图。

AD0809 分辨率为 8 位,最大不可调误差小于±1 LSB(LSB 是指 A/D 输出的数字量的

最低位),单一+5 V 供电,模拟电压输入范围为 0~5 V,功耗为 15 mW,不必进行零点和

满度调整,转换时间取决于加于芯片上的时钟频率,其范围为 10~1280 kHz,当 CLK=

500 kHz 时,转换时间为 128。

8路模拟开关

地址锁存与

译码

三态输出锁存

D0(28)D1(27)D2(26)D3(25)D4(24)D5(23)D6(22)D7(21)EOC

8位A/D

转换器3

8

A

B

C

ALE

STARTCLK

VR( )-VR( )+ OE

IN7IN6IN5IN4IN3IN2IN1IN0

图 8-10 ADC0809 内部结构图

2. ADC0809 引脚功能

图 是 的引脚图,引脚功能如下: ~: 路模拟量输的入端。1~8: 位数字量输出端口,1 为最高有效位,8 为最低有效位。:启动控制输入端,加正脉冲,立即启动 转换。

Page 138: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 8 章 AT89C51 系统接口技术 -131-

IN3IN4IN5IN6IN7

STARTEOC2 5OE

CLKVCC

REF( )+GND

2 72827262524232221201918171615

1234567891011121314

IN2IN1IN0ADDAADDBADDCALE2 12 22 32 42 8REF( )-

2 6

图 8-11 ADC0809 引脚图

(4) ALE:地址锁存控制端。高电平时把 ADDA、ADDB、ADDC 的三位地址信号送

入地址锁存器,经译码后选通 IN0~IN7 中的一个通道。

(5) EOC:转换结束信号输出端。A/D 转换开始后,EOC 信号由高变低,转换结束后,

EOC 返回高电平。此信号可以作为查询的状态信号,也可作为中断申请信号。

(6) OE:输出允许控制端。当此输出端的电平由低变高时,打开三态输出锁存器,将

转换结果送到数据总线上。

(7) CLK:时钟信号输入端。

(8) REF(+)、REF(-):参考电压输入端,一般 REF(+)接 VCC,REF(-)接 GND。

(9) ADDA、ADDB、ADDC:8 位模拟开关的 3 位地址选通输入端,用来选择对应的

输入通道,其对应关系如表 8-2 所示。

(10) VCC 和 GND:电源端和接地端。

表 8-2 8 路模拟开关功能表

ADDC ADDB ADDA 输入通道

0 0 0

0 0 1

0 1 0

0 1 1

1 0 0

1 0 1

1 1 0

1 1 1

IN0

IN1

IN2

IN3

IN4

IN5

IN6

IN7

3.AT89C51 与 ADC0809 接口

ADC0809 与 AT89C51 的连接有三种方式:查询方式、中断方式和定时方式。应用时

采用什么方式,应该根据具体情况来选择。

图 8-12 为单片机 AT89C51 与 ADC0809 的硬件电路图。该连接图既可作为中断方式,

又可作为查询方式,通过软件编程,这两种方式都能够实现。该电路的工作过程为:程序

先给出通道号地址,由 ALE 正脉冲信号使 ADDA、ADDB 和 ADDC 的地址得到锁存以选

中该通道,然后执行一条“MOVX @DPTR,A”指令产生 WR 信号,经过或非门给 START

Page 139: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-132- 单片机原理及接口技术

端提供正脉冲启动 A/D 转换。由于 START、ALE 连在一起,故锁存启动同时进行,A/D

转换完后 EOC 由低变高。接着执行一条“MOVX A,@ DPTR”指令产生 RD 信号,使

OE 有效,打开锁存器将 8 位数据就读入到 CPU 中了。

74LS373

D0D1D2D3D4D5D6D7

Q0Q1Q2

P0.5P0.4P0.3P0.2P0.1P0.0

P0.6P0.7

AT89C51

ALE

P2.0

2 82 72 62 52 42 32 22 1START

ALEOE

EOC IN7IN6IN5IN4IN3IN2IN1IN0

1≥

1≥

1RD

WR

INT0

ADDAADDBADDC

GOE

CLK

REF( )+

REF( )-

GND

5 V+

ADC0809

图 8-12 AT89C51 与 ADC0809 的接口图

[例 8.3] 用查询方式分别对 8 路模拟信号轮流采样一次,并依次把结果转存到以 30H

为首址的数据存储区,程序如下:

MAIN: MOV R1,#30H ;置数据区首址

MOV DPTR,#0FFF8H ;指向 IN0

MOV R7,#08H ;置通道数

LOOP: MOVX @DPTR,A ;启动 A/D 转换

MOV R6,#05H ;软件延时

DLAY: NOP

DJNZ R6,DLAY

WAIT: JNB P3.2,WAIT ;查询 EOC 是否为高,高则转换结束

MOVX A,@DPTR ;读取转换结果

MOV @R1,A ;存取数据

INC DPTR ;指向下一个通道

INC R1 ;指向下一个存储单元

DJNZ R7,LOOP ;巡回检测八个通道

RET

[例 8.4] 利用中断方式分别对 8 路模拟信号轮流采集一次,转换结果依次存放在首址

为 30H 的片内数据区,程序如下:

ORG 0000H

AJMP MAIN

Page 140: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 8 章 AT89C51 系统接口技术 -133-

ORG 0003H

AJMP PINT1

MIAN: MOV R1,#30H ;置数据区首址

MOV DPTR,#0FEF8H ;指向 IN0

MOV R7,#08H

SETB IT0

SETB EX0 ;开中断

SETB EA

LOOP: MOVX @DPTR,A ;启动 A/D 转换

PINT1: MOVX A,@DPTR ;读取数据

MOV @R1,A ;存取数据

INC R1 ;更新存储单元

INC DPTR ;更新通道

DJNZ R7,DONE

CLR EXO ;关中断

CLR EA

RETI ;中断返回

DONE: MOVX @DPTR,A

RETI

8.3.4 AT89C51 与 MC14433 接口应用

1. MC14433 的结构及特性

MC14433 是 32

1位双积分 A/D 转换器,它具有抗干扰性能好、转换精度高、自动校零、

自动极性输出、自动量程控制信号输出、动态高位扫描 BCD 码输出、单基准电压、过量欠

量程输出标志等特点,但其转换速度慢,在不要求高速转换的场合被广泛地应用。

MC14433 具有±1/1999 的分辨率(相当于 11 位二进制数),电压量程分 1.999 V 和

199.9 mV 两挡,转换速度 3~10 次/秒,基准电压为 2 V 或 200 mV(分别对应量程为 1.999 V

或 199.9 mV),工作电压为±5 V,典型功耗为 8 mW。

MC14433 由模拟电路部分和数字电路部分组成。

它采用了字位动态扫描 BCD 码输出方式,即千、百、

十、个位的 BCD 码轮流在 Q0~Q7 端输出,同时在

DS1~DS4 端出现同步字位选通信号用来确定并控制

读取 BCD 码。

2.MC14433 引脚介绍

MC14433 的引脚如图 8-13 所示。各引脚功能

如下:

123456789101112

VAGVRVXR1

R1/C1C1

C01C02DU

CLKICLKO

VEE

242322212019181716151413

VDDQ3Q2Q1Q0DS1DS2DS3DS4OREOCVS3

图 8-13 MC14433 引脚图

Page 141: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-134- 单片机原理及接口技术

(1) VAG:被测电压 VX 和基准电压 VR 的接地端(模拟地)。

(2) VR:外接基准电压(+2 V 或+200 mV)。

(3) VX:被测电压输入端。

(4) R1,R1/C1,C1:外接积分电阻和外接积分电容端。

(5) CO1,CO2:外接失调补偿电容,典型值为 0.1。:更新输出的 转换数据结果的输入端,当 与 相连时,每次的

转换结果都被更新。,:时钟信号输入、输出端。 DD、EE:分别为正电源端接+和模拟负电源端接-。SS:数字地或系统地。 :转换周期结束标志,每当一个 转换周期结束,输出一个宽度为时钟周

期二分之一的正脉冲。:过量程标志,平时为高电平,当XR 时,为低电平。 ~:多路选通脉冲输出端, 对应千位, 对应个位,每个选通脉

冲宽度为 个时钟周期,两个相邻脉冲之间间隔 个时钟周期,其脉冲时序图见图 。

千位 百位 十位 个位 千位 百位

1/2CLK周期 16 400≈ 个时钟周期

EOC

( )DS1最高位1/2位

DS2

DS3

( )DS4最低位

Q3 Q0~

18个时钟脉冲周期

2个时钟脉冲周期

图 8-14 MC14433 选通脉冲时序图

~: 码数据输出端,其中 为最低位, 为最高位。在 、和 选通期间,分别输出三位完整的 码,即 ~ 这 个数码中的任何一个。但

在 选通期间,~ 输出除了表示千位的 或 外,还表示了正负极性及欠过量程,

其含义见表 。表 8-3 DS1 选通时 Q0~Q3 表示的输出结果

DS1 Q3 Q2 Q1 Q0 输出结果状态

1 1 × × 0 千位数为 0

1 0 × × 0 千位数为 1

1 × 1 × 0 输出结果为正值

1 × 0 × 0 输出结果为负值

1 0 × × 1 输入信号为过量程

1 1 × × 1 输入信号为欠量程

Page 142: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 8 章 AT89C51 系统接口技术 -135-

3.AT89C51 与 MC14433 的接口

由于 MC14433 的 A/D 转换结果是动态分时输出 BCD 码。Q0~Q3 和 DS1~DS4 都不

是总线式的,因此,单片机只能通过并行口或扩展并行口与其相连。图 8-15 为 AT89C51

与 MC14433 的硬件接口图。

Q0Q1Q2Q3DS1DS2DS3DS4

P1.5P1.4P1.3P1.2P1.1P1.0

P1.6P1.7

EOCDUCO1

CO2

CLKI CLKOVX

VR

VAG

C1 R1/C1 R1VDD

VEE

MC1403

1MC14433

AT89C51

1INT

0.1 µF

0.047 µF

0.02 µF

5 V+

5 V-

1V

VX

5 V+

300 kΩ

0.01 µF470 kΩ

图 8-15 AT89C51 与 MC14433 接口图

图 8-15 中,MC14433 用集成精密+2.5 V 电压基准源经电位器分压作为 A/D 转换的基

准电压。EOC 与 DU 相连,用来选择连续转换方式,每次转换结果都送至输出寄存器,并

且由 EOC 作为查询或中断方式读取转换结果的输入信号。

用 MC14433 设计的 A/D 转换电路中,在程序设计时,因为要对符号位进行位处理,

所以要将数据保存在能够进行位处理的单元。下面的程序是在中断程序中用查询方式读取

MC14433 的 BCD 码扫描输出值,并将读取的数据存在能进行位寻址的 2EH、2FH 单元,

数据存放格式如图 8-16 所示。

符号 千 百

十 个

图 8-16 数据存放格式

程序如下:

MAIN: SETB IT1 ;INT1 为边沿触发方式

MOV IE,#10000100B ;CPU 开中断,允许 INT1 中断

中断服务程序:

PINT1: MOV A,P1

JNB ACC.4,PINT1 ;等待 DS1 信号

JB ACC.0,PER ;过欠量程转 PER

Page 143: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-136- 单片机原理及接口技术

JB ACC.2,PL1 ;结果为正转 PL1

SETB 77H ;负数,符号位置 1

AJMP PL2

PL1: CLR 77H ;正数,符号位清 0

PL2: JB ACC.3,PL3 ;ACC.3=0 时,千位数为 1

SETB 74H ;千位数置 1

AJMP PL4

PL3: CLR 74H ;千位数清零

PL4: MOV A,P1

JNB ACC.5,PL4 ;等待百位 BCD 码的选通信号

MOV R0,#2EH

XCHD A,@R0 ;百位数送入 2EH 低 4 位

PL5: MOV A,P1

JNB ACC.6,PL5 ;等待十位数选通信号 DS3

SWAP A ;高低 4 位交换

INC R0 ;指向 2FH 单元

MOV @R0,A ;十位数送入 2FH

PL6: MOV A,P1

JNB ACC.7,PL6 ;等待个位数选通信号 DS4

XCHD A,@R0 ;个位数送入 2FH 低 4 位

RETI

PER: SETB 10H ;置过欠量程标志

RETI

8.4 D/A 转换器及接口技术

在单片机应用系统设计中常用模拟信号控制外部设备。如交流电机、直流电机的正/

反转、扬声器的振动等都需要用模拟量去控制。由于单片机本身只能提供数字信号,因此

在用模拟量对外设的控制电路中,需要一种接口器件把单片机提供的数字信号转换成模拟

信号。我们把能完成这种功能的器件叫 D/A 转换器。D/A 转换器的输出形式有电流型和电

压型两种。

8.4.1 D/A 转换器的主要技术指标

1. 分辨率

分辨率指最小输出电压(对应的输入数字量最低有效位为 1)与最大输出电压(对应的数

字输入量所有位全为 1)之比。

例如,对于 10 位 D/A 转换器,其分辨率为

Page 144: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 8 章 AT89C51 系统接口技术 -137-

001.01023

1

12

110

≈=−

2. 转换精度

D/A 的转换精度主要取决于 D/A 转换器的二进制位数。例如,8 位的 D/A 相对误差是

1/256,16 位的 D/A 相对误差为 1/65 536。显然,二进制位数越多精度越高。

3. 建立时间

D/A 转换器是指从数字输入端发生变化开始,到输出模拟信号电压(或模拟信号电流)

达到满刻度值 ± (1/2)LSB 时所需要的时间。不同型号的 D/A 转换器其建立时间是不同的,

一般从几毫微秒到几微秒。输出形式是电流型的建立时间一般比输出形式是电压型的

要短。

8.4.2 D/A 转换器与单片机的接口

D/A 转换器与单片机接口时,要注意 D/A 转换器是否带有数据锁存器,输出是电流型

的还是电压型的,如果是电流型的在模拟输出端还要把电流变换成输出电压。

1. 不带数据锁存器的 D/A 转换器的接口方法

对于这类 D/A 转换器与单片机的接口连接,只需在 D/A 转换器输入端外加一个锁存器

即可。MC1408 是一个不带锁存器的 8 位 D/A 转换器,图 8-17 是 MC1408 与 89C51 的接口

连线图。

从图 8-17 中可知,由于 MC1408 不带数据锁存器,所以用一片片外锁存器 74LS273

作为具有数据锁存的并行输出口,其输出端与 MC1408 的输入端相连,用 2.5 V 的 AD580

作为 D/A 的参考电压源。MC1408 的输出外接一个运放,目的是由电流型转换为电压型的

输出,用 RBP 选择输出电压的极性:若连上 RBP,输出电压是双极性的;若断开 RBP,则输

出电压是单极性的。

D7D6D5D4D3D2D1D0

P0.5P0.4P0.3P0.2P0.1P0.0

P0.6P0.7

R115 V+

RW1

15 V+15 V-

AD580

RBPR0

Vout

8Q7Q6Q5Q4Q3Q2Q1Q

8D7D6D5D4D3D2D1D

AT89C51

74LS273CLK

MC1408

GND VEE

DB7DB6DB5DB4DB3DB2DB1DB0

VREF

VREF

I0

15 V-

74LS373

Q7Q6Q5Q4Q3Q2Q1Q0

&A0

WR

图 8-17 不带数据锁存器的 D/A 转换器与 AT89C51 的连接图

根据图 8-17 中的连接方法,选通 74LS273 的口地址为 FEH,以下三条指令就能实现

Page 145: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-138- 单片机原理及接口技术

D/A 转换。

MOV A,#NN ;NN 为待转换的数字量

MOV R0,#0FEH ;送口地址

MOVX @R0,A ;输出转换数据

执行 MOVX 指令,即产生 WR 信号,将锁存在 74LS273 中的数据输出到 MC1408,

立即进行 D/A 转换。 以下程序可以产生连续的锯齿波。

MOV R0,#0FEH

MOV A,#00H ;置转换初值

LOOP: MOVX @R0,A ;启动 D/A 转换

INC A ;转换值加 1

AJMP LOOP

2. 带数据锁存器的 D/A 转换器的接口方法

DAC0832 是典型的带数据锁存器的 8 位 D/A 转换器,下面以 DAC0832 为例来介绍这

类 D/A 转换器的接口方法。

1) DAC0832 特性与结构

DAC0832 具有两个输入数据寄存器的 8 位 DAC,分辨率为 8 位,电流稳定时间 1,

可采用单缓冲、双缓冲或直接数字输入工作方式,转换结果为电流型,它能直接与 系列

单片机接口。 是单一电源供电+~+,低功耗。图 是 的

内部逻辑结构图。

DAC寄存器

Q7Q6Q5Q4Q3Q2Q1Q0

输入寄存器

D7D6D5D4D3D2D1D0

Q7Q6Q5Q4Q3Q2Q1Q0

D/A转换器

D17D16D15D14D13D12D11D10

&

1≥

1≥

ILE

Rfb

IOUT1

IOUT2

VREF

AGNDCSWRWR

XFER

LE

D7D6D5D4D3D2D1D0LE

图 8-18 DAC0832 的内部结构图

2) DAC0832 引脚功能介绍

图 8-19 是 DAC0832 的引脚图。各引脚功能

如下:

(1) DI0~DI7:数据输入线。

(2) ILE:数据锁存允许端,高电平有效。

(3) CS :输入寄存器选择信号端,低电平

有效。

(4) 1WR :输入寄存器的写选通信号端,低

12345678910

CSWR1

AGNDDI3DI2DI1

LSB DI0VREF

RfbDGND

20191817161514131211

VCCILEWR2

XFERDI4DI5DI6DI7 MSBIOUT2IOUT1

图 8-19 DAC0832 的引脚图

Page 146: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 8 章 AT89C51 系统接口技术 -139-

电平有效。

(5) 2WR :DAC 寄存器的写选通信号端,低电平有效。

(6) XFER :数据转换控制信号线,低电平有效。 (7) VREF:基准电源输入端。

(8) Rfb:反馈信号输入端(反馈电阻在芯片内部)。

(9) IOUT1、IOUT2:电流输出端。

(10) VCC:电源输入端。

(11) AGND:模拟信号地。

(12) DGND:数字信号地。

3) DAC0832 与 AT89C51 的接口

从图 8-19 可知,只有当 CS和 ILE 同时有效时,才能够通过 1WR 将数据写入输入寄存

器。当 XFER =0, 2WR =0 时,输入寄存器的内容才被锁存于 DAC 寄存器中,此时,DAC

寄存器的输出和输入寄存器的状态一致。根据 DAC0832 内部结构和控制信号的逻辑关系,

它主要有两种工作方式:一种是单缓冲工作形式,一种是双缓冲工作形式。下面对这两种

工作方式分别作以介绍。 (1) 单缓冲工作方式:在应用系统中,当只有一路模拟量输出或虽有多路模拟量但不

需要做同步输出时,就可以采用单缓冲工作方式。在这种方式下,将两级寄存器的控制信

号并接,在控制信号的作用下,将待转换的数据直接送入 DAC 寄存器中。图 8-20 为 0832

与 89C51 在单缓冲方式下的连接方法。

ALE

P0

WR

AT89C51

G74LS373

D0

D7

Q0

Q7

OE

D0

D7~

A0

A7~8

A0

5 V+

VCC ILE

RFB

IOUT1

IOUT2 +

-V0

LM324

MC1403 5 V+2.5 V

C10.1 µF

C20.47 µF

AGND

VREF

DGND

DAC08328

8

CSXFERWRWR A

图 8-20 DAC0832 单缓冲方式下的连接方法

在图 8-20 中,D/A 转换器的基准电压 VREF 取自 MC1403 的分压输出,LM324 的功能

是把电流型输出转换成单极性的电压型输出,由于 CS、 XFER 并接到地址锁存器的 A0,

所以 0832 的口地址为 FFFEH。 按照图 8-23,产生梯形波的程序如下:

START: MOV DPTR,#0FFFEH ;选中 0832

STEP: MOV R6,#20H ;置阶跃值

Page 147: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-140- 单片机原理及接口技术

MOV R4,#05H ;置阶跃次数

MOV A,#00H ;送初值

LOOP: MOVX @DPTR,A ;启动 D/A 转换

ACALL DELAY ;调延时程序

ADD A,R6 ;加阶跃值

DJNZ R4,LOOP ;重复数到否

AJMP STEP

(2) 双缓冲工作方式:双缓冲工作方式用于需要同时输出几路模拟信号的场合。此种

方式下,每一路模拟量都需要一片 DAC0832,从而构成多个 0832 同步输出系统,图 8-21

是两路模拟信号同步输出的电路连接方法。

D0

D7~

G

Q0

Q7

OE

ALE

P0

WR

D0

D7

CS

XFERWR

WR2

II Rfb

D0

D7

CS

XFERWR

WR2

II Rfb

8位

8位

A2 A1 A0

A7 A0~74LS373

DAC0832(1)

DAC0832(2)

8位

AT89C51

X

Y

A

A

图 8-21 两路模拟信号同步输出系统

在图 8-21 中,0832 的输入寄存器和 DAC 寄存器锁存信号是分开控制的。第一片 0832

的输入寄存器的地址为 FFFEH,第二片的地址为 FFFDH。因为两片的 XFER 是并接到地址

线 A2 上的,所以两片的 DAC 寄存器地址均为 FFFBH,两片 0832 的输出经电流电压转换

后,分别接到示波器的 X、Y 偏转系统的输入端。 工作时,首先将要输出的 X、Y 数据分别送入两片 0832 的输入寄存器中,然后发传送

命令,两个输入寄存器的数据被同时送入各自的 DAC 寄存器中,再由 DAC 转换电路进行

D/A 转换,示波器的输入端获得同步模拟信号。

下面是按照图 8-21 使两路模拟电压同时输出的程序清单:

MOV DPTR,#0FFFEH

MOV A,#Xdata

MOVX @DPTR,A ;Xdata 写入第一片 0832 的输入寄存器

MOV DPTR,#0FFFDH

MOV A,#Ydata

MOVX @DPTR,A ;Ydata 写入第二片 0832 的输入寄存器

Page 148: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 8 章 AT89C51 系统接口技术 -141-

MOV DPTR,#0FBH

MOV @DPTR,A ;两片 0832 的输入寄存器的数据同时送到各自的 DAC 寄存器

8.5 步进电机与单片机的接口

在工业控制实际应用中,经常需要控制机械部件做各种形式的运动。如数控机床刀架运

动,计算机软盘驱动器磁头运动等等。为了驱动这类机械运动,人们通常采用步进电机。

步进电机是一种能把输出机械位移增量和输入数字脉冲对应的驱动器件,特别适合数字类

型的控制,在要求精确定位的场合尤其如此。下面将简要介绍步进电机的工作原理,阐述

步进电机与单片机的接口方法。

8.5.1 步进电机的基本工作原理

顾名思义,步进电机的运转过程是一步一步进行的。图 8-22 是三线步进电机控制原

理图。

脉冲分配器

驱动电路

步进电机

A

B

C

步进脉冲

方向控制

图 8-22 三线步进电机控制原理图

控制电路由脉冲分配器和驱动电路组成。控制电路有两个输入信号:步进脉冲和方向

控制信号。每输入一个步进脉冲,步进电机就转过一个固定的角度(例如 3°或 1.5°),这个

角度就称为步距角。步进电机顺时针、逆时针转动方向由控制端的逻辑电平来决定。例如,

高电平顺时针转动,低电平逆时针转动。步进脉冲经脉冲分配器形成三相的步进控制信号,

并由驱动电路对步进控制信号进行功率放大以激励步进电机的三个激磁绕组,使步进电机

运转。只要连续给步进电机送步进脉冲,步进电机就会一步一步地连续旋转。输入的步进

脉冲频率越高,步进电机就旋转得越快。但是步进脉冲的最高频率是受步进电机最高工作

频率限制的,一般在几百赫兹到几万赫兹范围内。如果步进脉冲的频率超过了允许的范围,

就会引起步进电机的运行“失步”。这样会使步进电机驱动的机械位移产生很大的

误差。

8.5.2 步进电机的运行方式

在步进电机的控制电路中,脉冲分配器的任务是将输入的步进脉冲以一定的方式分配

给步进电机的 A、B、C 三相激磁绕组,即使 A、B、C 三个绕组以一定的方式通电,不同

的通电方式会得到不同的步进电机的运行方式。这里介绍两种运行方式:三相三拍运行方

式和三相六拍运行方式。

(1) 三相三拍运行方式:如果 A、B、C 三相绕组按 A→B→C→A(正转)或 A→C→B→

Page 149: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-142- 单片机原理及接口技术

A(反转)的顺序依次通电,步进电机就处在三相三拍的运行方式下。前者的通电方式顺序若

定为使步进电机正转的顺序,则后者可使电机反转。通常每一次通电使电机转过 3°,要经

过三次通电也就是三拍才完成一个通电循环,即步进电机旋转一步。

(2) 三相六拍运行方式:如果 A、B、C 三相绕组按 A→AB→B→BC→C→CA→A(正

转)或 A→AC→C→CB→B→BA→A(反转)的顺序依次通电,则电机就处于三相六拍的方式

下运行。在这种方式下,步进电机每一步转过 1.5°,所谓六拍是指要经过六次通电才完成

一个通电循环。

8.5.3 步进电机与单片机的接口

根据步进电机的控制原理,至少可以得到步进电机与单片机连接的两种方法:用硬件

实现脉冲分配功能和用软件实现脉冲分配功能。下面将分别介绍。

1. 用硬件实现脉冲分配功能

在这种方案中,脉冲分配器,驱动电路由硬件实现,单片机只提供步进脉冲和正反转

控制信号。步进脉冲的产生、停止、频率和个数都可以用软件来控制。单片机输出步进脉

冲后,再由脉冲分配器按事先确定的顺序控制各项的通断。一般情况下,硬件一旦确定下

来,步进电机的运行方式也就确定了。显然这种方式灵活性差,应用受到限制。

2. 用软件实现脉冲分配功能

采用这种方案,就是只用软件来完成脉冲分配器的工作。这种方案不仅简化了硬件系

统,降低了成本,而且可以根据系统的需要,灵活地改变步进电机的运行方式。此时,硬

件的任务主要是功率驱动。图 8-23 就是 AT89C51 控制步进电机的一种接口方案。图中 P1.0、

P1.1、P1.2 分别接步进电机的 A 相、B 相和 C 相。为了抗干扰还采用了光电耦合器。图中

为了驱动步进电机,每相接一个达林顿管。当 P1.0 输出为 1 时,光电耦合器的发光二极管

不发光,光敏三极管被截止,使担负驱动任务的达林顿管导通,A 相绕组通电;反之,当

P1.0 输出为 0 时,A 相绕组不通电,其余两相的原理同 A 相。

1

15 V+C相

1

15 V+B相

1

15 V+A相

27 V+

P1.2

P1.1

P1.0

AT89C51

图 8-23 步进电机与 AT89C51 的连接

Page 150: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 8 章 AT89C51 系统接口技术 -143-

由于步进电机驱动电路工作在较大的脉冲电流下,所以采用了光电耦合器将单片机与

步进电机的驱动电路隔开,这不仅可以避免单片机与步进电机电路的共地干扰,而且还可

以在驱动电路发生故障后,不至于让功放部分的高电压串入单片机使其损坏。

下面介绍用软件实现脉冲分配的功能。

1) 用软件实现单三相的工作方式

由于单三相的通电方式为 A→B→C→A,因此只要依次向 P1 口输出如下控制即可:

P1.2 P1.1 P1.0

(C) (B) (A)

0 0 1 (01H) A 相通电

0 1 0 (02H) B 相通电

1 0 0 (04H) C 相通电

在两个相邻控制字之间应该有一定的延时,这可以通过软件延时来实现。要求时间间

隔为 1 ms,控制电机按三相三拍正转的程序如下:

DIAN: MOV P1,#01H ;A 相通电

LCALL DELAY ;调用延时子程序

MOV P1,#02H ;B 相通电

LCALL DELAY

MOV P1,#04H ;C 相通电

DELAY: MOV R2,#64H ;延时 1 ms 子程序

DLAY: NOP

NOP

NOP

DJNE R2,DLAY

RET

控制步进电机反转的程序如下:

DAN: MOV P1,#01H ;A 相通电

LCALL DELAY

MOV P1,#04H ;C 相通电

LCALL DELAY

MOV P1,#02H ;B 相通电

2) 用软件实现三相六拍的工作方式

三相六拍的控制字为

P1.2 P1.1 P1.0

(C) (B) (A)

0 0 1 (01H) A 相通电

0 1 1 (03H) A、B 相通电

0 1 0 (02H) B 相通电

1 1 0 (06H) B、C 相通电

Page 151: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-144- 单片机原理及接口技术

1 0 0 (04H) C 相通电

1 0 1 (05H) C、A 相通电

按以上的控制方式仿造三相三拍的工作方式编程,不难编出正反转程序。

由于三相三拍运行方式可以获得较小的步距角,且运行平稳,故此种方式常被用于要

求定位精度较高的场合。从以上所述不难看出对步进电机的控制,实质上归结为对步进脉

冲个数(与定位的位置和位移的距离控制有关)和对步进脉冲之间的时间间隔(与步进电机的

转速有关)的控制。而时间间隔又可转化为对某个基准延时子程序的循环次数,因此可以用

软件很方便地控制步进电机的运行,以达到各种控制目的。

以上是对步进电机控制原理的简单介绍。在实际应用中,还会涉及到诸如如何不失步

的启动和停止步进电机等很多技术问题,这需要在实践中多了解、多体会,以解决问题。

8.6 实 验

实验 1 A/D 转换实验

1.实验目的

(1) 熟悉 AD0809 的内部结构和工作原理。

(2) 掌握 AD0809 与 AT89C51 的接口方法。

(3) 掌握实现 A/D 转换的程序设计方法。

2.实验器材

(1) AT89C51 开发实验设备一台。

(2) ADC0809 及相关逻辑器件若干。

(3) 数字电压表一块。

3.实验内容和步骤

(1) 按图 8-24 接线,由图可知,IN0 和 IN1 的口地址为 7FF0H 和 7FF1H。

P0 D0 D7~

CBA

Q2Q1Q0

D7 D0~

G

OE

1≥

1≥

1

CLK

D

Q

SD CD Q

VCC

74LS04

ALE

STARTOE

EOC

CLK

REF( )+

REF( )-

5 V+

5 V+

74LS02

74LS3738

88

AT89C51

WR

RD

P2.7

INTO

ALE

74LS7421

ADC0809

IN0

IN1

图 8-24 ADC0809 实验电路图

Page 152: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 8 章 AT89C51 系统接口技术 -145-

(2) 在 DAC0809 的模拟输入端(IN0、IN1 端)接两个 10 kO 电位器,把+5V 和地端分

别引入 IN0、IN1。经检查正确后可通电。

(3) 单片机采用查询的方法,分别对二路模拟信号轮流采样,依次显示采样值,显示

缓区地址为 79H~7EH。编好程序,运行调试,将调试通过的程序整理好并加上注释。

(4) 先把输入的模拟量调到 0 V,观察数码管是否为 00,再将输入调到+5 V,观察是

否为 FFH,运行正确以后连续输入一些电压,记录转换后的显示值。

4.思考与讨论

(1) 若将八个通道连续循环采集数据,如何编写程序?

(2) 如果采用中断方式采集数据,如何编写程序?

(3) 整理实验数据,写出报告。

实验 2 D/A 转换

1.实验目的

(1) 了解 D/A 转换的基本原理。

(2) 掌握 D/A 转换芯片 0832 的性能及编程方法。

(3) 熟悉 0832 的引脚连接。

2.实验器材

(1) AT89C51 开发实验设备一台。

(2) DAC0832 及相关器件若干。

(3) 数字万用表一台。

(4) 示波器一台。

3.实验内容和步骤

(1) 按图 8-25 接好连线,0832 口地址为 7FFFH。

(2) 编制程序。要求编制锯齿波、三角波、正弦波三种波形的程序。

(3) 用示波器探头从三极管的输出端观察波形,改变程序使其输出满意的波形。

P0.5P0.4P0.3P0.2P0.1P0.0

P0.6P0.7

VCC ILE

0832

XFER CS WR2

WR1

Vrcf

GNDIout2

Iout1

Rfb

DI7DI6DI5DI4DI3DI2DI1DI0

8283848586878889

131415164567

+-

VCC

23

1

9111210

VCC213

OUT

VCC

28

16P2.7

WR

20 19

117

VCC

AT89C51

8

图 8-25 DAC0832 实验电路图

Page 153: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-146- 单片机原理及接口技术

4.思考与讨论

(1) 在示波器上三种波形每种波形只显示两种且轮流显示的程序如何编写?

(2) 不用查表的方法产生正弦波的程序如何编写?

(3) 整理实验数据,写出报告。

习题与思考题

8.1 程序设计中,怎样识别非编码键盘上的每一个按键?

8.2 要实现多个 LED 显示,通常可采用哪些方法? 其基本原理是怎样的?

8.3 设计一个用单片机与 6 位共阴 LED 显示器的接口电路,并编程使其显示 AT89C51

六个字符。

8.4 设计一个 0809 与单片机接口的电路,使其能对 8 路模拟信号采样,并把采集到

的数据存入片外存储器 2000H 开始的单元,每路模拟信号存储 10 个数据。画出连接图,

并编写程序。

8.5 编程使 AT89C51 通过 DAC0832 输出如图 8-26 所示的波形。

(1) (2) (3) (4)

图 8-26 8.5 题波形图

Page 154: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 9 章 串行接口及串行通信技术 -147-

第 9 章 串行接口及串行通信技术

串行通信是单片机与外界进行信息交换的一种方式,它在单片机双机、多机以及单片

机与 PC 机之间通信等方面被广泛应用。本章在介绍串行通信基本知识的基础上,着重阐

述了 AT89C51 串行 I/O 接口功能、扩展及其应用。

9.1 串行通信基础知识

9.1.1 并行通信和串行通信

计算机与外界进行信息交换称为通信。通信的基本方式可分为并行通信和串行通信。

1.并行通信

并行通信是指构成信息的二进制字符的各位数据同时传送的通信方法,如图 9-1 所示。

本书前几章中介绍的并行 I/O 口 P1~P3 与外部设备之间的数据传送,单片机与外扩存储器

之间,单片机与外扩并行 I/O 口(8255)之间等的数据传送方式,都属于并行通信方式。并行

通信的主要特点是传输速度快,信息数据有多少位就需要多少条传输线,因而在短距离通

信中占有优势;但对于长距离通信来说,因信号线太多而处于劣势。

WRRD

WRRDCSD0

P2.7P0.0

P0.7 D7

微型计算机(89C51)

外设(8255)

微型计算机(89C51)

外设

TXD

RXD

RXD

TXD

发送

图 9-1 并行通信示意图 图 9-2 串行通信示意图

2.串行通信

串行通信是指构成信息的二进制字符的各位数据一位一位顺序地传送的通信方式,如

图 9-2 所示。串行通信有专用的串行 I/O 接口,无论传送信息的长短只需两条传输线来传

送。微型机输出数据又称发送,而输入数据又称接收。与并行通信相比其信息传送速度慢,

所需传输线少,因而适用于长距离传送,如网络传输等。

9.1.2 异步通信和同步通信

串行通信又分为两种基本通信方式,即异步通信和同步通信。

Page 155: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-148- 单片机原理及接口技术

1. 异步通信

在异步通信中,被传送的信息通常是一个字符代码或一个字节数据,它们都以规定的

相同传送格式(字符帧格式)一帧一帧地发送或接收。发送端和接收端各有一套彼此独立,

互不同步的通信机构,由于它们所发送和接收数据的帧格式相同,因此可以互相识别接收

到的数据信息。

字符帧格式由四部分组成:起始位,数据位,奇偶校验位和停止位,如图 9-3 所示。

下面介绍各部分的功能。

D7 0/1 D0 D1 D2 D3 D4 D5 D6 D7 0/1 D0 D11 1 1 1 0

8位数据 奇偶校验

停止位 空闲位

8位数据

n 1第 + 字符帧

起始位

奇偶校验

停止位

起始位

第 字符帧 第 - 字符帧

图 9-3 异步通信帧格式

(1) 起始位:在没有数据传送时,通信线上处于逻辑“1”状态。当发送端要发送一个

字符数据时,首先发出一个逻辑“0”信号,这个低电平就是帧格式的起始位,只占一位,

作用就是向接收端表示发送端开始发送一帧数据。接收端检测到这个低电平后,就准备接

收数据信号。

(2) 数据位:在起始位之后,发送端发出(接收端接收)的是数据位,数据的位数没有严

格限制,如 5 位、6 位、7 位或 8 位等。由低位到高位逐位传送。

(3) 奇偶校验位:数据位发送完(接收完)之后,可发送奇偶校验位,它只占帧格式的一

位,用于传送数据的有限差错检测或表示数据的一种性质,是发送和接收双方预先约定好

的一种检验(检错)方式。可以是奇校验也可以是偶校检,有时也可不用奇偶校验。

(4) 停止位:字符帧格式的最后部分为停止位,逻辑“1”电平有效,位数可以是 1 位、

1/2 位或 2 位。表示一个字符帧信息的结束,也为发送下一个字符帧信息做好准备。

在异步通信中,字符信息可以一帧一帧连续传送,也可以出现间隙,即空闲状态。空

闲时通信线处于逻辑“1”状态。

2.同步通信

串行通信中,发送设备和接收设备是相互独立、互不同步的,即接收端不知道发送端

何时发送数据或发送的两组数据之间间隔多长时间,那么发送和接收之间靠什么信息协调

从而同步工作呢?在异步通信中,是靠传送数据每个字符帧的起始位和停止位来协调同步

的,即当接收端检测到传送线上出现“0”电平时,表示发送端己开始发送,而接收端也开

始接收数据,两端协调同步工作,当接收端检测到停止位“1”时,表示一帧数据已发送和

接收完毕。这种通信中,每帧数据的起始位和停止位都占用一定的时间,在传送数据块这

种信息量大的通信中显得速度较慢。为了提高通信速度,常去掉这些标志位,而采用同步

传送,即同步通信。同步通信的特点是在每个数据块传送开始前先发送一个或两个事先约

定好的同步字符,当接收端收到同步字符并确认后,表示发送数据开始,发送和接收两端

开始协调传送数据块的具体数据字符,这其间不允许有空隙,当一个数据块传送完后,再

发送一个或两个检验字符,用于接收端对接收到的数据字符的正确性检验,并表示此次传

Page 156: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 9 章 串行接口及串行通信技术 -149-

送结束。图 9-4 表示同步通信的数据传送格式。

同步

字符

数据

字符 1

数据

字符 2 ⋯

数据字

符 n-1

数据

字符 n

校验

字符

校验

字符

图 9-4 同步通信数据传送格式

在串行通信中,无论是异步通信还是同步通信,接收和发送双方使用的字符帧格式或

同步字符必须相同,可由用户自己确定也可采用统一的标准格式。异步通信传输速度较低,

一般为 50~9600 位/秒;同步通信速度较快,一般可达 80 000 位/秒。

3.波特率

在串行通信中,发送设备和接收设备之间除了采用相同的字符帧格式(异步通信)或相

同的同步字符(同步通信)来协调同步工作外,两者之间发送数据的速度和接收数据的速度

也必须相同,这样才能保证被传送数据的成功传送。串行通信中表示这种数据传送速度的

物理量叫波特率,是指单位时间内传送的信息量,以每秒传送的位(Bit)数表示,单位为波

特,即 1 波特=1 位/秒。而每位传送时间(每位宽)Td=1/波特率。例如,电传打字机传送速

率为 10 字符/秒,每个字符 11 位,则波特率为:11 位/字符×10 字符/秒=110 位/秒=110

波特,Td=1/110=0.0091 秒。

波特率是串行通信的重要指标,对数据的成功传送至关重要。通常异步通信的波特率

的范围为 50~9600 b/s,同步通信波特率等于发送/接收时钟频率。波特率不同于发送和接

收时钟频率,常是时钟频率的 1/16 或 1/64。

9.1.3 串行通信的制式

串行通信中,信息数据在通信线路两端的通信设备之间传递,接照数据传递方向和两

端通信设备所处的工作状态,可将串行通信分为单工、半双工和全双工三种工作制式。

1.单工(Half duplex)制式

在单工方式下,通信线的 A 端只有发送

器,B 端只有接收器,信息数据只能单方向传

送,即只能由 A 端传送到 B 端而不能反传。

如图 9-5 所示。

2.半双工( Half duplex)制式

半双工方式中,通信线路两端的设备都有一个发送器和一个接收器,如图 9-6 所示。

数据可双方向传送但不能同时传送,即 A 端送 B 端收或 B 端送 A 端收,A、B 两端的发

送/接收只能通过半双工通信协议切换交替工作。

发送

接收

A端

发送

接收

B端

图 9-6 半双工方式

发送器A端

接收器B端

图 9-5 单工方式

Page 157: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-150- 单片机原理及接口技术

3.全双工(Full duplex)制式

在全双工方式下,通信线路 A、B 两端都有发送器和接收器,A、B 之间有两个独立通

信的回路,两端数据不是交替发送和接收,而是同时发送和接收。因此通信效率比前两种

要高。该方式下所需的传输线至少要有三条,一条用于发送,一条用于接收,一条用于公

用信号地,如图 9-7 所示。

A端

B端

发送

接收 发送

接收

图 9-7 全双工方式

9.1.4 串行通信数据的校验

串行通信的目的不只是传送数据信息,更关键的是要进行准确无误的传送。为此需要

对传送的数据进行检验和改正,以保证信息的准确性。常用的方法有奇偶校验、和校验、

循环冗余码校验等。

1.奇偶校验

奇偶校验的特点是按字符校验,即在数据发送时,在每一个字符的最高位之后都附加

一个奇偶校验位“1”或“0”,使被传送字符(包括奇偶校验位)中含“1”的位数都为偶数(偶

校验)或都为奇数(奇校验)。接收端按照发送端所确定的奇偶性,对接收的每一个字符进行

校验,若奇偶性一致则传输正确,若不一致则说明出了差错。

这种奇偶校验只能检测到那种影响奇偶位数的错误,比较低级,速度较慢,一般只用

在异步通信中。

2.和校验

和校验是针对数据块的校验。发送端在发送数据块时,对块中的数据算术求和,然后

将产生的单字节的算术和作为校验字符(和校验)附加到位数据块的结尾传给接收端。接收

端对收到的数据块按与发送端相同的方法求算术和,其结果与接收到的校验字符比较,若

两者相同,表示传送正确,若不同则表示传送出错。

和校验的缺点是无法检验出字节排序的错误。

3. 循环冗余码校验(CRC)

CRC 检验是对一个数据块校验一次,它被广泛地应用于同步串行通信方式中,例如对

磁盘信息的读/写,对 ROM 或 RAM 存储区的完整性的校验等。

还有海明码校验、交叉奇偶校验等其他校验方法,这里不再一一说明。

9.2 AT89C51 的串行接口

AT89C51 单片机内部有一个可编程的全双工串行通信接口,可以同时进行数据发送和

Page 158: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 9 章 串行接口及串行通信技术 -151-

接收,通过软件编程设置多种波特率和工作方式不但可实现串行异步通信,还可作为同步

移位寄存器使用。

9.2.1 串行接口的结构及功能

AT89C51 串行口的结构框图如图 9-8 所示,主要由发送器、接收器和串行控制寄存器

组成。

门电路

发送控制器

1≥

接收控制器

输入移位寄存器

发送SBUF(99H)

接收SBUF(99H)

同步时钟

串行口控制寄存器

(98H)

内部总线

串行口中断TI

RI

TXD(P3.1)

RXD(P3.0)

图 9-8 AT89C51 串行口结构框图

1.发送器和接收器

发送器主要由发送缓冲寄存器 SBUF 和发送控制器组成。发送缓冲寄存器 SBUF 用于

存放将要发出的字符数据,发送控制器用于产生发送开始命令和移位控制脉冲,使 SBUF

串行移位发送字符数据,并产生中断申请。

接收器主要由接收缓冲寄存器 SBUF,接收移位寄存器和接收控制器组成。接收缓冲

寄存器 SBUF 用于存放接收到的字符,接收控制器用于产生接收同步命令和移位脉冲,控

制接收移位寄存器移位接收串行字符。接收器这种双缓冲结构,能够避免在接收下一帧数

据之前,CPU 未能及时响应接收器中断,没有把一帧数据读走而产生两帧数据重叠的问题。

串行口的发送和接收操作都是通过特殊功能寄存器 SBUF 进行的,寻址地址都是 99H,

但在 SBUF 内部,接收 SBUF 和发送 SBUF 在物理结构上是完全独立的。如果 CPU 写 SBUF,

数据就会被送入发送寄存器准备发送。如果 CPU 读 SBUF,则读入的数据一定来自接收缓

冲器。即 CPU 对 SBUF 的读写,实际上是分别访问两个不同的寄存器。

2.串行口控制寄存器

串行口控制寄存器 SCON 用于设置串行口的工作方式、监视串行口工作状态、发送与

接收的状态控制等。它是一个既可字节寻址又可位寻址的特殊功能寄存器。其格式如图 9-9

所示。

SCON

位地址

SM0 SM1 SM2 REN TB8 RB8 TI RI

9FH 9EH 9DH 9CH 9BH 9AH 99H 98H

图 9-9 控制寄存器 SCON 的格式

Page 159: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-152- 单片机原理及接口技术

SCON 寄存器各位的功能如下:

(1) SM0、SM1:串行口工作方式选择位,可构成四种工作方式,如表 9-1 所示。

表 9-1 串行口工作方式选择

SM0 SM1 工作方式 功 能 波特率

0 0

0 1

1 0

1 1

方式 0

方式 1

方式 2

方式 3

同步移位寄存器

10 位异步收发

11 位异步收发

11 位异步收发

fosc/12

可变

fosc/64 或 fosc/32

可变

(2) SM2:在方式 2 和方式 3 中多机通信的控制位。在方式 0 中,SM2 必须设成 0。在

方式 1 中,当处于接收状态时,若 SM2=1,则只有接收到有效的停止位“1”时,RI 才被

激活成“1”(发生中断请求)。在方式 2 和方式 3 中,若 SM2=0,串行口以单机发送或接收

方式工作,TI 和 RI 以正常方式被激活并申请中断;若 SM2=1,RB8=1 时,RI 被激活并申

请中断。

(3) REN:串行接收允许位。由软件置位或清零,REN=1 时,允许接收;REN=0 时,

禁止接收。

(4) TB8:在方式 2 或方式 3 中,是将要发送的第九位数据,由软件置位或清零,它可

作为数据奇偶校验位,也可在多机通信中作为地址帧或数据帧的标志位使用。

(5) RB8:在方式 2 或方式 3 中,是已接收到的第九位数据,可作为奇偶校验位。在多

机通信中也可作为地址帧或数据帧的标志位。在方式 1 中,若 SM2=0,则 RB8 是接收到的

停止位。在方式 0 中,该位没有用。

(6) TI:发送中断标志位。方式 0 中,在发送完第 8 位数据时由硬件置位。其他方式

中,则是在发送停止位之初由硬件置位。当 TI=1 时,向 CPU 申请中断,CPU 响应中断后,

发送下一帧数据。TI 在任何方式下都必须由软件清零。

(7) RI:接收中断标志位,方式 0 中,在接收完第八位数据时由硬件置位。其他方式

中,在接收到停止位的中间时刻由硬件置位。当 RI=1 时,向 CPU 申请中断,CPU 响应中

断后取走接收到的数据,准备接收下一帧数据。RI 在任何方式中都必须由软件清零。

AT89C51 中,串行发送中断 TI 和接收中断 RI 的中断入口地址是同一个,因此在中断

程序中必须由软件查询是哪一个发出的请求,从而作出相应的处理。单片机复位时,SCON

所有位均清零。

电源控制寄存器 PCON 中的第八位也与串行口有关,如图 9-10 所示。

PCON

位地址

SMOD

图 9-10 电源控制寄存器 PCON 的格式

(8) SMOD:为波特率选择位。在工作方工 1、方式 2 和方式 3 时,若 SMOD=1,则波

特率增加一倍,SMOD=0 时,波特率不加倍。

Page 160: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 9 章 串行接口及串行通信技术 -153-

9.2.2 串行通信的工作方式

AT89C51 串行口有四种工作方式,分别是方式 0、方式 1、方式 2 和方式 3,下面分别

介绍各种方式的功能及特点。

1.工作方式 0

在方式 0 下,串行口是作为同步移位寄存器使用的。其波特率固定为单片机振荡频率

(fosc)的 1/12,串行传送数据 8 位为一帧(没有起始、停止、奇偶校验位)。由 RXD(P3.0)端

输出或输入,低位在前,高位在后。TXD(P3.1)端输出同步移位脉冲,可以作为外部扩展的

移位寄存器的移位时钟,因而串行口方式 0 常用于扩展外部并行 I/O 口。

串行发送时,外部可扩展一片(或几片)串入并出的移位寄存器,如图 9-11 所示。CPU

将一个数据写入发送缓冲寄存器 SBUF(99H)时,即启动发送。SBUF 在发送控制器的控制

下,以 fosc/12 的波特率串行移位,数据低位在前,从 RXD 端串行输出,送给外扩移位寄

存器(74LS164)的输入端,同时 TXD 输出移位脉冲使移位寄存器(74LS164)以相同速率移位。

数据由 74LS164 并行口输出,从而扩展出一个并行输出口。发送完毕置中断标志 TI 为 1,

向 CPU 申请中断,CPU 响应后用软件使 TI 清零,然后可发送下一个字符帧。

RXD

TXD

89C51

SA

SB

CLK

输出数据

移位脉冲

1

2

3

3 4 5 6 10111213

74LS164

D7D6 D0

图 9-11 方式 0 扩展并行输出口

串行接收时,外部可扩展一片(或几片)并入串出的移位寄存器,如图 9-12 所示。当由

软件使 REN 置为 1,RI=0 时,即启动串行口以方式 0 接收数据。外扩 74LS165 并行输入

数据,在 TXD 端输出移位脉冲控制下,移位输出数据给串行口 RXD 端,串行口接收器以

fosc/12 的波特率采样 RXD 端输入数据(低位在前),当接收到 8 位数据时,置中断标志 RI

为 1,并发出中断请求。CPU 查询到 RI=1 或响应中断后即可读入接收 SBUF 中的数据,并

由软件使 RI 清零,准备接收下一帧数据。这样就扩展了一个并行输入口。值得注意的是在

方式 0 下时,SM2 位必须设为 0。

输入数据

移位脉冲

图 9-12 方式 0 扩展并行输入口

2.工作方式 1

在方式 1 下,串行口工作在 10 位异步通信方式,发送或接收一帧信息中,除 8 位数据

Page 161: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-154- 单片机原理及接口技术

移位外,还包含一个起始位(0)和一个停止位(1),其波特率是可变的。

发送时,当 TI=0,并由 CPU 向发送缓冲寄存器 SBUF 写入待发送数据时,即启动串

行口发送器,同时发送控制器自动将起始位 0 和停止位 1 分别加到 8 位字符前后,发送 SBUF

在移位脉冲作用下,从 TXD 端依次发送一帧数据。发送完后自动保持 TXD 端为高电平,

同时硬件置位 TI,并发出中断申请,CPU 响应中断后,由软件使 TI 清零,则可发送下一

帧数据。

接收数据时,SCON 中的 REN 位应用软件设置为允许接收状态(REN=1),然后串行口

接收器采样 RXD 端状态,当采样到从 1 到 0 的跳变并确认是起始位为 0 后,就开始接收

数据。在移位脉冲的控制下,将接收到的数据移入输入移位寄存器中,在接收到停止位时,

接收器还必须满足两个条件:RI=0 和 SM2=0 或接收到的停止位为 1,8 位数据才能送入接

收缓冲寄存器 SBUF,停止位才能进入 RB8 位,同时置位中断标志 RI,否则,这次接收到

的数据就被舍去,造成数据丢失。RI=1 时申请中断,CPU 响应中断后读走 SBUF 中的数据,

并由软件使 RI 清零,为下一次接收数据作好准备。为了防止数据丢失,在方式 1 下,SM2

最好设定为 0。

工作方式 1 的波特率是可变的,由定时器 T1 的计数溢出率决定。相应的公式为

波特率=32

2SMOD

×定时器 T1 溢出率

式中,SMOD 是电源控制寄存器的 PCON 最高位,SMOD=1 表示波特率加倍。

定时器 T1 的计数溢出率计算公式为

定时器 T1 溢出率=值 1T2

1

12

foscK −

式中,K 为定时器 T1 的位数,与定时器 T1 的工作方式有关(见第 5 章介绍),则波特率计

算公式为

波特率=值 1T2

1

12

fosc

32

2K

SMOD

−⋅⋅

在定时器 T1 用作波特率发生器时,通常选择定时器 T1 工作在方式 2,且不允许中断

(注意:不要混淆定时器工作方式和串行口工作方式)。因为方式 2 将 TH1 和 TL1 设定为两

个 8 位重装计数器,具有自动恢复定时初值的功能。从而避免了用程序反复装入计数初值

而引起的定时误点,使波特率更加稳定。当定时器 T1 工作在方式 2 时,上式中的 K=8。

3.工作方式 2

在方式 2 下,串行口工作在 11 位异步通信方式。一帧信息包含一个起始位“0”,八个

数据位,一个可编程第九数据位和一个停止位“1”。其中可编程位是 SCON 中的 TB8 位,

在八个数据位之后,可作奇偶校验位或地址/数据帧的标志位使用,由使用者确定。方式 2

的波特率是固定的。

发送数据时,先由软件设置 TB8,然后将要发送的 8 位数据写入发送 SBUF,即启动

发送器,同时发送控制器将起始位、第九数据位和停止位自动加入到一帧信息中,并从

TXD(P3.1)端移位输出。

Page 162: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 9 章 串行接口及串行通信技术 -155-

接收数据时,方式 2 的接收过程与方式 1 的基本类同,所不同的是:方式 1 时,RB8

中存放的是停止位,方式 2 时,RB8 中存放的是第九数据位。若第九数据位设置为奇偶校

验位,则令 SM2=0,以保证串行口能可靠接收;若第九数据位设置为地址/数据帧的控制位,

则可令 SM2=1,这时当 RB8=1 时,串行口将接收发来的地址帧信息,当 RB8=0 时,串行

口将丢弃所接收的数据帧信息。

方式 2 下的波特率只有两种固定值,且与 PCON 中的 SMOD 位状态有关,即当 SMOD=0

时,波特率为 fosc/64;当 SMOD=1 时,波特率为 fosc/32。

4.工作方式 3

在方式 3 下,串行口同样工作在 11 位异步通信方式,其通信过程与方式 2 完全相同,

所不同的是波特率,方式 3 的波特率由定时器 T1 的计数溢出率决定,确定方法与工作方

式 1 中的完全一样。

方式 1 和方式 3 中的波特率与单片机晶振频率 fosc 和定时器的计数初值有关,当波特

率要求按规范取 1200、2400、4800、9600 等值时,若采用 12MHZ 或 6MHZ 晶振频率,则

按上述公式算出的定时器 T1 的计数初值不是一个整数值,取整后使 T1 产生的波特率有一

定的误差,从而影响串行通信的同步性能。解决的方法只有调整单片机的晶振频率 fosc,

为此专门生产出一种频率为 11.0592 MHz 的晶振,可使计算出的 T1 初值为整数。表 9-2 列

出了不同晶振时的常用波特率及误差。

表 9-2 常用波特率及误差

晶振频率/MHz 波特率/Hz SMOD TH1 包装初值 实际波特率 误差

12.00 9600 1 F9H 8923 7%

12.00 4800 0 F9H 4460 7%

12.00 2400 0 F3H 2404 0.16%

12.00 1200 0 E6H 1202 0.16%

11.0592 19 200 1 FDH 19 200 0

11.0592 9600 0 FDH 9600 0

11.0592 4800 0 EAH 4800 0

11.0592 2400 0 F4H 2400 0

11.0592 1200 0 E8H 1200 0

9.2.3 多机通信

AT89C51 单片机串行口工作在方式 2 或方式 3 时,可实现多机通信功能,即一台主机

和多台从机之间通信,如图 9-13 所示。下面将介绍多机通信的原理。

多机通信是靠主从机之间正确地设置多机通信控制位 SM2 和传送数据帧的第九数据

位 TB8 来实现的。通信编程前,首先要给各从机定义一个地址字节,用来区分各从机。主

机和从机之间传送的信息分地址和数据两类,以第九数据位作为区分标志,第九数据位为

“1”时表示地址,为“0”时表示数据。

当主机向从机发送信息时,主机首先发送一个地址帧,此帧数据的第九数据位 TB8 应

设置为“1”,以表示是地址帧,8 位数据位是某台从机的地址。在从机方面,为了接收信

Page 163: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-156- 单片机原理及接口技术

息,初始化时都应将 SCON 的 SM2 设置为 1,REN 设置为 1,表示允许接收。各台从机部

接收到主机发来的地址帧信息后,因第九位数据 RB8 为 1(主机发出的第九位数据为

TB8=1),且 SM2=1,则置位中断标志 RI 并申请中断,各从机响应中断后判断主机送来的

地址与本机地址是否一致,若一致,则被寻址的从机就清除其 SM2 标志(SM2=0),准备接

收即将从主机送来的数据帧,而地址不一致的其他从机仍保持 SM2=1 的状态。

TXD

RXD

89C51主机

TXD RXD

89C20511从机

TXD RXD

89C20512从机

TXD RXD

89C20513从机

图 9-13 多机通信连接图

此后主机发送数据帧,由于 TB8 被设置为 0(表示发送数据),虽然各从机都能够收到

该数据,但只有 SM2=0 的那个被寻址的从机才把数据送入 SUBF,并置位 RI=1,申请中断,

该从机响应中断后读入该数据并重置 SM2=1,清零 RI=0,准备下一次通信。其余各从机皆

因 SM2=1 和 RB8=0 而舍弃该数据,等待主机的下一次寻址。这样就实现了主从机之间的

通信。

这种通信只能在主从机之间进行,从机之间的通信需经主机作中介才能实现。经过上

面分析,多机通信的过程可总结如下:

(1) 主、从机均初始化为方式 2 或方式 3,且置 SM2=1,REN=1,串行开中断。

(2) 主机置位 TB8=1,向从机发送寻址地址帧,各从机因满足接收条件(SM2=1,

RB8=1),从而接收到主机发来的地址,并与本机地址比较。

(3) 地址一致的从机将 SM2 清零,并向主机返回地址,供主机核对,不一致的从机恢

复初始状态。

(4) 主机核对返回的地址,若与刚才发出的地址一致则准备发送数据,若不一致则返

回(1)重新开始。

(5) 主机向从机发送数据,此时主机 TB8=0,只有被选中的那台从机能接收到该数据,

其他从机则舍弃该数据。

(6) 本次通信结束后,主从机重新置 SM2=1,又可进行新一次的通信。

在实际应用中,前面这种多机通信因受单片机功能和通信距离短的限制,很少被采用。

在一些较大的测控系统中,常将单片机作为从机(下位机)直接用于被控对象的数据采集与

控制,而把 PC 机作为主机(上位机)用于数据处理和对从机的管理,它们之间的信息交换主

要是采用串行通信或总线结构。这里不再介绍。

9.3 AT89C51 串行接口的应用与编程

AT89C51 串行口的应用十分广泛,四种工作方式各有特点,可应用到不同的场合。下

Page 164: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 9 章 串行接口及串行通信技术 -157-

面通过一些应用举例来加深对串行口的理解。

9.3.1 工作方式 0 的应用

串行口工作方式 0 主要用于扩展并行 I/O 口,扩展成并行输出口时,需要外接一片 8

位串行输入并行输出的同步移位寄存器 74HC164 或 CD4094。扩展成并行输入口时,需要

外接一片或几片并行输入串行输出的同步移位寄存器 74HC165 或 CD4014。

数据的串行输出或输入可采用中断方式,也可采用查询标志位 TI、RI 的方法,在移位

初始化时,要进行相应的设置。

[例 9.1] 利用串行口工作在方式 0,外扩一片 74HC164 构成一个三位 LED 动态显示

器,并将内部 RAM 显示单元 65H、66H、67H 中的内容输出显示。如图 9-14 所示。

1

1

1

P1.0

P1.1

P1.2

RXD

TXD

89C51

74LS164

SA

SB

CLK

VCC

CLR

5 V+

图 9-14 串行动态显示图

74HC164 是一种 8 位串行输入并行输出的同步移位寄存器,SA、SB 端为串行输入端,

CLK 为移位脉冲输入端,CLR 为清零端,CLR=0 时 8 位输出清零。

根据动态显示原理,串行口工作在方式 0,扩展的一片 74HC164 的并行输出端同时接

三个共阳极 LED 的八段数码管上,某一时刻使哪位通电显示由 P1.0、P1.1、P1.2 三位输出

控制,所需显示的字符由串行口输出,一个字符串行输出是否完成通过查询方式检测。单

片机晶振选 6 MHz。

主程序如下:

ORG 0100H

STPRT: MOV SCON,#00H ;串行口初始化为方式 0

SETB P1.2 ;消去最高显示位

SETB P1.1

MOV SBUF,65H ;传送最低显示位

JNB TI,$ ;传送没结束,等待

Page 165: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-158- 单片机原理及接口技术

CLR P1.0 ;最低位显示

CLR TI ;清中断标志位

LCALL DSSJ ;调延时子程序,维持状态

SETB P1.0 ;消去最低显示位

MOV SBUF,66H ;传送中间显示位

JNB TI,$ ;等待传送结束

CLR P1.1 ;显示中间位

CLR TI ;清中断标志位

LCALL DSSJ ;调延时子程序,维持状态

SETB P1.1 ;消去中间显示位

MOV SBUF,67H ;传送最高显示位

JNB TI,$ ;等待传送结束

CLR P1.2 ;显示最高显示位

CLR TI ;清中断标志位

RET

[例 9.2] 利用串行口工作方式 0,扩展一片并行输入串行输出的移位寄存器 74LS165,

如图 9-15 所示,构成一个 8 位并行输入口,输入 8 位开关量(每一开关量代表不同功能,

如启动、停止等),并将其存入固定单元 60H 中。

P1.0

TXD

89C51

Q11

CLK

74LS165RXD

LS/

D0D1 D7

图 9-15 串行口扩展输入并行口

74LS165 为并行输入串行输出的同步移位寄存器,Q11 为串行输出端,CLK 为同步移

位脉冲输入端,S/L 为控制端,若 S/ L =0,则允许并行输入(关闭串行输出),若 S/ L =1,则

允许串行输出(并行输入关闭),此端由 P1.0 控制。 串行口工作在方式 0,且处于接收状态,则 REN 置为“1”,SCON 的控制字为 10H,

并行数据采用间隔调用子程序的方式读入,程序如下:

START: CLR P1.0 ;输入并行数据

SETB P1.0 ;允许串行移位,等待移位脉冲

MOV SCON ,#10H ;设串行口方式 0,启动接收

JNB RI,$ ;等待接收一帧数据

CLR RI ;清中断标志位

MOV A,SBUF ;读入接收数据

MOV 60H,A ;存入固定单元

RET

Page 166: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 9 章 串行接口及串行通信技术 -159-

9.3.2 工作方式 1 的应用

串行方式 1 主要用于异步双机通信,波特率由定时器 T1 产生。

[例 9.3] 利用串行口方式 1 实现一个数据块的传送,数据块存在内部 RAM 的 60H~

6FH 中,波特率选为 2400,并形成和校验数据一起发送。

串行口工作为方式 1,且处于发送的单工模式,则 SCON 控制字为 40H。方式 1 的波

特率由 T1 产生,设 T1 工作于方式 2 自动重装初值模式,晶振频率为 11.0592 MHz 时,计

数初值为 F4H。用于和校验的算术和存放在 70H 中,并在数据块的末尾传送出去。

通过上面的分析,采用查询法传送数据块的子程序如下:

MOV TMOD,#20H ;设置 T1 为工作方式 2

MOV TL1,#0F4H ;给 T1 送初值

MOV TH1,#0F4H

SETB TR1

MOV SCON,#40H ;设置串行口为工作方式 1

MOV R0,#60H ;数据块首址送 R0

MOV R1,#10H ;数据块长度送 R1

MOV 70H,#00H

DWFP: MOV A,@R0

MOV SBUF,A ;发送数据

ADD A,70H ;对和校验求和

MOV 70H,A

JNB TI,$ ;未发送完等待

CLR TI

INC R0

DJNZ R1,DWFP

MOV SBUF,A ;发送和校验

JNB TI,$

CLR TI

RET

9.3.3 工作方式 2 与工作方式 3 的应用

方式 2 和方式 3 都是 11 位异步通信方式,所不同处仅在于波特率。方式 2 的波特率只

有固定的两种,而方式 3 的波特率则可由用户设定。

[例 9.4] 利用串行口方式 2 编制一发送程序,将片内 RAM 中 60H~6FH 单元的数据

串行发送出去,第九数据位 TB8 作奇偶校验位。

根据要求,将串行口设置为方式 2、单工发送,则 SCON 控制字为 80H。波特率选为

fosc/64。采用中断方式发送的主程序和中断程序如下:

Page 167: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-160- 单片机原理及接口技术

ORG 0000H

AJMP ZCX1 ;转主程序

NOP

0RG 0023H ;串行中断程序

INC R0 ;被发送数据地址增 1

MOV A,@R0 ;取出待发数据

MOV C,PSW.0 ;将奇偶位送 TB8

MOV TB8,C

MOV SBUF,A ;发送数据

DJNZ R1,CSJS ;判断是否发送完

CLR ES ;发送完关中断

CSJS: CLR TI ;清中断标志

RETI

NOP

ZCX1: ORG 0100H ;主程序

MOV SP,#20H ;置堆栈指针

MOV SCON,#80H ;串行口设置为方式 2

MOV PCON,#00H ;波特率选为 fosc/64

MOV R0,#60H ;数据块首址送 R0

MOV R1,#10H ;数据块长度送 R1

SETB EA ;开总中断

SETB ES ;开串行口中断

MOV A,@R0 ;取出待发数据

MOV C,PSW.0 ;将奇偶位送 TB8

MOV TB8,C

MOV SBUF,A ;发送数据

SJMP ¥ ;等待中断

[例 9.5] 试编制串行口在方式 3 下接收数据块的程序。设单片机晶振为 11.0592 MHZ,

波特率为 2400 b/s,接收数据存在片内 RAM 的 40H 起始单元的一段区间内,数据块长度

由发送方先发送过来(不超过允许值),每接收一个数据都核对其奇偶校验位,正确存储数

据,否则给出出错标志。

根据要求,设 T1 工作于方式 2,当 SMOD=0 时,T1 计数初值为 F4H。采用查询法编

制的程序如下:

START: MOV TMOD,#20H ;置 T1 工作于方式 2

MOV TH1,#0F4H ;置 T1 计数初值

MOV TL1,#0F4H

SETB TR1 ;启动 T1

MOV SCON,#0D0H ;置串行口工作于方式 3 允许接收

MOV PCON,#00H ;设 SMOD=0

Page 168: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 9 章 串行接口及串行通信技术 -161-

MOV R0,#40H ;接收数据区首址送 R0

JNB RI,¥ ;等待接收数据块长度字节

CLR RI ;接收后清 RI

MOV A,SBUF ;将数据块长度读入后存入 R1 中

MOV R1,A

OR0: JNB RI,¥ ;等待接收数据

CLR RI ;接收一个字符后清 RI

MOV A,SBUF ;将接收字符读入 A

JB PSW.0,OR1 ;进行奇偶位校验

JB RB8,OR3

SJMP OR2

OR1: JNB RB8,OR3

OR2: MOV @R0,A ;校验正确存接收数据

INC R0 ;存储单元地址增 1

CLR PSW.5 ;设置正确的标志

DJNZ R1,OR0 ;没接收完继续接收

SJMP ¥ ;接收完停机

OR3: SETB PSW.5 ;置校验出错标志

SJMP ¥ ;停机

9.4 PC 机与单片机间的串行通信

单片机被越来越广泛地应用于智能仪器仪表、数据采集、嵌入式自动控制等场合,当

需要处理较复杂数据或需要对多个采集数据进行综合处理以及需要进行集散控制时,单片

机的算术运算和逻辑运算能力都显得不足,这时往往需要借助计算机系统。将单片机采集

的数据通过串行口传送给 PC 机,由 PC 机高级语言或数据库语言对数据进行处理,或者实

现 PC 机对远端单片机进行控制。因此,实现单片机与 PC 机之间的远程通信更具有实际

意义。

本章前几节中介绍了单片机之间的通信,通信中的数据信号电平是 TTL 电平,即≥2.4

V 表示逻辑 1 和≤0.5 V 表示逻辑 0,这种信号只适用于通信距离很短的场合,用于远距离

传输必然会使信号衰减和畸变。因此,在实现 PC 机与单片机之间通信或单片机与单片机

之间远距离通信时,通常采用标准串行总线通信接口,比如 RS-232C、RS-422、RS-423、

RS-485 等。在这些串行总线接口标准中,RS-232C 是由美国电子工业协会(EIA)正式公布

的,是在异步串行通信中应用最广的标准总线,它适用于短距离或带调制解调器的通信场

合。下面以 RS-232C 标准串行总线接口为例,简单介绍 PC 机与单片机之间串行通信的硬

件实现过程。

9.4.1 RS-232C 总线标准

RS-232C 总线标准定义了 25 个引脚的连接器,各信号引脚的定义如表 9-3 所示。

Page 169: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-162- 单片机原理及接口技术

表 9-3 RS-232C 信号引脚定义

引 脚 定 义(助记符) 引 脚 定 义(助记符)

1 保护地(PG) 14 辅助通道发送数据(STXD)

2 发送数据(TXD) 15 发送时钟(TXC)

3 接收数据(RXD) 16 辅助通道接收数据(SRXD)

4 请求发送(RTS) 17 接收时钟(RXC)

5 清除发送(CTS) 18 未定义

6 数据准备好(DSR) 19 辅助通道请求发送(SRTS)

7 信号地(GND) 20 数据终端准备就绪(DTR)

8 接收线路信号检测(DCD) 21 信号质量检测

9 未定义 22 音响指示(RI)

10 未定义 23 数据信号速率选择

11 未定义 24 发送时钟

12 辅助通道接收线信号检测(SDCD) 25 未定义

13 辅助通道允许发送(SCTS) 表 9-3 中定义的许多信号线是为通信业务联系或信息控制而设置的,在计算机串行通

信中主要使用以下一些信号:

(1) 数据传输信号:发送数据(TXD),接收数据(RXD)。

(2) 调制解调器控制信号:请求发送(RTS),清除发送(CTS),数据准备好(DSR),数据

终端准备就绪(DTR)。

(3) 时钟信号:发送时钟(TXC),接收时钟(RXC)。

(4) 地线:保护地(PG),信号地(GND)。

RS-232C 总线的其他标准规定如下:

(1) RS-232C 总线标准逻辑电平:+5~+15 V 表示逻辑“0”,-15~-5 V 表示逻辑

“1”,噪声容限为 2 V。

(2) 标准数据传输速率:50 b/s、75 b/s、110 b/s、300 b/s、600 b/s、1200 b/s、2400 b/s、

4800 b/s、9600 b/s、19 200 b/s。

9.4.2 RS-232C 接口电路

当 PC 机与 AT89C51 单片机通过 RS-232C 标准总线串行通信时,由于 RS-232C 信号

电平与 AT89C51 单片机信号电平不一致,因此,必须进行信号电平转换。实现这种电平转

换的电路称为 RS-232C 接口电路。其常用的方法一般有两种,一种是采用运算放大器、晶

体管、光电隔离器等器件组成的电路来实现,另一种是采用专门集成芯片(如 MC1488、

MC1489、MAX232 等)来实现。下面以 MAX232 专门集成芯片为例来介绍接口电路的实现。

1. MAX232 接口电路

MAX232 芯片是 MAXIM 公司生产的具有两路接收器和驱动器的 IC 芯片,其内部有

一个电源电压变换器,可以将输入+5 V 的电压变换成 RS-232C 输出电平所需的±12 V 电

Page 170: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 9 章 串行接口及串行通信技术 -163-

压。在其内部同时也完成 TTL 信号电平和 RS-232C 信号电平的转换。所以,采用此芯片

实现接口电路只需单一的+5 V 电源就可以了。使用特别方便。

MAX232 芯片的引脚结构如图 9-16 所示。其中管脚 1~6(C1+、V+、C1-、C2+、

C2-、V-)用于电源电压转换,只要在外部接入相应电解电容即可;管脚 7~10 和管脚 11~

14 构成两组 TTL 信号电平与 RS-232C 信号电平的转换电路,对应管脚可直接与单片机串

行口的 TTL 电平引脚和 PC 机的 RS232 电平引脚相连。具体连接可参看图 9-17。

C1+V+C1-C2+C2-V-T2outR2in

12345678

VCCGNDT1outR1in

R1outT1inT2in

R2out

161514131211109

MAX232

图 9-16 MAX232 引脚图

2.PC 机与 AT89C51 单片机串行通信电路

图 9-17 是由芯片 MAX232 实现 PC 机与 AT89C51 单片机串行通信的典型接线图。图

中外接电解电容 C1、C2、C3、C4 用于电源电压变换,提高抗干扰能力,它们可以取相同

数值电容 1.0 。电容 用于对+ 电源的噪声干扰进行滤波,其值一般为 。

选择任一组电平转换电路实现串行通信,如图中选 、 分别与 的 、

相连,、 分别与 机中 接口的 、 相连。这种发送与接收

的对应关系不能连错,否则将不能正常工作。

AT89C51

TXD

RXDGND

C1+

C1-

C2+

C2-

C1

C2

T1in T1out

R1inR1out

V-

GND

VCC

V+

MAX232

C3

C5

C4

5 V+

GND

TXD

RS232

RXD

IBM-PC

图 9-17 用 MAX232 实现串行通信接口电路图

3.PC 机与多个单片机间的串行通信

图 表示一台 机与多个单片机间的串行通信电路。这种通信系统一般为主从结

构, 机为主机,单片机为从机。主从机间的信号电平转换由 芯片实现。这种小型分布式控制系统,充分发挥了单片机体积小、功能强、抗干扰性好、面向被

控对象等优点,将单片机采集到的数据信息传送给 机。同时还利用了 机数据处理能

力强,可将多个控制对象的信息加以综合分析、处理,然后向各单片机发出控制信息,以

实现集中管理和最优控制,并能将各种数据信息显示和打印出来。

Page 171: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-164- 单片机原理及接口技术

IBM-PC

TXD

RXD

TXD RXD

AT89C51(1#)

MAX232T1out R1in

T1in R1out

TXD RXD

AT89C51(2#)

MAX232T1out R1in

T1in R1out

TXD RXD

AT89C51(3#)

MAX232T1out R1in

T1in R1out

TXD RXD

AT89C51(4#)

MAX232T1out R1in

T1in R1out

图 9-18 PC 机和多个单片机串行通信电路

习题与思考题

9.1 串行通信有几种基本通信方式?它们有什么区别?

9.2 什么是串行通信的波特率?

9.3 串行通信有哪几种制式?各有什么特点?

9.4 简述 AT89C51 串行口控制寄存器 SCON 各位的定义。

9.5 AT89C51 单片机串行通信有几种工作方式?简述它们各自的特点。

9.6 简述 AT89C51 单片机串行口在四种工作方式下波特率的产生方法。

9.7 假设异步通信接口按方式 1 传送,每分钟传送 6000 个字符,则其波特率是多少?

9.8 串行口工作在方式 1 和方式 3 时,其波特率由定时器 T1 产生,为什么常选 T1 工

作在方式 2?若已知 fosc=6 MHz,需产生的波特率为 2400 b/s,则如何计算 T1 的计数初值?

实际产生的波特率是否有误差?

9.9 说明单片机多机通信的工作原理。

9.10 试用查询法编写 AT89C51 串行口在方式 2 下的接收程序。设波特率为 fosc/32,

接收数据块长 20H,接收后存在于片内 RAM 的 40H 开始单元,采用奇偶校验,放在接收

数据的第九位上。

9.11 设计一个发送程序,将芯片内 RAM 中的 30H~3FH 单元数据从串行口输出,要

求将串行口定义为方式 3,TB8 作奇偶校验位。

9.12 PC 机与单片机间的串行通信为什么要进行电平转换?

9.13 RS-232C 总线标准逻辑电平是怎样规定的?

9.14 绘出用 MAX232 芯片实现两片 AT89C51 单片机之间远距离串行通信的接口电

路图。

Page 172: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 10 章 单片机系统的开发与应用 -165-

第 10 章 单片机系统的开发与应用

通过前几章的介绍可知,AT89C51 单片机是一种集 CPU、RAM、Flash ROM、I/O 接

口和定时中断系统于一体的微型计算机(其它型号单片机类同)。只要有外加电源和晶体振

荡器就可独立完成对数字信号的算术运算、逻辑控制、串行通信等功能。由于单片机具有

体积小、重量轻、功耗低、功能强、价格低、可靠性好等诸多优点,因而在仪器仪表、家

用电器、数据采集等一些嵌入式控制领域被广泛应用。

将单片机应用于实际,只有单片机本身是不行的,还必须根据实际需要配备相应的外

围电路和应用程序,构成以单片机为核心的应用系统——单片机系统,才能实现所需的功

能。由于不同应用场合的要求不同,因而所需的单片机系统也就不同,但这些不同单片机

系统的设计(开发)过程或方法却是相似的。本章将从具体应用的角度简单介绍单片机系统

开发研制的一般方法、开发工具及应用实例。

10.1 单片机系统的开发设计

单片机系统开发设计的具体内容一般分为硬件设计和软件设计两大部分。硬件设计是

指设计由单片机和外围扩展电路组成的完整的单片机控制系统,它是单片机系统的基础。

软件设计则是在系统硬件的基础上所编制的各种应用程序的总称,它主要完成对信息的处

理、判断以及对硬件电路的合理调配,从而使硬件电路协调工作。单片机系统中硬件和软

件必须紧密配合、协调一致,才能构成一个高性能的实用系统。单片机系统开发设计的过

程一般包括总体设计、硬件设计、软件设计、仿真调试、程序固化、单机运行等几个阶段。

10.1.1 总体设计

总体设计一般包括以下几个方面。

1. 明确设计任务和技术指标

在开始设计前,设计者必须明确单片机系统所要完成的任务、控制对象的状况及所要

达到的技术指标。然后在查阅国内外相关产品及资料的基础上,对系统所能实现的技术性

能、技术指标和可行性作出论证。在确定出合理的技术指标后,整个系统的设计开发都要

围绕着如何能达到技术指标的要求来进行。

2. 建立被控对象的数学模型

所谓被控对象的数学模型是指对被控对象的变化规律或控制过程客观真实地描述,从

而决定单片机系统需要检测哪些变量,采用怎样的控制算法等。数学模型的形式是多样的,

可以是抽象出的数学公式,可以是逻辑推理和判断,也可以是运行状态的过程模拟等。数

Page 173: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-166- 单片机原理及接口技术

学模型要精确而且简单。精确是指可提高系统的控制精度,达到技术指标的要求;简单是

指便于设计和实现。在实践中,要建立好被控对象的数学模型有时是比较困难的,特别是

一些较复杂的被控对象,不但要求设计者具有一定的理论知识,还要有丰富的实践经验和

对被控对象的了解,因而有时需要设计者深入被控对象的实际现场进行调查研究,掌握最

直接的技术数据,这样才能建立好被控对象的数学模型。建立数学模型是单片机系统设计

中的一个十分重要的环节。

3. 总体方案的设计

总体方案的设计就是根据单片机系统要实现的功能和技术指标,对单片机系统各部分

的构成进行一个总体的构想,对各部分的具体实现有一个初步的方案。以后的具体设计都

是在总体方案的指导下进行的,当然也可以根据实际情况对总体方案的局部进行必要的修

改。总体方案的确定,直接关系到单片机系统结构、性能、实施方案的优劣、系统的性能/

价格比等,因此十分重要。总体方案设计中主要考虑以下几个方面:

(1) 系统构成:指整个单片机系统由哪几部分组成,如显示、键盘、输入通道、输出

通道、打印、通信等。系统构成的复杂程度不同,所需单片机的硬件资源也就不同,所采

用的实施方案也可能不同。

(2) 单片机机型的选择:目前单片机机型很多,如本书介绍的 AT89 系列,Intel 公司的

MCS-51 和 MCS-96/98 系列等。要根据系统的复杂程度、精度、速度及可靠性的要求,选

择一种性能价格比合理的单片机,而且还要考虑市场的货源和设计者具有的开发工具以及

熟悉程度等因素。

(3) 单片机硬件/软件的功能分配:单片机的硬件和软件设计是紧密联系在一起的,而

且某些功能可用硬件实现,也可用软件实现。因此在总体方案中,应将硬件/软件所完成的

功能进行必要的合理分配,能用软件来实现的尽量采用软件。这样可简化系统硬件结构,

降低成本。

(4) 其它器件的选择:单片机系统中,除单片机外,还有许多外围电路,如输入/输出

电路、检测电路、显示电路等。这些部件的选择除了能够满足系统精度、速度和可靠性等

的要求外,还要易于实现,易于采购。

(5) 开发研制的周期:根据系统的复杂程度和实现的难易度,确定一个合理的研制进

度时间表,使设计者在规定的时间内完成设计任务。

10.1.2 硬件设计

硬件设计就是在总体方案的指导下,对构成单片机系统的所有功能部分进行详细具体

的电路设计。首先要设计出各部分硬件电路原理图,然后在面包板上搭出电路进行具体实

验(一些简单、成熟的方案可不用单独实验)。需要软件配合时,可先编一些小程序并用开

发系统进行实验,并对可靠性和精度进行检验。当把各部分都设计完成后,就可构成单片

机系统,进行联合调试,直到满足系统要求为止。最后制作成印刷电路板并装成样机。

在硬件设计和调试过程中,当按总体方案的设想满足不了要求时,可更改设计方案并

进行实验,直到满足技术指标要求为止。在硬件设计中还必须充分考虑的一项重要的技术

指标就是单片机系统的可靠性。所谓可靠性通常是指在规定条件和规定时间内完成规定功

Page 174: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 10 章 单片机系统的开发与应用 -167-

能的能力。其中规定条件一般包括环境条件(如温度、湿度、振动等)、供电条件等;规定

时间一般指连续正常运转的时间、平均无故障时间等;规定的功能就是指该单片机系统所

具有的功能。

影响单片机系统可靠性的因素很多,其中两个主要因素在硬件设计中必须加以重视:

一是单片机系统硬件电路本身工作的稳定性;二是抵抗内部和外部各种干扰的能力。干扰

一般指加在电源电压或正常工作信号电压上的无用电信号,它一般来源于电网、空间电磁

场、输入/输出通道等,它会使系统工作产生错误或故障,扰乱系统的正常运行。解决抗干

扰问题,提高系统可靠性的常用措施有以下几点:

(1) 在硬件设计和加工时应注意选用质量好的电子元件、连接器等,并进行严格的测

试和筛选。

(2) 电路设计时要注意电平匹配。如 TTL 电平中“1”电平为 2.4~5 V,“0”电平为 0~

0.4 V;而 CMOS 电平中“1”电平为 4.95~5 V,“0”电平为 0~0.05 V。因此当 COMS 器

件接受 TTL 器件输出电平信号时,其输入端要加电平转换器或上拉电阻,否则 COMS 器

件就会处于不确定的状态。

(3) 设计时要充分考虑阻抗匹配,各部分间驱动能力要留有余地。在实际应用中,若

阻抗匹配不当或驱动能力不够,将导致时序混乱,系统工作不可靠甚至无法正常工作,而

且这种不可靠有时很难确定,因此要十分重视。

(4) 在设计印刷电路板时,强、弱电要严格分开,数字地和模拟地要分开,分别与电

源端地线相连。接地线要尽量加粗,在印刷电路板的关键部位应加去耦电容。

(5) 对供电电源要采取抗干扰措施。方法是:采用带屏蔽层的电源变压器,提高系统

抗共模干扰能力;加电源低通滤波器,滤出高次谐波以改善电源波形;电源变压器的容量

应留有余地等。

(6) 对输入/输出通道采取抗干扰措施。一般方法是:模拟电路通过隔离放大器进行隔

离;数字电路通过光电耦合进行隔离;采用双绞线提高抗共模干扰的能力;采用正确的接

地技术。

10.1.3 软件设计

软件设计就是在总体设计和硬件设计的基础上,对单片机系统的应用程序进行具体设

计。它包括程序的总体结构,程序流程图,具体程序的编制以及程序的检查修改等。

1.程序的结构设计

单片机系统的硬件设计使单片机 CPU 的接口分配、接口扩展及各种外围电路与 CPU

的连接关系,都有了明确的定义。那么单片机系统软件所要完成的任务在总体设计的基础

上也被进一步明确,这时应从系统的高度考虑软件总体程序结构以及程序功能的实现方法

和手段,从而设计出一个合理的、性能优良的单片机应用系统软件。

常用的程序设计方法有两种。一种是模块化程序设计,其中心思想是将一个功能较多、

较复杂的应用程序整体,按其功能划分成若干个相对独立的程序模块,各模块可以单独进

行设计、编制、查错和调试,最后将调试好的各程序模块连成一个完整的程序。这种方法

的优点是单个程序模块的设计和调试比较方便,一个模块可以为多个程序所共享,缺点是

Page 175: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-168- 单片机原理及接口技术

各个模块之间的连接有一定的难度。另一种方法是自上向下的程序设计,即先从主程序开

始设计,然后再按顺序编制从属程序和子程序,最终完成一个复杂程序的设计。这种方法

比较符合人们的日常思维,但程序的前后互有影响,程序的整体调试难度较大。

2.程序流程图

不论采用何种程序设计方法,程序总体结构确定后,一般以程序流程框图的形式对其

进行描述。总体框图中的各子模块或各子任务也应结合具体的教学模型和算法画出较详细

的程序流程框图,供后面编写具体程序和阅读程序使用。

3.程序的编制

程序流程图绘制成后,整个程序的轮廓和思路已十分清楚,便可开始编写实用程序。

这时,应对内部 RAM 资源的分配、程序存储器地址空间的分配、工作寄存器的使用等有

个总体的安排,然后再按程序框图用汇编语言或某些高级语言(如 C 语言等)编写出单片机

的实用程序。

4.程序的检查与修改

一个实用程序编好后,往往会有许多书写、语法、指令等错误,这些错误的出现有时

是不可避免的。在上机调试前将这些错误检查出来并加以修改是十分必要的,否则将给程

序调试造成混乱。检查的方法一般是自上而下逐条进行,也可借助某些汇编软件进行查找,

直到查出全部错误为止,并加以修改。

10.1.4 系统的仿真调试与运行

系统调试包括硬件调试和软件调试,而且两者是密不可分的。我们设计好的硬件电路

和软件程序,只有经过联合调试,才能验证其正确性;软硬件的配合情况以及是否达到设

计任务的要求,也只有经过调试,才能发现问题并加以解决、完善,最终开发成实用产品。

硬件调试分单元电路调试和联机调试,单元电路试验在硬件电路设计时已经进行,这

里的调试只是将其制成印刷电路板后试验电路是否正确,并排除一些加工工艺性错误(如错

线、开路、短路等)。这种调试可单独模拟进行,也可通过开发装置由软件配合进行。硬件

联机调试则必须在系统软件的配合下进行。

软件调试一般包括分块调试和联机调试两个阶段。程序的分块调试一般在单片机开发

装置上进行,可根据所调程序功能块的入口参量或变量初值编制一个特殊的程序段,并连

同被调程序功能块一起在开发装置上运行;也可配合对应硬件电路单独运行某程序功能块,

然后检查结果是否正确,如果执行结果与预想的不一致,可以通过单步运行或设置断点的

方法,查出原因并加以改正,直到运行结果正确为止。这时该程序功能块已调试完毕,可

去掉附加程序段。其它程序功能块可按此法进行调试。程序联机调试就是将已调试好的各

程序功能块按总体结构联成一个完整程序,在所研制的硬件电路上运行。从而试验程序整

体运行的完整性、正确性和与硬件电路的配合情况。在联调中可能会有某些支路上的程序、

功能块因受条件制约而得不到相应的输入参数,这时,调试人员应创造条件进行模拟调试。

在联调中如发现硬件问题也应及时修正,直到单片机系统的软件、硬件全部调试成功为止。

系统调试完成后,还要进行一段时间的试运行,从而检验系统的稳定性和抗干扰能力,

验证系统功能是否达到设计的要求,是否达到预期的效果。

Page 176: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 10 章 单片机系统的开发与应用 -169-

全部调试、检验、修改完成后,将用户软件固化在程序存储器中,插入用户样机后,

单片机系统就可独立单机运行。至此,系统研制工作已告完成。

10.2 单片机应用系统的开发工具

通过前面的介绍可知,一个单片机应用系统的开发过程要经过许多环节才能完成,其

中软、硬件的调试以及系统的联机调试是开发过程中的一个十分重要的环节,是发现问题、

解决问题、验证性能的关键一步。而单片机本身只是一个电子元件,不具有自开发能力,

必须借助于某种工具才能完成开发过程,这种开发工具就是单片机开发系统。

10.2.1 单片机开发系统的功能

目前国内外用于单片机的开发系统很多,大都具有如下功能。

1. 在线仿真功能

在线仿真功能是通过开发系统中的在线仿真器来实现的。仿真时,在线仿真器中的单

片机资源通过仿真插座暂时出借给目标系统,且不占用目标系统单片机的任何资源,仿真

器中的存储器(包括 ROM 和 RAM)也出借给目标系统,相当于目标系统所具有的存储器。

这样,设计者在单片机开发系统上所进行的各种调试就好像对仿真插座上的目标系统进行

调试一样,实现完全的一次性仿真。单片机资源通常指 CPU、片内 RAM、片内 ROM、SFR、

定时器、中断源、I/O 接口等。

2. 调试功能

在开发系统上可对应用程序进行单步运行、断点运行、连续运行的控制,并能查询程

序运行结果和各工作寄存器的状态,给软件调试带来了极大的方便。在联机调试中还可检

查出硬件电路故障和软件错误。

3. 软件辅助设计功能

单片机开发系统都能与 PC 机连接,允许用户在 PC 机上用汇编语言或高级语言编辑程

序,并配有汇编、反汇编、子程序库等编程软件,使设计者软件研制的工作量大为减轻。

4. 程序固化功能

单片机开发系统能将调试好的应用程序汇编成目标程序的机器码,并固化到单片机自

身的 ROM 中或外部扩展的 ROM 中,使单片机系统能独立运行。

10.2.2 开发系统的类型

单片机开发系统的类型大致可分为以下几种:

(1) 通用型单片机开发系统:这是使用最普及的一类开发装置,它具有独立的仿真结

构,通过 RS-232 串行接口与 PC 机相连,配有仿真插头和 EPROM 读出/写入器。用户可

先在 PC 机上编辑、修改源程序,然后将其汇编成机器码,再传送到开发装置的仿真 RAM

中,并可实现在线仿真调试,系统状态实时显示在屏幕上。可将调试好的程序固化在

EPROM 中。

(2) 实用型开发系统:这类装置的特点是硬件按典型应用系统配置,采用模块结构,

Page 177: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-170- 单片机原理及接口技术

并配有监控程序,具有自开发能力。用户可根据需要选择相应的功能模块板(如 A/D 板、I/O

板、显示板等)组成自己的应用系统,并通过 RS-232 与 PC 相连,对用户程序也可进行编

辑、调试、修改。

(3) 通用机开发系统:这是一种在通用计算机中加开发模板的开发系统。开发模板既

可插在计算机槽中,也可以用总线联接方式放在外部。开发模板的硬件结构包含通用计算

机不可替代部分,如 EPROM 写入,CPU 仿真所必需的单片机系统等。其优点是可充分利

用通用计算机的硬、软件资源,开发效率高。

(4) 模拟开发系统:这是一种完全依靠软件手段进行开发的系统。其工作原理是利用

模拟开发软件在计算机上实现对单片机的硬件模拟、指令模拟、运行状态模拟。该系统基

本上包括了在线仿真器的单步、检查和修改功能,并且还能模拟产生各种中断和 I/O 应答

过程,从而完成应用软件的开发过程,其间不需要任何在线仿真器和目标机。这种模拟开

发系统的优点是效率高、成本低,缺点是不能进行硬件系统的诊断和实时仿真。

在单片机系统的实际开发中,设计者应选用自己较熟悉并现有的开发系统使用,这样

可提高开发效率,缩短开发周期。具体开发系统的使用方法参看使用说明即可,这里不再

过多介绍。

10.3 单片机开发系统应用实例

本节针对 AT89C51 型单片机的应用列举两个例子,以说明单片机系统的开发应用。

10.3.1 数据采集与显示电路的设计

本单片机系统可自动采集 8 路输入模拟信号,8 路输入开关故障信号。正常工作时轮

流采集和显示 8 路模拟信号的数值,显示范围为 0~255(输入为 0~5 V 时),最小分辨率为

0.02 V。当出现故障时,可以判断故障原因并显示故障信息,该系统可作为现场数字监视

仪表使用。

1.系统硬件电路的设计

图 10-1 为数据采集与显示 AT89C51 单片机系统的电路原理图。下面对各部分电路予

以说明。

1) 模拟量采集电路

8 路模拟量采集由 A/D 转换器 ADC0809 完成,它具有 8 路模拟输入端,传感器检测的

信号经模拟电路(略)转换成 0~5 V 的直流信号后送给 ADC0809,地址线(A、B、C 端)决定

对哪一路模拟输入作 A/D 转换。另外 22 脚(ALE)的地址锁存端,6 脚(START)的测试控制

端,9 脚(0E)的 A/D 转换数据允许输出控制端,分别由 AT89C51 单片机的 P2.0~P2.5 端控

制。7 脚的转换结束信号由单片机 P3.7(RD)端读入,转换数据由 P0 口读入。10 脚的时钟

输入端由单片机 ALE(30 脚)信号经 14024 二分频后得到。

2) 8 路开关故障信号检测

8 路开关量信号采用中断查询相结合的方法检测。8 路信号经两个四输入端或非门和一

个二输入端与门输入给外部中断源 0INT ,同时 8 路信号也连到 P1 口,当有任何一路发生

Page 178: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 10 章 单片机系统的开发与应用 -171-

由低到高的故障请求时,都会引起中断,然后在中断程序中查询 P1 口是由哪个故障源发出

的请求,并显示出故障信息码。 3) 显示电路

正常的模拟量显示和故障信息显示采用 4 位共阳极 LED 数码显示电路,显示内容由串

行口输出给串入并出移位寄存器 74LS164,驱动数码管显示,采用动态扫描方法逐位显示

相关内容,显示的位数由 P3.3~P3.6 口控制。

4) 其它电路

上电复位电路,外晶振电路如图 10-1 所示。

P1.0

P1.7

VCC

P0.0

P0.7

D0

D3

D7

IN0

IN3

IN7

140241 12

P2.5P2.4P2.3P2.2P2.1P2.0P3.7

OESTARTALECBAEOC

ALE CLK

VCC

V+

GND

V-

5 V

5 V

模拟输入 (0 5 V)~

ADC0809AT89C51

&

1≥

1≥

XTAL2

XTAL16MHz

30 µF

30 µF

Q0

Q6

abcdefg

abcdefg

abcdefg

abcdefg

VCCCLK

5A8H

CLE

P3.3

P3.4P3.5P3.6RSTVSS

74LS1615.1 kΩ 5.1 kΩ 5.1 kΩ 5.1 kΩ

通道号 百位 十位 个位

0INT

Ω

µ

路输入开关量

图 10-1 数据采集显示电路原理图

2.系统软件设计

系统软件由主程序、显示子程序、模拟量测量子程序和 0INT 中断服务子程序组成。

下面分别加以说明。 1) 主程序

主程序完成的功能是初始化,然后循环调用显示子程序和模拟量测量子程序,对每一

通道的模拟量进行采集并循环显示通道号和采集数据,每个通道显示时间为 1 s。这期间允

许外中断 0INT 申请中断,当 0INT 申请中断时,说明有开关量故障信号发生,这时单片机

系统终止模拟量信号的采集和显示,转到中断服务程序并显示故障信息编码。其程序流程

图如图 10-2 所示。 2) 中断服务子程序

中断服务子程序主要用于判断故障源,并显示相应的故障信息。故障信息只用数码管

的后两位表示,故障信息码是固定的,存在于固定的内存单元中。其程序流程图如图 10-3

所示。

Page 179: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-172- 单片机原理及接口技术

开 始

初始化

开中断INT0

调显示子程序

调测量子程序

开 始

关中断

是中断请求吗 ?

P1扫描 口确定中断源

显示故障信息代码

等待故障复位

中断返回Y

N

图 10-2 主程序流程图 图 10-3 中断服务程序流程图

3) 显示子程序

显示子程序功能是显示某一模拟量输入通道的通道号和对应的采集数据,而并不显示

开关量故障信息码。采用动态扫描法实现 4 位数码管的数据显示。采样所得的 A/D 转换数

据存放在 60H~67H 内存单元中,采集数据在显示时需转换成十进制 BCD 码,其个位、十

位、百位分别存放在 68H~6AH 内存单元中,对应通道号存放在 7BH 单元中。寄存器 R0

用作显示数据地址指针。动态扫描周期为 20 ms。其程序流程图如图 10-4 所示。

开 始

置通道号,数据地址初值

BCD显示数据转换成 码

20 ms置动态扫描周期

4 LED位 动态扫描一次

20 ms 到否 ?

1s 每路显示 到否 ?

1通道号,数据地址增

8 路显示完否 ?

返 回

Y

Y

Y

N

N

N

图 10-4 显示子程序流程图

Page 180: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 10 章 单片机系统的开发与应用 -173-

4) 模拟量测量子程序

模拟量测量子程序的功能是控制 A/D 转换器 0809 对 8 路模拟量输入电压信号进行 A/D

转换,并将转换数据存入 60H~67H 单元中。其程序流程图如图 10-5 所示。

开 始

启动测试

读转换结果

存入内存单元

1通道号增

8 通道数小于 ?

A/D关闭 转换

返 回

A/D 转换结束 ?N

Y

Y

N

图 10-5 测量子程序

程序如下:

ORG 0000H

AJMP INITZ ;跳至主程序

ORG 0003H ;外中断 0 中断入口地址

AJMP FLTRT ;转外中断 0 子程序

NOP

******主程序******

ORG 0052H

INITZ: CLR A

MOV P2,A ;A/D 转换准备

MOV R0,#7FH ;内存循环清零(00H~7FH)

RAMX: MOV @R0,A

DJNZ R0,RAMX

MOV TCON,A ;定时器 0 停止计数

MOV TMOD,#01H ;定时器 0 工作方式 1

MOV SCON,#00H ;串行口工作在方式 0

Page 181: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-174- 单片机原理及接口技术

MOV SP,#15H ;置堆栈指针

SETB EA ;开中断

SETB EX0 ;允许外中断 0 中断

CLR IT0 ;外中断 0 为电平触发

WAITX: LCALL CLST ;循环测量一次

LCALL XSZC ;循环显示数据一次

AJMP WAITX ;返回 WAITX 循环

******测量子程序******

CLST: CLR A

MOV R0,#60H ;测量值存放首址

MOV R7,#00H ;置初始通道号

CLST1: MOV A,R7

MOV P2,A ;输出通道地址

SETB P2.3 ;锁存通道地址

SETB P2.4 ;A/D 启动准备

NOP ;延时 2

; 启动

, ;等待转换结束

;允许 数据输出

, ;读入 转换值

, ;存入内存

;关闭 输出

;内存地址,通道号增

,, ;采集结束了吗?没有结束则采集下一个通道

, ;一次测量结束

;子程序返回

显示子程序

: , ;显示数据地址初值

, ;置通道号初值

: , ;扫描频率

, ;显示数据转换为三位 码

, ;百位 码存于 中

Page 182: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 10 章 单片机系统的开发与应用 -175-

MOV A,#10

XCH A,B

DIV AB

MOV 69H,A ;存十位 BCD 码

MOV 68H,B ;存个位 BCD 码

XSZC2: MOV TH0,#27H ;扫描周期由 T0 定时 20 ms

MOV TL0,#10H

SETB TR0 ;启动 T0

SETB P3.6 ;关闭通道号显示位

MOV A,68H ;取出各位显示数据

MOV DPTR,#MAB ;显示段码首址

MOVC A,@A+DPTR

MOV SBUF,A ;显示数据由串行口输出

JNB TI,$ ;等待传送结束

CLR P3.3 ;显示个位

CLR TI ;清除 TI

LCALL YS1 ;调延时 1 ms 子程序

SETB P3.3 ;消去个位显示

MOV A,69H ;取十位显示数据显示

MOV A,@A+DPTR

MOV SBUF,A

JNB TI,$

CLR P3.4

CLR TI

LCALL YS1

SETB P3.4

MOV A,6AH ;取百位显示数据显示

MOVC A,@A+DPTR

MOV SBUF,A

JNB TI,$

CLR P3.5

CLR TI

LCALL YS1

SETB P3.5

MOV A,6BH ;取通道号显示

MOVC A,@A+DPTR

MOV SBUF,A

JNB TI,$

CLR P3.6

Page 183: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-176- 单片机原理及接口技术

CLR TI

LCALL YS1

SETB P3.6

JNB TF0,$ ;是否到 20 ms?若不到则等待

CLR TR0 ;关闭定时器 T0

DJNZ R3,XSZC2 ;1 s 不到继续显示该通道数据

INC R0 ;显示下一个通道数据

INC 6BH

MOV A,6BH

CJNE A,#08H,XSZC1 ;八个通道显示一次吗?没有则继续

RET ;循环显示一次结束,返回

YS1: MOV R2,#0AH ;1 ms 延时子程序

YS11: MOV R6,#0CH

YS12: DJNZ R6,YS12

DJNZ R2,YS11

RET

******中断服务程序******

FLTRT: CLR EX0 ;关中断

CLR EA

JNB P3.2,FLTRT1 ;真的有中断请求吗?有,转移

JNB P3.2,FLTRT1

RETI ;没有中断,退出

FLTRT1: MOV R0,#00H ;置故障码偏移地址

CLR TR0 ;关定时器 T0

CLR TI ;清除 TI 标志

JB P1.0,DLC1 ;判断故障源

INC R0 ;改变故障码偏移地址

INC R0

JB P1.1,DLC1

INC R0

INC R0

JB P1.6,DLC1

INC R0

INC R0

DLC1: MOV A,R0 ;取出故障码偏移地址

SETB P3.5 ;关闭高两位数码管

Page 184: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 10 章 单片机系统的开发与应用 -177-

SETB P3.6

MOV TH0,#27H ;定时器 T0 定时 20 ms

MOV TL0,#10H

SETB TRO ;启动 T0

MOV DPTR,#MCD ;置故障信息段码首址

MOVC A,@A+DPTR ;取出故障信息段码低位

MOV SBUF,A ;输出故障信息段码

JNB TI,$ ;等待输出结束

CLR P3.3 ;显示故障信息低位

CLR TI

LCALL YS1 ;延时 1 ms

SETB P3.3

INC R0

MOV A,R0

MOVC A,@A+DPTR ;取出故障信息段码高位

MOV SBUF,A ;输出故障信息段码高位

JNB TI,$

CLR P3.4 ;显示故障信息段码高位

CLR TI

LCALL YS1 ;延时 1 ms

SETB P3.4

JNB TF0,$ ;等待 20 ms 结束

CLR TR0 ;关闭 T0

AJMP DLC1 ;循环显示故障信息

END

LED 数码显示管共阳段码表,分别对应 0~9。

CLR TR0 ;关闭 T0

AJMP DLC1 ;循环显示故障信息

MAB: DB 0C0H,0F9H,0A4H,0B0H ;共阳数码管段码表,分别对应 0~9

DB 99H,92H,82H,0F8H,80H,90H

MCD: DB LED 数码显示管用故障信息段码表,根据需要编制(略)

END

10.3.2 数码管数字时钟电路的设计

LED 数码管时钟电路采用 24 h 计时方式,时、分、秒采用六位数码管显示。该电路具

有显示时间、调整时间、省电状态(数码管不亮,时钟不停)三种功能,采用 AT89C51 单片

机实现。

1. 系统硬件电路的设计

单片机控制的数码管时钟电路如图 10-6 所示,它采用的是 AT89C51 单片机,只用了

Page 185: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-178- 单片机原理及接口技术

P1 口和 P2 口,P0、P3 口可用于扩展显示年、月、日等功能。为了简化硬件电路,LED 显

示采用动态扫描方式实现,P1 口输出段码数据,P2.0~P2.5 端作扫描输出控制端,P2.7 作

功能转换按键输入端。LED 采用共阳极数码管,由三极管 9012 提供驱动电流。为了提高

计时精度,所采用的晶振频率为 12 MHz。

P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.0

abcdefg

abcdefg

abcdefg

abcdefg

abcdefg

VCC

abcdefg

P2.5P2.4P2.3P2.2P2.1P2.0

P2.6

P2.7

5 V10 kΩ

按键

3.9 kΩ 3.9 kΩ 3.9 kΩ 3.9 kΩ 3.9 kΩ 3.9 kΩ

5 V

XTAL2

XTAL1

VSS

30 pF

30 pF

12MHz

RST

8.2 kΩ

10 µF5 V

P0口

P3口

5 VAT89C51

时十位 时个位 分十位 分个位 秒十位 秒个位

图 10-6 AT89C51 数字时钟电路图

2. 系统软件的设计

1) 主程序

主程序功能主要是初始化、正常显示时间和判断功能转换键。显示时间调用显示子程

序。当 P2.7 端口按键按下时,转入调时功能程序。主程序流程图如图 10-7 所示。

开 始

内存单元清零

T0 T1 16, 为 位计数器

T0允许 中断

调用显示子程序

P2.7 0 = ?

调时程序

N

Y

图 10-7 主程序流程图

Page 186: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 10 章 单片机系统的开发与应用 -179-

2) 显示子程序

数码管显示的数据存放在 50H~55H 内存单元中,其中 50H、51H 单元存放秒数据,

52H、53H 单元存放分数据,54H、55H 单元存放时数据。时间数据采用 BCD 码表示,对

应的显示用段码表存放在 ROM 中。显示时,先取出 50H~55H 某一地址中的数据,然后

从段码表中查出对应的显示用段码并从 P1 口输出,同时 P2 口将对应的数码管选中,就可

显示出相应的时间值。

3) 定时器 T0 中断服务程序

时钟的最小计时单位是秒,60 s 进位 1 min,60 min 进位 1 h。定时器 T0 用于产生最

小单位 1 s,定时时间为 50 ms,中断累计 20 次即为 1 s。计数单元中的十进制 BCD 数每逢

60 进位。程序流程图如图 10-8 所示。

开 始

保护现场

1s到否?

1秒单元加

60s 到 ?

0 1分单元清 ,时单元加

24h 到 ?

时单元清零

恢复现场

中断返回

0 1秒单元清 ,分单元加

60min 到 ?

N

N

N

N

Y

Y

Y

Y

N

N

N

图 10-8 T0 中断服务程序

4) 定时器 T1 中断服务程序

进行时间调整时,正在被调整的时间以闪烁形式表现,定时器 T1 用于产生闪烁的时

间间隔,每隔 0.3 s 闪烁一次。程序流程图略。

5) 调时功能程序

调整时间程序的方法是:按下功能键,当按下时间小于 1 s 时,进入省电状态,大于

Page 187: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-180- 单片机原理及接口技术

1 s 时,进入调分状态,等待操作,此时计时器停止走动。当再次按键时,若按键时间小于

0.5 s,则时间加 1 min;若按键时间大于 0.5 s,则进入小时调整状态。在小时调整状态下,

若按键时间小于 0.5 s,则时间加 1 h,若按键时间大于 0.5 s,则退出调整状态,时钟继续

走动。程序流程图略。

6) 延时程序

系统使用三个延时程序。因为系统是动态显示,为了确保系统在有效显示时间范围内

(约 50 ms)必须执行显示程序,所以 0.5 s 的延时程序是通过执行显示程序约 81 遍实现的。

程序如下:

ORG 0000H

AJMP MAINT ;转主程序

NOP

ORG 000BH

AJMP INT01 ;转定时器 T0 中断程序

NOP

ORG 001BH

AJMP INT11 ;转定时器 T1 中断程序

NOP

******主程序******

MAINT: MOV R0,#7FH ;00H~7FH 单元清零

CLR A

WZ1: MOV @R0,A

DJNZ R0,WZ1

MOV SP,#30H ;置堆栈指针

MOV 5AH,#0AH ;放入“熄灭符”数据

MOV TMOD,#11H ;设 T0,T1 为 16 位定时器

MOV TL0,#0B0H ;置 50 ms 定时初值

MOV TH0,#3CH

MOV TL1,#0B0H

MOV TH1,#3CH

SETB EA ;开中断

SETB ET0 ;允许 T0 中断

SETB TR0 ;启动 T0

MOV R4,#14H ;用于产生 1 s 定时

MAINT1: LCALL XSZCX ;调用显示子程序

JNB P2.7,SJTZ0 ;功能键按下,进入调时程序

SJMP MAINT1

SJTZ0: LCALL XSZCX ;通过调用显示时间程序延时消抖动

JNB P2.7,SJTZ1

SJMP MAINT1 ;功能键没有按下,显示时间

Page 188: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 10 章 单片机系统的开发与应用 -181-

SJTZ1: CLR ET0 ;关闭 T0 中断

CLR TR0 ;关闭 T0

LCALL YS1S ;调用 1 s 延时程序

JB P2.7,KMTES ;按键时间小于 1 s,进入省电状态

MOV R2,#06H ;进入调时状态,置闪烁定时初值

SETB ET1 ;允许 T1 中断

SETB TR1 ;启动 T1

XYZ2: JNB P2.7,XYZ1 ;P2.7 端为 0,等待

CLR 01H ;置调分标志位为 1

XYZ4: JB P2.7,XYZ3 ;等待键按下

LCALL YS05S ;延时 0.5 s

JNB P2.7,XYZHH ;按键时间大于 0.5 s,转到调小时状态

MOV R0,#53H ;按键时间小于 0.5 s,进入调分状态

LCALL ADD1 ;调时间加 1 子程序

MOV A,R3 ;取要调整的单元数据

CLR C

CJNE A,#60,QWE ;调整单元数据与 60 比较

JC XYZ4 ;小于 60 转到 XYZ4 循环

QWE: CLR A ;大于或等于 60,清零

MOV @R0,A

DEC R0

MOV @R0,A

CLR C

AJMP XYZ4 ;转到 XYZ4 循环

KMTES: SETB ET0 ;省电状态,开 T0 中断

SETB TR0 ;启动 T0(开时钟)

KMA: JB P2.7,$ ;无按键按下,等待

LCALL XSZCX ;通过调用显示时间程序延时消抖动

JB P2.7,KMA ;是干扰返回等待

KMA1: JNB P2.7,$ ;等待键释放

LJMP MAINT1 ;返回主程序,显示时间

XYZHH: JNB P2.7,XYZ5 ;等待键释放

SETB 01H ;置调小时标志位

XYZ6: JB P2.7,XYZ7 ;等待键按下

LCALL YS05S ;有键按下,延时 0.5 s

JNB P2.7,XYZOUT ;按下时间大于 0.5 s,退出调整状态

MOV R0,#55H ;小于 0.5 s,调整小时

LCALL ADD1 ;调加 1 子程序

MOV A,R3

Page 189: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-182- 单片机原理及接口技术

CLR C

CJNE A,#24,KMB1 ;计时单元与 24 比较

JC XYZ6, ;小于 24 转 XYZ6 循环

KMB1: CLR A ;大于或等于 24,则清零

MOV @R,A

DEC R0

MOV @R0,A

AJMP XYZ6 ;转 XYZ6 循环

XYZOUT: JNB P2.7,XYZOUT1 ;退出调时状态,等待键释放

LCALL XSZCX ;通过调用显示程序延时消抖动

JNB P2.7,XYZOUT ;是抖动,返回 XYZOUT 等待

MOV 20H,#00H ;清调时标志位

CLR TR1 ;关闭 T1

CLR ET1 ;关 T1 中断

SETB TR0 ;启动 T0

SETB ET0 ;开 T0 中断

LJMP MAINT1 ;返回主程序

XYZ1: LCALL XSZCX ;键释放等待时,调用显示子程序

AJMP XYZ2 ;防止此时无时钟显示

XYZ3: LCALL XSZCX

AJMP XYZ4

XYZ5: LCALL XSZCX

AJMP XYZHH

XYZ7: LCALL XSZCX

AJMP XYZ6

XYZOUT1: LCALL XSZCX

AJMP XYZOUT

******显示子程序******

XSZCX: MOV R1,#50H ;显示数据首址

MOV R5,#0FEH ;扫描控制字初值

MAXY: MOV A,R5 ;扫描控制字送 A

MOV P2,A ;输出扫描控制字

MOV A,@R1 ;取显示数据

MOV DPTR,#ABC ;取段码表首地址

MOVC A,@A+DPTR ;取对应段码

MOV P1,A ;P1 口输出段码

LCALL YS1MS ;延时 1 ms

Page 190: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 10 章 单片机系统的开发与应用 -183-

INC R1 ;显示地址增 1

MOV A,R5 ;扫描控制字送 A

JNB ACC.5,ENDOUT ;ACC.5 为 0 时一次显示结束

RL A ;控制字左移

MOV R5,A ;制字送回 R5 中

AJMP MAXY ;循环显示下一个数据

ENDOUT: MOV P2,#0FFH ;一次显示结束,P2 口复位

MOV P1,#0FFH ;P1 口复位

RET ;子程序返回

******T0 中断服务程序******

INT01: PUSH ACC ;保护现场

PUSH PSW

CLR ET0 ;关 T0 中断

CLR TR0 ;关定时器 T0

MOV A,#0B7H ;修正中断响应时间

ADD A,TL0

MOV TL0,A

MOV A,#3CH

ADDC A,TH0

SETB TR0 ;启动定时器 T0

DJNZ R4,INT0U ;20 次中断未到退出中断

AD1: MOV R4,#14H ;R4 重新赋值

MOV R0,#51H ;指向秒计时单元(50H,51H)

LCALL ADD1 ;调用加 1 s 程序

MOV A,R3 ;秒数据放入 A

CLR C ;清进位标志

CJNE A,#60,AD2 ;小于 60 s 吗

JC INT0U ;小于 60 s 退出中断

AD2: CLR A ;大于或等于 60 s,清秒计数单元

MOV @R0,A

DEC R0

MOV @R0,A

MOV R0,#57H ;指向分计时单元(56H,57H)

ACALL ADD1 ;调用加 1 min 程序

MOV A,R3 ;分数据放入 A

CLR C

CJNE A,#60,AD3 ;小于 60 min 吗

Page 191: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-184- 单片机原理及接口技术

JC INT0U ;小于 60 min 退出中断

AD3: CLR A ;大于或等于 60 min,清分计数单元

MOV @R0,A

DEC R0

MOV @R0,A

MOV R0,#59H ;指向小时计时单元(58H,59H)

ACALL ADD1 ;调用加 1 h 程序

MOV A,R3 ;小时数据放入 A

CLR C

CJNE A,#24,AD4 ;小于 24 h 吗

JC INT0U ;小于 24 h 退出中断

AD4: CLR A ;大于或等于 24 h 清小时计数单元

MOV @R0,A

DEC R0

MOV @R0,A

INT0U: MOV 52H,56H ;中断退出时将分、时计时单元数据

MOV 53H,57H ;移入对应显示单元

MOV 54H,58H

MOV 55H,59H

POP PSW ;恢复现场

POP ACC

SETB ET0 ;开放 T0 中断

RETI ;中断返回

****** T1 中断服务程序******

INT11: PUSH ACC ;保护现场

PUSH PSW

MOV TL1,#0B0H ;装定时器 T1 初值

MOV TH1,#3CH

DJNZ R2,INT1U ;0.3 s 未到退出中断

MOV R2,#06H ;重装 0.3 s 定时用初值

CPL 02H ;0.3 s 定时到,对闪烁标志取反

JB 02H,CCC1 ;02H 位为 1 时显示单元“熄灭”

MOV 52H,56H ;02H 位为 0 时显示正常

MOV 53H,57H

MOV 54H,58H

MOV 55H,59H

INT1U: POP PSW ;恢复现场

POP ACC

Page 192: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

第 10 章 单片机系统的开发与应用 -185-

RETI ;退出中断

CCC1: JB 01H,CCC2 ;01H 位为 1 时转小时熄灭控制

MOV 52H,5AH ;01H 位为 0 时“熄灭符”放入分计时单元

MOV 53H,5AH

MOV 54H,58H

MOV 55H,59H

AJMP INT1U ;转中断退出

CCC2: MOV 52H,56H ;01H 位为 1 时“熄灭符”放入小时计时单元

MOV 53H,57H

MOV 54H,5AH

MOV 55H,5AH

AJMP INT1U ;转中断退出

ADD1: MOV A,@R0 ;取出现计时数据放入 A

DEC R0 ;指向前一单元

SWAP A ;A 中高 4 位与低 4 位互换

ORL A,@R0 ;前一单元中数据放入 A 中低 4 位

ADD A,#01H ;A 加 1

DA A ;十进制调整

MOV R3,A ;移入 R3 寄存器

ANL A,#0FH ;高 4 位变 0

MOV @R0,A ;放回前一地址单元

MOV A,R3 ;取回 R3 中暂存数据

INC R0 ;指向当前地址单元

SWAP A ;A 中高 4 位与低 4 位互换

ANL A,#0FH ;高 4 位变 0

MOV @R0,A ;数据存入当前地址单元

RET ;子程序返回

******延时子程序******

YS1MS: MOV R6,#14H ;延时 1 ms 子程序

YS1: MOV R7,#19H

YS2: DJNZ R7,YS2

DJNZ R6,YS1

RET

YS1S: LCALL YS05S ;延时 1 s 子程序

LCALL YS05S

RET

YS05S: MOV R3,#51H ;延时 0.5 s 子程序

Page 193: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-186- 单片机原理及接口技术

YS05S1: LCALL XSZCX

DJNZ R3,YS05S1

RET

ABC: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH

END

习题与思考题

10.1 在单片机系统设计中,硬件和软件的设计一般包括哪些内容?

10.2 在硬件设计中如何提高系统的可靠性?

10.3 单片机开发系统都有哪些功能?

10.4 设计一个节日彩灯循环闪烁的应用系统。

10.5 对于图 10-6 所示的电路,若要求在此基础上增加显示年、月、日的功能,应如

何设计?

10.6 设计一个交通灯控制系统,此系统要求具有显示秒倒计时功能,每当还差 10 s

应换指示灯时,该指示灯变为闪烁点亮。

Page 194: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

附录 ASCII 码字符表 -187-

附录 ASCII 码字符表

二 进 制 十六进制 字 符 二 进 制 十六进制 字 符

0000000 00 NUL 1000000 40 @

0000001 01 SOH 1000001 41 A

0000010 02 STX 1000010 42 B

0000011 03 ETX 1000011 43 C

0000100 04 EOT 1000100 44 D

0000101 05 ENQ 1000101 45 E

0000110 06 ACK 1000110 46 F

0000111 07 BEL 1000111 47 G

0001000 08 BS 1001000 48 H

0001001 09 HT 1001001 49 I

0001010 0A LF 1001010 4A J

0001011 0B VT 1001011 4B K

0001100 0C FF 1001100 4C L

0001101 0D CR 1001101 4D M

0001110 0E SO 1001110 4E N

0001111 0F SI 1001111 4F O

0010000 10 DLE 1010000 50 P

0010001 11 DC1 1010001 51 Q

0010010 12 DC2 1010010 52 R

0010011 13 DC3 1010011 53 S

0010100 14 DC4 1010100 54 T

0010101 15 NAK 1010101 55 U

0010110 16 SYN 1010110 56 V

0010111 17 ETB 1010111 57 W

0011000 18 CAN 1011000 58 X

0011001 19 EM 1011001 59 Y

0011010 1A SUB 1011010 5A Z

0011011 1B ESC 1011011 5B [

0011100 1C FS 1011100 5C \

0011101 1D GS 1011101 5D ]

0011110 1E RS 1011110 5E ^

0011111 1F US 1011111 5F _

0100000 20 SP 1100000 60 ’

Page 195: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

-188- 单片机原理及接口技术

续表

二 进 制 十六进制 字 符 二 进 制 十六进制 字 符

0100001 21 ! 1100001 61 a

0100010 22 ’’ 1100010 62 b

0100011 23 # 1100011 63 c

0100100 24 $ 1100100 64 d

0100101 25 % 1100101 65 e

0100110 26 & 1100110 66 f

0100111 27 ’ 1100111 67 g

0101000 28 ( 1101000 68 h

0101001 29 ) 1101001 69 i

0101010 2A * 1101010 6A j

0101011 2B + 1101011 6B k

0101100 2C , 1101100 6C l

0101101 2D - 1101101 6D m

0101110 2E / 1101110 6E n

0101111 2F NUL 1101111 6F o

0110000 30 0 1110000 70 p

0110001 31 1 1110001 71 q

0110010 32 2 1110010 72 r

0110011 33 3 1110011 73 s

0110100 34 4 1110100 74 t

0110101 35 5 1110101 75 u

0110110 36 6 1110110 76 v

0110111 37 7 1110111 77 w

0111000 38 8 1111000 78 x

0111001 39 9 1111001 79 y

0111010 3A : 1111010 7A z

0111011 3B ; 1111011 7B

0111100 3C < 1111100 7C |

0111101 3D = 1111101 7D

0111110 3E > 1111110 7E ~

0111111 3F ? 1111111 7F DEL

Page 196: 高职高专系列教材 单片机原理及接口技术idl.hbdlib.cn/book/00000000000000/pdfbook2/018/017/96756.pdf · 展技术、串行通信、并行i/o 口、a/d 转换、d/a

参 考 文 献 -189-

参 考 文 献

1 余永全. ATMEL 89 系列单片机应用技术. 北京: 北京航空航天大学出版社, 2002

2 张志良. 单片机原理与控制技术. 北京: 机械工业出版社, 2001

3 楼然苗. 51 系列单片机设计实例. 北京: 北京航空航天大学出版社, 2002

4 胡汉才. 单片机原理及其接口技术. 北京: 清华大学出版社, 1996

5 李朝青. 单片机原理及其接口技术. 北京: 清华大学出版社, 1998