×
关于关于关于1. 如何学习单片机7. LED 点阵的学习13.1602 液晶与串口的应用1.1 学习什么单片机7.1 C 语言变量的作用域13.1 通信时序解析1.2 如何学习单片机7.2 C 语言变量的存储类别13.2 1602 整屏移动1.3 单片机学习的准备工作7.3 LED 点阵的介绍13.3 多个 .c 文件的初步认识1.4 单片机开发环境搭建--Keil uVision4安装教程7.4 LED 点阵的图形显示13.4 单片机计算器实例1.5 Keil uVision4 简单使用教程7.5 LED 点阵的纵向移动13.5 串口通信原理和控制程序第一章问题汇总7.6 LED 点阵的横向移动14. I2C 总线与 EEPROM2. 点亮你的 LED 灯8. 单片机按键14.1 单片机 I2C 时序介绍2.1 单片机内部资源8.1 单片机最小系统解析14.2 I2C 寻址模式2.2 单片机最小系统8.2 C 语言函数的调用14.3 单片机 EEPROM 简介2.3 发光二极管(LED 灯)8.3 C 语言函数的形参和实参14.4 EEPROM 单字节读写操作时序2.4 特殊功能寄存器和位定义8.4 单片机按键介绍14.5 EEPROM 多字节读写操作时序2.5 新建一个工程8.5 ​单片机独立按键扫描程序14.6 EEPROM 的页写入2.6 第一个单片机程序8.6 单片机按键消抖程序14.7 I2C 和 EEPROM 的综合编程2.7 将程序下载到单片机8.7 单片机矩阵按键的扫描15. 实时时钟 DS13023. 单片机硬件基础知识学习8.8 简易加法计算器程序15.1 BCD 码介绍3.1 电磁干扰 EMI9. 步进电机与蜂鸣器15.2 单片机 SPI 通信接口3.2 单片机中去耦电容的应用9.1 单片机 IO 口的结构15.3 实时时钟芯片 DS1302 介绍3.3 三极管的的概念及其工作原理9.2 单片机上下拉电阻15.4 DS1302 的硬件信息3.4 单片机中三极管的应用9.3 电机的分类15.5 DS1302 寄存器介绍3.5 74HC138 三八译码器的应用9.4 28BYJ-48 步进电机原理15.6 DS1302 通信时序介绍3.6 LED 灯闪烁程序9.5 让电机转起来15.7 DS1302 的 BURST 模式4. 流水灯的实现9.6 转动精度与深入分析15.8 C 语言复合数据类型4.1 二进制、十进制和十六进制9.7 电机控制程序基础15.9 单片机电子时钟程序设计4.2 C 语言变量类型和范围9.8 实用的电机控制程序16. 红外通信与温度传感器4.3 C 语言基本运算符9.9 单片机蜂鸣器16.1 红外光的基本原理4.4 C 语言 for 循环语句10. 实例练习与经验积累16.2 红外遥控通信原理4.5 C 语言 while 循环语句10.1 单片机数字秒表程序16.3 NEC 协议红外遥控器4.6 C 语言函数的简单介绍10.2 PWM 的原理与控制程序16.4 温度传感器 DS18B204.7 单片机延时方法10.3 单片机交通灯实例17. 模数转换与数模转换4.8 LED 流水灯程序10.4 51单片机 RAM 区域的划分17.1 A/D 和 D/A 的基本概念5. 定时器与数码管基础10.5 单片机长短按键的应用17.2 A/D(模数转换)的主要指标5.1 逻辑电路与逻辑运算11. UART 串口通信17.3 PCF8591 硬件接口5.2 定时器介绍11.1 单片机串行通信介绍17.4 PCF8591 应用程序5.3 定时器的寄存器11.2 RS232 通信接口17.5 A/D 差分输入信号5.4 定时器的应用11.3 USB 转串口通信17.6 D/A 输出5.5 LED 数码管的介绍11.4 IO 口模拟 UART 串口通信17.7 单片机信号发生器程序5.6 数码管的真值表11.5 UART 串口通信的基本应用18. RS485 通信与 Modbus 协议5.7 数码管的静态显示11.6 通信实例与 ASCII 码18.1 RS485 通信6. 中断与数码管动态显示12. 1602 液晶介绍18.2 Modbus 通信协议介绍6.1 C 语言数组12.1 C 语言变量的地址18.3 Modbus 多机通信程序6.2 C 语言 if 语句12.2 C 语言指针变量的声明6.3 C 语言 switch 语句12.3 C 语言指针的简单示例6.4 数码管的动态显示12.4 C 语言指向数组元素的指针6.5 单片机数码管显示消隐12.5 ​C 语言字符数组和字符指针6.6 单片机中断系统12.6 1602 液晶介绍6.7 单片机中断的优先级12.7 1602 液晶的读写时序介绍12.8 1602 液晶指令介绍12.9 1602 液晶简单显示程序

5.3 单片机定时器的寄存器


标准的51单片机内部有 T0 和 T1 这两个定时器,T 就是 Timer 的缩写,现在很多51系列单片机还会增加额外的定时器,在这里我们先讲定时器0和1。前边提到过,对于单片机的每一个功能模块,都是由它的 SFR,也就是特殊功能寄存器来控制。与定时器有关的特殊功能寄存器,有以下几个,大家不需要去记忆这些寄存器的名字和作用,你只要大概知道就行,用的时候,随时可以查手册,找到每个寄存器的名字和每个寄存器所起到的作用。

表5-1的寄存器是存储定时器的计数值的。TH0/TL0 用于 T0,TH1/TL1 用于 T1。

表5-1 定时值存储寄存器

名称 描述 SFR 地址 复位值
TH0 定时器0高字节 0x8C 0x00
TL0 定时器0低字节 0x8A 0x00
TH1 定时器1高字节 0x8D 0x00
TL1 定时器1低字节 0x8B 0x00

表5-2是定时器控制寄存器 TCON 的位分配,表5-3是则是对每一位的具体含义的描述。

表5-2 TCON——定时器控制寄存器的位分配(地址 0x88、可位寻址)

7 6 5 4 3 2 1 0
符号 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
复位值 0 0 0 0 0 0 0 0

表 5-3 TCON——定时器控制寄存器的位描述

符号 描述
7 TF1 定时器1溢出标志。一旦定时器1发生溢出时硬件置1。清零有两种方式:软件清零,或者进入定时器中断时硬件清零。
6 TR1 定时器1运行控制位。软件置位/清零来进行启动/停止定时器。
5 TF0 定时器0溢出标志。一旦定时器0发生溢出时硬件置1。清零有两种方式:软件清零,或者进入定时器中断时硬件清零。
4 TR0 定时器0运行控制位。软件置位/清零来进行启动/停止定时器。
3 IE1 外部中断部分,与定时器无关,暂且不看。
2 IT1 外部中断部分,与定时器无关,暂且不看。
1 IE0 外部中断部分,与定时器无关,暂且不看。
0 IT0 外部中断部分,与定时器无关,暂且不看。

大家注意在表5-3中的描述中,只要写到硬件置1或者清0的,就是指一旦符合条件,单片机将自动完成的动作,只要写软件置1或者清0的,是指我们必须用程序去完成这个动作,后续遇到此类描述就不再另做说明了。

对于 TCON 这个 SFR,其中有 TF1、TR1、TF0、TR0 这4位需要我们理解清楚,它们分别对应于 T1 和 T0,我们以定时器1为例讲解,那么定时器0同理。先看 TR1,当我们程序中写 TR1 = 1 以后,定时器值就会每经过一个机器周期自动加1,当我们程序中写 TR1 = 0 以后,定时器就会停止加1,其值会保持不变化。TF1,这个是一个标志位,他的作用是告诉我们定时器溢出了。比如我们的定时器设置成16位的模式,那么每经过一个机器周期,TL1 加1一次,当 TL1 加到255后,再加1,TL1 变成0,TH1 会加1一次,如此一直加到 TH1 和 TL1 都是255(即 TH1 和 TL1 组成的16位整型数为65535)以后,再加1一次,就会溢出了,TH1 和 TL1 同时都变为0,只要一溢出,TF1 马上自动变成1,告诉我们定时器溢出了,仅仅是提供给我们一个信号,让我们知道定时器溢出了,它不会对定时器是否继续运行产生任何影响。

本节开头我们就提到了定时器有多种工作模式,工作模式的选择就由 TMOD 来控制,TMOD 的位分配和描述见表5-4到5-6所示,TMOD 的位功能如表5-5所示。

表5-4 TMOD——定时器模式寄存器的位分配(地址 0x89、不可位寻址)

7 6 5 4 3 2 1 0
符号 GATE(T1) C/T(T1) M1(T1) M0(T1) GATE(T0) C/T(T0) M1(T0) M0(T0)
复位值 0 0 0 0 0 0 0 0

表5-5 TMOD——定时器模式寄存器的位描述

