51单片机定时器相关介绍

发布者:数字冒险最新更新时间:2021-03-10 来源: eefocus关键字:51单片机  定时器  溢出标志 手机看文章 扫描二维码
随时随地手机看文章

对于软件手段,我们在前面的课程已经详细讲到过,它最大的缺点就是占用单片机的“机时”,也就是耗费单片机的“精力”,从而降低了单片机的工作效率。而定时器则不同,它是单片机内部一个独立的功能模块,定时器一旦设置后,定时器便自动开始计时,当计时时间满后,便产生相应的中断,去处于中断函数内的程序,而在计时这段时间内,定时器和CPU是分别独立工作的,CUP此时就可以有时间去做其它的事情。所以为了提高单片机的工作效率和实现精确的延时,目前几乎所有的半导休生产厂商在设计单片机时,在内部都配置了定时器模块。下面51单片机内部的定时器进行介绍。


1、定时器/计数器概述


51单片机内部共有两个定时器/计数器模块T0和T1,对于52单片机内部又增加了定时器T3。它们即具有定时功能,也可以作计数功能,可以通过相应的寄存器进行设置。但不论是用于定时功能还是计数功能,其基本原理都是一样的,如图1所示为定时器/计数器的结构图,内部为一个加1计数器,由高8位TH0(或TH1)和低8位TL0(或TL1)两个计数寄存器组成。TMOD是定时器/计数器的工作模式和工作方式寄存器,用来确定是处于定时模式还是计数模式以及何种工种方式,这个后面讲解寄存器的时会讲到。TCON为控制寄存器,用来控制定时器/计数器的启动、停止及溢出标志等的设置。



图1 定时器/计数器的结构框图




工作原理如图的所示,加1计数器相当于一个装数的容器,每来一个脉冲自动加1,当数装满后便自动溢出,如果此时设置的中断,CPU便会停止当前正在执行的工作,去执行中断函数内的程序。这里也可以形象把计数器看作一个装水的水桶,每来一滴水,水桶的水便会增加一点,当水装满了后,便会溢出。


加1计数器的计数脉冲有两个来源,一个是由系统时钟振荡器输出脉冲经过12分频后送来,一个是由外部引脚T0(P34引脚)和T1(P35引脚)送来的外部脉冲(通常为下降沿),前者主要用于定时,后者主要用于计数。每来一个脉冲时,计数器会自动加1,当加到全为1时,再来一个脉冲,计数器便会自动清0,且计数器此时会溢出并使TCON寄存器中的TF0和TF1置1,如果此时设置了定时器中断允许,便会自动的向CPU发出中断请求。



图2 定时器/计数器的工作原图


可能大家还是不明白,这样为什么就可以用来进行定时和计数呢,这里我们以通俗的例子解释一下定时,还是以水桶装水为例,假设水桶开始一滴水都没有(相当于计数器内部全为0),此时来一滴水(相当于来一个脉冲),水桶的水便会增加一滴(相当于计数器自动加1),而水桶的容积是规定了的(相当于计数器最大计数值),水桶的水总会有满的时候(相当于计数器加到全部为1),此时假设每来一滴水的时间我们知道或者人为可以设置,水桶从一滴水没有到全部装满就会有一个时间,这个就是定时时间值。


也就是说,我们如果知道每来一个脉冲相应的时间t,又知道加1计数器最大可以装多少数n,我们就可以知道这个时间值T,即T=nt。而这个T的时间通常是固定的,实际应用时需要不同的定时时间,我们可以采用预先在计数器内装一定的初值(相当于在水桶内先装一些水),然后在这个初值的基本上再来相应脉冲,计数器自动加1,一直到溢出,我们就可以得到任意想要的定时时间。


从图2中我们还可以看出,定时器/计数器还有一个控制开关,此开关可以控制定时器计数器相应的启动和停止。而此开关的开闭主要是由图2左下部的TRX 、GATE等信号共同作用,这里都是门电路,可以由数电的知道解释,因为比较简单,这里我就不作说明,后面结合的相关的寄存器进行介绍。


2、定时器/计数器相关寄存器


与定时器/计数器相关的寄存器主要有两个(编程时如涉及到中断,还要用到中断相关的寄存器,前面已经讲可),一个是工作模式及工作方式设置寄存器TMOD,一个就是跟控制有关(就是图2中开关的设置有关的)寄存器TCON,下面分别对其进行介绍。


