第6章 MCS - 51单片机内部定时器/ 计数器 及串行接口 6.1 定时器/计数器的结构及工作原理 6.2 方式和控制寄存器 6.1 定时器/计数器的结构及工作原理 6.2 方式和控制寄存器 6.3 工作方式 6.4 定时器/计数器应用举例 6.5 MCS - 51单片机的串行接口 6.6 串行口的应用
6.1 定时器/计数器的结构及工作原理 图 6.1 定时器/计数器结构框图
加法计数器是计满溢出时才申请中断, 所以在给计数器赋初值时, 不能直接输入所需的计数值, 而应输入的是计数器计数的最大值与这一计数值的差值, 设最大值为 M, 计数值为 N, 初值为 X, 则 X的计算方法如下: 计数状态: X=M-N 定时状态: X=M-定时时间/T 而 T=12÷晶振频率
6.2 方式和控制寄存器 一、 定时器/计数器的方式寄存器TMOD 图 6.2 TMOD各位定义
1. M1M0工作方式控制位 表 6.1 工作方式选择表 M1 M0 方式 说 明 0 0 说 明 0 0 13 位定时器(TH的 8 位和TL的低 5 位) 0 1 1 16 位定时器/计数器 1 0 2 自动重装入初值的 8 位计数器 1 1 3 T0 分成两个独立的 8 位计数器, T1 在方式 3 时停止工作
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)的电平是高还是低。
二、 定时器/计数器控制寄存器TCON TF0、TF1分别是定时器/计数器T0、 T1 的溢出标志位, 加法计数器计满溢出时置 1, 申请中断, 在中断响应后自动复 0。TF产生的中断申请是否被接受, 还需要由中断是否开放来决定。 TR1、TR0 分别是定时器 /计数器T1、 T0 的运行控制位, 通过软件置 1 后, 定时器 /计数器才开始工作, 在系统复位时被清 0。
6.3 工作方式 一、 方式 0 图6.3 方式 0(13位计数器)
二、 方式1 图 6.4 方式 1(16位计数器)
三、方式 2 图 6.5 方式 2(初始常数自动重装载)
四、 方式 3 图 6.6 方式 3(两个 8 位独立计数器)
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
由此可知: 使用方式 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
程序清单如下: 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
SETB ET0 ; 开T0中断 SETB EA ; 开总允许中断 MAIN: AJMP MAIN ; 主程序 TOINT: CPL P1.0 MOV TL0, #0CH MOV TH0, #0F0H RET
二、 方式 1应用 方式 1 与方式 0 基本相同, 只是方式 1 改用了 16 位计数器。 要求定时周期较长时, 13 位计数器不够用, 可改用 16 位计数器。 例 2 已知某生产线的传送带上不断地有产品单向传送, 产品之间有较大间隔。使用光电开关统计一定时间内的产品个数。 假定红灯亮时停止统计, 红灯灭时才在上次统计结果的基础上继续统计, 试用单片机定时器 /计数器T1的方式 1完成该项产品的计数任务。
图 6.7 硬件原理图
(1) 初始化: TMOD=11010000B=0D0H (GATE=1, C/T=1, M0M1=01) TCON=00H (2) T1在方式1时, 溢出产生中断, 且计数器回零, 故在中断服务程序中, 需用R0计数中断次数, 以保护累积计数结果。
(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
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
三、 方式 2 应用 方式 2 是定时器自动重装载的操作方式, 在这种方式下, 定时器 0 和 1 的工作是相同的, 它的工作过程与方式 0、 方式 1 基本相同, 只不过在溢出的同时, 将 8 位二进制初值自动重装载, 即在中断服务子程序中, 不需要编程送初值, 这里不再举例。定时器 T1 工作在方式 2 时, 可直接用作串行口波特率发生器,
四、 方式 3 的应用 定时器 T0 工作在方式 3 时是 2 个 8 位定时器 /计数器。 且TH0 借用了定时器 T1 的溢出中断标志TF1和运行控制位 TR1。 例 3 假设有一个用户系统中已使用了两个外部中断源, 并置定时器 T1 于方式 2, 作串行口波特率发生器用, 现要求再增加一个外部中断源, 并由 P1.0 口输出一个 5 Hz的方波(假设晶振频率为 6 MHz)。
在不增加其它硬件开销时, 可把定时器/计数器 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。 下面是有关的程序。
MOV TL0, #0FFH MOVTH0, #206 MOVTL1, #BAUD ; BAUD根据波特率要求设置常数 MOVTH1, #BAUD MOVTMOD, #27H ; 置T0工作方式3 ; TL0工作于计数器方式 MOVTCON, #55H ; 启动定时器 T0、 T1, 置外部中断 0 和 1 ; 为边沿激活方式 MOVIE, #9FH ; 开放全部中断
TL0 溢出中断服务程序(由 000BH单元转来): TL0INT: MOV TL0, #0FFH … ; 外部引脚 T0 引起中断处理程序 RETI TH0 溢出中断服务程序(由 001BH转来): TH0INT: MOVTH0, #206 CPL P1.0 此处串行口中断服务程序、 外中断 0和外中断 1的中断服务程序没有列出。
6.5 MCS - 51单片机的串行接口 6.5.1 串行通信的基本概念 (1) 同步方式是将一大批数据分成几个数据块, 数据块之间用同步字符予以隔开, 而传输的各位二进制码之间都没有间隔。 其基本特征是发送与接收时钟始终保持严格同步。 (2)异步通信是按帧传送数据, 它利用每一帧的起、止信号来建立发送与接收之间的同步,每帧内部各位均采用固定的时间间隔, 但帧与帧之间的时间间隔是随机的。其基本特征是每个字符必须用起始位和停止位作为字符开始和结束的标志, 它是以字符为单位一个个地发送和接收的。
6.5.2 与串行口有关的特殊功能寄存器 1. 数据缓冲器SBUF 串行口缓冲器SBUF是可直接寻址的特殊功能寄存器, 其内部RAM字节地址是99H。在物理上, 它对应着两个独立的寄存器, 一个发送寄存器, 一个接收寄存器。发送时, 就是CPU写入 SBUF的时候,51 系列单片机没有专门的启动发送状态的指令; 接收时, 就是读取SBUF的过程, 接收寄存器是双缓冲的, 以避免在接收下一帧数据之前, CPU未能及时响应接收器的中断, 没有把上一帧数据读走, 而产生两帧数据重叠的问题。
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.2 串行口操作模式选择 SM0 SM1 模 式 功 能 波 特 率 0 0 0 1 1 0 1 1 1 同步移位寄存器 8位UART 表6.2 串行口操作模式选择 SM0 SM1 模 式 功 能 波 特 率 0 0 0 1 1 0 1 1 1 同步移位寄存器 8位UART 9位UART fOSC/12 可变(T1溢出率) fOSC/64 或fOSC/32
3. 电源控制寄存器PCON 特殊功能寄存器PCON中, 只有一位(最高位)SMOD与串行口的工作有关, 该位是串行口波特率系数的控制位: SMOD=1 时, 波特率加倍, 否则不加倍。 PCON的地址为 87H, 不可位寻址, 因此初始化时需要字节传送。
6.5.3 串行口的 4 种工作模式 模式 0 (1) 模式 0 输出状态。 图 6.8 外接移位寄存器输出
(2) 模式 0 输入状态。 图6.9 外接移位寄存器输入
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申请中断, 完成一次发送过程。
(2) 模式 1 接收过程。 用软件清除 RI后, 当允许接收位 REN被置位 1 时, 接收器以选定波特率的 16 倍的速率采样 RXD引脚上的电平, 即在一个数据位期间有 16 个检测脉冲, 并在第 7、 8、9 个脉冲期间采样接收信号, 然后用三中取二的原则确定检测值, 以抑制干扰。 并且采样是在每个数据位的中间, 避免了信号边沿的波形失真造成的采样错误。当检测到有从“1”到“0”的负跳变时, 则启动接收过程, 在接收移位脉冲的控制下, 接收完一帧信息。 当最后一次移位脉冲产生时能满足下列两个条件: ① RI=0; ② 接收到的停止位为 1 或 SM2=0。
3. 模式 2 和模式 3。 串行口工作于模式 2 和模式 3 时, 被定义为 9 位异步通信接口。 它们的每帧数据结构是 11 位的: 最低位是起始位(0), 其后是 8 位数据位(低位在先), 第 10 位是用户定义位(SCON中的 TB8或 RB8), 最后一位是停止位(1)。模式 2 和模式3 工作原理相似, 唯一的差别是模式 2 的波特率是固定的, 即为 fOSC / 32或 fOSC / 64; 而模式 3的波特率是可变的, 与定时器 T1的溢出率有关。
(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。
(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。
装入 SBUF和 RB8以及置位 RI的信号只有在产生最后一个移位脉冲且同满足下列两个条件, 才会产生: ② SM2 =0 或接收到的第 9 位数据为“1”。 上述两个条件中任一个不满足, 所接收的数据帧就会丢失, 不再恢复。 两者都满足时, 第 9 位数据装入 TB8, 前 8 位数据装入 SBUF。 请注意: 与模式 1 不同, 模式 2 和 3 中装入 RB8 的是第 9 位数据, 而不是停止位。所接收的停止位的值与SBUF、 RB8 和 RI都没有关系, 利用这一特点可用于多机通信中。
6.5.4 多机通信 图 6.10 多处理机通信系统
6.5.5 波特率 串行口每秒钟发送或接收的数据位数称为波特率。 假设发送一位数据所需时间为T, 则波特率为 1/T。 (1) 模式 0 的波特率等于单片机晶振频率的 1/12, 即每个机器周期接收或发送一位数据。 (2) 模式 2 的波特率与电源控制器PCON的最高位SMOD的写入值有关: 即SMOD=0, 波特率为(1/64) fOSC; SMOD=1, 波特率为(1/32)fOSC。
(3) 模式 1 和模式 3 的波特率除了与SMOD位有关之外, 还与定时器 T1 的溢出率有关。 定时器 T1 作为波特率发生器, 常选用定时方式 2( 8 位重装载初值方式), 并且禁止 T1 中断。此时 TH1 从初值计数到产生溢出, 它每秒钟溢出的次数称为溢出率。 于是
表 6.3 定时器T1产生的常用波特率
假设某MCS - 51 单片机系统, 串行口工作于模式 3, 要求传送波特率为1 200 Hz, 作为波特率发生器的定时器T1工作在方式 2 时, 请求出计数初值为多少? 设单片机的振荡频率为6 MHz。 因为串行口工作于模式 3 时的波特率为 所以
当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.6 串行口的应用 一、 串行口的编程 串行口需初始化后, 才能完成数据的输入、输出。其初始化过程如下: 6.6 串行口的应用 一、 串行口的编程 串行口需初始化后, 才能完成数据的输入、输出。其初始化过程如下: (1) 按选定串行口的操作模式设定SCON的SM0、SM1两位二进制编码。 (2) 对于操作模式 2 或 3, 应根据需要在 TB8 中写入待发送的第 9 位数据。 (3) 若选定的操作模式不是模式 0, 还需设定接收/发送的波特率。 设定SMOD的状态, 以控制波特率是否加倍。 若选定操作模式1或3, 则应对定时器 T1进行初始化以设定其溢出率。
二、 串行口的应用 例1 用 8051 串行口外接 74LS165 移位寄存器扩展8位输入口, 输入数据由 8 个开关提供, 另有一个开关 K提供联络信号。电路示意如图6.11 所示。当开关K合上时, 表示要求输入数据。输入 8 位开关量, 处理不同的程序。 图 6.11
程序如下: 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 ; 准备下一次接收。 …
例 2 利用串行口进行双机通信。 图 6.12 双机通信系统
甲机发送(采用查询方式): 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 ; 送串口并开始发送数据
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 ; 等待接收数据长度
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: … ; 出错处理程序 …