51定时/计数器的详解。
码字不易,如有帮助请收藏,点赞哦。
前提:首先我们知道51单片机内部有21~26个特殊功能寄存器:
以上是常见的21个寄存器,后还有
以上是一些需要了解的寄存器,每个寄存器都有自己的作用。因为单片机内部都是逻辑运算,需要各种标志位,来开关,控制。
学习之前还需要知道:
①51 单片机有两组定时器/计数器,因为既可以定时,又可以计数,故称之 为定时器/计数器。
②定时器/计数器和单片机的 CPU 是相互独立的。定时器/计数器工作的过程 是自动完成的,不需要 CPU 的参与。
③51 单片机中的定时器/计数器是根据机器内部的时钟或者是外部的脉冲信 号对寄存器中的数据加 1。 有了定时器/计数器之后,可以增加单片机的效率,一些简单的重复加 1 的 工作可以交给定时器/计数器处理。CPU 转而处理一些复杂的事情。同时可以实 现精确定时作用。
简而言之,定时器就是 根据脉冲信号,计脉冲数。
首先明确我们要干嘛?目标就是 写一个 5ms 触发一次的程序 只要 5ms 到了就执行一次让 灯亮一下。
灯的端口是 P2
学习之前,首先我们要明白51单片机的基础(以下以STC89C51为例):
定时器就是 一共十六位 THx占八位 TLx占八位
如图所示,
当使用T1定时器的时候 就使用 TH1 TL1 各占八位 前者高八位 后者低八位
当使用T0定时器的时候 就使用 TH0 TL0 各占八位 前者高八位 后者低八位
特殊功能定时器 T2 在这里先不讲 后续讲解。
首先我们明白了 定时器的 T1 T0
随机提问 请问当单片机频率为1Mhz的时候 等于 多少 秒?
答:1us;周期=频率的倒数 也就是 1/100000=0.000001s = 0.0001ms=1us
上图更加详细!!!供大家参考!
定时器 分 T0 和 T1两个,T0、T1又分为4种工作方式:方式0、方式1、方式2和方式3。
Mode0、Mode1、Mode2、Mode3为四个方式。
既然有四个方式供大家选择,那怎么选择呢???
这里我们就要用到 TMOD 了
TMOD寄存器格式例子:比如 TMOD = 0x01 想当于 0000 0001 则使用的是 定时器0 工作方式为1
- GATE 是门控位,
GATE = 0 定时器/计数器是否计数,仅由控制位TRx来控制(一般上电就是 0)
GATE = 1 定时器/计数器是否计数,由外中断引脚INT1或INT0的电平和TRx一起控制
- C/T :定时/计数模式选择位。C/T =0 为定时模式;C/T =1 为计数模式。
- M1M0:工作方式设置位。定时/计数器有四种工作方式。
由此就明白 TMOD = 0x01 为什么是 定时器0 工作方式1
TMOD = 0x02 是 T0 方式2
TMOD = 0x03 是 T0 方式3
定时器1 也如法炮制 请大家自己推理一下
上面讲了 如何填写定时器/计数器的工作方式 TMOD
现在我们开始来讲一下 控制寄存器TCON
TCON格式如图所示 这个TCON的格式 后四格是空的 实际上不是空的 从左到右 依次是IE1、IT1、IE0、IT0,分别是中断的,这里不做过多解释,后续补上。
- TF1、TF0:计数溢出标志位
T1 计数溢出时由硬件自动置 TF1 为 1。CPU 响应中断后 TF1 由硬件自动清 0。T1 工作时,CPU 可随时查询 TF1 的 状态。所以,TF1 可用作查询测试的标志。TF1 也可以用软件置 1 或清 0,同硬 件置 1 或清 0
- TR0、TR0:计数允许控制位
T1 运行控制位。TR1 置 1 时,T1 开始工作;TR1 置 0 时, T1 停止工作。TR1 由软件置 1 或清 0。所以,用软件可控制定时/计数器的启动 与停止。
学习这些之后,基本够了,可以开始写定时器,以下贴一些电路图,供大家参考!
【单片机学习】51单片机【定时/计数器】,详细介绍-电子工程世界 (eeworld.com.cn)
#include
#include "intrins.h"
sbit key1 = P3^2;
#define led P2
#define uint unsigned int
#define uchar unsigned char
void delay(uint z) {
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
char i = 100;
void main()
{
TMOD = 0x01;
TH0 = 0xee;
TL0 = 0x00;
P2 = 0x00;
EA = 1;
ET0 = 1;
TR0 = 1;
while(1)
{
}
}
void timer() interrupt 1
{
TH0 = 0xee;
TL0 = 0x00;
i--;
if(i <= 0)
{
P2 = ~P2;
i=100;
}
}
TH0 = 0xee TL0 = 0x00 各占八位
为啥是0xee呢 这个程序的功能就是 0xee代表5ms
计算公式:
定时时间 = (2^16-X)* 12/11.0592
即 5000 = (2^16-X)* 12/11.0592
X = 60928
即 TH1 = 0xee TL0 = 0x00
即可定时 5ms
疑问解答:TMOD |= 0x01;为啥要用 |= ???
将TMOD表示成二进制数,然后与0x01按位进行或运算,并把最终结果赋值给TMOD。
这个是C中的一种语法 不影响结果 如: P3 |= 0x80意思是 P3=P3|Ox80 表示P3的最高位(P3.7)为1,不影响P3其他位
程序结尾的定时器的部分中断代码,interrupt 1这个是中断的优先级设置
文章到此结束,希望对大家有所帮助!!!