第 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 SM O D 晶振频率的波特率模式第 6章 MCS - 51单片机内部定时器 /计数器及串行接口
(3) 模式 1 和模式 3 的波特率除了与 SMOD位有关之外,
还与定时器 T1 的溢出率有关 。 定时器 T1 作为波特率发生器,常选用定时方式 2( 8 位重装载初值方式 ),并且禁止 T1
中断 。 此时 TH1 从初值计数到产生溢出,它每秒钟溢出的次数称为溢出率 。 于是
)12 5 6(1232
2
32
2
131
TH
f
T
O SC
SM O D
SM 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,… ;