单片计算机及其应用
梁 文 海
EMAIL,sicnu_lwhai@yahoo.com.cn
lwhai@sicnu.net
四川师范大学物理与电子工程学院
2005年 08月 28日
单片计算机及其应用
第一章 绪论
第二章 MCS— 51单片机的结构和原理
第三章 MCS51指令系统
第四章 汇编语言程序设计
第五章 MCS-51单片机内部定时 /计数器及其应用
第六章 单片机系统扩展
第七章 MCS-51系统的串行接口
第八章 MCS-51 单片机的中断系统
第九章 单片机应用系统的组成




本章内容
Single Chip Microcomputer
什么是单片机
单片机特点及应用
单片机的结构特点
一、什么是单片机
1、微型计算机硬件结构 —— 常见的微机外形
台式微机 便携式微机立式微机
微型计算机硬件结构 —— 微机硬件组成
显示器
主机
键盘
鼠标
微型计算机硬件结构 ——
运 算 器
控 制 器
CPU
存 储 器




















硬件系统
内部结构
硬件系统 —— 构成微机
的实体和装置
软件系统 —— 微机系统所
使用的各种程序的总称
软件系统 与 硬件系统 共同
构成实用的微机系统,两
者是 相辅相成、缺一不可
的。




+
微型计算机系统
运 算 器
控 制 器
CPU
存 储 器




















硬件系统
微型计算机系统
CPU












+
微型计算机系统
硬件系统












运 算 器
控 制 器
存 储 器
单片微型计算机 是指集成在一个芯片上的微型计算机,
简称单片机 —— 单片机实质上就是一个 芯片
2、单片微型计算机
单片机内部结构示意图
C P U
存 储 器
定 时 器 / 计 数 器 中 断 系 统
P0-P3 TxD
RxD
T INT


I/
O



I/
O

单片机应用系统
单片机应用系统


机 +
接口
电路
及外
设等
+ 软件
硬件
单片机应用系统由 硬件 和 软件 组

硬件是 应用系统的基础
软件是在硬件的基础上 对其资源
进行合理调配和使用,从而完成
应用系统所要求的任务,二者相
互依赖,缺一不可
注:本课程的重点 1.掌握单片机应用系统硬件原理的分析方法。
2.掌握软件设计与调试的基本技能。
二,单片机的结构特点
2、引脚采用分时复用技术。 由于芯片集
成度高,而引脚又不宜过多,因此将部
分引脚设计为多功能的,例如,地址总
线和数据总线采用分时复用等。
1、存储结构。 采用 ROM和 RAM严格分
开的哈佛结构,可分为:内部 ROM、
RAM,外部 ROM,RAM。
3、特殊功能寄存器 (21个 ) 采用特殊功能寄存器
来控制单片机的功能状态,如定时 /计数器、
串行口和中断逻辑等。
4、全双工串行接口 内部具有全双工串行接口,
可实现单机或多机通讯,为实现分布式控制
系统提供了可能。
5、布尔处理器 内部具有布尔处理器,可十分
方便的进行二进制位逻辑运算,进行组合逻
辑设计
三、单片机的特点及应用
1,单片机的特点
体积小, 重量轻
电源单一,功耗低
功能强,价格低
运行速度快,抗干扰能力强,可靠性高
可以嵌入到电子产品中 —— 嵌入式应用系统
2,单片机应用
工业方面
民用方面
仪表方面
电讯方面
数据处理方面
汽车方面
A、单片机应用模式
1、单机应用
即在一个应用系统中仅使用了一个单片机,其主要应用
领域有:智能产品、智能仪表、测控系统、数控控制机智能
接口。
2、多机应用
多机应用是单片机在高科技领域中应用的主要模式,其
高可靠性, 高控制功能 及 高运行速度 的,三高” 技术,在未
来的高科技工程系统中采用单片机多机系统作为主要的发展
方向。其应用模式可分为功能弥散系统、并行多机处理系统
和局部网络系统。
B、单片机的供应状态
单片机通过执行指令流来完成预先设定的功能,
其指令的存放方式取决于片内 ROM的配置情况:
1、片内 ROM配置 即单片机片内带有 掩模
ROM,其内容由厂家出厂时设定,因而其生产
周期长,经济 风险大 但 成本较低 。征对以上特
点,已有厂家推出了一次性(即 OTP型)用户
可编程的单片机,因而兼具成本低、周期短、
低风险等优点。
2、片内 EPROM配置 适用于样机开发,可
多次重写。
3、片内 E2PROM配置 适用于样机开发,
可多次重写,其重写比 EPROM更方便,目
前使用最为广泛。
4、片内无 ROM配置 由于片内无 ROM,因
而需在片外扩展 ROM,其电路复杂,灵活
性差,已逐渐被 淘汰。
C、单片机的等级
集成电路依据其使用环境可分为三个等级
1、商用级 温度范围为 0~70OC,限用于机房及办公
环境
2、工业级 温度范围为 -45~85OC
3、军用级 温度范围为 -50~125OC
不同级别之间价格相差很大,如军用级为商用级的
10倍乃至上百倍。单片机为工业级产品。
3,单片机种类
◆ 生产厂商:
美国微芯片公司,PIC16C××系列,PIC17C××系列,PIC1400
系列,
美国英特尔公司的 MCS-48和 MCS-51系列,
美国摩托罗拉公司的 MC68HC05系列和 MC68HC11系列,
美国齐洛栺公司的 Z8系列,
日本电气公司的 μPD78 ××系列,
美国莫斯特克公司和仙童公司合作生产的 F8( 3870)系列
等。
A、单片机的分类(按用途)
( 1)通用型单片机 它可向开发者提供较多资源,
具有较强的通用性,适应性较强,应用较为广泛,
便于普及和推广,但有时会造成大量资源的浪费。
( 2)专用型单片机 专门征对特殊使用场合的具体
要求而设计,通常是微控制系统的集成产品,因而
其抗干扰能力比通用型强,适用于各种恶劣环境,
但由于其专用性强,其应用范围受到了很大的限制。
B、按字长分类
( 1) 4位机 主产于日本,如 SM系列,UPD系
列等,其特点是价栺便宜,其数值运算能力
差。
( 2) 8位机 目前市面上的主导机型,如 Intel,
Motorola,Zilog等厂家的产品,由于其功能强
大,价栺低廉,品种繁多,数值处理能力一
般,应用范围较广。
( 3) 16位机,32位机 具有强大的数值处
理能力,且具有并行功能,适用于有大量
数据处理的应用系统,由于其字长较长,
运行速度较高,因而数据处理速度高。它
的发展壮大直接推动了信息化时代的到来。
如 TMS320C50,迚行一次乘法运算仅需
60ns。
◆ 单片机的发展经历了由 4位 机到 8位 机,再到
16位 机的发展过程
◆ 目前 8位 单片机仍是单片机的 主流 机型;
? 2-1 关于 MCS-51系列
? 2-2 MCS-51系列 单 片机的结构原理
? 2-3 MCS-51单片机的引脚及其片外总线结构
? 2-4 MCS-51单片机的工作方式
? 2-5 MCS-51单片机的时序
第二章 MCS— 51单片机的结构和原理
一,MCS-51系列型号
型 号 片内程序存储器 片内数据存储器
8031 NO 128Bytes
8051 4K ROM 128Bytes
8751 4K EPROM 128Bytes
8032 NO 256Bytes
89C51 4K E2PROM 128Bytes
89C52 8K E2PROM 256Bytes
89C2051 2K E2PROM 128Bytes
2-1 关于 MCS-51系列
二,MCS-51的主要特点
1、单 +5V供电,40引 脚封装
2,8位字长 CPU
3、片内有 振荡 电路和 时钟 电路
4,32根 I/O线
5,64K外部 RAM(不含内部 RAM)
6,64K外部 ROM(含内部 ROM)
7,2个 16位定时 /计数器( 8X52有 3个)
8、具有 2个优先级别的 5个中断源( 8X52有 6
个)
9、可编程的全双工串行口,如工作方式、波
特率等
10、布尔处理器
11,128个用户可寻址位单元
12,128字节内部 RAM( 8X52有 256个字节)
时钟电路
CPU
ROM RAM
T0 T1
中断系统串行接口并行接口
P0 P1 P2 P3 TXD RXD INT0 INT1
定时计数器
结构框图
? 中央处理器
CPU,8位,
运算和控制
功能
? 内部 RAM,共
256个 RAM单
元,用户使用
前 128个单元,
用于存放可读
写数据,后
128个单元被
专用寄存器占
用。
? 内部 ROM:
4KB掩膜 ROM,
用于存放程序、
原始数据和表
格。? 定时 /计数器:
两个 16位的定
时 /计数器,实
现定时或计数
功能。
? 并行 I/O口,4个
8位的 I/O口 P0、
P1,P2,P3。
? 串行口,一个全
双工串行口。? 中断控制系统:5个中断源(外
中断 2个,定时
/计数中断 2
个,串行中断 1
个)
? 时钟电路,可
产生时钟脉冲
序列,允许晶
振频率 6MHZ和
12MHZ
2-2 MCS-51系列 单 片机的结构原理
一、基本组成
1,8051单片机的基本组成
1,中央处理器 CPU,8位,运算和控制功能
2,内部 RAM,共 256个 RAM单元,用户使用前 128个单元,
用于存放可读写数据,后 128个单元被专用寄存器占用。
3,内部 ROM,4KB掩膜 ROM,用于存放程序、原始数据和表
格。
4,定时 /计数器,两个 16位的定时 /计数器,实现定时或计数功
能。
5,并行 I/O口,4个 8位的 I/O口 P0,P1,P2,P3。
6,串行口,一个全双工串行口。
7,中断控制系统,5个中断源(外中断 2个,定时 /计数中断 2
个,串行中断 1个)
8,时钟电路,可产生时钟脉冲序列,允许晶振频率 6MHZ和
12MHZ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
28
27
26
25
24
23
22
21
20
19
18
17
16
15
EP
RO
M
2764
1
2
3
4
5
6
7
8
9
10
11
12
13
14
28
27
26
25
24
23
22
21
20
19
18
17
16
15
EP
RO
M
2764
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
40
39
38
37
36
35
34
33
32
31
30
29
28
27
26
25
24
24
22
21
1
2
3
4
5
6
7
8
9
10
11
12
13
14
28
27
26
25
24
23
22
21
20
19
18
17
16
15
RAM
6264
1
2
3
4
5
6
7
8
9
10
11
12
13
14
28
27
26
25
24
23
22
21
20
19
18
17
16
15
RAM
6264
2,



8031
8751
8051
89C51片内
RAM
片内
ROM
256B(字节)
4K
64K
64K
(1)程序存储器
程序 存储器
内部 外部
0000H
0FFFH
(4K)
0000H
FFFFH
(64K)
0000H
0FFFH
(4K)
0000H
0001H
0002H
(PC)
0000H是程序执行的起始单元,
在这三个单元存放一条
无条件转移指令
中断 5
中断 4
中断 3
中断 2
中断 10003H
000BH
0013H
001BH
0023H
002BH
外部中断 0
定时器 0中断
外部中断 1
定时器 1中断
串行口中断
8位
...
0FFFH
0FFEH
EA=1 EA=0
程序 存储器资源分布
中断入
口地址
org 0000h
ljmp main
org 002bh
Main,mov sp,#60h
……..
0000H
FFFFH
(64K)
内部
外部
(2)数据存储器
数据 存储器
00H
FFH
7FH
80H(高 128B)
(低 128B) RAM
专用
寄存器
00H
07H08H
0FH
10H
17H
18H
1FH
0区
R0
R7
R0
R7
R0
R7
R0
R7
1区
2区
3区
工作寄存器区
可作一般 RAM
读写 也可位寻
址区
20H
2FH 7F 78
07 00
30H
7FH 数据缓冲区 /堆栈区
内部 RAM存储器
1 1 第 3 区 18H~1FH
0 1 第 1 区 08H~0FH
RS1 RS0 寄存器区 片内 RAM地址
0 0 第 0 区 00H~07H
1 0 第 2 区 10H~17H
工作寄存器区 选择位 RS0,RS1
注意, 一个单元地址对应有 8个位地址
MSB—— Most Significant Bit (最高有效位)
LSB —— Least Significant Bit (最低有效位)
单元地址
2FH
2EH
2DH
2CH
2BH
2AH
29H
28H
27H
26H
25H
24H
23H
22H
21H
20H
7F
77
6F
67
5F
57
4F
47
3F
37
2F
27
1F
17
0F
07
MSB 位地址 LSB
7E
76
6E
66
5E
56
4E
46
3E
36
2E
26
1E
16
0E
06
7D
75
6D
65
5D
55
4D
45
3D
35
2D
25
1D
15
0D
05
7C
74
6C
64
5C
54
4C
44
3C
34
2C
24
1C
14
0C
04
7B
73
6B
63
5B
53
4B
43
3B
33
2B
23
1B
13
0B
03
7A
72
6A
62
5A
52
4A
42
3A
32
2A
22
1A
12
0A
02
79
71
69
61
59
51
49
41
39
31
29
21
19
11
09
01
78
70
68
60
58
50
48
40
38
30
28
20
18
10
08
00
RAM位寻址区位地址表 (P11)
( 3)特殊功能寄存器(高 128个单元)
MCS-51内部安排有 21个特殊功能寄存器
各特殊功能寄存器的符号及地址见 表 2-2。分
别由于以下各个功能单元:
? CPU,ACC,B,PSW,SP,DPTR( 由两
个 8位寄存器 DPL,DPH组成 )
?并行口,P0,P1,P2,P3
?中断系统,IE,IP
?定时 /计数器, TMOD,TCON,TH1,TL1、
TH0,TL0
?串行口,SCON,SBUF,PCON
3,CPU
? 由运算器, 控制器 和 若干 SFR( ACC,B,
PSW,SP,DPTR) 构成。
( 1)运算器,实现数据的算术运算和逻辑运
算。
( 2)累加器 ACC,提供一个操作数并存放运
算结果,其进位标志 CY同时也是布尔处理
器的累加器。
( 3)寄存器 B,用于乘法和除法操作,也用
作暂存器。
( 4) CPU标志寄存器
? CY,进位标志,有进位或借位
时为 1,否则为 0
? AC,辅助进位标志当 D3向 D4有
进位或借位时为 1,否则为 0
? F0,用户标志
? RS1,RS0,工作寄存器组
? OV,溢出标志,结果超过 -
128~+127时,OV=1,否则为 0
CY AC F0 RS1 RS0 OV — PPSW
1 1 第 3 区 18H~1FH
0 1 第 1 区 08H~0FH
RS1 RS0 寄存器区 片内 RAM地址
0 0 第 0 区 00H~07H
1 0 第 2 区 10H~17H
( 4) CPU标志寄存器
? P,奇偶校验标志,当 ACC中,1”的个数为奇
数个时,P=1
? PSW.1,保留位,用户可使用。
?椎栈指针 SP,先入后出的特殊存储器指针 。
?数据指针 DPTR,用于存放 16位地址,可分为
DPH和 DPL。
MOV SP,#60H
MOV DPL,#0FFH
MOV DPH,#0FH
4、并行 I/O口
P0,0
P0.1
P0.2
P0.3
P0.4
P0.5
P0.6
P0.7
P1,0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7
P2.7
P2.6
P2.5
P2.4
P2.3
P2.2
P2.1
P2,0
P3,0
P3.1
P3.2
P3.3
P3.4
P3.5
P3.6
P3.7
?4个 8位并行 I/O口,P0,P1,P2,P3;
?均可作为双向 I/O端口使用。输入时可
以缓冲,输出时可以锁存。
(1)特点:
P0,访问片外扩展存储器时,
复用为低 8位地址线和数据线
P2,高 8位地址线。
P1,双向 I/O端口
P3,第二功能
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
40
39
38
37
36
35
34
33
32
31
30
29
28
27
26
25
24
24
22
21
8031
8051
8751
89C51
片外扩展存储器时 P0、
P2口自动作为总线使用
( 2) I/O口的字节地址和位地址
( 3)下面分别介绍 4个 I/O口的结构
B,P1口的位结构
? P1口由于只能作为 I/O口使用,因而输出控制电路
结构同 P0口不同。
C,P2口位结构
P2口既可用作 I/O口,也可用作高 8位地址总线。
D,P3口位结构
P3口既可用 I/O口,又分别具有第二功能,但二者不
能混用,其 第二功能 如下表所示。
ALE
WR
RD
P1,0
P1,1
P1,2
P1,3
P1,4
P1,5
P1,6
P1,7
指令 1,MOV P1,#00H
指令 2,MOV P1,#0FFH
指令 3,MOV P1,#0AAH
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
E 输出举例
指令 4,CLR P1.0
指令 5,SETB P1.0
+5V
1
1
1
1
1
1
1
1
F 输入举例
S0+5 V 4.7 k W
ALE
WR
RD
P3,0
P3,1
P3,2
P3,3
P3,4
P3,5
P3,6
P3,7
读端口,MOV P3,#11111111B
MOV A,P3 89C51
× × × × × × × ×寄存器 A
注,当 I/O端口作为输入使
用时,需先向端口写入, 1”,
使内部的 FET截止,再读入
引脚的状态。
你知道 P3.4
对应寄存器 A
哪一位吗?
P3.4
你知道这是
为什么吗?
1 1 1 1 1 1 1 10
一,MCS-51单片机信号引脚简介
P3口线的第二功能
VCC
VSS
XTAL2
XTAL1
RST
P0,0
P0.1
P0.2
P0.3
P0.4
P0.5
P0.6
P0.7
P1,0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7
P2.7
P2.6
P2.5
P2.4
P2.3
P2.2
P2.1
P2,0
ALE
P3,0
P3.1
P3.2
P3.3
P3.4
P3.5
P3.6
P3.7
(2)、振荡电路,XTAL1,XTAL2
(3)、复位引脚,RST
(4)、并行口,P0,P1,P2,P3
(7),ALE:地址锁存控制信号
(1)、电源线,VCC(+5V),VSS(地 )
EA
PSEN (5),EA:访问程序存储控制信号
(6),PSEN:外部 ROM读选通信号
RXD/
TXD/
INT0/
INT1/
T0/
T1/
WR/
RD/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
40
39
38
37
36
35
34
33
32
31
30
29
28
27
26
25
24
24
22
21
8031
8051
8751
89C51
1、管脚图
2-3 MCS-51单片机的引脚及其片外总线结构
二、片外三总线结构
1、地址总线( AB)
由 P2,P0提供 16位地址
2、数据总线( DB)
由 P0口提供 8位数据
3、控制总线( CB)
由 P3口和 RST,EA,ALE,PSEN组成
2-4 MCS-51单片机的工作方式
一、复位方式
在振荡电路工作时,在 RST引脚上加上一个至
少保持 2个机器 周期的高电平,单片机完成复位。
其 复位电路结构和内容 如图所示
? 复位电路
? 复位不影响 RAM内容。使 PC指向 0000H,重新执
行程序。
? 复位可分为上电自动复位和按键复位两种方式。
复位方式、程序执行
方式、单步执行方式、
掉电方式、节电方式
二、程序执行方式
?本方式是单片机的 基本工作方式,复位
后,程序自 0000H开始执行。
?用户的程序一般不可能从 0000H开始存
放。因此,需要从 0000H开始存放一条
转移指令,以使执行转移到用户程序的
入口地址。
三、单步执行方式
在外界脉冲的控制下,单片机每执行一条
指令就暂停下来。
四、掉电和节电方式
用于低功耗系统设计
PCON SMOD — — — GF1 GF0 PD IDL
D7 D0
五、编程和校验方式
对于内部含有 EPROM或 EEPROM的单片
机,可用于对其 编程 或对其 校验 。
2-5 MCS-51单片机的时序
一、时序
?在执行指令的过程中,CPU的控制器发出的
一系列特定的控制信号在时间上的相互关系。
?内部控制信号和外部控制信号。
二、区别几个概念
?1、振荡周期(时钟周期),振荡信号周期,
fOSC
?2,状态周期, 又叫 S周期,可分为 P1和 P2两拍,
其中 P1通常完成逻辑操作,而 P2通常完成内部
寄存器与寄存器间的数据传输,fosc/2。
?3、机器周期,单片机的基本操作周期,fosc/12。
(教材 P25)包含六个状态周期。
?4、指令周期,执行一条指令的周期,分别
有单、双和四机器周期指令。
?5,ALE信号,可作为一种周期信号使用。
三,MCS-51指令的取指 /执行时序
指令的处理
都包括 取指
(取操作码或
操作数) 和 执
行 (指令的逻
辑功能) 两个
阶段,每出现
一次 ALE信号,
CPU就进行一
次取指操作。
指令
寄存器
译码
地址
译码
程序计数器 地址寄存器
累加器 A运算器
①②








