51单片机是基本的入门级单片机,或者说是应用最广泛的一种。本文主要介绍51单片机定时器/计数器,首先介绍51单片机定时器/计数器的工作原理,其次介绍51单片机定时器/计数器的工作模式,最后阐述51单片机定时器/计数器的应用。让让我们和边肖一起来看看吧。
51单片机定时器/计数器的概念在单片机中,脉冲计数与时间的关系非常密切。每输入一个脉冲,计数器的值将自动累加1。只要两个相邻计数脉冲之间的时间间隔相等,计数值就表示时间的流逝。所以单片机里的定时器和计数器其实是同一个物理电子元件,只是计数器记录单片机外部发生的事情(接受外部脉冲),而定时器是单片机自己提供的。MCS-51单片机的晶振经过12分频后作为稳定脉冲提供给单片机。晶体振荡器的频率很精确,所以单片机计数脉冲的时间间隔也很精确。
51单片机的定时器/计数器的工作原理加计数器输入的计数脉冲有两个来源,一个是系统的时钟振荡器的输出脉冲经过12分频后发出的;一个是带T0或T1引脚输入的外部脉冲源。
当用作定时器时,定时器对8051单片机振荡器输出的脉冲数进行12分频后计数,即定时器T0/T1的寄存器值在每个机器周期内自动累加1,直至溢出,之后继续从0开始循环计数;因此,定时器的分辨率是时钟振荡频率的1/12;
当用作计数器时,外部脉冲信号由引脚T0(P3.4)或T1(P3.5)计数。当输入的外部脉冲信号从1负跃至0时,计数器的值将自动增加1。由于检测从1到0的下降沿需要两个机器周期,因此要求采样电平至少保持一个机器周期。当晶振频率为12MHz时,最高计数频率小于1/2MHz,即计数脉冲周期大于2微秒。计数器的最高频率一般为时钟振荡频率的1/24;
因此,无论是定时器还是计数器工作,定时器T0和T1都不占用CPU 是时候了。除非定时器/计数器T0和T1溢出,否则CPU可能被中断,而中断处理程序将被执行。因此,定时器/计数器是单片机中高效灵活的部分。
51单片机定时器工作原理图:
从上图可以看出,与定时器相关的寄存器主要有以下几种:TMOD、TCON、TL0、TH0、TL1、TH1。这里有几个寄存器。
16位加法计数器:
是定时器计数器的核心,其中TL0、TH0是定时器计数器0的底八位和顶八位;TL1、TH1是定时器计数器1的底八位和顶八位;并且高八位和低八位可以分开使用。16位加法计数器主要用于设置定时器计数器的初始值。
TMOD定时器工作模式和模式寄存器
GATE:定时开关控制位。当GATE=1,INT0或INT1引脚为高电平,TCON中TR0或TR1控制位为1时,定时器/计数器0或1开始工作。如果GATE=0,只要TR0或TR1控制位设为1,定时器/计数器0或1就会开始工作。
C/T:定时器或计数器功能的选择位。C/T=1为计数器,计数脉冲通过外部引脚T0或T1输入。当C/T=0时,为定时器,内部系统时钟提供工作脉冲。
M1 M0:T0,T1工作模式选择位
TCON定时器控制寄存器
TF1:定时器T1溢出标志,可以被程序查询和清除。TF1也是中断请求的来源,当CPU响应T1中断时由硬件清除。
0:定时器T0溢出标志,可由程序查询和清除。TF0也是中断请求的来源,当CPU响应T0中断时由硬件清除。
Tr1: T1允许计数控制位,为1时,允许T1计数(计时)。
Tr0: T0允许计数控制位,为1时,允许T0计数(计时)。
IE1:外部中断1请求源(INT1,P3.3)标志。IE1=1,外部中断1正在向CPU请求中断,并且0 & gt;当CPU响应此中断时,由硬件清0。
IT1:外部中断源1触发模式控制位。位1被设置为触发底部电平,位0被设置为触发下降沿。
0:外部中断0请求源(INT0,P3.2)标志。0=1,外部中断1正在向CPU请求中断,并且0 & gt;当CPU响应此中断时,由硬件清0。
IT0:外部中断源0触发模式控制位。位1被设置为触发底部电平,位0被设置为触发下降沿。
1个MCU定时器4种工作模式0:
TL0的低5位和TH0的所有8位一起构成一个13位定时器/计数器。定时器/计数器启动后,定时或计数脉冲数加到TL0,TL0从预设初始值(时间常数)开始累加,并连续增加1。当TL0满时,它被进位到TH0,直到13位寄存器溢出。当TH0溢出时,TCON中的TF0标志被设置到CPU。并且定时器/计数器硬件将自动将13位寄存器值清零。如果需要进一步计时/计数,有必要使用相关指令重置时间常数,并将计时器/计数器的中断标志TF0设置为0。
工作模式1:最常用的定时器工作模式。
模式1与模式0几乎相同,只是模式1中的寄存器TH0和TL0共同构成一个16位定时器/计数器来参与操作,因此定时/计数范围比模式0中的大。
工作模式2:工作模式2特别适合用作更精确的脉冲信号发生器。
这种模式也叫自动重装预置号模式。有时候,我们的计时/计数操作需要重复几次计时/计数。如果溢出时什么都不做,那么第二轮计时/计数就从0开始计时/计数,这不是我们想要的。因此,要保证每次溢出后重新开始计时/计数操作的是我们想要的,就需要在某个地方重新加载预置数(时间常数),而重新加载预置数的操作是由硬件设备自动完成的,不需要人工干预,所以这种工作模式称为自动重新加载预置数。在工作模式2下,自动重载的预置数存储在定时器/计数器的寄存器的高8位,即TH0中,只剩下TL0参与定时/计数操作。
这种工作模式常用于波特率发生器(串行通信),T1工作在串行模式2;当以这种方式使用时,计时器提供时间参考;数完之后,你不不需要做太多,只需要做一件事,就是重新加载预置数,重新开始计数,中间没有延迟。
工作模式3:
模式3仅适用于定时器/计数器T0。当定时器T1处于模式3时,相当于TR1=0。别数了。由于定时器/计数器T1没有工作模式3,如果定时器/计数器T0设置为工作模式3,TL0和TH0将被分成两个独立的8位定时器/计数器。
51单片机定时器/计数器在protues下构建仿真环境的应用:
这里如何设置定时器的初始值:
工作模式0:13位定时器/计数器工作模式,最多可以计数到2的13次方,即8192次。
工作模式1:16位定时器/计数器工作模式,最多能计数2的16次方,即65536次。
工作模式二:8位定时器/计数器工作模式,最多可计数2的8倍,即256次。
工作模式三:8位定时器/计数器工作模式,最多可计数2的8倍,即256次。
以12M晶体振荡器为例:它每秒可以执行1,000,000个机器周期。并且计时器每次溢出多达65,536个机器周期。
那么对于12MHz晶体振荡器
每个机器周期1 us(12/fosc=1 us)
模式13位定时器的最大时间间隔=2^13=8.192毫秒
模式16位定时器的最大时间间隔=2^16=65.536毫秒
模式2 8位定时器的最大时间间隔=2^8=0.256ms=256 us
模式8位定时器的最大时间间隔=2^8=0.256ms=256 us
以上是对定时器定时最大时间间隔的说明。下面详细介绍如何计算初始值(小于最大时间间隔)。如果定时器计时为10ms,定时器的初始值计算如下:
-使用12M晶体振荡器时,12MHz除以12mhz等于1MHz,这意味着1秒=1,000,000个机器周期。10ms=10000个机器周期。
预置数的计算公式:预置数=最大值-要统计的次数;(65536-10000)
然后将预置数载入16位定时器计数器,如下所示:
TH0=(65536-10000)/256
TL0=(65536-10000)%6
-使用11.0592M晶振时,11.0592MHz除以12就是921600Hz,也就是每秒921600个机器周期,10ms=9216个机器周期。
预置数的计算公式:预置数=最大值-要统计的次数;(65536-9216)
然后将预置数载入16位定时器计数器,如下所示:
TH0=(65536-9216)/256
TL0=(65536-9216)%6
本文介绍了初始值的确定。下面是定时器最常见的两种用法。
定时:定时器计数器作为定时器使用,配置步骤如下:
1.模式设置,配置TMOD寄存器
2.定时器初始值设定假设中断10ms。
3.启动定时器中断
4.打开完全中断。
5.打开计时器
通过以上五个步骤,开启一个定时器,定时器在10毫秒内不发起中断,即在10毫秒内不进入中断服务程序。
示例程序如下:
#包括《reg51.h》
sbit led=p1^0;
无符号整数标志;
void main()
{
TMOD=0x 01;//1.模式设置0000001使用定时器0和工作方程式1(M1=0,M0=1)。
TH0=(65536-10000)/256;//2.定时器设置为每10ms启动一次中断。
TL0=(65536-10000)% 6;
ET0=1;//3.启动定时器0中断。
EA=1;//4.打开总中断
TR0=1;//5.打开计时器
while(1)
{
if(flag==100)
{
led=~ led
flag=0;
}
}
}
Void TIM0()中断1 //中断服务程序
{
TH0=(65536-10000)/256;//要为进入的中断复位定时器,请注意。
TL0=(65536-10000)% 6;
旗帜;
}1234567891011121314151617181920212223242526272829
计数:定时器计数器作为计数器使用,配置步骤如下:
1.模式设置,配置TMOD寄存器。
2.打开计数器中断
3.打开完全中断。
4.打开计数器
通过这简单的四个步骤,我们打开了一个计数器,可以对P3.4或者p3.5的下降沿脉冲进行计数,这里需要注意一点,计数器不能开启中断,所以刚刚赢了当服务程序溢出时,不要去中断它。
示例程序如下:
#包括《reg51.h》
sbit led=p1^0;
sbit s=p3^4;
无符号整数计数;
void main()
{
TMOD=0x 05;//1.模式设置0000101采用计数器0和工作模式1(M1=0,M0=1)。
TH0=0;//计数器被清除
TL0=0;
ET0=1;//2.启动计数器0中断
EA=1;//3.打开总中断
TR0=1;//4.打开计数器。
led=1;
while(1)
{
count=(TH0《8)| TL0;
If((count*10000)==50000)//按键5次,反转led状态。
{
led=0;
TH0=0XFF
TL0=0XFF//让计数器人工进入中断
}
}
}
Void TIM0()中断1 //中断服务程序
{
led=1;
TH0=0;
TL0=0;
}
标签:定时器计数器工作