概述
8051单片机定时器/计数器的基本知识
概述:
51单片机内部集成了两个16位定时/计数器T0和T1,他们可以单独配置为定时器或计数器。
当它们被配置为定时器时,将按照预先设置好的长度运行一段时间后产生一个溢出中断;
当他们被配置为计数器时,在单片机的外部中断引脚上检测到一个脉冲信号后计数器将加1,如果达到预先设置好的事件数目,就将产生一个中断事件。
处于计数工作模式时, 加法计数器对芯片端子T0(P3.4)或T1(P3.5)上的输入脉冲进行计数;
处于定时器工作模式时,加法计数器对内部机器周期脉冲进行计数。
相关寄存器:
工作方式寄存器:TMOD(地址:0x89)
TMOD不支持位寻址,当单片机初始化后,TMOD的值为0x00。
TMOD的结构:
bit | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
---|---|---|---|---|---|---|---|---|
name | GATE | C/ T ‾ overline{T} T | M1 | M0 | GATE | C/ T ‾ overline{T} T | M1 | M0 |
其中bit0-bit3对定时器0进行配置,bit4-bit7对定时器1进行配置
GATE位:定时/计数器的门控位
GATE=0时,定时/计数器的运行只受到控制寄存器TCON中的运行控制位TRx控制;
GATE=1时,定时/计数器的运行收到TRx和外部中断输入引脚上的电平双重控制。也就是定时器的启动由TRx和INTx共同控制,即TRx=1&&INTx=1时,定时/计数器方可运行。
C/
T
‾
overline{T}
T位:定时方式、计数方式选择位
C/
T
‾
overline{T}
T=0时,工作在计数状态下;
C/
T
‾
overline{T}
T=1时,工作在定时状态下。
定时器/计数器0与定时器/计数器1只在工作方式选择位上有所差别,差别在定时器/计数器0有工作方式3,定时器/计数器1没有工作方式3,当定时器/计数器1的工作方式选择位配置为工作方式3时,定时器/计数器1停止工作。
M1 | M0 | 工作方式 | 含义 |
---|---|---|---|
0 | 0 | 0 | 13bit不带自动重装的计数器 |
0 | 1 | 1 | 16bit不带自动重装的计数器 |
1 | 0 | 2 | 自动重装的8bit计数器 |
1 | 1 | 3 | 独立的两个8bit计数器 |
在工作方式2中,数据寄存器THx作为自动重装值自动赋值给数据寄存器TLx。
控制寄存器:TCON(地址:0x88)
TCON支持位寻址,用于控制定时器/计数器的启动与溢出。当单片机初始化后,TMOD的值为0x00。
TCON的结构:
bit | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
---|---|---|---|---|---|---|---|---|
name | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
TFx为定时器/计数器的溢出标志位。该位置位则说明单片机检测到了定时器/计数器的溢出,并且PC自动跳转到该中断向量入口,当单片机响应中断后,该位被硬件自动清除。该位由硬件写操作,软件读操作。
TRx为定时器/计数器启动控制位,当该位被置位时,启动定时器/计数器。该位由软件写操作,硬件读操作。
TCON的bit0-bit3为外部中断控制位。
T0数据寄存器:TH0、TL0
T1数据寄存器:TH1、TL1
关于数据寄存器的赋值:
1个计数周期等于1个机器周期
1个机器周期等于12个时钟周期
MCU主频:
f
o
s
c
f_{osc}
fosc
MCU计数周期:
T
c
y
T_{cy}
Tcy
预设时间:t
定时器/计数器需要运行的次数:num
T c y T_{cy} Tcy= 12 f o s c frac{12}{f_{osc}} fosc12,num= t T c y frac{t}{T_{cy}} Tcyt= t ∗ f o s c 12 frac{t*f_{osc}}{12} 12t∗fosc
相关应用实例:
实例1:
#include <AT89X52.h>
sbit Signal = P2 ^ 0;
//初始化定时计数器控制寄存器
Timer0_int(void) interrupt 1 using 1 //定时器0中断服务子程序
{
Signal = ~Signal; //P1.7引脚翻转
TH0 = 0x1F;
TL0 = 0x08; //重装初始化值
}
void main()
{
TMOD = 0x00; //定时/计数器的方式和控制寄存器
//不受外部中断控制,选择方式0:13bit定时/计数器,工作在定时方式
EA = 1; //中断允许控制寄存器IE中的第7位bit7:EA中断允许总控制
ET0 = 1; //中断允许控制寄存器IE中的第1位bit1:ET0定时器/计数器T0的溢出中断允许位
TH0 = 0x1F; //这里是高8位与低5位:0001 1111 xxxx0 1000
TL0 = 0x08; //装入初始化值
TR0 = 1;
while(1)
{
}
}
实例2:
#include <AT89X52.h>
sbit Signal = P2 ^ 0;
//初始控制寄存器
//TL0中断服务子函数,使用通用工作寄存器组1
void Timer0(void) interrupt 1 using 1
{
Signal = 0;
TR0 = 0; //停止定时器TL0
TL0 = 0xCE;
}
//TH0中断服务子函数,占用定时计数器1的中断向量,使用通用工作寄存器组2
void Timer1(void) interrupt 3 using 2
{
Signal = 1;
TR0 = 1; //启动定时器TL0
TH0 = 0x38;
}
main()
{
TMOD = 0x03; //定时/计数器的方式和控制寄存器TMOD
//0000 0011 定时器1工作在模式0、定时器0工作在模式3 ,它们都工作在定时模式
EA = 1;
ET0 = 1;
ET1 = 1;
TH0 = 0x38;
TL0 = 0xCE;
Signal = 1;
TR0 = 1;
TR1 = 1; //启动两个定时器
while(1)
{
}
}
实例3:
#include <AT89X52.h>
sbit LED1 = P2^0; //外部LED驱动引脚定义
void Timer0(void) interrupt 1 using 1 //定时计数器0中断处理函数
{
LED1 = ~LED1; //如果有中断,LED翻转
}
main()
{
TMOD = 0x06; //定时/计数器的方式和控制寄存器
//0000 0110 定时计数器0 工作方式2 计数模式
TH0 = 0xFD;
TL0 = 0xFD;
EA = 1;
ET0 = 1; //打开相应中断
TR0 = 1;
while(1)
{
}
}
最后
以上就是如意树叶为你收集整理的MCS-51单片机总结——No1.定时器/计数器应用8051单片机定时器/计数器的基本知识的全部内容,希望文章能够帮你解决MCS-51单片机总结——No1.定时器/计数器应用8051单片机定时器/计数器的基本知识所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复