6.1 定时器/计数器概述
6.1.1 基本概念
定时器/计数器是单片机的重要组成部分,可用于精确计时、产生定时中断和计数外部事件。8051单片机有两个16位定时器/计数器:T0和T1,每个定时器/计数器由两个8位寄存器组成。
定时器模式
计数器对内部机器周期计数,用于实现精确的定时功能
计数器模式
计数器对外部输入脉冲计数,用于测量外部事件的频率或次数
6.1.2 工作原理
- 核心结构:定时器/计数器的核心是一个16位加1计数器,由THx和TLx两个8位寄存器组成
- 定时器模式:计数脉冲来自内部时钟,频率为晶振频率的1/12
- 计数器模式:计数脉冲来自外部输入引脚T0(P3.4)或T1(P3.5)
- 溢出机制:当计数器计满溢出时,TFx标志位置1,可触发中断或作为查询标志
6.1.3 相关寄存器
TMOD寄存器(定时器模式控制寄存器)
TMOD用于设置定时器/计数器的工作模式,字节地址为89H,不可位寻址。
位功能详解:
- GATE(门控位):
- = 0:仅由TR位控制启停
- = 1:由TR位和外部中断引脚共同控制
- C/T(模式选择):
- = 0:定时器模式(内部时钟)
- = 1:计数器模式(外部引脚)
M1、M0(模式选择):
- M1=0, M0=0:模式0(13位)
- M1=0, M0=1:模式1(16位)
- M1=1, M0=0:模式2(8位自动重装)
- M1=1, M0=1:模式3(T0双8位)
常用配置案例:
TCON寄存器(定时器控制寄存器)
TCON用于控制定时器的运行和溢出标志,字节地址为88H,可位寻址。
定时器相关位:
- TF1/TF0(溢出标志):
- 定时器溢出时由硬件置1
- 触发中断后由硬件清零(模式2除外)
- TR1/TR0(运行控制):
- = 1:启动定时器
- = 0:停止定时器
外部中断相关位:
- IE1/IE0(中断标志):
- 外部中断请求有效时置1
- IT1/IT0(触发方式):
- = 0:电平触发方式
- = 1:边沿触发方式
常用配置案例:
6.2 定时器/计数器工作模式
模式0:13位定时器/计数器
模式0是8051单片机的兼容模式,由THx的8位和TLx的低5位组成13位计数器,TLx的高3位无效。
计数器结构:
- 最大计数值:2^13 = 8192
- 最大定时时间:8192 × 机器周期(12MHz晶振下约8.192ms)
- 适用场景:兼容早期单片机,较少使用
初始化代码:
模式1:16位定时器/计数器
模式1是最常用的工作模式,由THx和TLx组成完整的16位计数器,功能完整,定时范围最大。
计数器结构:
- 最大计数值:2^16 = 65536
- 最大定时时间:65536 × 机器周期(12MHz晶振下约65.536ms)
- 适用场景:需要较长定时的场合,如LED闪烁、按键防抖等
初始化代码(定时50ms):
模式2:自动重装初值
模式2是一种自动重装初值的8位定时器/计数器,TLx作为计数器,THx作为初值寄存器,溢出后THx自动装入TLx,无需软件重装。
工作原理:
- 最大计数值:2^8 = 256
- 最大定时时间:256 × 机器周期(12MHz晶振下约256μs)
- 适用场景:需要精确定时且定时时间较短的场合,如波特率发生器
初始化代码(波特率发生器):
模式3:T0双8位模式
模式3仅适用于T0,将T0分成两个独立的8位计数器TH0和TL0。TL0使用原T0的控制位(TR0、TF0),TH0占用T1的控制位(TR1、TF1),此时T1只能作为串行口波特率发生器使用。
计数器结构:
- TL0:8位定时器/计数器,使用T0中断
- TH0:仅8位定时器,使用T1中断
- T1:停止计数,只能用作波特率发生器
- 适用场景:需要两个独立定时器的场合
初始化代码:
模式选择建议
适用于需要较长定时的场合,如LED闪烁、按键防抖、定时采集等。
适用于需要精确定时且无需重装初值的场合,如波特率发生器、高频信号检测。
与模式1类似,但较少使用,仅用于兼容早期8048单片机程序。
仅在需要两个独立8位定时器时使用,此时T1只能用作波特率发生器。
6.3 定时器/计数器编程
6.3.1 初值计算
6.3.2 编程步骤
设置TMOD寄存器
写入初值
设置中断寄存器
启动定时器
编写中断服务程序
6.3.3 编程实例
实例一:定时中断实现LED闪烁
项目功能:
使用定时器T0实现1秒延时,控制LED灯每秒闪烁一次,模拟警示灯效果。
硬件连接:
LED正极通过限流电阻连接至P1.0引脚,负极接地。
实例二:计数器模式脉冲计数
项目功能:
使用T0计数器模式对外部脉冲计数,每计满100个脉冲触发中断,切换LED状态。
硬件连接:
脉冲信号输入至T0引脚(P3.4),LED连接至P1.0引脚。
实例三:简易电子秒表
项目功能:
使用T0定时器实现秒表功能,P1口控制8个LED显示秒数(二进制),每1秒加1。
硬件连接:
8个LED分别连接至P1.0~P1.7引脚,LED正极通过限流电阻接电源。
实例四:LED流水灯控制器
项目功能:
使用T0定时器实现LED流水灯效果,8个LED依次点亮,每个LED点亮500ms。
硬件连接:
8个LED分别连接至P1.0~P1.7引脚,采用共阳极接法。
实例五:按键防抖处理
项目功能:
使用T0定时器实现按键防抖,检测按键按下后延时10ms再判断,避免抖动干扰。
硬件连接:
按键一端接P3.2(INT0),另一端接地;LED连接至P1.0引脚。
实例六:定时数据采集
项目功能:
使用T0定时器实现每隔500ms采集一次ADC数据,模拟温度采集场景。
硬件连接:
ADC输出接至P0口,LED连接至P1口显示采集状态。
6.4 串行口通信
6.4.1 基本概念
串行通信是指数据一位一位地按顺序传送的通信方式,具有传输线少、成本低等优点。8051单片机内置一个全双工串行通信接口,可实现单片机之间或单片机与其他设备之间的通信。
异步通信
8051单片机采用异步通信方式,以帧为单位进行数据传输
全双工
发送和接收可同时进行,有独立的发送和接收缓冲器
6.4.2 串行口结构
- 发送缓冲器SBUF:用于存放待发送的数据:指令:MOV SBUF,A
- 接收缓冲器SBUF:用于存放接收到的数据:指令:MOV A,SBUF
- SCON寄存器:用于设置串行口的工作方式、接收/发送控制和状态标志
- 波特率发生器:通常由定时器T1或T2构成,用于控制串行通信的速率
6.4.3 工作方式
方式0:同步移位寄存器
波特率固定为fosc/12,主要用于扩展I/O口
方式1:10位异步通信
波特率可变,由定时器T1或T2控制,最常用的通信方式
方式2:11位异步通信
波特率固定为fosc/64或fosc/32
方式3:11位异步通信
波特率可变,由定时器T1或T2控制
6.4.4 波特率计算
6.4.5 串行口编程
案例一:串口发送字符串
项目功能:
单片机通过串口向PC发送"Hello, 8051!"字符串,可用于调试通信是否正常。
硬件连接:
单片机TXD(P3.1)引脚接USB转TTL模块的RXD,GND共地。
案例二:串口回显程序
项目功能:
单片机接收PC发送的数据,然后将接收到的数据原样发送回去,实现回显功能。
硬件连接:
单片机TXD(P3.1)接USB转TTL的RXD,RXD(P3.0)接USB转TTL的TXD。
案例三:串口控制LED
项目功能:
PC通过串口发送指令控制LED:发送'1'点亮LED,发送'0'熄灭LED,发送'2'闪烁LED。
硬件连接:
LED正极通过限流电阻接P1.0,负极接地;串口连接同案例二。
案例四:串口方式0驱动74LS164实现8位左移流水灯
项目功能:
利用串口方式0驱动74LS164芯片,实现8位LED从右向左依次点亮的流水灯效果,循环往复。
硬件连接:
74LS164的DS接P3.0(RXD),CP接P3.1(TXD),MR接VCC;Q0-Q7输出端接8个LED。
6.5 综合案例
案例一:LED闪烁控制
使用定时器T0产生500ms的定时中断,在中断服务程序中切换LED的状态,实现LED以1秒为周期闪烁。
案例二:数码管动态显示
使用定时器T1产生2ms的定时中断,在中断服务程序中进行数码管的动态扫描,实现4位数码管显示0-9999的计数。
案例三:串口通信测试
实现单片机与PC之间的串口通信,单片机接收PC发送的数据,并将其原样返回。
案例四:串口控制LED
通过串口发送指令控制LED的亮灭。发送'A'点亮LED,发送'B'熄灭LED,发送'C'切换LED状态。
6.6 本章总结
核心要点
- 掌握定时器/计数器的4种工作模式及其应用场景
- 熟练计算定时器初值,理解定时时间与初值的关系
- 掌握串行口的4种工作方式,重点掌握方式1
- 熟练计算串行口波特率,理解定时器T1作为波特率发生器的配置方法
- 能够编写定时器中断和串行口中断的应用程序
学习建议
- 通过实际实验加深对定时器工作原理的理解
- 多练习定时器初值和波特率的计算
- 结合Proteus仿真软件验证程序功能
- 尝试将定时器和串行口结合使用,实现更复杂的应用
- 注意中断服务程序中现场保护的重要性
6.7 课后练习题
1 填空题
1. 8051单片机有____个16位定时器/计数器,它们分别是____和____。
2. 定时器模式下,计数脉冲来自____;计数器模式下,计数脉冲来自____引脚。
3. TMOD寄存器中,GATE位为____时,定时器由TR位控制启动;GATE位为____时,定时器由外部中断引脚控制启动。
4. 定时器模式2具有____功能,适用于____场合。
5. 8051串行口有____种工作方式,其中方式____是最常用的异步通信方式。
6. 串行口方式1的波特率由____决定,通常使用____作为波特率发生器。
7. SCON寄存器中,REN位的作用是____,TI位表示____。
8. 定时器T0工作在模式3时,被分成两个独立的____位计数器,此时____停止工作。
9. 方式1通信的帧格式为:1位____、____位数据、1位____,共10位。
10. 12MHz晶振,波特率2400bps,SMOD=0时,定时器T1的初值应为____。
2 单选题
1. 以下哪种工作模式具有自动重装初值功能?
A. 模式0 B. 模式1 C. 模式2 D. 模式3
2. 定时器T0工作在模式3时,TH0的启停由哪个位控制?
A. TR0 B. TR1 C. ET0 D. EA
3. 串行口方式1的波特率是?
A. 固定的 B. 可变的 C. fosc/12 D. fosc/64
4. TMOD寄存器中,C/T位为1时,定时器工作在?
A. 定时模式 B. 计数模式 C. 中断模式 D. 串行模式
5. 12MHz晶振下,定时器T0模式1的最大定时时间约为?
A. 65ms B. 8ms C. 256ms D. 1ms
6. 串行口发送数据时,以下哪个标志位需要软件清零?
A. RI B. TI C. SCON D. SMOD
7. 定时器中断向量地址中,T0中断的入口地址是?
A. 000BH B. 001BH C. 0023H D. 0003H
8. 以下哪种方式常用于波特率发生器?
A. T0模式0 B. T1模式1 C. T1模式2 D. T0模式3
9. 串行口方式0的波特率是?
A. fosc/12 B. fosc/64 C. 可变 D. 9600bps
10. PCON寄存器中SMOD位为1时,波特率会?
A. 不变 B. 减半 C. 加倍 D. 清零
3 编程题
1. 使用定时器T0模式1,编写程序实现P1.0引脚输出周期为2秒的方波(晶振频率为12MHz)。
2. 使用定时器T1模式2,编写程序实现P1口8个LED依次循环点亮,每个LED点亮时间为500ms(晶振频率为12MHz)。
3. 编写串口通信程序,实现单片机向PC发送字符串"Hello, 8051!"(波特率2400bps,12MHz晶振)。
4. 编写程序,通过串口接收PC发送的数据,并根据接收到的数据控制LED:接收到'1'点亮LED,接收到'0'熄灭LED。
5. 使用定时器T0模式0,编写程序实现4位数码管动态显示,显示0-9999的循环计数(定时时间为1ms)。