线
外部地址总线 AB
数据缓冲器 外部数据总线 DB
寄存器区
外部控制总线 CB
内部控制信号
时钟及清零
三,MCS-51指令的取指 /执行时序
取指过程
例, MOV A,#09H 74H 09H ;把 09H送到累加器 A中
执行过程
PC=0000H
0001H
0000H
0002H
0 1 1 1 0 1 0 0
0 0 0 0 1 0 0 1
(PC)
(PC)
0001H0002H 0000H
外部控制总线
取指过程
(PC)
执行过程
指令的处理 都包
括 取指 (取操作
码或操作数) 和
执行 (指令的逻
辑功能) 两个阶
段,每出现一次
ALE信号,CPU
就进行一次取指
操作
四、访问外部 ROM时序
在 S1P2时刻
ALE信号有效。
2.P0口送出 ROM 的低 8
位地址,P2口送出高 8位
地址,A7-A0只持续到
S2结束,故在外部要用
锁存器,可用 ALE作为
锁存信号,A15-A8在整
个读指令过程中都有效
3.在 S3P1时刻
/PSEN开始有效,
可以用它选通外部
ROM的使能端,被
选种的 ROM单元的
内容,从 P0口读入
CPU,然后 /PSEN
失效。
4.在 S4P2后开始
第二次读入,其
过程与第一次相
同。
五、访问外部 RAM时序
本章作业,除 7题外
在同一机器周期的 S5状态产
生的 ALE信号的下降沿,将
P0总线上出现的低 8位地址
锁存在外部的锁存器中。
读数据
寻址方式
数据传送类指令
算术运算类指令
逻辑操作类指令
控制转移类指令
位操作指令
常用伪指令


MCS
51




本章内容
Single Chip Microcomputer
概 述
? MCS-51系列单片机的指令系统 专用于 51系列单片
机,共有 111条指令,具在丰富灵活的寻址方式,
其指令格式与 8086的指令系统相同,甚至某些指令
还完全相同。使用时应注意区别。
? 在 111条指令中,从存储空间的占用上看,单字节
指令占 49条,双字节指令占 45条,三字节指令占 17
条 ;从执行时间上看,在 111条指令中,单机器周
期指令占 64条,双机器周期指令占 45条,仅乘法和
除法两条指令为四机器周期指令 。因而无论是存储
空间的利用率,还是时间的执行效率都是较高的,
再加上灵活的寻址方式,特别适合于实时测量和控
制场合。因而,单片机又常被称为 微控制器 。
§ 3-1 指令的格式及标识
操作码
7 0
数据或寻址方式
7 0
双字节指令:
标号,操作码 操作数或操作数地址 ;注释
单字节指令,操作码
7 0
三字节指令,操作码
7 0
数据或寻址方式
7 0
数据或寻址方式
7 0
指令按字节长度可以分为三种:
指令的格式:
例如,MOV A,R0
例如,MOV A,30H
例如,MOV DPTR,#2010H
操作码助记符、目的操作数、源操作数是指令的核心部分。方拪号
中内容为可选项,其有无视具体的指令而异。
一、指令的格式
二、关于标号
标号不允许只用数字,而应 以字母打头,后
面跟数字,不可使用运算符号,不能同十六
进制数发生混淆,较好的取名原则 是见名知
义。便于程序员在调试程序时更加顺利,往
往一个标号就是一个功能入口,因而在使用
标号时应特别小心,用并非每句指令都需要
标号。
三、关于指令中的符号标识
符 号 含 义
Rn 表示当前选定寄存器组的工作寄存器 R0~ R7
Ri 表示作为间接寻址的地址指针 R0~ R1
#data 表示 8位立即数, 即 00H~ FFH
#data16 表示 16位立即数, 即 0000H~ FFFFH
addr16 表示 16位地址, 用于 64K范围内寻址
addr11 表示 11位地址, 用于 2K范围内寻址
direct 8位直接地址, 可以是内部 RAM区的某一单元或某一专用功能寄存器的地址
Rel 带符号的 8位偏移量 ( -128~ +127)
Bit 位寻址区的直接寻址位
( X) X地址单元中的内容, 或 X作为间接寻址寄存器时所指单元的内容
← 将 ← 后面的内容传送到前面去
四、关于注释
为了增强程序的可读性, 使别人易读, 或
防止日久遗忘, 可适当加些注释 。 注释由
,;, 开始 。
§3-2 寻址方式
在程序行中,操作码 代表了该句指令的功
能,而功能的对象却由操作数决定,由操作
数指出参与运算的数或该数所在的地址。 取
得操作数的地址的方法叫做 寻址方式 。寻址
方式与计算机的存储空间结构是密切相关的。
灵活运用各种寻址方式,可以大大的提高程
序的运行效率。
MCS-51基本七种寻址方式
寻址方式 寻址空间
R0~R 7
寄存器寻址
A, B, AB, D PT R
内部 RA M 的低 128 字节
SFR
位地址 0 0 ~ 7 FH
直接寻址
SFR 中的位寻址空间
立即寻址 RO M
内部 RA M ( Ri, SP )
寄存器间接寻址
外部 RA M ( Ri, D P T R )
变址寻址 RO M ( A +PC, A + D PT R )
相对寻址 RO M
位地址 0 0 ~ 7 FH
位寻址
SFR 中位寻址区
一、寻址方式 (找信 方式 )
我的信在他
那 !找信 去 !


注,找信是寻找 信的, 地
址, !
你能说出第
二封信的
“地址”吗?
目的地
#XXH
操作数
MOV P1,#55H
MOV A,#01H
55H
目的地 信
寄存器寻址
直接寻址
立即数寻址
寄存器间接寻址
变址寻址
相对寻址
位寻址
目的地
寄存器寻址 P31
直接寻址 P32
立即数寻址 P32
寄存器间接寻址 P33
变址寻址 P33
相对寻址 P34
位寻址 P35
内部 RAM
或 SFR区
操作数
XXH
MOV P1,20H
20H
目的地
注,寻址是寻 操作数 的, 地
址, !
直接给出地址
20H—— 直接寻址
目的地
寄存器寻址
直接寻址
立即数寻址
寄存器间接寻址
变址寻址
相对寻址
位寻址
寄存器
目的地
操作数
XXH
MOV P1,A
R0-R7
A
B
DPTR你能说出为什么
叫寄存器寻址吗?
寄存器寻址
直接寻址
立即数寻址
寄存器间接寻址
变址寻址
相对寻址
位寻址
MOV P1,@R0
目的地
寄存器
操作数
3AH
内部 RAM
3AH 65H
R0
R1
DPTR










目的地你能说出 1号箱
子和 2号箱子分
别对应内存中哪
一部分吗?
寻址比较
MOV P1,R0
③ 地址是寄存器 R0
MOV P1,@R0 ② 地址在寄存器 R0里
MOV P1,20H
④ 地址是内存 20HMOV P1,#20H
① 直接将 20H这个数送 P1口
错 !
错 !错 !

对 !
寻址比较
MOV P1,R0
③ 地址是寄存器 R0
MOV P1,@R0 ② 地址在寄存器 R0里面
MOV P1,20H
④ 地址是内存 20HMOV P1,#20H
① 直接将 20H这个数送 P1口
错 !
错 !
错 !

对 !
寻址比较
MOV P1,R0
③ 地址是寄存器 R0
MOV P1,@R0 ② 地址在寄存器 R0里面
MOV P1,20H
MOV P1,#20H
① 直接将 20H这个数送 P1口
错 !
错 !
错 !

对 !④ 地址是内存 20H
寻址比较
MOV P1,R0
③ 地址是寄存器 R0
MOV P1,@R0 ② 地址在寄存器 R0里
MOV P1,20H
④ 地址是内存 20HMOV P1,#20H
① 直接将 20H这个数送 P1口
错 !
错 !
错 !

对 !
寄存器寻址
直接寻址
立即数寻址
寄存器间接寻址
变址寻址
相对寻址
位寻址
MOVC A,@A+DPTR
目的地
寄存器
操作数
内部 RAM
3AH 65H
3AH
基址 寄存器
12H
变址 寄存器
34H
内部 RAM
46H
A
DPTR
PC
46H
目的地
寄存器寻址
直接寻址
立即数寻址
寄存器间接寻址
变址寻址
相对寻址 XXH
位寻址
操作数
SJMP 54H
PC + 54H
PC 2002H
··
·
··
·
2002H =2056H
PC 2056H
寄存器寻址
直接寻址
立即数寻址
寄存器间接寻址
变址寻址
相对寻址
位寻址
20H
··
·
··
·
27H
21H
28H
10 0 0 0 0 0 0 0
想一想,
如果想使 27H单
元的 第 3位 置 1,
该怎么办呢?
单元地址
2FH
2EH
2DH
2CH
2BH
2AH
29H
28H
26H
25H
24H
23H
22H
21H
20H
7F
77
6F
67
5F
57
4F
47
37
2F
27
1F
17
0F
07
MSB 位地址
LSB 7E
76
6E
66
5E
56
4E
46
36
2E
26
1E
16
0E
06
7D
75
6D
65
5D
55
4D
45
35
2D
25
1D
15
0D
05
7C
74
6C
64
5C
54
4C
44
34
2C
24
1C
14
0C
04
7B
73
6B
63
5B
53
4B
43
33
2B
23
1B
13
0B
03
7A
72
6A
62
5A
52
4A
42
32
2A
22
1A
12
0A
02
79
71
69
61
59
51
49
41
31
29
21
19
11
09
01
78
70
68
60
58
50
48
40
30
28
20
18
10
08
00
位寻址地址表例,SETB 3DH
3D 3C 3B3F 3E 3A 39 3827H
寄存器寻址
直接寻址
立即数寻址
寄存器间接寻址
变址寻址
相对寻址
位寻址
SETB 3DH
20H
··
·
··
·
27H
21H
28H
0 0 0 0 0 0 010
§3-3 MCS— 51指令系统的分类
2.1 数据传送指令( 29条)
2.2 算术运算指令( 24条)
2.3 逻辑运算指令( 24条)
2.4 控制转移指令( 17条)
2.5 位操作指令( 17条)
2.6 常用伪指令( 17条)
目的地址 源地址
数 据
MOV <目的操作数 >,<源操作数 >
MOV A,#20H,
A
Rn
direct1
@Ri
A
Rn
direct2
@Ri
#data
MOV
20H
A
2.1 数据传送指令( 29条 不影响标志位 CY AC OV)
—— 8位 数据传送指令 (15条 )
2.1 数据传送指令( 29条)
—— 16位 数据传送指令( 1条)
MOV DPTR,#data16
—— 外部 数据传送指令 (4条 )
MOVX <目的操作数 >,<源操作数 >

A
@DPTR
@Ri
MOVX
A
@DPTR
@Ri
—— 交换和查表类 指令 (9条 )
,AXCH
direct
@DPTR
@Ri
1)字节交换指令 (3条 )
2)低半字节交换指令 (1条 )
XCHD A,@Ri
3)累加器 A中高 4位和低 4位交换 (1条 )
SWAP A
4)查表指令 (2条 )
MOVC A,@A+PC
MOVC A,@A+DPTR
5)堆栈操作指令 (2条 )
PUSH direct
POP direct
举例
例 3-1 将片内 RAM30H单元的内容送到片外 60H;
将片外 4312H单元的内容送到片内 31H单元:
MOV A,30H
MOV R0,#60H
MOV @R0,A
MOV DPTR,#4312H
MOV A,@DPTR
MOV 31H,A
direct
2.2算术运算类指令( 24条)
—— 普通 加法 指令( 4条)
A,
Rn
@Ri
#data
ADD
ADD A,Rn
ADD A,direct
ADD A,@Ri
ADD A,#data
注意,1.本指令影响 Cy,AC,Ov,P等标志。
2.求和操作既可看成是有符号数运算,
也可看成是无符号数运算,完全由程序员编
程时自行设定。
3.计算机运算时的规定参见教材 P38。
2.2算术运算类指令( 24条)
—— 带进位 加法 指令( 4条)
directA,
Rn
@Ri
#data
ADDC
ADDC A,Rn
ADDC A,direct
ADDC A,@ Ri
ADDC A,#data
除相加时要考虑进位外,其余操作与前
面相同。
2.2算术运算类指令( 24条)
—— 减法 指令 (4条 )
directA,
Rn
@Ri
#data
SUBB
SUBB A,Rn
SUBB A,direct
SUBB A,@Ri
SUBB A,#data
减法指令是带借位的,若不需要带借位减,则
在作减法指令前清除借位位,即 CLR C
减法指令影响 OV,CY,AC标志位
助记符格式 机器码 (B) 相应操作 指令说明 机器周期
INC A 00000100 A?A+1 影响 PSW的 P标志 1
INC Rn 00001rrr Rn?Rn+1 n=0~7,
rrr=000~111
1
INC direct 0101 direct (direct)?(direct)+1 1
INC @Ri 0000011i (Ri)?(Ri)+1 i=0,1 1
INC DPTR 10100011 DPTR?DPTR+1 2
DEC A 00010100 A?A-1 影响 PSW的 P标志 1
DEC Rn 00011rrr Rn?Rn-1 n=0~7,rrr=000~111 1
DEC direct 00010101direct (direct)?(direct)+1 1
DEC @Ri 0001011i (Ri)?(Ri)-1 i=0,1 1
—— 加 1减 1指令
—— 乘法 指令 (1条 )
MUL A B
—— 除法 指令 (1条 )
DIV A B
两个 8位操作数相
乘,形成 16位的积,
其中 A为积的低位
而 B为积的高位。
需要进行更多位的
乘法运算,需另外
编程方能实现。
举例见教材 P40
两个 8位操作数相除,
其中 A为被除数而 B为
除数;运算后,结果仍
然在 AB中,其中 A为商
而 B为余数。
同乘法指令相同,
需要进行更多位的除法
运算,需另外编程方能
实现。
十迚制调整指令
DA A ;实现 BCD码加法
BCD码相加后,根据 Ac和 Cy的状态对 A中的数
作适当调整,使运算结果为 BCD码。
这条指令对加法结果的调整规则是:
(1)若累加器 A低 4位大于 9或辅助进位标志 AC=
1.则低 4位加 6;
(2)若累加器 A高 4位大于 9或 CY= 1,则高 4位加 6;
(3)若 1,2条件都满足时,则 A加 66H;
(4)若 1,2条件都不满足时,则 A加 00H;
(5)若果加器 A的最高位因调整而产生进位时,将 CY
置 1,若不产生进位整前的状态而并不清零。
DA指令只影响进位标志 CY。
例 3-3 设 ACC中为压缩 BCD码 56H,R3中为压缩 BCD
码 67H,且 Cy=1,求 ACC与 R3的压缩 BCD码之和
MOV A,#56H
MOV R3,#67H
ADDC A,R3
DA A ; A=?
(A) =01010110
(R3)=01100111
+)(Cy)=00000001
和 =10111110
调整 +) 01100110
1 00100100BCD码为 124
2.3逻辑及移位类指令
—— 逻辑与 指令( 6条)
助记符格式 机器码 (B) 相应操作 指令说明 机器
周期
ANL A,direct 01010101
direct
A?A∧ direct 按位相与 1
ANL A,Rn 01011rrr A?A∧ Rn n=0~7,
rrr=000~111
1
ANL A,@Ri 0101011i A?A∧ (Ri) i=0,1 1
ANL A,#data 01010100 data A?A∧ #data 1
ANL direct,A 01010010direct (direct)?(direct)∧ A 不影响 PSW的 P标志 1
ANL
direct,#data
01010011
direct data
(direct)?
(direct)∧ #data 不影响 PSW的 P标志 2
—— 逻辑或 指令( 6条)
01000011
direct data
助记符格式 机器码 (B) 相应操作 指令说明 机器
周期
ORL A,direct 01000101
direct
A?A∨ direct 按位相或 1
ORL A,Rn 01001rrr A?A∨ Rn n=0~7,rrr=000~111 1
ORL A,@Ri 0100011i A?A∨ (Ri) i=0,1 1
ORL A,#data 01000100data A?A∨ #data 1
ORL direct,A 01000010
direct
(direct)?(direct)∨
A
不影响 PSW的 P标

1
ORL
direct,#data (direct)?(direct)∨ #data 不影响 PSW的 P标志 2
—— 逻辑 异或 指令( 6条)
助记符格式 机器码 (B) 相应操作 指令说明 机器
周期
XRL A,direct 01100101
direct
A?A?(direct) 按位相异或 1
XRL A,Rn 01101rrr A?A?Rn n=0~7,rrr=000~111 1
XRL A,@Ri 0110011i A?A?(Ri) i=0,1 1
XRL A,#data 01100100 data A?A?#data 1
XRL direct,A 01100010
direct
(direct)?(direct)?A 不影响 PSW的 P标志 1
XRL
direct,#data
01100011
direct data
(direct)?
(direct)?#data 不影响 PSW的 P标志 2
—— 累加器 A清 0和取反 指令
助记符
格式
机器码 (B) 相应操作 指令说明 机器
周期
CLR A 11100100 A?00H A中内容清 0,影响 P标志 1
CPL A 11110100 A中内容按位取反, 影响 P标志 1A?A
A.0A.7
A.0A.7
A.0A.7
A.0A.7
CY
CY
RL A
RR A
RLC A
RRC A
注意,执行带进位的循环移位指令之前,必须给 CY置位或清零。
—— 循环移位 指令
例 3-4 设 (20H)=(X7X6X5X4X3X2X1X0)
(21H)=(Y7Y6Y5Y4Y3Y2Y1Y0)
试编程使 (30H)=Y2Y1Y0X4X3X2X1X0
程序清单,MOV 30H,20H
ANL 30H,#00011111B; B:二进制
O:八进制
D:十进制
H:十六进制
MOV A,21H
RL A
SWAPA
ANL A,#11100000H
ORL 30H,A
例 3-5 若 ACC=X7X6X5X4X3X2X1X0,试编程将 A中
的低 5位送至 P1口,但不能影响 P1口的高 3位。
程序清单:
MOV A,#0AAH
ANL P1,#11100000B
ORL P1,A
2.4 控制转移类指令
—— 无条件转移 指令 (4条 )
1) 长转移指令,LJMP AAAAH ; AAAAH?PC
PC=0000H
PC=AAAAH
0000H
0001H
··
·
··
·
AAA9H
AAAAH
0002H
假设执行该指
令前,PC的值
为 0000H。
注意,该指令可以转移到 64 KB程序存储器中的任意位置。
PC高 5位
(保持不变 )
PC低 11位
A10 A9 A8 0 0 0 0 1 A7 A6 A5 A4 A3 A2 A1 A0
操作码 (第一字节 ) 操作数 (第二字节 )
11位转移地址的形成示意图
程序计
数器 PC
2)绝对转移指令
AJMP addr11 ; PC+2?PC,addr11 ?PC.10~PC.0
PC
2002H
2003H
0000H
0001H
··
·
··
·
2004H
2005H
2006H
PC
PC
PC
PC
0002H
PC
3)相对转移指令
例,SJMP 03H
03H
03H就是当前 PC值
与目的 PC值 相对差
PC
—— 条件转移 指令 (8条 )
1)累加器 A判 0指令 (2条 )
助记符格式 机器码 (B) 相应操作 机器周期
JZ rel 0110000 若 A=0,则 PC?PC+rel,否则程序顺序执行 2
JNZ rel 01110000 若 A≠0,则 PC?PC+rel,否则程序顺序执行 2
2)减 1非零转移 指令 (2条 )
助记符格式 机器码 (B) 相应操作 机器周期
DJNZ
Rn,rel
11011rrr
rel
Rn?Rn-1,若 Rn≠0,则 PC?PC+rel,
否则顺序执行 2
DJNZ
direct,rel
11010101
direct rel
( direct) ?( direct) -1,若 ( direct)
≠0,则 PC?PC+rel,否则顺序执行 2
3)比较转移 指令 (4条 )
助记符格式 机器码 (B) 相应操作 机器周期
CJNE
A,#data,rel
10110100
data rel
若 A≠#data,则 PC?PC+rel,否则顺
序执行;若 A<#data,则 CY=1,否则
CY=0
2
CJNE
Rn,#data,rel
10111rrr
data rel
若 Rn≠#data, 则 PC?PC+rel,否则
顺序执行;若 Rn<#data,则 CY=1,否
则 CY=0
2
CJNE
@Ri,#data,rel
1011011i
data rel
若 (Ri)≠#data, 则 PC?PC+rel,否
则顺序执行;若 (Ri)<#data,则 CY=1,
否则 CY=0
2
CJNE
A,direct,rel
10110101
direct
rel
若 A≠(direct), 则 PC?PC+rel,否
则顺序执行;若 A<(direct),则 CY=1,
否则 CY=0
2
—— 调用和返回 指令 (8条 )
1)绝对调用 指令( 1条)
助记符格式 机器码 (B) 相应操作 机器周期
ACALL
addr11
a10a9a810001
addr7~0
PC?PC+2
SP? SP+1,(SP)?PC0~ 7
SP? SP+1,(SP)?PC8~15
PC0~10 ? addr11
2
2)长调用 指令( 1条)
助记符格式 机器码 (B) 相应操作 机器周期
LCALL
addr16
00010010
addr15~8
addr7~0
PC?PC+3
SP?
SP+1,SP?PC0~7
SP?
SP+1,SP?PC8~15
PC?addr16
2
3)返回 指令
助记符格式 机器码 (B) 相应操作 机器周期
RET 00100010
PC8~15 ? (SP),SP ?SP-1
PC0~7 ? (SP),SP ?SP-1
子程序返回指令
2
RETI 00110010 PC8~15 ? SP,SP ?SP-1PC0~7 ? SP,SP ?SP-1
中断返回指令
2
助记符格式 机器码 (B) 相应操作 指令说明
NOP 00000000 空操作 消耗 1个机器周期
4)空操作
举例
例 3-6根据累加器 A命令键键值,设计命令键操作程
序入口跳转表。程序如下:
CLR C
RLC A ;乘 2,若用 LJMP指令则乘 3
MOV DPTR,#JPTAB
JMP @A+DPTR
JPTAB,AJMP CCS0
AJMP CCS1
AJMP CCS2
例 3-7 测试 P1口输入的 100个数中 0~9各数的概率分布程序
MOV 40H,#100
READ,MOV A,P1
CHK0,CJNE A,#0,CHK1
INC 30H
DJNZ 40H,READ
SJMP EEND
CHK1,CJNE A,#1,CHK2
INC 31H
DJNZ 40H,READ
SJMP EEND
CHK2,CJNE A,#2,CHK3
INC 32H
DJNZ 40H,READ
SJMP EEND
CHK3,CJNE A,#3,CHK4
INC 33H
DJNZ 40H,READ
SJMP EEND
CHK4,CJNE A,#4,CHK5
INC 34H
DJNZ 40H,READ
SJMP EEND
CHK5,CJNE A,#5,CHK6
INC 35H
DJNZ 40H,READ
SJMP EEND
CHK6,CJNE A,#6,CHK7
INC 36H
DJNZ 40H,READ
SJMP EEND
CHK7,CJNE A,#7,CHK8
INC 37H
DJNZ 40H,READ
SJMP EEND
CHK8,CJNE A,#8,CHK9
INC 38H
DJNZ 40H,READ
SJMP EEND
CHK9,INC 39H
DJNZ 40H,READ
EEND,SJMP $
2.5 位操作类指令
单元地址
2FH
2EH
2DH
2CH
2BH
2AH
29H
28H
27H
26H
25H
24H
23H
22H
21H
20H
7F
77
6F
67
5F
57
4F
47
3F
37
2F
27
1F
17
0F
07
MSB 位地址 LSB
7E
76
6E
66
5E
56
4E
46
3E
36
2E
26
1E
16
0E
06
7D
75
6D
65
5D
55
4D
45
3D
35
2D
25
1D
15
0D
05
7C
74
6C
64
5C
54
4C
44
3C
34
2C
24
1C
14
0C
04
7B
73
6B
63
5B
53
4B
43
3B
33
2B
23
1B
13
0B
03
7A
72
6A
62
5A
52
4A
42
3A
32
2A
22
1A
12
0A
02
79
71
69
61
59
51
49
41
39
31
29
21
19
11
09
01
78
70
68
60
58
50
48
40
38
30
28
20
18
10
08
00
RAM 位寻址区位地址表
助记符格式 机器码 (B) 相应操作 指令说明 机器周期
MOV C,bit 10100010 CY? bit 位传送指令, 结果影响 CY标志 2
MOV bit,C 10010010 bit? CY 位传送指令, 结果不影响 PSW 2
2.位置位和位清零指令
助记符格式 机器码 (B) 相应操作 指令说明 机器周期
CLR C 11000011 CY? 0 位清 0指令, 结果影响 CY标志 1
CLR bit 11000010
bit
bit? 0 位清 0指令, 结果不影响 PSW 1
SETB C 11010011 CY?1 位置 1指令, 结果影响 CY标志 1
SETB bit bit? 1 位置 1指令, 结果不影响 PSW 111010010
bit
1.位传送指令
3.位运算指令
助记符格式 机器码 (B) 相应操作 指令说明 机器周期
ANL C,bit 10000010 bit CY? CY∧ bit 位与指令 2
ANL C/bit 10110010 bit 位与指令 2
ORL,bit 01110010 bit CY? CY∨ bit 位或指令 2
ORL C/bit 10100010 bit 位或指令 2
CPL C 10110011 位取反指令 2
CPL bit 10110010 位取反指令, 结果
不影响 CY
2
CY? CY∧ bit
CY? CY∨ bit
CY?CY
bit?bit
例 3-8 设 A,B,D代表位地址,试编程实现 D
为 A与 B 之异或,即 D=AB+AB 。
MOV C,B
MOC D,C
MOV C,A
ANL C,/B
ORL C,D
MOV D,C
ANL C,/A ; C与 A相与
助记符格式 机器码 (B) 相应操作 机器周期
JB bit,rel 00100000bit rel 若 bit=1,则 PC?PC+3+rel,否则顺
序执行
2
JNB bit,rel 00110000 bit rel 若 bit=0,则 PC?PC+3+rel,否则顺
序执行
2
JBC bit,rel 00010000 bit rel 若 bit=1,则 PC?PC+3+rel,bit?0,
否则顺序执行
2
4.位转移指令
5.判 CY标志指令
助记符格式 机器码 (B) 相应操作 机器周期
JC rel 01000000 若 CY=0,则 PC?PC+2+rel,否则顺序执

2
JNC rel 01010000 若 CY≠0,则 PC?PC+2+rel,否则顺序执

2
常用伪指令
? 定位伪指令 ORG
? 定义字节数据伪指令 DB
? 定义字数据伪指令 DW
? 定义空间伪指令 DS
? 符号定义伪指令 EQU或=
? 数据赋值伪指令 DATA
? 数据地址赋值伪指令 XDATA
? 汇编结束伪指令 END
+
+
(P1.1) U
(P2.2) V
(TF0) W
(IE1) X
(20H.0) Y
(21H.1) Z
U(V+W)
Q (P3.3)
Q=U(V+W)(X+Y)Z
MOV C,P2.2
ORL C,TCON.5
ANL C,P1.1
MOV F0,C
MOV C,TCON.3
ORL C,/00H
ANL C,F0
ANL C,/09H
MOV P3.3,C
例 3-9 编程实现下图所示的逻辑功能
补例, 条件转移类指令范例 —— 方案一
还有什么方法实
现循环的终止?
将 00H~0FH这 16个数顺序地置入片内
RAM20H~2FH单元中。
MOV R0,#20H
MOV R7,#16
CLR A
LOOP,MOV @R0,A
INC A
INC R0
DJNZ R7,LOOP
SJMP $
JMP1.ASM
条件转移类指令范例 —— 方案二
MOV R0,#20H
MOV R7,#0FH
CLR A
LOOP,MOV @R0,A
INC A
INC R0
CJNE A,#0FH,LOOP
SJMP $
JMP2.ASM
条件转移类指令范例 —— 方案三
MOV R0,#20H
MOV A,#0FH ;
MOV 30H,#00H
LOOP,MOV @R0,30H
INC 30H
INC R0
DEC A
JNZ LOOP
SJMP $
JMP3.ASM
条件转移类指令范例 —— 方案四
MOV R0,#20H
MOV A,#0FH
MOV 30H,#00H
LOOP,MOV @R0,30H
INC 30H
INC R0
SUBB A,#01H
JNC LOOP
SJMP $
JMP4.ASM
练习 1
设内部 RAM中 33H单元中内容为 44H,34H单元中
内容为 0AFH,R0中内容为 33H,R1中内容为 00H,给
出以下每一条指令执行后 A中的值和 PSW中 P的值。
MOV A,#34H
MOV A,34H
MOV A,R1
MOV A,@R0
注意:对 PSW中 P标志的影响。
练 习 2
设内部 RAM30H单元中内容为 52H,请给出以下程
序结果:
MOV A,#30H
MOV A,30H
MOV R0,#30H
MOV A,@R0
MOV 30H,#30H
设 P1口内容为 0AAH( P1口地址为 90H),请给出
以下程序结果:
MOV R0,#30H
MOV 10H,P1
MOV A,10H
MOV @R0,A
MOV 40H,@R0
本章主要知识点
? 指令的七种寻址方式。
?难点:寄存器间接寻址
? 各类指令的主要功能。
?难点:查表指令
?难点:条件转移指令
? 作业,2.2 2.4 2.6










本章内容
Single Chip Microcomputer
§4-0概述
§4-2 运算程序设计
§4-3 数据的拆拼和转换
§4-1 循环程序设计
§4-5 查表程序
§4-6 散转程序设计
§4-7 I/O端口控制程序
§4-8 子程序调用时的参数传递
概 述
? 最早人们只能用 机器语言 (二进制)编写程序;
? 为了方便记忆,人们开始用助记符形式的汇编语言编写
程序,称为 低级语言 。然后再用汇编系统将其翻译成机
器语言,该过程称为 汇编 ;
? 为了用更接近人的语言编写程序,程序设计师们发明了
高级语言,如,BASIC,FORTRAN,PASCAL、
? C,JAVA
然后再用编译系统将其翻译成机器语言,该过程称为 编
译 ;
? 机器只能识别机器语言。所以必须用编译系统将高级语
言编写的源程序编译成机器语言,用汇编系统将用汇编
语言编写的源程序汇编成机器语言;
? 由低级或高级语言构成的程序称为 源程序,由机器语言
构成的程序称作 目标程序 ;
一、设计语言
源程序 目标程序
低级语言 机器语言
汇编
高级语言 机器语言编译
二、程序设计方法
一、程序设计
利用计算机能够接受的语言把解决问题的方法和步骤
描述出来,也就是编制计算机的程序,人们常说的软件设
计。 对于单片机应用程序,我们可以把它看成是操作系统
和应用软件的集合。
二、程序设计步骤
用汇编语言编写一个程序的过程大致可分为以下几
个步骤:
1、分析问题,明确所要解决问题的具体要求。
2、确定算法。根据实际问题的要求和指令系统的
特点,决定所要采用的计算公式和计算方法,这就是常
说的算法。算法是进行程序设计的依据,它决定了程序
的正确性和程序的质量。
3、制定程序框图。根据算法,制定出运算步骤的顺
序,再把运算过程画成流程图。
4、确定数据格式,分配工作单元,将程序框图进
一步细化。
5、根据流程图和指令系统,编写出汇编语言源程
序。
6、程序测试。由于单片机没有自开发功能,因而
必须借助仿真器,以单步、断点、连续方式调试程序,
直到完全正确为止。特别地,对于有硬件的应用系统,
必须将软件和硬件结合起来调试,直到软件、硬件能协
调一致,浑然一体为止。
7、程序优化。 这一环节很容易被广大设计人员所
忽略。它是指从程序结构上对程序加以调整,精减一
些冗余指令,以加快程序的执行速度,节省程序存储
空间,从而提高系统的可靠性。
三、程序设计实例引入
? 实例
假设一个班有 50个人,
共有 3门选修课:
? 计算机算法
? 服装 CAD设计
? 德语
请找出:
? 同时选了三门课的同学;
问题的解决
?第一步
如何在计算机中表示选修某门课的所有
同学
5
12
23
25
2
25
39
29
39
4
12
25
29
39
计算机算法 服装 CAD设计 德语
选修这门人数
学生的学号
这个过程实际上是设计数据结构的问题
问题的解决
?第二步
设计思路:找出同时选了三门课的同学
这个过程实际上是设计算法的过程,既构建模型。
计算机算法 CAD设计
德语
重复该过 程








找出第一个学生
他选了德语吗?
他选了 CAD吗?
记录要找的人
还有学生吗?
下一个学生
N
N
Y
N
Y
Y
结束
他选计算机吗?
N
Y
几点启示
?整体构思;
?构建整体流程框图;
?结构合理,流程清晰,简单明了;
?局部模块化;
为什么要用流程图?
? 符合人进行逻辑思考的习惯
? 计算机从根本上来说,没有任何逻辑
性,所以,你必须告诉它,先做什么,
后做什么,遇到什么情况又该做什么,
等等
? 流程图设计本身是一个逐步求精的过
程,最终将任务划分为若干能由机器
指令实现的小模块
§ 4-1 循环程序设计
一、循环程序结构 开 始
N
结 束
Y
循环结束控制
修改控制变量
循环工作部分
置初值
在单片机应用程序设计中,
循环程序的使用非常广泛。单循
环的结构如下图所示:
其主体为循环体,由循环
工作部分和修改控制变量构成。
同其他语言一样,循环
程序可以实现嵌套,构成多重
循环。但切不可形成交叉。只
能将整个循环程序作为外循环
的循环体。
二、循环程序设计举例
例 1、延时程序设计
DELAY,MOV R7,#200 ; 1个机器周期
DE1,MOV R6,#123 ; 1
NOP ; 1
DE2,DJNZ R6,DE2 ; 2
DJNZ R7,DE1 ; 2
RET ; 2
如晶体振荡器频率为 12MHz,则其延时时间为:
1+( 1+1+2*123+2) *200+2=50.003ms
这是一个 50ms的精确延时程序。
DELAY.ASM
在 RAM中,从 50H开始连续存放 N个单字节无符
号数,N存放的 R2中,试编程求这 N个数的和,结果
放在 R4R3中。程序清单如下:
NSUM,MOV R0,#50H
LOOP,MOV A,R3
ADD A,@R0
MOV R3,A
CLR A
ADDC A,R4
MOV R4,A
INC R0
DJNZ R2,LOOP
RET
例 2、数据求和
§4-2 运算程序设计
一、多字节加法
例 4-3-1 设有两个 4字节的二进制数 2F5BA7C3H和
14DF35B8H,分别放在以 40H和 50H为起始地址的单元中(低
位在低地址),试编程求这个数之和,结果放在以 40H为起
始地址的单元中。
ORG 0000H
LJMP JAFA
ORG 0100H
JAFA,MOV R0,#40H
MOV R1,#50H
MOV R2,#04H
LCALL JASUB
LJMP $
以上为主程序
JASUB,CLR C
JASUB1,MOV A,@R0
ADDC A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R2,JASUB1
RET
END MULADD.ASM
ADDC A,Rn
ADDC A,direct
ADDC A,@Ri
ADDC A,#data
本程序适合于 N个字节的两数求和,
但并不严密,当最后一次加法有迚位时
并没有相应处理,实际应用时应根据实
际情冴稍作修改。
例 2,有两组 BCD码分别存放在 23H,22H单元和 33H,32H单元,
求它们的和并送入 43H,42H单元中去。 (高位在前,低位在后 )
分析,
··
·
··
·
··
·
32H
33H
42H
A
22H
23H
43H
··
·
00111000
01100101
00010001
10000111
BCD码 83H
BCD码 11H
补,多字节 BCD码加法
例 2,有两 组 BCD码(如,1183H和
5678H),分别存放在 23H,22H单元和
33H,32H单元,求它们的和,并送入
43H,42H单元中去。 (高位在前,低位
在后 )
解:
流程图 (框图 )如何?
请同学们自己绘制流
程图。
开始
(22H)?A
(32H)+A?A
十进制调整
(33H)+A?A
A?(43H)
结束
A?(42H)
(23H)?A
十进制调整
ORG 0000H
MOV A,22H
ADD A,32H
DA A
MOV 42H,A
MOV A,23H
ADDC A,33H
DA A
MOV 43H,A
SJMP $
END
此条加法指令可否
改用带进位的 (ADDC)?
开始
(22H)?A
(32H)+A?A
十进制调整
(33H)+A?A
A?(43H)
结束
A?(42H)
(23H)?A
十进制调整
ORG 2000H
CLR C
MOV A,22H
ADD A,32H
DA A
MOV 42H,A
MOV A,23H
ADDC A,33H
DA A
MOV 43H,A
END
··
·
··
·
··
·
32H
33H
42H
A
22H
23H
43H
··
·
1000 0011
0101 0110
0001 0001
0111 1000
1000 0011
0111 1000+
1111 1011
0110 0001
0001 0001
0101 0110
0110 0111
0110 1000
PC
PC
PC
PC
PC
PC
PC
PC
PC
1111 10110110 0001
PC
1000
PC
10 011
多字节 BCD码加法 (P53)
与多字节加法程序类似,但需在加法
指令后加一条十迚制加法调整指令。 主程
序与前面相同。
DADD:CLR C
JAD1,MOV A,@R0
ADDC A,@R1
DA A
MOV @R0,A
INC R0
INC R1
DJNZ R2,JAD1
RET
ORG 0000H
LJMP JABCD
ORG 0100H
JABCD:
MOV R0,#40H
MOV R1,#50H
MOV R2,#04H
LCALL DADD
LJMP $
以上为主程序 BCDADD.ASM
二、多字节减法
多字节减法程序和多字节加法程序类似,
只需将加法指令换为减法指令即可。
例 4-3-2 在 43H~40H依次存放被减数
443ADD7BH;在 53H~50H中依次存放减数
14DF35B8H,试编程求二者之差
ORG 0000H
LJMP JIAN
ORG 0100H
JIAN,MOV R0,#40H
MOV R1,#50H
MOV R2,#04H
LCALL JIANSUB
LJMP $
以上为主程序
JIANSUB,CLR C
JIAN1,MOV A,@R0
SUBB A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R2,JIAN1
RET
END
此程序也可以推广到 N个字节的情况。
四、多字节数乘法
MCS-51系列单片机指令系统仅能提供 8位乘法指令
若需迚行 8位以上的乘法运算,则需通过编程实现。
设 (R4)(R3)中为十六位被乘数,R2中为 8位乘数,其
积存放在 R7R6R5中。
由于 (R4)(R3)*(R2)=[(R4)*256+(R3)]*(R2)
=(R4)*(R2)*256+(R3)*R2
R4 R3
B A
R6 R5R7
B A+
R2×
(R4)*(R2)*256
(R3)*(R2)
CHENFA,MOV A,R2
MOV B,R3
MUL AB ;(R3)*(R2)
MOV R5,A
MOV R6,B
MOV A,R2
MOV B,R4
MUL AB ;(R2)*(R4)
ADD A,R6
MOV R6,A
MOV A,B
ADDC A,#00H
MOV R7,A
RET
五、多字节除法
51指令系统提供一条 8位的除法指令,但要想用于
多位除法运算则较为困难。因此,在进行多字节除法运
算时,多采用手工算法相同的思路。
被除数除数
商数
— 除数
余数
— 除数
余数
— 除数
…...;够减则商 1,否则商 0;够减则商 1,否则商 0并恢复余数;够减则商 1,否则商 0并恢复余数
以上为右移对齐的手工算法,计算机的算法仍采用
这种方法,只不过是采用左移对齐的办法,称为“恢复
余数法。
R6 R5Cy
R2—
被除数
除数
商数,够减则商 1,否则商 0
并恢复余数R5
除法次数 -->R7
清进位,(R6)(R5)左移一位
移出一位 -->标志位
(R6)-(R2)
标志位 =1?
保存余数
(R7)-1=0?
商 1
Y
N
商 0并恢复余数
Y进位位 =1?N
N
返回
Y
程序清单,
DSUB:MOV R7,#08H
DV1,CLR C
MOV A,R5
RLC A
MOV R5,A
MOV A,R6
RLC A ;被除数左移 1位
MOV 07H,C
CLR C
SUBB A,R2
JB 07H,GOU ;07H=1,则够减
JNC GOU ;C=0,则够减
ADD A,R2 ;恢复余数
AJMP DV2
GOU,INC R5 ;商 1
DV2,MOV R6,A ;保存余数
DJNZ R7,DV1
RET
本程序仅适用于商小于 255的情冴,即
R6<R2,若商大于 255,必须加以适当调
整。
本程序关键在于商只有, 0”或, 1”两
种情冴,因此,每次商, 1”均采用左移后
加 1的方法来实现。
§4-3 数据的拆拼和转换
在实际应用中,经常会遇到实际需要的数据格式同得
到的数据格式不完全相符的情况,如采集到的数据、运算
的结果、输出的数据等,这就需要对其进行适当的转换,
以符合实际情况的要求。这就是通常所说的数据拆拼和转
换。一、数据的拆拼
BBCD:MOV A,7CH
ANL A,#0FH
MOV R5,A
MOV A,7CH
ANL A,#0F0H
SWAP A
MOV R6,A
RET
例 4-4-1 转换前 7CH中为压缩 BCD码 XY
程序清单:
0Y0X转换后 R6R5中为非压缩 BCD码
例 4-4-2 拆拼前 (20H)=X7X6X5X4X3X2X1X0
拆拼后 (21H)= X0X1X2X3X4X5X6X7
DESORT,MOV A,20H
MOV R6,A
MOV R7,#08H
RESO,CLR C
MOV A,R6
RLC A
MOV R6,A
MOV A,21H
RRC A
MOV 21H,A
DJNZ R7,RESO
RET
A5 A0 0A2 A1A4 A3A6
0 0 00 00 0A7
A7
A4 0 0A1 A0A3 A2A5
A7 0 00 00 0A6
A6
补充内容
例 1,将 20H单元的两个压缩 BCD码拆开变成 ASCII码,存入 21H,22H
单元。 (假设 20H中的 BCD码为 00110100)
什么是 BCD码?
什么是 ASII码?
BCD码与 ASII码关

··
·
··
·
··
·
20H
21H
22H
A
B
0011 压缩 BCD码
0011
0011
0100
低四位 ASII码
高四位 ASII码
压缩 BCD码拆开变成 ASCII码
方法 1,将 BCD码除以 10H,恰好是将 BCD
码分别移到了 A,B的低 4位。然后再各自
与 30H相 或,即成为 ASCII码。
方法 2,利用半字节交换指令来实现。
二、数据的转换
在计算机内部,仸何数据都是以二迚制的形式存
储,但是,当我们在作 I/O操作时,往往需要其它形式
的数据栺式,如 ASCII码,BCD码、八迚制数等,这就
需要做一些数据栺式的互换操作。
1,ASCII码到二进制数的相互转换
二进制与 ASCII码的相互关系为:
数字 0~9对应的 ASCII码为 30H~39H,即加 30H
字母 A~F对应的 ASCII码为 41H~46H,即加 37H
(1)ASCII到二进制的转换
通过以上介绍的二者之间的关系,不难画出流程图:
开始
取操作数
清进位标志
减 30H
差 >9?
转换正确
结束
减 07HY
转换正确
N
ASCTOHEX:
MOV A,R2
CLR C
SUBB A,#30H
MOV R2,A
CJNEA,#0AH,NEXT
NEXT,JC TOK
SUBB A,#07H
TOK,MOV R2,A
RET
例 4-4-3 转换前 R2为 ASCII码,转换后 R2为二进制
(2)二进制到 ASCII码
HEXTOASCII:
MOV A,R2
ANL A,#0FH
ADD A,#90H
DA A ;若 R2>9,则加 66H,且产生 Cy
ADDC A,#40H
DA A
MOV R2,A
RET
例 4-4-4 转换前 R2为二迚制,转换后 R2为 ASCII码
当二迚制数 <0AH时,加 30H即得相应的 ASCII,当二迚制数介于 0AH、
0FH之间(包拪 0AH,0FH),则加 37H即得到相应的 ASCII。下例
为另一算法。
2,BCD码与二迚制的相互转换
(1)BCD到二进制的转换
3615=3*103+6*102+1*10+5
=[(3*10+6)*10+1]*10+5
由压缩 BCD码到非压缩 BCD码的转换较为简单,
在前面我们已经涉及,在此不再重复。
例 4-4-5 如下图所示
15H
36H41H
40H
压缩 BCD码
3H
6H
1H
5H
43H
42H
41H
40H
非压缩 BCD码
1FH
0EHR3
R2
二进制数
高位 BCD码的地址 ->(R0)
计数初值 3->(R7)
初值送结果单元 0->(R3)
((R0))->(R2)
(R3R2)*10->(R3R2)
(R0)-1->(R0)
(R3R2)+((R0))+(Cy)->(R3R2)
(R7)-1=0?
结束
Y
N
3615=3*103+6*102+1*10+5
=[(3*10+6)*10+1]*10+5
R3R2
3H
6H
1H
5H
43H
42H
41H
40H
R0
MOV R0,#43H ;指向高位
MOV R3,#00H ;结果单元清零
MOV A,@R0
MOV R2,A ;转换初值送 R2
ML10,MOV A,R2
MOV B,#0AH
MUL AB ;R2乘 10
MOV R2,A ;暂存 R2*10低位
MOV A,B
XCH A,R3 ;暂存 R2*10高位
MOV B,#0AH
MUL AB ;R3*10
ADD A,R3 ;R3*10低位加
MOV R3,A ;为什么不处理 B
BCDHEX,MOV R7,#03H ;计数初值
MOV A,@R0
ADD A,R2 ;结果与低单元相加
MOV R2,A
MOV A,R3
ADDC A,#00H;加低位迚位位
MOV R3,A ;保存结果
DJNZ R7,ML10
RET
由于二位压缩 BCD码的表示范围为 0~9999,
其对应二迚制为 0~270H,不会超过两个字节,因
而不必考虑 R3*10的高位。
JAFA,DEC R0 ;指向下一位
例 4-4-6 如下图所示
(2) 二进制到 BCD的转换
15H
36HR3
R2
二进制数
3H
8H
4H
5H
43H
42H
41H
40H
非压缩 BCD码
1H44H
如上图所示,双字节二进制数的表示范围为
0~65535,因而需要 5个 BCD码位来表示。从二进制到
BCD码,我们采用连减的办法,其原理如下:
待转换的二进制数 -104
够减,万位加 1,再减
不够减,恢复余数,再减 103以此类推,直到得到个位为止。
104=2710H 103=03E8H 102=0064H 10 =0AH
BBCD:MOV R0,#44H ;数据指针
MOV R7,#04H ;计数初值
MOV DPTR,#PWTAB
MOV R6,#00H ;偏移量
BBC1:MOV A,R6
MOVC A,@A+DPTR
MOV R4,A ;查幂值表低位
INC R6
MOV A,R6
MOVC A,@A+DPTR
MOV R5,A ;查幂值高位
INC R6
MOV @R0,#00H
MOV A,R2
SUBB A,R4 ;减低位
MOV R2,A
MOV A,R3
SUBB A,R5 ;减高位
MOV R3,A
JC BBC3 ;不够减则恢复余数
INC @R0 ;够减则结果单元加 1
SJMP BBC2
BBC3:MOV A,R2
ADD A,R4 ;恢复余数低位
MOV R2,A
MOV A,R3
ADDCA,R5 ;恢复余数高位
MOV R3,A
BBC2:CLR C
DJNZ R7,BBC1 ;未减完则继续
MOV A,R2
MOV @R0,A ;保存个位
RET
PWTAB:DB 10H,27H ;10000
DB 0E8H,03H ;1000
DB 64H,00H ;100
DB 0AH,00H ;10
DEC R0 ;指向下一单元
§ 4-5 查表程序
查表程序中一种常用的非数值运算程序,应
用非常广泛。使用查表程序可以完成数据的
补偿、计算、转换等各种功能,具有程序简
单、执行速度快、精度高等优点,而这正是
单片机在测控场合或智能化仪表中所需要的。
一、以 DPTR为基地址的查表程序
MOVC A,@A+DPTR
1、其操作步骤如下:
? 初始化 DPTR,将表格的首地址放入 DPTR
中,作为基地址。
? 初始化 ACC,A中应该放所要查询的数据在
表格中的顺序号。
? 执行结果, 在执行该指令后,A中存放的是
在表格中查到的数据。
注意事项
? 在查询表格时,若所要查询的数据是双字
节的,则在初始化 A中的数应为顺序号的 2
倍,且应执行两次本指令。
? 对于单字节表格而言,表项的个数应不大
于 256个,若大于 256时,则应适当修改
DPTR的值。
? 表格的存放位置。
二、以 PC为基地址的查表指令
? MOVC A,@A+PC
表格存放地址 =PC+偏移量 +X(表项 )
1、操作步骤
? (1) 将待查表的项数送给 ACC。
? (2) 叠加偏移量,表头和当前 PC的地址偏移量
加到表项上。
? (3) 执行结果。
2、注意事项
? (1) 对于双字节表格,其处理方法与以 DPTR
为基地址的情况相同。
? (2) 对于单字节表格而言,其项数应不大于
256。
? (3) 对于双字节表格而言,其项数应不大于
128。
三、两种方式的比较
1,PC仅能对所谓本地表格操作,即表格项数
不得大于 256,且偏移量可能随程序的变化
而变化,计算较为麻烦,其优点是少用寄存
器。
2,DPTR使用起来非常灵活,表项数不受限制,
且表格可以放在 64K的任意地方。
例 4-5-1
设有一个巡回检测报警系统需对 16路输入值
进行比较,当每一路输入值超过该路的报警
值时实现报警。
?函数 Y的内存地址 =函数表首地址 +( X*2)
?查表前,路数 Xi在 R2中,查表后的 值存放在
(R4R3)中。
查表程序清单
? TB1,MOV A,R2
? ADD A,R2 ;路数 Xi*2?A
? MOV R3,A ;保存
? ADD A,#data ;data=
? MOVC A,@A+PC ;1
? XCH A,R3 ;1
? ADD A,#data+1;2 ;data=?
? MOVC A,@A+PC ;1
? MOV R4,A ;1
? RET ;1
? TAB1,DW 05F0H,0E89H,0A695H,1EAAH
DW 0D9BH,7F93H,0373H,26D7H
? DW 2710H,9E3FH,1A66H,22E3H
? DW 1174H,16EFH,33E4H,6CA0H
例 4-5-2
在一个温度测量装置中,测出的电压与温度
为非线性关系。设测得的电压为 X,用 10位二
迚制数表示。现要求采用查表法实现线性化
处理。
V
TT1
V1
非线形
V1=KT1
分 析
? 10位二进制位的表示范围为 0~1023,因而有
1024个电压值,从而可以建立一个表格,其
项数为 1024个。
?存放温度值 Y的单元地址 =表首地址 +( X*2)
?设测得的电压值已存放在 20H,21H中,
(20H为高字节 ),查表后的温度值存放在 22H,
23H中,(22H为高字节 )。
例 4-5-2 程序清单
? LTB2,MOV DPTR,#TAB2
? MOV A,21H; (20H21H)*2
? CLR C
? RLC A
? MOV 21H,A
? MOV A,20H;表首 + (20H21H)*2
? RLC A ;为什么不清 C
? MOV 20H,A
? MOV A,21H
? ADD A,DPL
? MOV DPL,A
? MOV A,20H
? ADDCA,DPH;为什么带进位加
? MOV DPH,A
测得的电压值
存放 (20H21H)
中 (20H为高字
节 ),查表后的
温度值存放在
(22H23H)中
(22H为高字节 )
例 4-5-2 程序清单 (续 )
? CLR A ;查表 为什么清 A
? MOVC A,@A+DPTR
? MOV 22H,A
? INC DPTR
? CLR A
? MOVC A,@A+DPTR
? MOV 23H,A
? RET
? TAB2,DW ………….,;温度表值
? DW …………..
§ 4-6 散转程序设计
在程序设计中,不外有三种情
况,顺序, 循环和条件分支程
序 。其中顺序程序设计最为简
单,而循环程序设计在前面已
经学习过。分支程序 (如下图
所示 )又可分为两大类,字节
条件和位条件,即 CJNE和 JC、
JB,JZ类指令。位条件转移
指令很容易实现简单条件转移,
当要实现多分支转移时,可以
通过 CJNE来实现,这就是所
谓散转程序设计,但实现起来
则较为麻烦。
(A)=0?
Y
Y
Y
(A)=1?
N
(A)=2?
N
N
例 4-6-1
测试 P1口输入的
100个数中 0~9各
数的概率分布程序
(A)=0? Y
Y
Y
(A)=1?
N
(A)=2?
N
N
操作 0
操作 1
操作 2
终点
MOV 40H,#100
READ,MOV A,P1
CHK0,CJNE A,#0,CHK1
INC 30H
DJNZ 40H,READ
SJMP EEND
CHK1,CJNE A,#1,CHK2
INC 31H
DJNZ 40H,READ
SJMP EEND
CHK2,CJNE A,#2,CHK3
INC 32H
DJNZ 40H,READ
SJMP EEND
CHK3,CJNE A,#3,CHK4
INC 33H
DJNZ 40H,READ
SJMP EEND
CHK4,CJNE A,#4,CHK5
INC 34H
DJNZ 40H,READ
SJMP EEND
CHK5,CJNE A,#5,CHK6
INC 35H
DJNZ 40H,READ
SJMP EEND
例 4-6-1 程序清单 (教材 P45)
CHK6,CJNE A,#6,CHK7
INC 36H
DJNZ 40H,READ
SJMP EEND
CHK7,CJNE A,#7,CHK8
INC 37H
DJNZ 40H,READ
SJMP EEND
CHK8,CJNE A,#8,CHK9
INC 38H
DJNZ 40H,READ
SJMP EEND
CHK9,INC 39H
DJNZ 40H,READ
EEND,SJMP $
利用条件转移类
指令来实现分支,程
序较为简单,容易实
现,但应特别注意的
是,在分析问题时,
一定要逻辑严密,充
分判断出各种可能出
现的条件标志。
二、利用转移指令来实现的程序散转
? JMP @A+DPTR
? 其执行过程可以分为三步:
? (1)将转移表首地址送入 DPTR作为基地址。
? (2) 将条件标志单元内容装入 A中作为变址,在装
入前,还应根据转移表项内容作相应变化。
? (3)实现转移 。
? 我们可以根据转移表的不同来分为三种散转程序:
1、采用 转移指令表 的散转程序设计
这类散转程序的核心部分 —— 转移表部分由
无条件转移指令 AJMP或 LJMP构成。
其转移范围分别为 64K或 2KBytes。
例 4-6-2 要求根据 R7的内容转向各个
操作程序 。
? 即( R7) =0,转向 OPR0
? 即( R7) =1,转向 OPR1
? 即( R7) =2,转向 OPR2
? ……………………………
? 即( R7) =n,转向 OPRn
例 4-6-2程序清单
? JUMP1,MOV DPTR,#JPTAB1
? MOV A,R7
? ADD A,R7 ; (R7)*2?(A)
? JNC NOAD ;判断是否有进位,
? INC DPH ;有加到高字节地址
? NOAD,JMP @A+DPTR
? JPTAB1:AJMP OPR0
? AJMP OPR1
? ……………..
? AJMP OPRn
例 4-6-2 注意事项
( 1)在本例中,由于 AJMP指令的指令长度为 2个字
节,因而在散转时采用自加的方法使变址实现乘 2;
若改用 LJMP指令,由于其指令长度为 3字节,因而
应使变址乘 3来修下正。当修正产生进位时,要将
进位加到 DPH中。
(2) 由于 R7是单字节,因而散转点不能大于 256个。
为了克服此局限性,我们考虑:通过修改 DPTR的
办法来增加散转点,使这最大散转点 N可达到
N<=(最大存储容量 — 散转表首地址 )/3。
例 4-6-3 要求根据 R6R7中的数据转向
对应的操作程序 (P65)
JUMP2,MOV DPTR,#JPTAB2
MOV A,R6
MOV B,#03H ;(R6)*3?(BA)
MUL AB
ADD A,DPH
MOV DPH,A
例 4-6-3续
MOV A,R7
MOV B,#03H
? MUL AB
? XCH A,B
? ADD A,DPH
? MOV DPH,A
? XCH A,B
? JMP @A+DPTR
? JPTAB2:LJMP OPR0
? LJMP OPR1
? ……………..
? LJMP OPRn
2、采用 转向地址偏移量表 散转程序
本方法的关键在于建立一个转向地址偏移量
表,需要程序员认真计算,否则会产生错误。
4-6-4 要求按 R7的内容转向 5个操作程序。
JUMP3,MOV A,R7
MOV DPTR,#TAB3
MOVC A,@A+DPTR
JMP @A+DPTR
TAB3,DB OPR0-TAB3
DB OPR1-TAB3
…………………….
DB OPR4-TAB3
OPR0:
OPR1:
OPR2:
…… 本例的散转范围小于 256,同上例一样,本例也可通过
变通的方法,使这能在 64K范围内实现散转。
3、采用转向地址表的散转程序 (P66)
本方法的关键在于将散转点的地址直接建立
表格,然后利用查表程序,从而实现散转。
例 4-6-5 要求根据 R7的内容转向相应的操作程
序中去,设各操作程序有入口地址分别为
OPR0,OPR1,…,OPRn
例 4-6-5程序
? MOV DPTR,#TAB4 ;指向地址表
? MOV A,R7
? ADD A,R7 ;R7*2
? JNC NADD
? INC DPH ;加进位
? NADD:MOV R3,A
? MOVC A,@A+DPTR ;查高位地址
? XCH A,R3
? INC A
? MOVC A,@A+DPTR ;查低位地址
? MOV DPL,A
? MOV DPH,R3
? CLR A
? JMP @A+DPTR ;实现散转
例 4-6-5程序 (续 )
TAB4,DW OPR0 ;低位字节在高地址
DW OPR1
DW OPR2
…………….
DW OPRn
本例也能通过修改 DPTR的方法来使散转点大
于 256个。
三、采用,RET”指令的散转程序
本方法的关键在于将操作程序的目的地址压
入椎栈,然后通过,RET”指令来将目的地址
弹入到 PC中,从而实现程序转移。即利用
RET指令来代替两个 POP指令。
例 4-6-6
要求根据 R7的内容转向各处操作程序,设各
操作程序的转向地址分别为
OPR0,OPR1,…..OPRn
例 4-6-6程序
JUMP5,MOV DPTR,#TAB5
MOV A,R7
ADD A,R7 ;R7*2
JNC NADD
INC DPH
NADD,MOV R3,A
? MOVC A,@A+DPTR ;查高位地址
? XCH A,R3
? INC A
? MOVC A,@A+DPTR
? PUSH ACC ;低位地址
? PUSH 03H ;PUSH R3高位地址
? RET
? TAB5,DW OPR0 ;转地址表
? DW OPR1
? …………….
? DW OPRn
小结
以上方法可灵活使用,需对地址差值进行计
算的方法,其差值会因程序的变化而变化,
使用时要小心从事。对于椎栈操作不太熟悉
的同学,在使用,RET”实现散转时,更要小
心谨慎。
§ 4-7 I/O端口控制程序
通过前面的学习,我们知道单片机有 32个 I/O
口可供编程者使用。由于结构上的原因,I/O
口作为输出时,由于端口具有锁存功能,不
需外接锁存器;但是,当把它作为输入口时,
虽然具有输入缓冲器,但不具有输入锁存器,
因此在 CPU完成读引脚前,输入的数据必须
一直保持在引脚上。为此,我们需要借助一
些特定的接口电路来实现输入功能。
一,BCD拨码盘与单片机的接口
如右图所示,A为公共
端,当 A接 VCC时,拨
码盘输出 正逻辑,当 A
接 GND时,拨码盘输
出 负逻辑 。其输出范围
为 0000~1001,因而称
之为 BCD拨码盘。类
似于电度表的计量数字。
BCD拨码盘与单片机的接口
BCD拨码盘与单
片机的接口电路
如右图所示:通
过读取 P1口的低
四位即可获得
BCD拨码盘的状
态信息 。
二、多片 BCD拨盘与单片机的接口
? 如图所示:通过对 P1口
的高四位进行扫描,使
P1.4~P1.7依次为,0”,
然后查询 P1口低四位的
状态,从而得到拨盘的
状态信息。
? 由于拨盘在控制端为
,0”时选中该位,因此
拨盘的输出为反码,经
与非门后,读出的状态
信息为正码。
三、拨码输入程序
? 将 4位 BCD码按千,百,十,个位依次读入,然后存放在
30H_33H中。
? RDS,MOV R0,#30H
? MOV R2,#7FH
? MOV R3,#04H
? LOOP,MOV A,R2
? MOV P1,A
? MOV A,P1
? ANL A,#0FH
? MOV @R0,A
? INC R1
? MOV A,R2
? RR A
? MOV R2,A
? DJNZ R3,LOOP
? RET
§ 4-8 子程序调用时的参数传递
? 在进行程序设计时,为保证程序的高效、可靠的运
行,增加程序的可读性、可懂性,我们提倡结构化
编程,而结构化编程的重要一点就是 子程序的编制。
? 在进行程序设计时,有些程序段是被多次使用
到,但每次使用时,需要对某个寄存器的内容稍作
修改。为了避免多次多次重复编写同样的程序,节
省存储空间,我们就可以把这样的程序段独立出来,
形成一个独立的子程序,每次要使用前,先对需要
修改的寄存器进行修改后,用 ACALL或 LCALL调
用,这里修改的寄存器我们称之为入口参数,子程
序执行的结果,我们称之为出口参数,参数修改方
式则称之为参数传递。
一、通过寄存器传递参数
?这种方法应用最为广泛、
也最易使用,它是在调用
子程序之前,对需要修改
的寄存器预先修改后,再
来调用子程序。
例 4-8-1 试编程对 30H~3AH单元清零
? MAIN,………..…………
? MOV R0,#30H
? MOV R7,#0AH
? LCALL SUBRT
? ………………….
? SUBRT,MOV A,#00H
? RESU,MOV @R0,A
? INC R0
? DJNZ R7,RESU
? RET
二、通过椎栈传递参数
例 4-8-2 试编程对 30H~3AH单元清零
MAIN,……………..
MOV 70H,#30H
MOV 71H,#0AH
PUSH 70H
PUSH 71H
LCALL SUBRT
………………………
SUBRT:POP DPH
POP DPL
POP 07H
POP 00H
SUB1,MOV A,#00H
LOOP,MOV @R0,A
INC R0
DJNZ R7,LOOP
PUSH DPL
PUSH DPH
RET
对于简单程序而言,
这种方法反而较笨,较
易引起混淆。
三、利用数据指针传递参数
?在这种方法中,待传递的参数不是放在调用
指令之前,而是紧跟在调用指令之后,此法
对参数量大的情况特加有用。
?例 4-8-3 将表格中的数据送打印机打印
? MAIN,……………..
? ACALL PRINT
? DB ‘THIS IS AN EXAMPLE
? DB 0AH,0DH,00H
? NEXT,…………………
? PRINT:POP DPH
? POP DPL
? PPP1,MOV A,#00H
? MOVC A,@A+DPTR ;查表
? INC DPTR
? JZ PPEND ;判断是否结束
? PPP2,…………….,;打印子程序
? ……………..
? SJMP PPP1 ;未完则继续
? PPEND:JMP @A+DPTR;转向主程序 NEXT处,取代返回
指 ;令
本章作业,1,2,4,8