注意:对单片机内部寄存器的说明相当于对结构原理的解释,所以在单片机内部功能模块看不明白时,也可以借助相关寄存器的说明加以理解。


(1)定时器工作模式及工作方式寄存器TMOD


工作方式寄存器TMOD用于设置定时/计数器的工作模式及工作方式,低四位用于T0,高四位用于T1。其格式如下:



GATE:门控位。GATE=0时,只要用软件使TCON中的TR0或TR1为1,就可以启动定时/计数器工作;GATA=1时,要用软件使TR0或TR1为1,同时外部中断引脚或也为高电平时,才能启动定时/计数器工作。即此时定时器的启动多了一条件。


C/T :定时/计数模式选择位。C/T=0为定时模式;C/T =1为计数模式。


M1M0:工作方式设置位。定时/计数器有四种工作方式,由M1M0进行设置。具体说明如下表:



(2)定时器/计数器控制寄存器TCON


TCON的低4位用于控制外部中断,已在前面介绍。TCON的高4位用于控制定时/计数器的启动和中断申请。其格式如下:



TF1(TCON.7):T1溢出中断请求标志位。T1计数溢出时由硬件自动置TF1为1。CPU响应中断后TF1由硬件自动清0。T1工作时,CPU可随时查询TF1的状态。所以,TF1可用作查询测试的标志。TF1也可以用软件置1或清0,同硬件置1或清0的效果一样。


TR1(TCON.6):T1运行控制位。TR1置1时,T1开始工作;TR1置0时,T1停止工作。TR1由软件置1或清0。所以,用软件可控制定时/计数器的启动与停止。


TF0(TCON.5):T0溢出中断请求标志位,其功能与TF1类同。


TR0(TCON.4):T0运行控制位,其功能与TR1类同。


3、定时器工作方式及赋初值


通过对上面TMOD寄存器的介绍,我们知道,通过设置M0M1可能选择定时器的工作方式。这里可能有的人对选择定时器工作方式及赋初值是什么意思不明白,其实也很好理解,前面我们不是把加1计数器比作装水的水桶吗,而51单片机有4种工作方式就相当于有4种不同大小的装水的水桶,所以我们必须通过TMOD这个寄存器选择哪使用哪一个水桶(也就是选择哪一种工作方式);至于为什么要赋初值前面我实际已经有讲到过,计数器从全是装0到全部装1的整个时间是固定的,而我们实际用使用需要不同的定时间,所以我们必须先在计数器内先装一些数,然后在这个基本上进行加1计数,就可以得到我们想要的定时时间。


定时器总共有四种工作方式,而因为定时器工作方式1比较常用,所以这里仅对定时器0工作方式1进行介绍,并介绍如何赋初值。


方式1的计数位数是16位,由TL0作为低8位、TH0作为高8位,组成了16位加1计数器 ,其逻辑结构图如图3所示。


图3 定时器0工作方式1逻辑结构图


当GATE=0,TR0=1时,TL0便在机器周期的作用下开始自动加1,当加了256次后自动向前进一位,直到TH0也计满,然后溢出,置标志寄存器TF0=1,如果此时设置了中断允许,CPU便作进入中断函数内进行中断程序的处理。注意,此时若TR0=1一直打开的话,计数器满后会全部自动清零,然后重新重复以上过程,直到TR0=0时结束。


接下来讲解如何计算定时器的初值问题。定时器一旦启动,它便在原来的数值基础上开始加1计数,若在程序开始时,我们没有设置TH0和TL0,它们的默认值都是0,假设时钟频率为12MHZ,12个时钟周期为一个机器周期,那么此时的机器周期就是1us,计满TH0和TL0就需要2X16-1,再来一个脉冲,计数器就溢出,随即向CPU申请中断。因此溢出一次的时间为65536us,约等于65.5ms,如果我们要定时50ms,此时就需要向TH0t和TL0里面先赋初值,在这个初值的基础上计50000个数后,定时器溢出,此时刚好就是50ms中断一次,如需要定时1S时,在写程序时当产生20次50ms的定时器中断后便认定是1s,这样便可以精确制定定时时间了。要定时50ms,即要计50000个数,TH0和TL0中应该装的总数是65536-50000=15536,把15536对256求模:15536/256装入TH0中,把15536对256求余:15536%256装入TL0中就可以了。


