第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
第 6章 MCS - 51单片机内部定时器 /
计数器 及串行接口
6.1 定时器 /计数器的结构及工作原理
6.2 方式和控制寄存器
6.3 工作方式
6.4 定时器 /计数器应用举例
6.5 MCS - 51单片机的串行接口
6.6 串行口的应用
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
6.1 定时器 /计数器的结构及工作原理
图 6.1 定时器 /计数器结构框图
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
加法计数器是计满溢出时才申请中断,所以在给计数器
赋初值时,不能直接输入所需的计数值,而应输入的是计数
器计数的最大值与这一计数值的差值,设最大值为 M,计数
值为 N,初值为 X,则 X的计算方法如下,
计数状态, X=M- N
定时状态, X=M-定时时间 /T
而 T=12÷
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
6.2 方式和控制寄存器
一,定时器 /计数器的方式寄存器 TMOD
图 6.2 TMOD各位定义
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
1,M1M0工作方式控制位
表 6.1 工作方式选择表
M1 M0 方式 说 明
0 0 0 13 位定时器 (TH的 8 位和 TL的低 5 位)
0 1 1 16 位定时器 /计数器
1 0 2 自动重装入初值的 8 位计数器
1 1 3 T0 分成两个独立的 8 位计数器,T1 在方式 3 时停止工作
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
2,C/T
若 C/T=1时,为计数器方式 ; C/T = 0时,为定时器方式 。
3,GATE 定时器 /
当 GATE=1时,只有 INT0 ( 或 INT1) 引脚为高电平且
TR0(或 TR1 )置 1 时,相应的定时器 /计数器才被选通工作,
这时可用于测量在 INTx端出现的正脉冲的宽度 。 若 GATE=0,
则只要 TR0 (或 TR1)置 1,定时器 /计数器就被选通,而不管
INT0 (或 INT1)的电平是高还是低 。
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
二, 定时器 /计数器控制寄存器 TCON
TF0,TF1分别是定时器 /计数器 T0,T1 的溢出标志位,
加法计数器计满溢出时置 1,申请中断,在中断响应后自动复
0。 TF产生的中断申请是否被接受,还需要由中断是否开放
来决定 。
TR1,TR0 分别是定时器 /计数器 T1,T0 的运行控制位,
通过软件置 1 后,定时器 /计数器才开始工作,在系统复位时
被清 0。
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
6.3 工作方式
一,方式 0
图 6.3 方式 0( 13位计数器)
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
二,方式 1
图 6.4 方式 1( 16位计数器)
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
三、方式 2
图 6.5 方式 2(初始常数自动重装载)
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
四,方式 3
图 6.6 方式 3(两个 8 位独立计数器)
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
6.4 定时器 /计数器应用举例
一, 方式 0 的应用
例 1 利用定时器输出周期为 2 ms的方波,设单片机晶振
频率为 6 MHz。
选用定时器 /计数器 T0 作定时器,输出为 P1.0 引脚,2 ms
的方波可由间隔 1 ms的高低电平相间而成,因而只要每隔 1
ms对 P1.0 取反一次即可得到这个方波 。
定时 1 ms的初值,
因为 机器周期 =12÷ 6 MHz= 2 μs
所以 1 ms内 T0 需要计数 N次,
N= 1 ms÷ 2 μs = 500
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
由此可知, 使用方式 0 的 13 位计数器即可,T0 的初值 X为
X=M- N=8 192- 500=7 692=1E0CH
但是,因为 13 位计数器中,低 8 位 TL0 只使用了 5 位,其
余码均计入高 8 位 TH0 的初值,则 T0
TH0=0F0H,TL0=0CH
TMOD初始化, TMOD=00000000B=00H
( GATE=0,C/T=0,M1=0,M0=0)
TCON初始化, 启动 TR0=1
IE初始化, 开放中断 EA=1,定时器 T0 中断允许 ET0=1
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
程序清单如下,
ORG 0000H
AJMP START;
ORG 000BH
AJMP TOINT ; T0
ORG 0030H
START,MOV SP,# 60H;
MOV TH0,# 0F0H ; T0
MOV TL0,# 0CH
MOV TMOD,# 00H
SETB TR0 ; 启动 T0
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
SETB ET0 ; 开 T0
SETB EA ;
MAIN,AJMP MAIN ;
TOINT,CPL P1.0
MOV TL0,# 0CH
MOV TH0,# 0F0H
RET
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
二, 方式 1应用
方式 1 与方式 0 基本相同,只是方式 1 改用了 16 位计数
器 。 要求定时周期较长时,13 位计数器不够用,可改用 16 位
计数器 。
例 2 已知某生产线的传送带上不断地有产品单向传送,
产品之间有较大间隔 。 使用光电开关统计一定时间内的产品
个数 。 假定红灯亮时停止统计,红灯灭时才在上次统计结果
的基础上继续统计,试用单片机定时器 /计数器 T1的方式 1完
成该项产品的计数任务 。
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
图 6.7 硬件原理图
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
(1) 初始化, TMOD=11010000B=0D0H
( GATE=1,C/T=1,M0M1=01)
TCON=00H
(2) T1在方式 1时,溢出产生中断,且计数器回零,故在中
断服务程序中,需用 R0计数中断次数,以保护累积计数结果 。
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
(3) 启动 T1计数,开 T1中断。
程序清单如下,
ORG 0000H
AJMP START ;
ORG 001BH
AJMP T1INT ; T1
ORG 0100H
START,MOV SP,# 60H ;
MOV TCON,# 00H
MOV TMOD,# 0D0H
MOV TH1,# 00H
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
MOV TL1,# 00H
MOV R0,# 00H ;
MOV P3,# 28H; 设置 P3.5
SETB TR1 ; 启动 T1
SETB ET1; 开 T1
SETB EA ;
MAIN,ACALL DISP ; 主程序,

ORG 0A00H
T1INT,INC R0 ;
RETI
DISP,… ;
RET
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
三, 方式 2
方式 2 是定时器自动重装载的操作方式,在这种方式下,
定时器 0 和 1 的工作是相同的,它的工作过程与方式 0、
方式 1 基本相同,只不过在溢出的同时,将 8 位二进制初值
自动重装载,即在中断服务子程序中,不需要编程送初值,这
里不再举例 。 定时器 T1 工作在方式 2 时,可直接用作串行
口波特率发生器,
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
四, 方式 3
定时器 T0 工作在方式 3 时是 2 个 8 位定时器 /计数器 。
且 TH0 借用了定时器 T1 的溢出中断标志 TF1和运行控制位
TR1。
例 3 假设有一个用户系统中已使用了两个外部中断源,
并置定时器 T1 于方式 2,作串行口波特率发生器用,现要求
再增加一个外部中断源,并由 P1.0 口输出一个 5 Hz的方波
( 假设晶振频率为 6 MHz) 。
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
在不增加其它硬件开销时,可把定时器 /计数器 T0 置于工
作方式 3,利用外部引脚 T0端作附加的外部中断输入端,把
TL0 预置为 0FFH,这样在 T0 端出现由 1至 0 的负跳变时,
TL0 立即溢出,申请中断,相当于边沿激活的外部中断源 。 在
方式 3下,TH0 总是作 8 位定时器用,可以靠它来控制由
P1.0 输出的 5 kHz方波 。
由 P1.0 输出 5 kHz的方波,即每隔 100 μs使 P1.0 的电
平发生一次变化 。 则 TH0中的初始值 X=M- N=256-
100/2=206。
下面是有关的程序。
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
MOV TL0,# 0FFH
MOVTH0,# 206
MOVTL1,# BAUD ; BAUD
MOVTH1,# BAUD
MOVTMOD,# 27H ; 置 T0工作方式 3; TL0
MOVTCON,# 55H ; 启动定时器 T0,T1,置外部中断 0 和 1;
MOVIE,# 9FH ;
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
TL0 溢出中断服务程序(由 000BH单元转来),
TL0INT,MOV TL0,# 0FFH
… ; 外部引脚 T0 引起中断处理程序
RETI
TH0 溢出中断服务程序(由 001BH转来),
TH0INT,MOVTH0,# 206
CPL P1.0
RETI
此处串行口中断服务程序,外中断 0和外中断 1的中断服
务程序没有列出。
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
6.5 MCS - 51单片机的串行接口
6.5.1 串行通信的基本概念
(1) 同步方式是将一大批数据分成几个数据块,数据块之
间用同步字符予以隔开,而传输的各位二进制码之间都没有
间隔 。 其基本特征是发送与接收时钟始终保持严格同步 。
(2) 异步通信是按帧传送数据,它利用每一帧的起, 止信
号来建立发送与接收之间的同步,每帧内部各位均采用固定的
时间间隔,但帧与帧之间的时间间隔是随机的 。 其基本特征
是每个字符必须用起始位和停止位作为字符开始和结束的标
志,它是以字符为单位一个个地发送和接收的 。
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
6.5.2 与串行口有关的特殊功能寄存器
1,数据缓冲器 SBUF
串行口缓冲器 SBUF是可直接寻址的特殊功能寄存器,其
内部 RAM字节地址是 99H。 在物理上,它对应着两个独立的寄
存器,一个发送寄存器,一个接收寄存器 。 发送时,就是 CPU写
入 SBUF的时候,51 系列单片机没有专门的启动发送状态的指
令 ; 接收时,就是读取 SBUF的过程,接收寄存器是双缓冲的,以
避免在接收下一帧数据之前,CPU未能及时响应接收器的中断,
没有把上一帧数据读走,而产生两帧数据重叠的问题 。
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
2,串行口控制寄存器 SCON
SCON用于控制和监视串行口的工作状态,其各位定义如
图 5.3 所示 。 相应的各位功能介绍如下,
SM0,SM1,用于定义串行口的操作模式,两个选择位对
应 4 种模式,见表 6.2。 其中 fOSC是振荡器频率,UART为通用异
步接收和发送器的英文缩写 。
SM2,多机通信时的接收允许标志位 。 在模式 2 和 3 中,
若 SM2 = 1,且接收到的第 9 位数据 ( RB8) 是 0,则接收中断
标志 ( RI) 不会被激活 。 在模式 1中,若 SM2=1 且没有接收到
有效的停止位,则 RI不会被激活 。 在模式 0 中,SM2 必须是 0。
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
表 6.2 串行口操作模式选择
SM0 SM1 模 式 功 能 波 特 率
0 0
0 1
1 0
1 1
0
1
0
1
同步移位寄存器
8位 UART
9位 UART
9位 UART
fOSC/12
可变 (T1溢出率 )
fOSC/64 或 fOSC/32
可变 (T1溢出率 )
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
3,电源控制寄存器 PCON
特殊功能寄存器 PCON中,只有一位 ( 最高位 ) SMOD
与串行口的工作有关,该位是串行口波特率系数的控制位,
SMOD=1 时,波特率加倍,否则不加倍 。
PCON的地址为 87H,不可位寻址,因此初始化时需要字
节传送。
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
6.5.3 串行口的 4 种工作模式
1,模式 0
(1) 模式 0 输出状态。
图 6.8 外接移位寄存器输出
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
(2) 模式 0 输入状态。
图 6.9 外接移位寄存器输入
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
2,模式 1
串行口工作于模式 1 时,为波特率可变的 8 位异步通信接
口 。 数据位由 P3.0 (RXD)端接收,由 P3.1(TXD)端发送 。 传送
一帧信息为 10 位, 一位起始位 ( 0),8 位数据位 ( 低位在前 )
和一位停止位 ( 1) 。 波特率是可变的,它取决于定时器 T1 的
溢出速率及 SMOD的状态 。
(1) 模式 1 发送过程 。 用软件清除 TI后,CPU执行任何
一条以 SBUF为目标寄存器的指令,就启动发送过程 。 数据由
TXD引脚输出,此时的发送移位脉冲是由定时器 /计数器 T1 送
来的溢出信号经过 16 或 32 分频而取得的 。 一帧信号发送完时,
将置位发送中断标志 TI=1,向 CPU申请中断,完成一次发送过程 。
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
(2) 模式 1 接收过程 。
用软件清除 RI后,当允许接收位 REN被置位 1 时,接收
器以选定波特率的 16 倍的速率采样 RXD引脚上的电平,即在
一个数据位期间有 16 个检测脉冲,并在第 7,8,9 个脉冲期
间采样接收信号,然后用三中取二的原则确定检测值,以抑制
干扰 。 并且采样是在每个数据位的中间,避免了信号边沿的波
形失真造成的采样错误 。 当检测到有从, 1”到, 0”的负跳变
时,则启动接收过程,在接收移位脉冲的控制下,接收完一帧信
息 。 当最后一次移位脉冲产生时能满足下列两个条件,
① RI=0;
② 接收到的停止位为 1 或 SM2=0。
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
3,模式 2 和模式 3。
串行口工作于模式 2 和模式 3 时,被定义为 9 位异步通
信接口 。 它们的每帧数据结构是 11 位的, 最低位是起始位
( 0),其后是 8 位数据位 ( 低位在先 ),第 10 位是用户定义
位 ( SCON中的 TB8或 RB8),最后一位是停止位 ( 1) 。 模
式 2 和模式 3 工作原理相似,唯一的差别是模式 2 的波特率
是固定的,即为 fOSC / 32或 fOSC / 64; 而模式 3的波特率是可
变的,与定时器 T1的溢出率有关 。
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
(1) 模式 2和模式 3的发送过程 。
发送过程是由执行任何一条 SBUF为目的寄存器的指令来
启动的 。 由, 写入 SBUF”信号把 8 位数据装入 SBUF,同时
还把 TB8 装入发送移位寄存器的第 9 位,并通知发送控制器
要求进行一次发送 。 发送开始,把一个起始位 ( 0) 送到 TXD
端 。 移位后,数据由移位寄存器送到 TXD端 。 再过一位,出现
第一个移位脉冲 。 第一次移位时,把一个停止位, 1”由控制器
的停止位发生端送入移位寄存器的第 9 位 。 此后,每次移位时,
把 0 送入第 9 位 。 因此,当 TB8 的内容送到移位寄存器的输出
位置时,其左面一位是停止位, 1”,而再往左的所有位全为
,0”。 这种状态由零检测器检测到后,就通知发送控制器作最
后一次移位,然后置 TI=1,请求申请中断 。 第 9 位数据 ( TB8)
由软件置位或清零,可以作为数据的奇偶校验位,也可以作为多
机通信中的地址, 数据标志位 。 如把 TB8 作为奇偶校验位,可
以在发送程序中,在数据写入 SBUF之前,先将数据位写入
TB8。
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
(2) 模式 2和模式 3接收过程 。
与模式 1类似,模式 2和模式 3接收过程始于在 RXD端
检测到负跳变时,为此,CPU以波特率 16倍的采样速率对 RXD
端不断采样 。 一检测到负跳变,16分频计数器就立刻复位,同
时把 1FFH写入输入移位寄存器 。 计数器的 16个状态把一位时
间等分成 16份,在每一位的第 7,8,9个状态时,位检测器对
RXD端的值采样 。 如果所接收到的起始位无效 ( 为 1),则复
位接收电路,等待另一个负跳变的到来 。 若起始位有效 ( 为
0) 则起始位移入移位寄存器,并开始接收这一帧的其余位 。
当起始位 0 移到最左面时,通知接收控制器进行最后一次移
位 。 把 8 位数据装入接收缓冲器 SBUF,第 9 位数据装入
SCON中的 RB8,并置中断标志 RI=1。
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
装入 SBUF和 RB8以及置位 RI的信号只有在产生最后一
个移位脉冲且同满足下列两个条件,才会产生,
① RI=0;
② SM2 =0 或接收到的第 9 位数据为, 1”。
上述两个条件中任一个不满足,所接收的数据帧就会丢失,
不再恢复 。 两者都满足时,第 9 位数据装入 TB8,前 8 位数
据装入 SBUF。
请注意, 与模式 1 不同,模式 2 和 3 中装入 RB8 的是第
9 位数据,而不是停止位 。 所接收的停止位的值与 SBUF、
RB8 和 RI都没有关系,利用这一特点可用于多机通信中 。
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
6.5.4 多机通信
图 6.10 多处理机通信系统
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
6.5.5
串行口每秒钟发送或接收的数据位数称为波特率 。 假设
发送一位数据所需时间为 T,则波特率为 1/T。
(1) 模式 0 的波特率等于单片机晶振频率的 1/12,即每个
机器周期接收或发送一位数据 。
(2) 模式 2 的波特率与电源控制器 PCON的最高位 SMOD
的写入值有关,
即 SMOD=0,波特率为 (1/64) fOSC; SMOD=1,波特率为 ( 1/32)
fOSC。
64
22 S M O D?? 晶振频率的波特率模式
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
(3) 模式 1 和模式 3 的波特率除了与 SMOD位有关之外,
还与定时器 T1 的溢出率有关 。 定时器 T1 作为波特率发生
器,常选用定时方式 2( 8 位重装载初值方式 ),并且禁止 T1
中断 。 此时 TH1 从初值计数到产生溢出,它每秒钟溢出的次
数称为溢出率 。 于是
)1256(1232
2
32
2
131
TH
f
T
O S C
S M O D
S M O D
??
??
?? 的溢出率的波特率或模式
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
表 6.3 定时器 T1产生的常用波特率
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
假设某 MCS - 51 单片机系统,串行口工作于模式 3,要
求传送波特率为 1 200 Hz,作为波特率发生器的定时器 T1工
作在方式 2 时,请求出计数初值为多少? 设单片机的振荡频
率为 6 MHz。
因为串行口工作于模式 3 时的波特率为
)12 5 6(1232
23
TH
f O S CS M O D
????的波特率模式
所以
)2/32(122 5 61 S M O D
O S CfTH
???? 波特率
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
当 SMOD=0 时,初值 TH1=256-6× 106/(1 200× 12× 32/1)
=243=0F3H
当 SMOD=1 时,初值 TH1=256-6× 106/( 1200× 12× 32/2)
=230=0E6H
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
6.6 串行口的应用
一, 串行口的编程
串行口需初始化后,才能完成数据的输入, 输出 。 其初始
化过程如下,
(1) 按选定串行口的操作模式设定 SCON的 SM0,SM1两位
二进制编码 。
(2) 对于操作模式 2 或 3,应根据需要在 TB8 中写入待发
送的第 9 位数据 。
(3) 若选定的操作模式不是模式 0,还需设定接收 /发送的波
特率 。
设定 SMOD的状态,以控制波特率是否加倍 。
若选定操作模式 1或 3,则应对定时器 T1进行初始化以设定
其溢出率。
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
二、
例 1 用 8051 串行口外接 74LS165 移位寄存器扩展 8位输
入口,输入数据由 8 个开关提供,另有一个开关 K提供联络信
号 。 电路示意如图 6.11 所示 。 当开关 K合上时,表示要求输入
数据 。 输入 8 位开关量,处理不同的程序 。
图 6.11
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
程序如下,
START,JB P1.0,$ ; 开关 K未合上,
SETB P1.1 ; 165
CLR P1.1 ;
MOV SCON,# 10H ; 串行口模式 0
JNB RI,$ ; 查询 RI
CLR RI ; 查询结束,清 RI
MOV A,SBUF ;; 根据 A
SJMP START ; 准备下一次接收。

第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
例 2
图 6.12 双机通信系统
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
甲机发送(采用查询方式),
MOV SCON,# 80H ; 设置工作方式 2
MOV PCON,# 00; 置 SMOD=0,
MOV R0,# 40H ;
MOVR2,# 10H ;
LOOP,MOV A,@R0 ;
MOV C,P ; 奇偶位送 TB8
MOVTB8,C
MOV SBUF,A ; 送串口并开始发送数据
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
WAIT,JBCTI,NEXT ; 检测是否发送结束并清 TI
SJMP WAIT
NEXT,INC R0;
DJNZR2,LOOP
RET
乙机接收(查询方式),
MOV SCON,# 90H; 模作模式 2,
MOV PCON,# 00H; 置 SMOD=0
MOV RO,# 60H ;
MOV R2,# 10H ;
第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
LOOP,JBC RI,READ ; 等待接收数据并清 RI
SJMP LOOP
READ,MOV A,SBUF ;
MOV C,P
JNC LP0 ; C不为 1 转 LP0
JNB RB8,ERR ; RB8=0,即 RB8不为 P转 ERR
AJMP LP1
LP0,JB RB8,ERR ; RB8=1,即 RB8不为 P转 ERR
LP1,MOV @R0,A ; RB8=P,
INC R0
DJNZ R2,LOOP
RET
ERR,… ;