本章内容
Single Chip Microcomputer
§5-1 定时 /计数器工作原理及结构
§5-3 定时 /计数器的工作方式
§5-4 定时 /计数器的应用举例
§5-2 定时 /计数器方式和控制寄存器
第五章 MCS-51单片机内部定时 /计
数器及其应用
51系列单片机内部提供 2个定时 /
计数器 T0和 T1,即可用作 定时器,
也可用作 计数器,还可作为 串行口
的波特率发生器,定时 /计数器同软、
硬件结合使用,可给应用系统的设
计带来很多方便之处。
§ 5-1定时 /计数器的工作原理及结构
TRi
一、计数器的工作条件 1、
控制信号有效,1” 2,
有计数信号源
二、脉冲输入
方式 1、定时:
C/T=0,计数脉
冲 fosc/122、
计数,C/T=1,
计数脉冲从 Ti
端输入
三、定时 /计数器工作原理
1、定时方式,C/T=0,当控制信号为,1”时,每一个
机器周期,加 1计数器做一次加 1操作,直至加到全
,1”,再过一个机器周期,计数恢复为全,0”,且
TFi=1。
2、计数方式,C/T=1,当控制信号为,1”时,外部计
数脉冲加在 T0( P3.4)或 T1(P3.5)引脚上,在该引脚
上每产生一个下降沿,加 1计数器做一次加 1操作,
直至加到全,1”,再产生一个下降沿,计数恢复为
全,0”,且 TFi=1。其计数频率比定时器方式低,
应不大于 fosc/24。
四、定时 /计数器是可编程的
定时 /计数器的工作方式分别有 8位,13位和
16位三种长度,它在后台运行,程序的运行
和定时 /计数器的加 1操作是并行的。我们可
通过查询 TFi的状态来了解它的工作情况。可
通过预设计数器的初值来改变计数长度 。
五、定时 /计数器的硬件构成
TMOD,TCON分别控制定时 /计数器的工
作状态和工作方式。 TH0,TL0,TH1,TL1
分别为 T0,T1的加 1计数器。
§ 5-2 定时 /计数器的方式和控制寄存

?定时 /计数器是可编程的,程序员只需对几个
特殊功能寄存器进行简单的操作,既可完成
对定时 /计数器的操作。这几个特殊功能寄存
器为 TH1,TL1,TH0,TL0,TCON和
TMOD
? TH0,TL0和 TH1,TL1分别是定时 /计数器
的计数核心,但加 1计数器的运行则由 TMOD
和 TCON来控制。
一、定时器方式寄存器 TMOD
TMOD格式如下:
1、定时 /计数器工作方式选择位
TMOD D7 D6 D5 D4 D3 D2 D1 D0
88H GATE C/T M1 M0 GATE C/T M1 M0
定时器 1 定时器 0
1、定时 /计数器工作方式选择位
表 5.1 方式选择位意义
M1 M0 工作方式 功能说明
0 0 方式 0 13位计数器
0 1 方式 1 16位计数器
1 0 方式 2 自动再装入 8位计数器
1 1 方式 3
2,C/T功能选择
C/T=0 对内部脉冲计数,计数频率为 fosc/12
C/T=1对 Ti引脚输入脉冲计数,计数频率不大于
fosc/24。
GATE=0,由 TRi来启动和停止定时 /计数器
GATE=1,TRi必须同 INTi一起来启动和停止定时 /计
数器,即 TRi=INTi=1时,定时器启动,其中一个为
,0”时,停止计数。
注意,T0和 T1的控制是严格独立的
TMOD不能位寻址,使用时必须用字节传送指
令,复位时,TMOD=0
二、定时 /计数器控制寄存器 TCON
? TCON格式如下:
TFi,计数器溢出标志,计数器溢出时,由硬件对 TFi
置,1”,并申请中断。进入中断后,由硬件自动清
零,也可由软件清零。
TRi,计数器运行控制位,由软件置,1”或清零来启
动和停止计数器。
TCON 8FH 8EH 8DH 8CH 8BH 8AH 89H 88H
88H TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
定时控制 中断控制
二、定时 /计数器控制寄存器 TCON
?其余位为有关中断的控制,以后再详
讲。
注意,T0和 T1的控制是严格独立的
? TCON可位寻址,可分别用位名来进行
寻址,不必记忆位地址。
?复位时,TCON=0
§ 5-3 定时 /计数器的工作方式
?通过前面的学习,我们可以知道:通过对 C/T
的不同选择,可以选择内、外部脉冲计数方
式。而对 M1M0的设置,可以使 T0和 T1工作
在四种工作方式。
一、方式 0
13位定时 /计数器方式。由 TLi(4~0)和 THi(7~0)
组成。
T=(213-A)*12/fosc 微秒
方式 0
1,C/T=0
?定时时间 T=(213-A)*12/fosc 微秒
?式中,A为定时器初值,
2,C/T=1
3,GATE=0
4,GATE=1
二、方式 1
方式 1为 16位定时 /计数器 方式。由 TLi(7~0)和
THi(7~0)组成。其余与方式 0相同。
? 定时时间 T=(216-A)*12/fosc 微秒
? 式中,A为定时器初值,
三、方式 2
方式 2为能 自动重置 计数器初值的工作方式,TLi为 8
位计数器,THi为计数器初值暂存器。
? 定时时间 T=(28-A)*12/fosc 微秒
? 式中,A为定时器初值,
四、方式 3
方式 3仅适用于 T0。 此时,TH0和 TL0分别为 2个 8
位计数器,TL0由 T0的控制位来控制,而 TH0则由
T1的控制位来控制。而 T1则可工作在方式 0,1,2
的任一方式,但其启动则由控制方式控制,将 T1置
为方式 3时则停止计数。
几种方式的区别:
方式 0,1,2仅在于位数不同,
方式 3则是增加了一个计数器资源而已。
§ 5-4 定时 /计数器的应用举例
?定时 /计数器是可编程的,在使用前,必须通
过软件对其初始化。
一、定时 /计数器的初始化步骤
1、确定工作方式 —— 对 TMOD置初值
2、置定时 /计数器初值。 即初始化 TH0,TL0,TH1、
TL1,在用作计数器时,除定量计数外,一般不设
初值。
? 计数,A=2n-待计数值
? 定时,A=2n-定时值 *fosc/12
3、如需中断,则开放中断,否则略去。
4、启动定时 /计数器 ;对 TRi置,1”。
5、通过中断或 TFi来获知定时 /计数器的工作状态。
6、停止定时 /计数器 ;不需要再用时,应对 TRi清零。
二、应用举例
? 例 5-4-1 利用 T1在 P1.1口上输出周期为 1ms的方波。
假定 fosc=6MHz
根据要求可知:定时 /计数器应工作在定时器方式,即
C/T=0定时时间应为 0.5ms,方式 0为 13位方式,故
其工作方式可为方式 0,因而,TMOD=00H。
? 定时时间 T =( 213-X) *12/(6*106)=500 (微秒 )
? X=7942=1F06;F806H
0 0 0 1 1 1 1 1 0 0 0 0 0 1 1 0
X X X 0 0 1 1 01 1 1 1 1 0 0 0
二、应用举例
由于 TMOD和 TCON在复位时均为,00”,故不必对
其重新置数。
? BEGIN,MOV TL1,#06H
? MOV TH1,#0F8H
? SETB TR1
? LOOP,JBC TF1,PTF0
? AJMP LOOP
? PTF0,MOV TH1,#0F8H
? MOV TL1:#06H
? CPL P1.1
? AJMP LOOP
二、方式 2应用
?例 5-4-2 由 P3.4(T0)引脚输入低频脉冲信号,
其重复周期大于 1ms,要求在 P3.4每发生一
次负跳变时,由 P1.0输出一个宽为 500US的
负同步脉冲,与此同时由 P1.1输出一个宽为
1ms的正同步脉冲。
二、方式 2应用
将 T0工作在计数方式,初值设为 0FFH,则每在
P3.4上产生一个脉冲,T0溢出,然后将 T0改为
500US的定时方式。
? 设晶振频率为 6MHz,则 500US定时器的初值 X为:
? ( 28-X) *2*10-6=500*10-6
? 由此可得,X=06H
? 考虑到程序中标有,*”号指令执行的时间,
将初值修正为 0AH。
例 5-4-2 程序
? BEGIN,MOV TMOD,#06H
? MOV TH0,#0FFH
? MOV TL0,#0FFH
? CLR P1.1
? SETB TR0
? DEL1,JBC TF0,RESP1 ;检测外部信号跳变
? AJMP DEL1
? RESP1,CLR TR0
? MOV TMOD,#02H
? MOV TH0,#0AH
? MOV TL0,#0AH
? SETB P1.1
? CLR P1.0
? SETB TR0 ; *
? DEL2,JBC TF0,RESP2 ; *检测第一次 500US
? AJMP DEL2
例 5-4-2 程序
RESP2,SETB P1.0
DEL3,JBC TF0,RESP3 ;检测第二次 500US
AJMP DEL3
RESP3,CLR P1.1
CLR TR0
AJMP BEGIN
三、门控位的应用
? GATE=1时,可测量 INTi引脚上的脉冲的宽
度。
?例 5-4-3 利用 T0门控位测试 INT0引脚上出现
的正脉冲的宽度,并以机器周期的形式显示
在显示器上
BEGIN,MOV TMOD,#09H
MOV TL0,#00H
MOV TH0,#00H
WAIT1,JB P3.2,WAIT1 ;等待变低
SETB TR0
WAIT2,JNB P3.2,WAIT2 ;等待变高
WAIT3,JB P3.2,WAIT3 ;等待变低
CLR TR0
MOV R0,#DISBUF
MOV A,TL0
XCHDA,@R0
INC R0
SWAP A
XCHDA,@R0
INC R0
MOV A,TH0
INC R0
SWAP A
XCHDA,@R0
DIS,LCALL DISUP
AJMP DIS
………………..
XCHDA,@R0
本章作业,1,2,3,4,8










本章内容
Single Chip Microcomputer
§6-1 单片机最小应用系统
6.2 单片机的外部扩展性能
§6-3 程序存储器的扩展
概述
§6-4 数据存储器的扩展
§6-5 I/O口的扩展
概 述
51系列单片机在一个芯片上集成了许多硬件资源,
它们能够完成复杂的软件工作和较为简单的硬件操
作,在一定程度上相当于一台单板机的功能。但在
完成一些复杂的控制时,就比不上单板机的功能强
大了。
? 在做一些智能仪器、仪表,小型检测和控制时,往
往利用单片机的最小系统就能满足要求。但在大多
数情况下,在构造一个工业控制系统时,最小系统
一般不能满足系统的需求,这时,就必须在单片机
外部扩展相应的芯片,以满足系统的要求,这就是
系统扩展。
? 单片机的系统扩展包括 ROM扩展,RAM扩展,I/O
扩展、定时 /计数器扩展、中断扩展及其它特殊功能
的扩展。
问题的提出
在单片机应用
系统的设计中,
往往出现 RAM,
ROM或者 I/O口
不够的情况,
怎么办?
ROM的扩展
RAM的扩展
并行 I/O口的扩展
§6-1 MCS-51单片机最小应用系统
原则上,一个单片机应用系统除必
须具有单片机外,只要有振荡电路、复
位电路和 ROM就能工作了,当然,它
们都不能没有电源提供。这就是单片机
的最小应用系统。
一,8051/8751/89C51/89C2051 最小应
用系统
特 点
? 1、有大量 I/O线,在不
需外部 ROM的系统中,
EA端应接 VCC。
? 2、内部 RAM和 ROM大
小有限,但在数据量小
的小系统中基本够用。
? 3、应用系统开发具有
特殊性。程序量较小,
外部电路简单。我们推
荐使用 89C51或
89C2051。
晶振
复位
电路
4个并口

二,8031最小应用系统
由于 8031内部
无 ROM,因此,
由 8031组成的
最小应用系统
必须在片外扩
展 ROM
与 8051构成的
最小系统相比,
除均需要振荡
电路和复位电
路外,其 EA端
必须接地。
6.2