以上就是定时器赋初值的计算方法,总结后可以得出以下结论:当用定时器的方式1时,设机器周期为t ,定时器产生一次中断的时间为T,那么需要计数的个数N=T/t,装放THX和TLX中的数分别为:


THX=(65536-N)/256 ,TLX=(65536-N)%256


要计算机器周期t,就需要知道系统的时钟频率,也就是单片机外接晶振的频率,实验板上的时钟频率为11.0592MHZ,那么机器周期为12X(1/11059200)=1.09us,若T=50ms.那么N=50000/1.09=45873,如果晶振为12MHX的话,用同样的方法算出来N=50000.


4程序举例


下面我们举一个例子,用单片机的定时器0、工作方式1和中断技术实现让L1以间隔1s的时间闪烁。


这里我们先总结一下,在使用定时器主要对定时器作相应的初始化,其步骤为:


(1)对TMOD赋值


选择计数或者定时


确定T0或T1的工作方式。


(2)计算初值,并将其写入TH0、TL0或TH1、TL1。


(3)使TR0或TR1置位,启动定时/计数器定时或计数。


(4)需使用中断方式时,则对IE等赋值,开放中断


下面我们给出相关程序。


例1:1357灯以间隔1s的时间闪烁。




#include//头文件,主要用来声明,特殊功能寄存器的地址


#define uint unsigned int//宏定义


#define uchar unsigned char//宏定义


sbit D1=P1^0;//位声明


uchar time;//定义变量time为无符号字符型


void main()//主函数


{


TMOD=0x01;//设置定时器0为工作方式1


TH0=(65535-50000)/256;//定时50ms赋初值15535


TL0=(65535-50000)%256;


EA=1;//开总中断


ET0=1;//开定时器0中断


TR0=1;//启动定时器0


//上面6行为定时器和中断初始化程序


while(1);//停在这里等待中断产生




}


void tim1() interrupt 1//中断子函数,功能为500ms灯灭一次


{


time++;//进入一次中断time自加1


if(time==10)//如果自加到10,相当于500ms


{


D1=~D1;//灯亮灭交替


time=0;//time清零


}


}


程序下载到51hei实验板上的现象如图4所示:

图4 L1灯以间隔1s的时间闪烁


关键字:51单片机  定时器  溢出标志 引用地址:51单片机定时器相关介绍

上一篇:GPRS数据传输模块的设计与实现
下一篇:有关51单片机晶振的21个问题总结

推荐阅读最新更新时间:2024-11-06 14:25