符号 描述
T1/T0 在表5-5中,标 T1 的表示控制定时器1的位,标 T0 的表示控制定时器0的位。
GATE 该位被置1时为门控位。仅当„INTx‟脚为高并且„TRx‟控制位被置1时使能定时器„x‟,定时器开始计时,当该位被清0时,只要„TRx‟位被置1,定时器 x 就使能开始计时,不受到单片机引脚„INTx‟外部信号的干扰,常用来测量外部信号脉冲宽度。这是定时器一个额外功能,本节课暂不介绍。
C/T 定时器或计数器选择位。该位被清零时用作定时器功能(内部系统时钟),被置1用作计数器功能。

表5-6 TMOD——定时器模式寄存器 M1/M0 工作模式

M1 M0 工作模式 描述
0 0 0 兼容 8048 单片机的13位定时器,THn 的8位和 TLn 的5位组成一个13位定时器。
0 1 1 THn 和 TLn 组成一个16位的定时器。
1 0 2 8位自动重装模式,定时器溢出后 THn 重装到 TLn 中。
1 1 3 禁用定时器1,定时器0变成2个8位定时器。

可能你已经注意到了,表5-2的 TCON 最后标注了“可位寻址”,而表5-4的 TMOD 标注的是“不可位寻址”。意思就是说:比如 TCON 有一个位叫 TR1,我们可以在程序中直接进行 TR1 = 1 这样的操作。但对 TMOD 里的位比如(T1)M1 = 1这样的操作就是错误的。我们要操作就必须一次操作这整个字节,也就是必须一次性对 TMOD 所有位操作,不能对其中某一位单独进行操作,那么我们能不能只修改其中的一位而不影响其它位的值呢?当然可以,在后续课程中你就会学到方法的,现在就先不关心它了。

表5-6列出的就是定时器的4中工作模式,其中模式0是为了兼容老的 8048 系列单片机而设计的,现在的51几乎不会用到这种模式,而模式3根据我的应用经验,它的功能用模式2完全可以取代,所以基本上也是不用的,那么我们就重点来学习模式1和模式2。

模式1,是 THn 和 TLn 组成了一个16位的定时器,计数范围是0~65535,溢出后,只要不对 THn 和 TLn 重新赋值,则从0开始计数。模式2,是8位自动重装载模式,只有 TLn 做加1计数,计数范围0~255,THn 的值并不发生变化,而是保持原值,TLn 溢出后,TFn就直接置1了,并且 THn 原先的值直接赋给 TLn,然后 TLn 从新赋值的这个数字开始计数。这个功能可以用来产生串口的通信波特率,我们讲串口的时候要用到,本章节我们重点来学习模式1。为了加深大家理解定时器的原理,我们来看一下他的模式1的电路示意图5-2。

图5-2 定时器/计数器模式1示意图

我带领大家一起来分析一遍这个示意图,日后如果再遇到类似的图,大家就可以自己研究了。OSC 框表示时钟频率,因为1个机器周期等于12个时钟周期,所以那个 d 就等于12。下边 GATE 右边的那个门是一个非门电路,再右侧是一个或门,再往右是一个与门电路,大家可以对照一下5-1节的内容。

图上可以看出来,下边部分电路是控制了上边部分,那我们先来看下边是如何控制的,我们以定时器0为例。

1) TR0 和下边或门电路的结果要进行与运算,TR0 如果是0的话,与运算完了肯定是0,所以如果要让定时器工作,那么 TR0 就必须置1。

2) 这里的与门结果要想得到1,那么前面的或门出来的结果必须也得是1才行。在 GATE 位为1的情况下,经过一个非门变成0,或门电路结果要想是1的话,那 INT0 即 P3.2 引脚必须是1的情况下,这个时候定时器才会工作,而 INT0 引脚是0的情况下,定时器不工作,这就是 GATE 位的作用。

3) 当 GATE 位为0的时候,经过一个非门会变成1,那么不管 INT0 引脚是什么电平,经过或门电路后都肯定是1,定时器就会工作。

4) 要想让定时器工作,就是自动加1,从图上看有两种方式,第一种方式是那个开关打到上边的箭头,就是 C/T =0 的时候,一个机器周期 TL 就会加1一次,当开关打到下边的箭头,即 C/T =1 的时候,T0 引脚即 P3.4 引脚来一个脉冲,TL 就加1一次,这也就是计数器功能。


分类导航

关注微信下载离线手册

bootwiki移动版 bootwiki
(群号:472910771)