宽度为 16位,其高 8位地址总
线由 P2口提供,低 8位地址总
线由 P0口经地址锁存器锁存后
提供。 用作地址总线后的 P2口
不能再用作 I/O口使用
数据线由 P0口提供,其宽度
为 8位,它为三态双向口,是
使用最为频繁的通道。单片
机与外部交换的数据、指令
等大都经 P0口传送
控制总线:
/ EA
/ PSEN
/ RD
/ WR
ALE
二,MCS-51单片机的系统扩展能力
1、地址范围
0000H~0FFFFH,共 64KBytes。
2、空间重叠
外部 RAM和外部 ROM地址空间重叠,但因其
选通信号、访问指令不同,因而不会造成访
问混乱。
3、扩展 I/O与外部 RAM统一编址
单片机不再另外提供信号作扩展 I/O用,
而是同外部 RAM统一编址,因而会占用部分
RAM地址空间。
§ 6-3 程序存储器的扩展
在 51系列单片机中,ROM的寻址范
围为 64KBytes,在片内无 ROM或
ROM空间不够的情况下,我们需要
在片外扩展 ROM,以满足系统和需
求。
§ 6-3 程序存储器的扩展
我们还是本着三总线的扩展方法来讱座其扩展方法:
低 8位地址则
由 P0口经地
址锁存器后提供
片选则由
P2口剩余
部分经译码
后提供。
高 8位地
址由 P2口
直接提供。
1、地址总线
2、数据总线
数据总线直接由 P0
口提供
3、控制总线
4、外部 ROM访问时序
二、外部 EPROM扩展电路
1、使用单片的 EPROM扩展电路
EPROM扩展实例
----在 8031单片机上扩展 4KB EPROM
.
.
.
D7 Q7
373
D0 Q0
G
控制线
A11
A8
A7
A0
2732
O7
O0
OE CE
```
```P2.3
P2.0
P0.7
8031 P0.0
ALE
PSEN
```
```
12根地址线
8根数据线
2、使用多片的 EPROM扩展电路
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 地址
1 1 0 * * * * * * * * * * * * * C000HDFFFH
1 0 1 * * * * * * * * * * * * * A000HBFFFH
0 1 1 * * * * * * * * * * * * * 6000H~7FFFH
P2.5
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 地址
0 0 0 * * * * * * * * * * * * * 0000H1FFFH
0 0 1 * * * * * * * * * * * * * 2000H3FFFH
0 1 0 * * * * * * * * * * * * * 4000H~5FFFH
注 意
?利用线选法时,电路简单,但地址线
利用率较低,造成地址空间浪费。
?利用地址译码法时,地址空间完全利
用,但电路比较复杂。
在集成电路技术比较发达的今天,这种方法已
不多用,可用 1至 2片即可达到最大扩展容量。如:
§ 6-4 数据存储器的扩展
? 51单片机的片内 RAM为 128Bytes或
256Bytes,一般情况下都能满足应用系统的
需求,但当数据量较大时,就需要在片外扩
展 RAM,其最大容量可达 64KBytes。由于
片外扩展 I/O与外部 RAM采用统一编址,因而
外部 RAM的实际容量有时不能达到
64KBytes。
一、数据存储器扩展的方法
数据存储器的扩展方法与程序
存储器的扩展方法基本相同。
我们还是本着三总线的扩展方
法来讱解 RAM的扩展方法:
数据存储器扩展
1.低 8位地址则由 P0口经地
址锁存器后提供,其余部
分地址由 P2口直接提供。
片选则由 P2口
剩余部分经译
码后提供
2.数据总
线直接由
P0口提供。
3.控制总线的连接
二、外部 RAM访问方法
1、低 8位地址总线寻址的外部 RAM区
MOVX A,@Ri
MOVX @Ri,A
2,16位地址总线寻址的外部 RAM区
MOVX A,@DPTR
MOVX @DPTR,A
三、常用数据存储器的扩展电路
1、常用静态 RAM的引脚 图
2、扩展单片 6116数据存储器举例
2、扩展单片 6264数据存储器举例
2,EEPROM的扩展电路( P
EEPROM具有程序存储器和数
据存储器的特点。既可在线修
改数据,还能保证掉电后数据
不丢失。因而既可用作数据存
储器,也可用作程序存储器。
EEPROM的扩展电路
§ 6-5 I/O口的扩展
? 51系列单片机有 32个 I/O口,且大多数情冴下
不能完全提供给用户,因此在需要大量 I/O口
时,我们必须对其迚行扩展。
?从功能上看,单片机的 I/O口有两种类型:基
本 I/O和可编程 I/O。基本 I/O结构简单但功能单
一,仅适用于简单的数据输入和输出;可编
程 I/O功能丰富但成本较高,使用较灵活。
一、简单 I/O口的扩展
? I/O口的扩展原则为,输入三态、输出锁存,,因此
利用 TTL或 MOS电路可进行简单 I/O口的扩展。
如:用 8位三态缓冲器 74LS244可扩展输入口;
用 8D锁存器 74LS273,74LS373,74LS377
等可组成输出口 。
? 利用片选信号对外部 I/O进行编址,对其 访问就象访
问外部 RAM一样。使用 MOVX指令。
? /RD及 /WR信号参加片选。
1、单个 I/O口的扩展
其 I/O口地址为 0FEFFH,即保证 P2.0为,0”即可。其
输入和输出共用一个地址,不会发生冲突。
实现按下任意键对应 LED
发亮的程序如下:
LOOP,MOV DPTR,#0FEFFH
MOVX A,@DPTR
MOVX @DPTR,A
SJMP LOOP
2、多个 I/O口的扩展
在扩展多个 I/O时,应注意单片机 I/O的驱动能力。
二、可编程 I/O口 8155的扩展
可编程 I/O接口芯片结构一般较复杂,在
对其使用前,一般应由单片机对其进行编程,
设定其工作方式,然后才能对其进行操作。
这类芯片如下表所示:
1,8155的结构和技术性能
1,256Bytes 的 RAM,
存取时间为 400ns。
2,三个通用的并行 I/O
口,其中 A,B口为 8
位,C口方 6位。
且 C口可工作于应答
式 I/O方式。
3,一个 14位的定时 /计
数器。
4,单 5V供电,具有内
部地址锁存器。
5,40个引脚封装。
2,8155的引脚功能
? AD0~AD7 地址 /数据总线
? IO/ /M I/O和片内 RAM选择 ;1:
选择 IO 0:选择片内 RAM
? /CE片选信号
? ALE 地址锁存允许
? /RD 读选通信号
? /WR 写选通信号
? TI 计数脉冲输入端
? TO 计数的输出信号线
? RESET 复位信号输入端,可编
程芯片均有此引脚
? PA7~0 8 位并行口
? PB7~0 8位并行口
? PC5~0 6位并行口
? VCC,VSS 电源和地
3,8155和 8031的连结
4,8155的口地址分布
8155的 RAM和 I/O口地址分配
5,8155片内 RAM的使用
EXAM,MOV DPTR,#0E700H
? MOV A,#01H
? MOVX @DPTR,A
? INC DPTR
? MOV A,#0FFH
? MOVX @DPTR,A
? MOV DPTR,#0E700H
? MOVX A,@DPTR
? MOV R2,A
? INC DPTR
? MOVX A,@DPTR
? ADD A,R2
? JZ OK
? ERROR,………………
? OK,………………
8155片内 RAM
的使用,必须确
保 IO/M=0,且用
MOVX指令对其
访问。
6,8155片内可编程 I/O的使用
?( 1) 8155命令寄存器的用法
8155的 C口可以设置成 4种工作方式
? ALT1方式 A,B口为基本 I/O口,C口为输入口
? ALT2方式 A,B口为基本 I/O口,C口为输出口
? ALT3方式 A口为选通输入方式,C口低 3位为
A口联络线,B口和 C口的其余位为基本 I/O口
? ALT4方式 A口和 B口均为选通输入方式,C口
低 3位为 A口联络线,C口高 3位为 B口联络线
?我们应重点掌握前两种工作方式。
其方式控制如下表所示:
C口工作方式及控制信号分布
( 2) 8155应用举例
例:设选择 8155的 A口为基本输入口,B口为
基本输出口,C口为输出口,试编程将 A口输
入数据从 B口输出,并求反后将低 6位从 C口
输出。
根据要求,其命令寄存器的控制字应为 06H
即,0 0 0 0,0 1 1 0
程序清单
? MOV DPTR,#0EF00H
? MOV A,#06H
? MOVX @DPTR,A
? INC DPTR
? MOVX A,@DPTR
? INC DPTR
? MOVX @DPTR,A
? INC DPTR
? CPL A
? MOVX @DPTR,A
? RET
本章作业,1,3,4
第六章 结束


51







本章内容
Single Chip Microcomputer
§7-1概 述
§7-4选学内容
§7-2 MCS-51的串行接口
§7-3 MCS-51单片机串行口的应用
§ 7-1概 述
当今社会已迚入信息时代,网络成为当今科技
发展的一大方向,计算机系统通过网络这一桥梁,
在信息时代中发挥着越来越大的作用。在单片机的
应用系统中,单机应用非常广泛,但在一些大型、
智能化系统中,必须要由多个单片机协同工作才能
完成仸务,因此,它们之间的信息传递成为了一种
必然。在学习单片机间的通讯之前,我们有必要对
通信的基础知识有一些了解。
一、什么是串行通信?
?串行通信和并行通信
计算机 1
GND
计算机 2
GND
并行通信
计算机 1
GND
计算机 2
GND
发送
接收
串行通信
并行通信,即数据的各位 同时 传送;
串行通信,即数据 一位一位 顺序传送。
二、串行通信的分类
? 异步 (Asynchronous Communication)
? 异步是指收发双方时钟异步,即收方和发方的时钟
各自独立,由起始位和结束位来实现收、发同步。
允许 ± 5%的误差。
( 1)帧结构 帧为收发双方传数据的基本单位
其结构如图所示。由一个起始位,0”,5~8位数据
(低位在前),再后为奇偶校验位和一个停止位
,1”构成。
异步 (Asynchronous Communication)
( 2)特点
?利用起始位和结束位来实现收发同步
?帧间间隔随机
?位间隔固定
?每帧数据最多一个字节
( 3)错误检验方法,奇偶校验
串行通信的分类
? 同步 (Synchronous Communication)
? 同步传送方式是一种 连续传送 方式,适合于大量数据的高速
传送。收发双方的时钟实现同步。
( 1)帧结构
( 2)特点
? 利用同步字符或同步时钟实现收、发同步
? 每帧数据为一数据块,故传送速率较异步快
? 同步时钟要求较严格
( 3)校验方法,CRC 循环冗余校验
三、波特率( Baud rate)
? 波特率 是指串行通讯中数据传送的速率,即每秒种
传送的数据传送的二进制位数。它指的是位与位之
间的时间间隔。其单位为比特 /秒,bps
? 在异步通讯中,收发双方是通过设定相同的波特率、
依靠起始位和结束位来实现数据的准确传送。
例,设每秒传送 120个字符,其帧结构为 1个起始位,
7个数据位,1位校验位和 1位结束位,其波特率为:
120字符 /秒 *10位 /字符 =1200bps
四、串行通信制式
? 单工 (simplex)
? 半双工 (half duplex )
? 全双工 (full duplex)
串行通信制式
数据只能单
向流动
数据虽能双向通讯,
但仸一时刻仅能单向
传送。
数据双向通讯,收、
发各用一根信号线,
可完全独立工作。
§ 7-2 MCS-51的串行接口
?概述
? 有一个可编程全双工串行通信接口( UART)
(Universal Asychronous Receiver/Transmitter )
? 可同时发送、接收数据 (Transmit/Receive)
? 有四种工作方式,帧格式有 8,10,11位。
? 波特率 (Baud rate)可设置
波特率为每秒钟传送二进制数码的位数,也叫比
特数,单位为 b/s,即位 /秒( bps)。
一、串行口的构成
串行口内部组成示意图 如图所
示,结构较为复杂,我们在使
用时可将其抽象为三个可供软
件直接访问的的特殊功能寄存
器:
PCON,SCON和 SBUF。
通过对它们的读写操作即可完
全控制串行口。
MCS-51串行接口寄存器
? SBUF——串行口数据缓冲器
?共两个:一个发送寄存器 SBUF,一个接收 SBUF,二者
共用一个地址 99H。 它在物理上对应两个寄存器,发送
寄存器和接收寄存器,由于它们并不在同一时刻使用,
因此两个寄存器共用一个地址并不会发生冲突,通过指
令来区别是发送还是接收。其中,接收寄存器采用双缓
冲而发送寄存器采用单缓冲。
? SCON——串行口控制寄存器。 它用来定义串行口
的工作方式及监视串行口的工作状态。
? PCON——电源及波特率选择寄存器,PCON.7为
SMOD,波特率加倍位,当 SMOD=1时,波特率为
SMOD=0时的两倍。 PCON不能进行位寻址,可用
ANL PCON,#7FH或 ORL PCON,#80H来对其
清零或置,1”。
只有该位有用,为 1时,波特率 × 2;为 0时不变。
电源及波特率选择寄存器 PCON
SMOD × × × GF1 GF0 PD IDL87H
串行口控制寄存器 SCON
SM0 SM1 SM2 REN TB8 RB8 TI RI
工作方式选择
多机通信控制位
允许串行接收位
REN=1时,允许
接收; REN=0时,
禁止接收。
接收数据的第 9位
方式 2,3中第九
位,多机通讯中
可用来表示是地
址帧还是数据帧
接收中断标志,由硬件
置,1”,而由软件清
零 发送中断标志
9FH 9EH 9DH 9CH 9BH 9AH 99H 98H
SM0 SM1 工作方式 功能 波特率
0 0 方式 0 8位同步移位寄存器 fosc/12
0 1 方式 1 10位 UART 可变
1 0 方式 2 11位 UART fosc/64或f
osc/32
1 1 方式 3 11位 UART 可变
串行方式的定义
例:设串行口工作在方式 1,允许接收,则指令为:
MOV SCON,#01010000B
串行口的四种工作方式
? 方式的选择由 SM1,SM0实现。
? 四种方式的比较:
工作方式 功能 说明 波特率
方式 0 8位同步移位
寄存器
常用于扩展
I/O口
fosc/12
方式 1 10位 UART 8位数据、起始
位、结束位
可变(取决于定
时器 1溢出率)
方式 2 11位 UART 8位数据、起始
位 0、结束位 1
和奇偶校验位
fosc/64或
fosc/32
方式 3 11位 UART 8位数据、起始
位、结束位
可变(取决于定
时器 1溢出率)
1、方式 0
? 在此种方式下,串行口工作在 移位寄存器 方式,其
波特率为 fOSC/12,数据从 RXD( P3.0)端移出,
同步移位脉冲由 TXD( P3.1)输出。发送、接收的
数据为低位在前。
? ( 1)发送。 执行 MOV SBUF,A后,数据和同步
时钟从串行口发出,发送结束后,必须由软件对 TI
清零。即:
JNB TI,$
CLR TI
其 时序如图 所示:
( 2)接 收
REN=1且 RI=0时,启动一个接收过程。
数据从串行口输入,接收完毕后,RI=1,执
行 MOV A,SBUF后,数据进入 CPU,要进
行下一次接收,必须用软件对 RI清零,
SETB REN;
MOV SCON,#10H
JNB RI,$
MOV A,SBUF
其接收时序 如下图 所示:
2、方式 1
?串行口工作在 8位异步通讯接口 方式。其一帧
信息为 10位,其中,8位数据位,一位起始位
( 0)和一位停止位( 1)。 TXD端为发送端
而 RXD为接收端,波特率可变。
TXD
RXD
MCU
(1),方式 1---发送
?执行 MOV SBUF,A后,数据从 TXD输出,
发送完一帧信息后,置 TI=1,再次发送前,
须对 TI清零。其时序图如下图所示:
( 2) 方式 1-接收
? 由于方式 1发送时不传送同步时钟,因而接收端在接收数据
是通过采样来实现的。其采样频率为波特率的 16倍,利用三
中取二原则来确认接收数据。
? 接收过程在 REN置 1的前提下,从搜索到起始位开始。直到
9位接收完毕(含 1位停止位)。
? 在 9位接收完毕后,只有,RI=0,SM2=0或接收到的停止位
为 1,才将 8位数据送入 SBUF,停止位送 RB8,并置 RI=1。
3、方式 2和方式 3
?方式 2和方式 3为 9位异步通讯口,一帧信息
由 11位组成,即起始位( 0),8位数据位、
1位可编程位和 1位停止位。方式 2和方式 3的
区别仅在于波特率不同
方式 2波特率 = 2SMOD64 * fOSC
方式 3波特率 = 2
SMOD
32 * (定时器 T1的溢出率)
( 1)发送
发送前,可以用任何位操作指令将第 9位数据装入
TB8中,然后执行 MOV SBUF,A。串行口会自动将
TB8作为第 9位数据发出,发送完毕,TI=1。
( 2)接收
其方法与方式 1类似
说 明
由于方式 1,2和 3并不传送同步时钟,因
此,必须保证发送方和接收方应工作在相同
的波特率下,才能保证数据的准确传送。
§ 7-3 MCS-51单片机串行口的应用
一,MCS-51单片机的串行通讯的波特率
串行口的传送速率即波特率由 fosc、
PCON,SMOD及定时器 Ti的设定。
串行口的四种工作方式对应于三种波
特率:
1、方式 0:其波特率固定为 fosc/12
2、方式 2:有两种波特率可供选择
方式 2波特率 = 2SMOD64 * fOSC
3、方式 1和方式 3
波特率 = 2
SMOD
32 * (定时器 T1的溢出率)
定时器 T1的溢出率 = fOSC12
2K-初值
1
*
其中,K是定时器的位数,取决于定时器的工作方式。为
保证高精度,尽可能选择方式 2自动装入方式。
定时器 T1产生的常用波特率
二、串行口方式 0用作扩展并行 I/O口
用串行口扩展 I/O口具有电路简单易行,成本低
等优点,因而被经常使用。
1、用方式 0扩展并行输出口
74LS164为 TTL型,而 CD4094为 CMOS型串行移
位寄存器
在串行口外接一个串入并出的移位寄存器,即
可扩展一个并行 I/O口。
例 7-4-1 用 8051串行口外接 74LS164扩展 8位并行输出口。
74LS164为 一串入并出移位寄存器,其 A,B为串
行输入端,CLK为移位时钟,MR为清零端。串行口
工作在方式 0,移位寄存器方式,也可将清零端直接连
到 VCC端。
8051
RXD
TXD
P1.0
VCC
发光二极管的显示延时采用延时子程序 DELAY
来实现。
SM0 SM1 SM2 REN TB8 RB8 TI RI
9FH 9EH 9DH 9CH 9BH 9AH 99H 98H
程序清单:
ORG 2000H
UART:MOV SCON,#00H
MOV A,#80H
CLR P1.0 ;移位寄存器清零
LCALL DELAY
SETB P1.0
STA,MOV SBUF,A
JNB TI,$
CLR TI
RR A
SJMP STA
串行口发送标准模块
74LS165为 TTL型,而 CD4014为 CMOS型串行移位寄存器
SM0 SM1 SM2 REN TB8 RB8 TI RI
9FH 9EH 9DH 9CH 9BH 9AH 99H 98H
2、用方式 0扩展并行输入口
例 7-4-2 用 8051串行口外接 CD4014扩展 8位并行输出口。
CD4014为一并入串出移位寄存器,Q8为串行数据输
出端,CLK为移位时钟端,P/S为预置 /移位控制端。
P/S=1时,并行置入数据,P/S=0时,开始串行移位。
输入联络信号由 K提供,K=0时,表示有数据输入,
当 RI=1时,表示数据串行移入完毕,可以进行下一次输
入。
输入允许开关则由 SCON中的 REN来控制,采用
查询 RI的状态的方式来决定数据传送与否。
SM0 SM1 SM2 REN TB8 RB8 TI RI
程序清单:
REC,JB P1.1,$
SETB P1.0
CLR P1.0
MOV SCON,#10H
JNB RI,$
CLR RI
MOV A,SBUF
SJMP REC
串行接收标准模块
无论是扩展输入,还是扩展输出口,都可以进行级连,
从而实现更多位的串行输入或串行输出扩展,
SM0 SM1 SM2 REN TB8 RB8 TI RI
三、方式 1的点对点的异步通讯
?利用 8031的串行口进行点对点
的全双工通讯。
例 7-4-3 假设两个 8031系统相距很近,它们以串行口直接相
连,如图所示。要求它们之间进行双工的 ASCII字符收发,
最高一位用于奇偶校验,波特率为 1200bps,fosc=6Mhz
1、由于数据位为 7位,及 1位奇偶校验位,因而可采用
方式 1。
2、由于 波特率 为 1200bps,故定时器初值为:
TXD
RXD
GND
8031
甲 TXD
RXD
GND
8031

8031双机通讯
3、奇偶校验作如下处理后,使 A
中 1的个数始终为奇数个。
MOV A,#ASCII
MOV C,P
CPL C
MOV ACC.7,C
若 A中原有奇数个 1,则 P=1,操作后 A
中仍有奇数个 1;若 A中原有偶数个 1,
则 P=0,操作后 A中则有奇数个 1;
4、双工通讯要求收发同时迚行,收和发均在串行接口中
迚行,CPU只是把数据写入缓冲器或从缓冲器中读入数据。
究竟是需要读或是写则通过检测 TI和 RI来迚行区别。下面
给出实现指定功能的通讯程序,发送和接收通过子程序调
用来实现,发送缓冲区首址为 20H,接收缓冲区首址为
40H。
主程序:
ORG 0000H
LJMP MAIN
ORG 0023H
LJMP SBR1
ORG 0100H
MAIN:MOV TMOD,#20H
MOV TH1,#0F3H
MOV TL1,#0F3H
SETB TR1
MOV SCON,#50H
MOV R0,#20H
MOV R1,#40H
ACALL SOUT
AJMP $
方式 1允许接
收 REN=1
SBR1,JNB RI,SEND
ACALL SIN
SJMP NEXT
SEND,ACALL SOUT
NEXT,RETI
SOUT:MOV A,@R0
MOV C,P
CPL C
MOV ACC.7,C
INC R0
MOV SBUF,A
JNB TI,$
CLR TI
RET
SIN,MOV A,SBUF
CLR RI
MOV C,P
CPL C
ANL A,#7FH
MOV @R1,A
INC R1
RET
以上是基本的双机通讯程序,
大家可根据这一基本程序,
加以发挥和扩充,即可完成
较为复杂的通讯功能。
四、方式 2、方式 3与多机通讯
RXD
TXD
GND
8031
主机
8031多机通讯
TX
D
RXD GN
D
从机 1
TX
D
RXD GN
D
从机 2
TX
D
RXD GN
D
从机 3
通讯原理:利用多机通讯位 SM2和 TB8,主机发送接
收数据的从机地址,该从机处于接收使能,能接收主
机随后发送的数据,地址不同的从机不能接收数据。
§ 7-4 选学内容
单片机之间的通信
R X D
T X D
8 0 5 1
应用系统
( 甲机 )
R X D
T X D
8 0 5 1
应用系统
( 乙机 )
双机异步通信接口电路
1
21
7 4 L S 0 5
V C C 外 5 V
1
1
2
3 1
2
3
S N 7 5 1 7 5
1
1
4 3
1
2
3
2
1
3
34
7 4 L S 0 5
7 4 L S 0 5
外 5 V V C C
T X D
R X D
8 0 5 1
( 甲机 )
8 0 5 1
( 乙机 )
R X D
T X D
V C C外 5 V
外 5 VV C C
S N 7 5 1 7 4
S N 7 5 1 7 5 S N 7 5 1 7 4
7 4 L S 0 5
外 5 V
外 5 V
R1
R3
R2
R1
R3
R2
RS-422A双机异步通信接口电路
双机通信软件编程
查询方式
1) 甲机发送
编程将甲机片外 1000H~ 101FH单元的数据块从串行口
输出。定义方式 2发送,TB8为奇偶校验位。发送波特率
375 kb/s,晶振为 12 MHz,所以 SMOD=1。
参考发送子程序如下:
MOV SCON,#80H ;设置串行口为方式 2
MOV PCON,#80H ; SMOD=1
MOV DPTR,#1000H ;设数据块指针
MOV R7,#20H ;设数据块长度
START,MOVX A,@DPTR ;取数据给 A
MOV C,P
MOV TB8,C ;奇偶位 P送给 TB8
MOV SBUF,A ;数据送 SBUF,启动发送
WAIT,JBC TI,CONT ;判断一帧是否发送完 。 若送完, 清 TI,取下一个数据
AJMP WAIT ;未完等待
CONT,INC DPTR ;更新数据单元
DJNZ R7,START ;循环发送至结束
RET
2) 乙机接收
编程使乙机接收甲机发送过来的数据块,并存入片内 50H~
6FH单元。接收过程要求判断 RB8,若出错置 F0标志为 1,正确
则置 F0标志为 0,然后返回。
在进行双机通信时,两机应采用相同的工作方式和波特率。
参考接收子程序如下:
MOV SCON,#80H ;设置串行口为方式 2
MOV PCON,#80H ; SMOD=1
MOV R0,#50H ;设置数据块指针
MOV R7,#20H ;设置数据块长度
SETB REN ;启动接收
WAIT,JBC RI,READ ;判断是否接收完一帧。若完,清 RI,读入数据
AJMP WAIT ;未完等待
READ,MOV A,SBUF ;读入一帧数据 a
JNB PSW.0,PZ ;奇偶位为 0则转
JNB RB8,ERR ; P=1,RB8=0,则出错
SJMP RIGHT ;二者全为 1,则正确
PZ,JB RB8,ERR ; P=0,RB8=1,则出错
RIGHT,MOV @R0,A ;正确,存放数据
INC R0 ;更新地址指针
DJNZ R7,WAIT ;判断数据块是否接收完
CLR PSW.5 ;接收正确,且接收完清 F0标志
RET ;返回
ERR,SETB PSW.5 ;出错,置 F0标志为 1
RET ;返回
第七章结束
本章作业,2,3,6,7
第八章 MCS-51 单片机的中断系统
本章主要介绍 51系列单片机 中断系统 问题,
本章将介绍以下具体内容:
中断系统 ----中断源、中断方式,中断控制寄
存器、中断响应、中断请求的撤除。
CPU与外设之间传送数据的方式可以有以下几种:
1,无条件传送方式
2,查询方式
3,中断传送方式
4,DMA方式
§ 8.1 输入 /输出的控制方式
预备内容
§ 8.2 MCS-51单片机的中断系统
8.2.1,MCS-51单片机的中断系统结构
一、中断的概念
执行主
程序
主程序
继续执行
主程序
断点
中断请求
中断响应
执行
中断
处理
程序
中断返回
IE0
TF0
IE1
TF1
TI
RI
中断请
求标志
EX0
ET0
EX1
ET1
ES≥1
PX0
PT0
PX1
PT1
PS
高级
低级
二,MCS-51单片机的 中断系统(图 8-1)







询 入口
地址
入口
地址
INT0
INT1
T0
T1
TI
RI
中断允
许控制
中断优
先级
EA
中断

一、中断源
共有 五 个中断源,分别是 外部中断 两个,定时中断 两
个和 串行中断 一个,它们是:
外部中断 0--INT0,由 P3.2提供,
外部中断 1—INT1,由 P3.3提供,
外部中断有两种信号方式,即 电平 方式
和 脉冲 方式。
T0溢出中断 ; 由片内定时 /计数器 0提供
T1溢出中断 ; 由片内定时 /计数器 1提供
串行口中断 RI/TI; 由片内串行口提供
8.2.2,MCS-51 中断 源
二、中断方式
单片机的中断为 固定入口式中断,即一响应中断
就转入 固定入口地址 执行中断服务程序。具体入
口如下:
中断源 入口地址
INT0 0003H
T0 000BH
INT1 0013H
T1 001BH
RI/TI 0023H
在这些单元中往往是一些跳转指令,跳到真正的
中断服务程序,这是因为给每个中断源安排的空
间只有 8个单元。
三、中断控制的寄存器
与中断控制有关的控制寄存器有四个:
TCON----定时控制寄存器,
IE----中断允许控制寄存器,
IP----中断优先级控制寄存器,
SCON----及串行口控制寄存器。
1.定时控制寄存器 TCON
D7 D6 D5 D4 D3 D2 D1 D0
TF1 TF0 IE1 IT1 IE0 IT0
中断请求标志 触发方式选择 0 低电平1 下降沿
2.串行口控制寄存器 SCON
D7 D6 D5 D4 D3 D2 D1 D0
TI RI
串行中断请求标志
3.中断允许控制寄存器 IE
D7 D6 D5 D4 D3 D2 D1 D0
EA ES ET1 EX1 ET0 EX0
4.中断优先级控制寄存器( IP)
D7 D6 D5 D4 D3 D2 D1 D0
PS PT1 PX1 PT0 PX0
0 禁止,1允许
0 低级别,1高级别
四、中断响应
响应条件 ----CPU要响应中断需满足下列条件:
① 无同级或高级中断正在服务;
② 当前指令周期结束,如果查询中断请求的机器
周期不是当前指令的最后一个周期,则不行;
③ 若现行指令是 RETI,RET或 访问 IE,IP指令,则
需要执行到当前指令及下一条指令方可响应。
响应过程 --单片机响应中断后,自动执行下列操作:
① 置位中断优先级有效触发器,即关闭同级和低级
中断:
② 调用入口地址,断点入栈,相当于 LCALL指令;
③ 进入中断服务程序。
响应时间 --从查询中断请求标志位到转向中断服务
入口地址所需的机器周期数。
( 1) 最快响应时间
以外部中断的电平触发为最快。
从查询中断请求信号到中断服务程序需要三个机器
周期:
1个周期(查询)+ 2个周期(长调用 LCALL)
( 2) 最长时间
若当前指令是 RET,RETI和 IP,IE指令,紧接着下
一条是乘除指令发生,则最长为 8个周期:
2个周期执行当前指令(其中含有 1个周期查询)+
4个周期乘除指令+ 2个周期长调用= 8个周期。
中断返回 — 中断处理程序的最后一条指令是 RETI,
它使 CPU结束中断处理程序的执行,返回到断点处,
继续执行主程序。
当有几个处于同一优先级的中断同时发出中断请求
时,CPU响应哪个中断呢? CPU则按照 自然优先级 作
出判断并快速响应中断请求。其自然优先级为:
中断源 同级自然优先级
外部中断 0 最高级
定时器 T0中断
外部中断 1
定时器 T1中断
串行口中断 最低级
四、中断响应过程及响应时间
1、中断响应的操作过程
在每个机器周期的 S5P2期间,各中断标志采样相应
的中断源,而 CPU在下一个机器周期的 S6期间按顺序
查询中断标志,并将相应中断的标志置 1,且在再下一
个机器周期的 S1期间按优先级进行中断处理。
中断响应后,由硬件产生长调用指令,LCALL”,
并将当前的 PC指针压入椎栈保护,然后将对应的中断
矢量装入程序计数器 PC,使程序转向该中断矢量地址
单元,执行中断服务程序,直到执行,RETI”指令返
回,断点处 PC指针从椎栈中弹入 PC,继续执行中断前
的程序。中断矢量如下表所示:
中断源 矢量地址
外部中断 0 0003H
定时器 T0中断 000BH
外部中断 1 0013H
定时器 T1中断 001BH
串行口中断 0023H
在编写中断服务程序时,应注意以下几点:
( 1)在中断矢量地址放一条长转移指令,使中断服务
程序可以灵活地安排在 64KB程序存储器的任意位置。
( 2)在执行中断服务程序时,应注意保护现场。
( 3)在执行中断服务程序时,为避免更高优先级的中
断,可用软件关闭 CPU中断,或禁止某中断源中断,
在中断返回前再开放中断。
( 4)中断返回指令,RETI”不能用,RET”来代替。
2、外部中断的响应时间
外部中断从产生到响应,至少要经历 3个以上的机
器周期,再加上 CPU在执行指令时的时间延迟。因此,
为保证可靠响应外部中断,中断请求信号至少要保持
3~8个机器周期。
§ 8-3 扩充外部中断源
MCS-51系列单片机提供 2个外部中断源,在很多情
况下,仅有两个中断源是远远不够的。因此,我们有必
要对其进行扩充。其方法主要有两种:
1、将定时器 T0,T1扩充为外部中断源
2、采用中断和查询相结合的方法扩充外部中断源
一、利用定时器扩充外部中断源
51系列单片机具有内部定时 /计数器,可以用作对外
部事件计数,其计数脉冲从相应引脚输入。利用这一特
点,我们将计数初值设置为满程,一旦外部有一个脉冲
输入,计数器加 1并产生溢出中断。因此可以把外部计数
引脚 T0( P3.4)或 T1( P3.5)扩充为外部中断,而 T0和
T1为外部中断的中断矢量入口。
例 8-3-1 将定时器 T0设为方式 2,并将其扩充为一个外
部中断源。
其程序清单为:
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP TIMER0
ORG 0100H
MAIN,MOV TMOD,#06H
MOV TH0,#0FFH
MOV TL0,#0FFH
SETB TR0
SETB ET0
SETB EA
……………
LJMP $
TIMER0:…………
RETI
这样,相当于在 T0引脚上扩展一个外部中断源。
二、利用中断和查询相结合的方法扩充外部中断源
利用这种方法可以扩充多个外部中断源,并可按需
求划分它们的优先级别。
例 8-3-2 如图所示,试编写
出中断服务程序。
XI0 最高
XI1
XI2
XI3
XI4 最低
其优先级别要求如下表所示:
程序清单:
EXINT1,PUSH PSW
PUSH ACC
JB P1.0,SAV1
JB P1.1,SAV2
JB P1.2,SAV3
JB P1.3,SAV4
DISUB:POP ACC
POP PSW
RETI
SAV1:……………………,.
AJMP DISUB
SAV2:……………………,.
AJMP DISUB
SAV3:……………………,.
AJMP DISUB
SAV4:……………………,.
AJMP DISUB
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP EXINT0
ORG 0013H
LJMP EXINT1
ORG 0100H
MAIN,SETB EX0
SETB EX1
SETB EA
………………,.
LJMP $
EXINT0:
………………,.
RETI
由于在查询工作按 P1.0~P1.3的顺序进行,因此其优
先级别为 XI1最高,而 XI4最低。
注意:外部中断采用电平触发与采用边沿触发基本
相似。其区别仅在于:如果是边沿触发,中断响应后会
自动清除中断请求标志,而电平触发不会自动清除中断
请求标志。因此,在实际使用时,应注意以下两点:
1:请求中断的低电平必须保持足够的时间,以确
保中断请求被可靠响应。
2、中断请求信号保持时间不宜太长。在中断返回
前,请求信号必须被撤除,以避免同一中断请求被二次
响应。可在中断返回前加判中断信号是否撤除指令,如
上例中,加上 JNB P3.2,$ 或 JNB P3.3,$,即可保证同
一中断请求不会被二次响应。
§ 8-4 中断系统的应用( X=0,1)
一,8051系统的单步操作
这种操作方式广泛应用于单片机的开发系统中,在
常规系统的设计中一般很少使用,我们不作过多介绍。
二、只有一个外部中断源的情况
例 8-4-1 如图所示,将
P1.7~P1.4设置为输入方式,
P1.3~P1.0设置成输出方式,
驱动发光二极管,用于显示
P1.7~1.4的输入情况。要求
外部中断每中断一次,完成
一次读写操作。
中断请求由 INT0输入,
并采用了去抖动电路。
程序清单:
ORG 0000H
LJMP GAFN
ORG 0003H
LJMP XTGA
ORG 0100H
GAFN:SETB EX0
SETB IT0
SETB EA
AJMP $
ORG 2000H
XTGA:MOV A,#0FFH
MOV P1,A
MOV A,P1
SWAP A
MOV P1,A
RETI
三、多个外部中断源的情况
例 8-4-3 如图所示,中断线路可实现多个故障显示。当
系统无故障时,4个故障源输入端为低电平,显示灯全
灭,当某部分出现故障时,其相应的输入线才由低电
平变为高电平,从而引起中断,中断服务程序的任务
是判定故障源,并用相应的灯显示。
程序清单:
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP SERVE
ORG 0100H
MAIN:ANL P1,#55H
SETB IT0
SETB EX0
SETB EA
LOOP1:MOVA,P1
ANL A,#55H
JNZ LOOP1
ANL P1,#55H
SJMP LOOP1
SERVE:JNB P1.0,L1
SETB P1.1
SJMP L2
L1,CLR P1.1
L2,JNB P1.2,L3
SETB P1.3
SJMP L4
L3,CLR P1.3
L4,JNB P1.4,L5
SETB P1.5
SJMP L6
L5,CLR P1.5
L6,JNB P1.6,L7
SETB P1.7
SJMP L8
L7,CLR P1.7
L8,RETI
本章作业,1,3,8
人机接口
键盘接口
显示器接口
模拟量输入 /输出接口
D/A转换接口
A/D转换接口
综合应用
单片机与 LCD接口










本章内容
Single Chip Microcomputer
PC机除了主
机以外还需要
哪些部分呢?
单片机电路有时候也需要键盘、显示等外设。
9.1 键盘接口
? 按键的特点及输入原理
? 独立式按键
? 矩阵式按键
按键的特点及输入原理
? 键输入原理:
通过按键的接通与断开,产生两种相反的逻辑
状态
低电平, 0”与 高电平, 1”。
? 键功能的实现:
对于一组键或一个键盘,需通过接口电路与单
片机相连。可采用 查询 或 中断 方式测试有无键按下,
再确定是哪一个键按下,将该键号送入累加器 ACC,
然后判断是数字键还是功能键,若是数字键,则将
键号对应的数字送入相关输入缓冲区;若是功能键,
则通过跳转指令转入执行该键的功能程序,执行完
后再返回主程序。
键盘接口需要解决的问题
是否有键按下
按键识别:
键抖动及消除,
机械按键抖动时间在
5ms~ 10ms之 间
硬件方案 —— 双稳态去抖电路
软件方案 —— 延时 10ms~ 20ms后再次判断
消除方法,
求键号
独立式按键
接口电路:
特点:一线一键,按键识别(编程)简单;但占用
较多口线,适合 8键以下使用。
原理 ----当任何一个键被按下时,与其相连的输入线被
置成, 0”,平时该线为, 1”。
键处理程序 ORG 2000H
START,MOV A, #0FFH ;先置 P1口为,1”
MOV P1,A
MOV A,P1 ;输入键状态
JNB ACC.0,P0F ;查询 0号键
JNB ACC.1,P1F ;查询 1号键
JNB ACC.2,P2F ;查询 2号键
JNB ACC.3,P3F ;查询 3号键
JNB ACC.4,P4F ;查询 4号键
JNB ACC.5,P5F ;查询 5号键
JNB ACC.6,P6F ;查询 6号键
JNB ACC.7,P7F ;查询 7号键
LJMP START
键盘扫描
P0F,LJMP PROM0 ;入口地址表
P1F,LJMP PROM1
P6F,LJMP PROM6
P7F,LJMP PROM7
……
PROM0,………………….,; 0号键功能程序
PROM7,………………….,; 7号键功能程序
…………………..
LJMP START ; 0号键处理完返回键盘扫描
LJMP START ; 7号键处理完返回键盘扫描
…………………..
.
.
.
.
例 1:用 P1口检测三个按键的状态并完成相应的功能
解,资源分配:
用 P1口的低 3位检测 3个按键的输入,为 1则表
示按键没有按下,为 0则表示相应按键被按下。
流程图:
ORG 0000H
KB,MOV P1,#0FFH
MOV A,P1
CPL A
ANL A,#0FH
JZ KBACK
LCALL D10MS
MOV A,P1
CPL A
ANL A,#0FH
JZ KBACK
CJNE A,#01H,KB01
LCALL PGM1
SJMP KBACK
KB01,CJNE A,#02H,KB02
LCALL PGM2
SJMP KBACK
KB02,CJNE A,#04H,KB
LCALL PGM3
KBACK,LJMP KB
END
编程 (1),按三个按键
中的任一键都对应一
个特定功能。
若判断键释
放应如何修
改?





关键:如何
判断键号?
3210
4 765
111098
15141312
+5V
P1.4
P1.3
P1.0
MCS-51
P1.7
P1.6
P1.5
P1.2
P1.1
接口电路:
特点:按键识别应采用扫描法或线路反转法
编程较为复杂,节省口资源,8键以上使用
键盘扫描子程序一般包括以下内容:
1.判别有无键按下;
2.扫描获取闭合键的行, 列值;
3.用计算法或查表法得到键值;
4.判断闭合键释放否, 如没释放则继续等待;
5.保存闭合键号 。
键按下 /释放判断
KS,MOV A,#00H
MOV P1,A ;全扫描字 #00H送 P1口
MOV P1,#0FH
MOV A,P1 ; 读入 P1口状态
CPL A ;变正逻辑,高电平表示有键按下
ANL A,#0FH ;取低 4位
RET ;返回,A≠0表示有键按下
按键识别 —— 扫描法
流程:
当第 0列处于低电平时, 逐行 查找是否有行线变低,
若有, 则 第 0列与该行的交叉点 按键按下;若无, 则表示
第 0列无键按下, 再让下一列处在低电平, 依此循环, 这
种方式称为 键盘扫描 。
原理:
在某一时刻只让 一条列线 处于 低 电平,其余列线均
处于高电平,则当这一列有键按下时,该键所在的行
电平将会由高电平变为低电平,可判定该列相应的行
有键按下。
例 2:键盘扫描程序
SERCH,MOV R2,#0EFH
MOV R3,#00H
LINE0,MOV A,R2
MOV P1,A
MOV A,P1
JB ACC.3,LINE1
MOV A,#00H
AJMP TRYK
LINE1,JB ACC.2,LINE2
MOV A,#04H
AJMP TRYK
LINE2,JB ACC.1,LINE3
MOV A,#08H
接口电路
AJMP TRYK
LINE3,JB ACC.0,LINE4
MOV A,#0CH
AJMP TRYK
LINE4,INC R3
MOV A,R2
RL A
JNB ACC.0,BACK
MOV R2,A
AJMP LINE0
TRYK,ADD A,R3
BACK,RET
接口电路
定时扫描方式
定时扫描方式就是每隔一段时间对键
盘扫描一次,它利用单片机内部的定时器
产生一定时间(例如 10 ms)的定时,当定
时时间到就产生定时器溢出中断。 CPU响应
中断后对键盘进行扫描,并在有键按下时
识别出该键,再执行该键的功能程序 。
中断扫描方式
为提高 CPU工作效率,可采用中断扫描工作方式。
其工作过程如下:当无键按下时,CPU处理自己的工作,
当有键按下时,产生中断请求,CPU转去执行键盘扫描
子程序,并识别键号。 P 1, 0
P 1, 1
P 1, 3
P 1, 2
P 1, 4
P 1, 5
P 1, 6
P 1, 7
I N T 0
8 0 3 1
&
9.2 显示器接口技术
LED的结构和显示原理
静态显示方式
动态显示方式
动态显示的实现
动态显示方式
问题引入:
LED显示器如何显示出指定数字 /字符?
com
com
例:模拟产品计数显示电路


ORG 1000H
STAR,MOV TMOD,#60H ;定时器 T1工作在方式 2计数
MOV TH1,#00H ; T1置初值
MOV TL1,#00H
MAIN,MOV P1,#0C0H ;数码管显示 0
DISP,JB P3.3,DISP ;监测按键信号
ACALLDELAY ;消抖延时
JB P3.3,DISP ;确认低电平信号
DISP1,JNB P3.3,DISP1 ;监测按键信号
ACALLDELAY ;消抖延时
JNB P3.3,DISP1 ;确认高电平信号
SETB TR1 ;启动计数器
DISP2,MOV A,TL1
MOVC A,@A+DPTR ;查表获取数码管显示值
MOV P1,A ;数码管显示计数值
CJNE A,#8E,DISP2
LJMP STAR
TAB,0C0H,0F9H,0A4H … …
DELAY,MOV R2,#14H
DELAY1,MOV R3,#0FAH
DJNZ R3,$
DJNZ R2,DELAY1
RET
END
静态显示方式
?连接
所有 LED的 位选 均共同连接到 +VCC或 GND,每个 LED的 8
根 段选线 分别连接 一个 8位并行 I/O口,从该 I/O口送出
相应的字型码显示字型。
?特点
原理简单;显示亮度强,无闪烁;占用 I/O资源较多。
动态显示方式
?连接
所有 LED的 段选 线共同连接在一起共用 一个
8位 I/O口,而每个 LED的 位选 分别由 一根相应
的 I/O口线控制 。因此必须采用动态扫描显示
方式,每一个时刻只选通其中一个 LED,同时
在段选口送出该位 LED的字型码。
动态显示基本原理
电路的接法决定了必须采用 逐位扫描显示方式 。
即从段选口送出某位 LED的字型码,然后选通该位 LED,
并保持一段延时时间。然后选通下一位,直到所有位扫
描完。
要注意的两个问题:
1.字型码通常通过查表指令 MOVC来求得,
2.换位显示时通常要加一段程序使所有的 LED全灭,
AD0
12
P A 0
21
AD1
13
P A 1
22
AD2
14
P A 2
23
AD3
15
P A 3
24
AD4
16
P A 4
25
AD5
17
P A 5
26
AD6
18
P A 6
27
AD7
19
P A 7
28
P B 0
29
CE
8
P B 1
30
RD
9
P B 2
31
WR
10
P B 3
32
I O / M
7
P B 4
33
A L E
11
P B 5
34
P B 6
35
P B 7
36
T M R O U T
6
P C 0
37
P C 1
38
T M R I N
3
P C 2
39
P C 3
1
P C 4
2
R E S E T
4
P C 5
5
8155
e d c
dp
b afg
70 1 2 3 4 5 6
P B 0 ~ P B 7
P A 0 ~ P A 7
2 0 0 Ω × 8
动态显示程序流程图
采用 动态扫描方式 依次循环点亮各位数码管,构成
多位动态数码管显示电路 。
开 始
显示缓冲区首地址送 R0
显示位数送 R2
起始显示位送 R3
禁止所有位(关显示)
从缓冲区取要显示的数
查表得字型码
指向段选口,送字型码
指向位选口,送位选码
延时
指向显示缓冲区下一个单元
位选码左移
结束1
1
扫描完一遍吗?
Y
N
试编制程序,要求当其中某一按键压下时与
其对应的二极管将被点亮。
课堂练习
P1.7
P1.6
P1.5
P1.4
P1.3
P1.2
P1.1
P1.0
8031
+ 5V
9.3 D/A转换器接口
?D/A转换器的作用
?典型芯片 DAC0832
?DAC0832的应用
D/A转换器的作用
单片机 控制对象D/A转换
?将数字量转换为模拟量,以便操纵控制对象。
?D/A转换器的主要指标
转换速度:一般几十微秒到几百微秒,快速的可达 1微秒。
转换精度(分辨率):决定于输入数字量的位数,位数越多,
精度越高。
典型芯片 -DAC0832介绍
DAC0832是一个八位 D/A转换器,转换时间 1微秒,结构如下:















LE1或 LE2=1,当前寄存器的输出跟随输入
LE1或 LE2=0,锁存数据
DAC0832功能分析
DI0-DI7:转换数据输入
CS:片选信号
ILE,WR1:控制 输入 寄存器
ILE=1,WR1=0时:直通
ILE=1,WR1=1时:锁存
因此,DAC0832可以
有三种工作形式,直通,
单级锁存, 两级锁存 。
XFER,WR2:控制 DAC寄存器
XFER=0,WR2=0时:直通
XFER=1 or WR2=1时:锁存
单缓冲方式的接口( 1)
译码器输出
—— 一个处于直通方式,另一个处于受控的锁存方式
“同时, 做何解释?
单缓冲方式的接口( 2)
—— 两个输入寄存器 同时 受控的方式
单缓冲方式的应用
——产生锯齿波
假定采用接口 ( 1) 方式, 即 输入寄存器受控, 而 DAC寄存器直通,
输入寄存器地址为 E000H,产生锯齿波 。
源程序清单如下:
ORG 0200
MOV DPTR,#0E000H ;指向输入寄存器地址
MOV A,#00H ;转换初值
WW,MOVX @DPTR,A ; WR1有效,启动 D/A转换
INC A
NOP ;延时
NOP
AJMP WW
1/28
2/28
3/28
254/28
255/28
0
产生的锯齿波的过程
D/A转换产生的锯齿波
用同样的方法也可以产生三角波、矩
形波、梯形波。
若将 A的初值改为
FF
INC改为 DEC?
ORG 0200
MOV DPTR,#0E000H ;指向输入寄存器地址
MOV A,#0FFH ;转换初值
WW,MOVX @DPTR,A ; WR1有效,启动 D/A转换
A
NOP ;延时
NOP
AJMP WW
DECINC
——两个锁存器 都接成 受控锁存方式。
双缓冲方式的接口和应用
对一个数字量的转换,需
两步完成,程序如下:
MOV DPTR,#00E0H
MOVX @DPTR,A
MOV DPTR,#00C0H
MOVX @DPTR,A
输入寄存器地址,00E0H
DAC寄存器地址,00C0H
你知道它与第二种
单缓冲方式的区别
吗?






W R
A L E
E A
8 0 3 1
P 0, 7 ~ P 0, 0
D I 7 - D I 0
I L E
C S
W R 2
W R 1
+ 5 V
D A C 0 8 3 2
X F E R
Y7
A7
A6
A5
74LS138
Y6
C
B
A
Y7
Y6
9.4 A/D转换器接口
?A/D转换器的作用
?典型芯片 ADC0809
?ADC0809的应用
A/D转换器的作用
将模拟量转换为数字量,以便计算机接收处理
传感器 单片机A/D转换
?双积分式 A/D转换器
?逐次逼近式 A/D转换器。
A/D转换器概述
逐次逼近式典型 A/D转换器芯片有:
(1)ADC0801~ADC0805型 8位 MOS型 A/D转换器
(2)ADC0808 / 0809型 8位 MOS型 A/D转换器
(3) ADC0816 / 0817
典型芯片 —ADC0809介绍
ADC0809是一个 8位 8通道的 AD转换器。
ADC0809功能分析
CLK:时钟信号,可由单片机 ALE信号分
频得到。
转换有以下几步,
1,ALE信号上升沿有
效,锁存地址并
选中相应通道。
2,ST信号有效,开
始转换。 A/D转换
期间 ST为低电平。
3,EOC信号输出高电
平,表示转换结
束 。
4,OE信号有效,允
许输出转换结果。
ADC0809和单片机的连接
写信号,P2.0有效
时,启动 AD转换。
转换结束后,输
出高电平,向 CPU
发出中断请求
读信号,P2.0有效
时,允许输出 AD
转换结果。
转换时钟由 ALE分
频得到。
8031
74LS373
ADC0809
÷ 2
CLK
D0-D7
≥ 1
≥ 1
1
1
1
G
EOC
ST
ALE
OERD
P2.0
WR
INT1
ALE
P0 A0-A7
A0 A1 A2
A
B
C
VR(+)
VR(-)
+5V
GND
IN0
IN7
IN6
IN5
IN4
IN3
IN2
IN1
转换结果由此输出
通道选择表
选择的通道
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
C B A
8031 A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0
0809 × × × × × × × ST × × × × × C B A
× × × × × × × 0 × × × × × 0 0 0


× × × × × × × 0 × × × × × 1 1 1
1,首先分析各个通道的地址。 (IN0到 IN7的地址为 0000H到 0007H)
编程应用 —中断方式
2,编程:可采用 中断, 查询 两种方式。
中断方式:
ORG 0000H ;主程序入口地址
AJMP MAIN ;跳转主程序
ORG OO13H ;中断入口地址
AJMP INT1 ;跳转中断服务程序
MAIN,SETB IT1 ;边沿触发
SETB EA ;开中断
SETB EX1 ;允许中断
MOV DPTR,#0007H ;指向 0809 IN7通道地址
MOVX @DPTR,A ;启动 A/D转换
SJMP $ ;等待中断
INT1,MOVX A,@DPTR ;读 A/D转换结果
MOV B,A ;存数
RETI ;返回
查询方式:
ORG 0000H ;主程序入口地址
AJMP MAIN ;跳转主程序
ORG 1000H ;中断入口地址
MAIN,MOV DPTR,#0007H ;指向 0809 IN7通道地址
MOVX @DPTR,A ;启动 A/D转换
L1,JB P3.3 L1 ;查询
MOVX A,@DPTR ;读 A/D转换结果
MOV B,A ;存数
SJMP $
综合应用
语音数字化存储与回放系统
主控电路
? 分析实训电路板中 0809的连接,确定各通道地
址。
? 对通道 0输入模拟电压,运行转换程序,用动
态显示方式在最右边两个 LED显示转换结果。
9.4 单片机与 LCD
接 口 设 计
任务 1:如何在 LCD的指定位置显示出
指定的字符。
2行 × 16列
A
b
任务 2:如何在 LCD的指定位置显示字
符串。
2行 × 16列
Shenzhen
Polytechnic
基本内容
? LCD接口 程序设计 **
? 字符型 LCD模块的使用方法
? 单片机与字符型 LCD模块 接口电路
≈≈≈≈ NOTICE≈≈≈≈
LCD,Liquid Crystal Display
一、字符型 LCD模块
Shenzhen
Polytechnic
?LCD实验模块的连接管脚
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
VSS VDD VO RS R/W E DB0 DB1 ADB3DB2 DB5DB4 DB7DB6 K
LCD模块
Vss,+5V电源管脚 (Vcc)
VDD,地管脚 (GND)
Vo,液晶显示驱动电源 (0V~ 5V)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
VSS VDD VO RS R/W E DB0 DB1 ADB3DB2 DB5DB4 DB7DB6 K
LCD模块
DB0~ DB7,数据线,可以用 8位连接,也可以只用高
4位连接,节约单片机资源,本实验中采用的是八位
连接方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
VSS VDD VO RS R/W E DB0 DB1 ADB3DB2 DB5DB4 DB7DB6 K
LCD模块
A,背光控制正电源
K:背光控制地
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
VSS VDD VO RS R/W E DB0 DB1 ADB3DB2 DB5DB4 DB7DB6 K
LCD模块
?单片机与 LCD模块之间有四种基本操作:
写命令
读状态
写显示数据
读显示数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
VSS VDD VO RS R/W E DB0 DB1 ADB3DB2 DB5DB4 DB7DB6 K
LCD模块
RS R/W 操作
0 0 写命令 操作(初始化、光标定
位等)
0 1 读状态 操作(读忙标志)
1 0 写数据 操作(要显示内容)
1 1 读数据 操作(可以把显示存储
区中的数据反读出来)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
VSS VDD VO RS R/W E DB0 DB1 ADB3DB2 DB5DB4 DB7DB6 K
LCD模块
RS,数据和指令选择控制端,RS=0:命令 /状态; RS=1:数据
R/W,读写控制线,R/W=0:写操作; R/W=1:读操作
E,数据读写操作控制位,E线向 LCD模块发送一个脉冲,
LCD模块与单片机之间将进行一次数据交换
二、单片机与字符型 LCD模块接口 数据线:DB7~ DB0接
单片机的
P1.7 ~ P1.0
控制端:
RS ~ ~ P3.0
R/W ~ ~ P3.1
E ~ ~ P3.2
单片机与 LCD模块硬件连接
? 实验模块,A01,A07
? 连线表:
动手做
A01 A07
连接 1 +5V/GND +5V/GND
连接 2 P1.0-P1.7 DB0-DB7
连接 3 P3.0 RS
连接 4 P3.1 RW
连接 5 P3.2 E
注意,连接时,需要将跳线设置与 E
端接通
三,LCD接口程序设计
? 程序设计
? 功能设置 ——写命令 子程序
LCD初始化,按一定顺序写命令字
如:写清屏命令字,写 DDRAM光标定位 地址命令字
? 显示数据 ——写数据 子程序
? 读入状态字 —— 读状态 子程序
1,读状态字
RS R/W 操作
0 0 写命令操作(初始化、光标
定位等)
0 1 读状态操作(读忙标志)
1 0 写数据操作(要显示的内容)
1 1 读数据操作(可以把显示存
储区中的数据反读出来)
?E (P3.2):
?RS ( P3.0) =0;
?R/W( P3.1) =1;
RS EQU P3.0
RW EQU P3.1
E EQU P3.2
?E(P3.2):
?R/W(P3.1)=1;
?RS(P3.0)=0;
SETB RW ;RW=1
NOP ;3条
CLR RS ;RS=0
NOP ;3条
SETB E ;E=1
NOP ;3条
MOV A,P1 ;读入状态字
NOP ;3条
CLR E ;E=0
NOP ;3条
CLR RW ;RW=0
STAT:
RET
2,写命令字( 实训教程 P33)
RS R/W 操作
0 0 写命令操作(初始化、光标
定位等)
0 1 读状态操作(读忙标志)
1 0 写数据操作(要显示的内容)
1 1 读数据操作(可以把显示存
储区中的数据反读出来)
?E:
?RS=0; R/W=0;
?采用查询方式,读入状态字,再判断忙标志 ACC.7。
RW=0
RS=1
E=1
命令字 → A,A →P1
E=0
RS=0
返回
写数据
读入状态字 → A
ACC.7=0?
不忙吗?
延时
Y
N
动手做
假定显示数据已
存放到内部 RAM
的 21H单元
3,命令字
指令名称 控制信号 控制代码
RS RW D7 D6 D5 D4 D3 D2 D1 D0
清屏 0 0 0 0 0 0 0 0 0 1
归 home位 0 0 0 0 0 0 0 0 1 *
输入方式设置 0 0 0 0 0 0 0 1 I/D S
显示状态设置 0 0 0 0 0 0 1 D C B
光标画面滚动 0 0 0 0 0 1 S/C R/L * *
功能设置 0 0 0 0 1 DL N F * *
CGRAM地址设置 0 0 0 1 A5 A4 A3 A2 A1 A0
DDRAM地址设置 0 0 1 A6 A5 A4 A3 A2 A1 A0
读 BF和 AC 0 1 BF AC6 AC5 AC4 AC3 AC2 AC1 AC0
写数据 1 0 数 据
读数据 1 1 数 据
清除屏幕,置 AC
为零 —— 01H
指令名称 控制信号 控制代码
RS RW D7 D6 D5 D4 D3 D2 D1 D0
清屏 0 0 0 0 0 0 0 0 0 1
归 home位 0 0 0 0 0 0 0 0 1 *
输入方式设置 0 0 0 0 0 0 0 1 I/D S
显示状态设置 0 0 0 0 0 0 1 D C B
光标画面滚动 0 0 0 0 0 1 S/C R/L * *
功能设置 0 0 0 0 1 DL N F * *
CGRAM地址设置 0 0 0 1 A5 A4 A3 A2 A1 A0
DDRAM地址设置 0 0 1 A6 A5 A4 A3 A2 A1 A0
读 BF和 AC 0 1 BF AC6 AC5 AC4 AC3 AC2 AC1 AC0
写数据 1 0 数 据
读数据 1 1 数 据
设光标移动方向并
指定整体显示是否
移动。
I/D=1:增量方式
I/D=0:减量方式
S=1:移位
S=0:不移位
00000110——06H
设整体显示开关
( D),光标显示
开关( C),光标
位的字符闪耀( B)
D=1;C=0;B=0
00001100——0cH
指令名称 控制信号 控制代码
RS RW D7 D6 D5 D4 D3 D2 D1 D0
清屏 0 0 0 0 0 0 0 0 0 1
归 home位 0 0 0 0 0 0 0 0 1 *
输入方式设置 0 0 0 0 0 0 0 1 I/D S
显示开关控制 0 0 0 0 0 0 1 D C B
光标画面滚动 0 0 0 0 0 1 S/C R/L * *
功能设置 0 0 0 0 1 DL N F * *
CGRAM地址设置 0 0 0 1 A5 A4 A3 A2 A1 A0
DDRAM地址设置 0 0 1 A6 A5 A4 A3 A2 A1 A0
读 BF和 AC 0 1 BF AC6 AC5 AC4 AC3 AC2 AC1 AC0
写数据 1 0 数 据
读数据 1 1 数 据
设接口数据位数
( DL),显示行数
( L),及字型( F)
DL=1,8位 =0,4位
N=1:2行 =0:1行
F=1:5× 10 =0,5× 7
00111000——38H
指令名称 控制信号 控制代码
RS RW D7 D6 D5 D4 D3 D2 D1 D0
清屏 0 0 0 0 0 0 0 0 0 1
归 home位 0 0 0 0 0 0 0 0 1 *
输入方式设置 0 0 0 0 0 0 0 1 I/D S
显示开关控制 0 0 0 0 0 0 1 D C B
光标画面滚动 0 0 0 0 0 1 S/C R/L * *
功能设置 0 0 0 0 1 DL N F * *
CGRAM地址设置 0 0 0 1 A5 A4 A3 A2 A1 A0
DDRAM地址设置 0 0 1 A6 A5 A4 A3 A2 A1 A0
读 BF和 AC 0 1 BF AC6 AC5 AC4 AC3 AC2 AC1 AC0
写数据 1 0 数 据
读数据 1 1 数 据
设置 DDRAM地
址,为显示定位
4,初始化 LCD
上电
延时 20ms
功能设置
延时 37us
显示状态设置
延时 37us
清屏
延时 1.52ms
输入方式设置
初始化结束
38h
0ch
01h
06h
动手做
5,定位光标位置
把显示数据显示在某个位置,就是把显示数据写在相应的
DDRAM地址中,DDRAM地址占 7位。 Set DDRAM
address命令如下,
row 1 2 3 4 5 …… 14 15 16
line1 00H 01H 02H 03H 04H …… 0dH 0eH 0fH
line2 40H 41H 42H 43H 44H …… 4dH 4eH 4fH
≈≈≈≈ NOTICE≈≈≈≈
?光标定位,写入一个显示字符后,DDRAM地址会 自动加
1或减 1,加或减由输入方式字设置;
? 第 1行 DDRAM地址与第 2行 DDRAM地址 并不连续 。
80H 81H 82H 83H 84H 8dH 8eH 8
0c0H 0c1H 0c2H 0c3H 0c4H 0cd 0ceH 0cf
6,LCD显示程序设计
main
LCD初始化
光标定位
显示字符
动手做
SJMP $
7,显示数据
对于常用数字、字
母等显示数据为其
ASCII码
1,分析下页中 LCD与单片机的接口电路,并编制
LCD显示字符程序;
2,查找资料,并整理成文档,题目,LCD介绍,内
容包括,LCD的分类、结构、特点及应用等。
单片机与字符型 LCD模块接口 数据总
线双向
驱动器
地址锁
存器
地址译
码器