如何利用STM32通用定时器实现输出两路占空比和频率可调的互补PWM
MCU:STM32F334C8T6 PWM即脉宽调制,可以用来驱动电机,驱动全桥电路等,用过STM32的知道,用它的定时器可以很容易实现PWM输出,使用高级定时器的TIMx_CHy和TIMx_CHyN可以轻易实现互补PWM(complementary PWM)波形的输出。 高级定时器资源有限,本文利用通用定时器(General-purpose timers)实现互补PWM输出,在高级定时器资源不够时不失为一个好方法。 STM32的定时器PWM有两种模式:PWM mode 1和PWM mode 2 工作原理: PWM mode 1 - In upcounting, channel 1 is active as lon
[单片机]
如何利用STM32通用<font color='red'>定时器</font>实现输出两路占空比和频率可调的互补PWM
51单片机-新按键程序
1.支持连按的书写 对上一讲的知识我们再补充一下支持连按的代码以此加深理解。 实验现象就是按着按键不放,那么“key=1;”出现的频率就会比不支持连按代码的时候多,所以就会有左右不断流水的现象,按键的功能代码大家自己去分析了。 #include reg52.h #include function.h #define TIMES 2000 //让流速慢一点 sbit KEY4 = P2^7; u8 KEY4_Scan() { static u8 key_up=1; static u16 times; if(key_up==0) { times++; if(times =T
[单片机]
<font color='red'>51单片机</font>-新按键程序
基于51单片机的电子导游系统设计
引言 随着生活水平的提高,越来越多的人把旅游当成了一种时尚的消费方式,而有些问题也随之产生,如导游人员的缺乏及其素质不高,加之大批喜欢独立自由的旅游者的出现,这些促使了电子导游系统的产生。电子导游系统发展有个过程,最开始时是一种半自动化系统,功能是把景点信息以语音文件格式存储在导游机里,一般通过键盘直接键入景点代码,选择播放。这种类型的导游机,缺点是要输入景点代码,很不方便。发展到现在,出现了全自动化的导游机,它在景点先安放无线发射模块,这些发射模块可以控制工作范围,这样在各个景点就有不同的编码信号。游客到达景点后,游客手上的导游机会自动接收编码信号,经过解码后,由控制中心控制语音播放即可。本文介绍了这一全自动化导游机的设计,采
[单片机]
基于<font color='red'>51单片机</font>的电子导游系统设计
51单片机汇编——延时和点灯
前言 这篇文章主要是看视频学习51汇编,但是我的环境总是配置不好,出现了这个问题(keil2+vdmagdi.exe+Proteus),有懂的小伙伴可以帮助一下我 ^.^ 一、延时程序 1.1 延时程序的简介和分类 在单片机的控制应用中,常有延时的需要,CPU 过一段时间再去做某件事,称之为延迟。延时有两种方法,即软件延时和硬件延时 硬件延时是通过定时/计数器(中断程序)来实现的,这种方法不占用 CPU 的工作时间 软件延时一般采用循环程序,通过 CPU 执行一个具有固定延迟时间的循环体来实现的 1.2 软件延时 1、机器周期数 延时程序的延时时间主要与两个因素有关,一是所用晶振,二是延时程序中的循环次数,一旦晶振确定之后
[单片机]
基于51单片机的汉字LCD智能显示模块设计
引言 在电子产品设计中,人机交互显示界面是必不可少的工作,目前一般使用的液晶显示器均为七段笔划式,只能显示数字和少量字符,功能往往受到局限,对于较复杂的字符或图形则无能为力。而LCD智能型显示模块则是一种低功耗、低损耗、低价值的显示器件,它不但可以显示各式各样的字符、汉字和图形,同时具有可编程能力,且与单片机接口方便,基于以上优点,LCD智能显示模块获得了广泛的应用。 系统组成 本系统主要由三部分组成,分别为单片机,LCD模块和FLASH字库,图1所示是该系统的硬件原理框图,由于显示所需要占用的资源过多(本设计采用的是16×16点阵,每个汉字存储需要32个字节),而单片机内部RAM资源及其有限,所以系统设计时有必要扩展—FL
[应用]
51单片机,点阵显示汉字(C语言)
#include #include #define uint unsigned int #define uchar unsigned char sbit SH_595=P2^1; sbit DATA_595=P2^0; sbit ST_CP_595=P2^2;//74HC595(12)-ST_CP上升沿-移位寄存器的数据进入数据存储寄存器 输出锁存器的时钟信号端口 sbit MR_595=P2^3; //74HC595(10)-MR 为0将移位寄存器的数据清0 sbit E1_154=P2^4;//74HC154(18)-E1为0开列(col)输出 显示允许 控制信号端口 uchar keynum; uchar tem
[单片机]
51单片机PWM电机调速程序
#include reg51.h #define TH0_TL0 (65536-1000)//设定中断的间隔时长 unsigned char count0 = 50;//高电平的占空比 unsigned char count1 = 0;//比较用的临时变量 bit Flag = 1;//电机正反转标志位,1正转,0反转 sbit Key_add=P2 ^ 0; //电机减速 sbit Key_dec=P2 ^ 1; //电机加速 sbit Key_turn=P2 ^ 2; //电机换向 sbit PWM1=P2^6;//PWM 通道 1,反转脉冲 sbit PWM2=P2^7;//PWM 通道 2,正转脉冲 unsig
[单片机]
基于stm32单片机的通用定时器配置
stm32单片机的定时器资源相当丰富,它的定时器分为高级控制定时器、通用定时器和基本定时器,具体这些定时器资源在哪个系列的片子有就得看不同的片子的手册了。他们具体有什么区别,我也是刚接触这个,看他的数据手册介绍也是茫然,主要是刚开始摸,那些功能都没用到,反正用做定时作用的话哪种定时器都行。在这我就把我自己配置通用定时器的方法及心得简短做个总结,以防以后忘记了。我配置的是定时器2(TIM2)。 通用定时器的时钟可来自于外部或内部,选用默认即是采用内部的。通用定时器的时钟来源为APB1总线,所以首先,得将APB1外设时钟打开。 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE)
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved