单片机定时器作用原理及学习应用详解

时间:2023-03-07作者:佚名
  定时器是单片机的重点中的重点,但不是难点,大家一定要完全理解并且熟练掌握定时器的应用。
  定时器的初步认识
  时钟周期:时钟周期T是时序中最小的时间单位具体计算的方法就是1/时钟源,如果大家用的晶振是11.0592M,那么对于这个单片机系统来说,时钟周期=1/11059200秒。
  机器周期:我们的单片机完成一个操作的最短时间。机器周期主要针对汇编语言而言,在汇编语言下程序的每一条语句执行所使用的时间都是机器周期的整数倍,而且语句占用的时间是可以计算出来的,而C语言一条语句的时间是不可计算的。51单片机系列,在其标准架构下一个机器周期是12个时钟周期,也就是12/11059200秒。现在有不少增强型的51单片机,其速度都比较块,有的1个机器周期等于4个时钟周期,有的1个机器周期就等于1个时钟周期,也就是说大体上其速度可以达到标准51架构的3倍或12倍。因为我们是讲标准的51单片机,所以我们后边的课程如果遇到这个概念,全部是指12个时钟周期。
  这两个概念了解即可,下边就来我们的重头戏,定时器和计数器。定时器和计数器是单片机内部的同一个模块,通过配置SFR(特殊功能寄存器)可以实现两种不同的功能,我们大多数情况下是使用定时器功能,因此我们的课程也是主要来讲定时器功能,计数器功能大家自己了解下即可。
  顾名思义,定时器就是用来进行定时的。定时器内部有一个寄存器,我们让它开始计数后,这个寄存器的值每经过一个机器周期就会加1一次,因此,我们可以把机器周期理解为定时器的计数周期。我们的秒表,每经过一秒,数字加1,而这个定时器就是每过一个机器周期的时间,也就是12/11059200秒,数字加1。还有一个特别注意的地方,就是秒表是加到60后,秒就自动变成0了,这种情况在单片机和计算机里我们称之为溢出。那定时器加到多少才会溢出呢?定时器有几种模式,假如是16位的定时器,也就是2个字节,最大值就是65535,那么加到65535后,再加1就算溢出,如果有其他位数的话,道理是一样的,对于51单片机来说,溢出后,这个值会直接变成0。从某一个初值,经过计算确定的时间后溢出,这个过程就是其定时的含义。
  定时器的寄存器描述
  标准的51里边只有定时器0和定时器1这两个定时器,现在很多单片机也有多个定时器的,在这里我们先讲定时器0和1。那么我前边提到过,对于单片机的每一个功能模块,都是由他的SFR,也就是特殊功能寄存器来控制。而和定时器有关的特殊功能寄存器,有以下几个,大家不需要去记忆这些寄存器的名字和作用,你只要大概知道就行,用的时候,随时可以查手册,找到每个寄存器的名字和每个寄存器所起到的作用。
  表2 定时值存储寄存器

单片机定时器作用原理及学习应用详解


  表3 TCON--定时器/计数器控制寄存器的位分配(地址:88H)

可位寻址;复位值:0x00;复位源:任何复位

单片机定时器作用原理及学习应用详解

  表4 TCON--定时器/计数器控制寄存器的位描述

单片机定时器作用原理及学习应用详解


  大家注意在表4中的描述中,只要写到硬件置1或者清0的,就是指一旦符合条件,单片机自动完成的动作,只要写软件置1或者清0的,是指我们用程序去完成这个动作,后边课程中不再做说明。
  表2中的寄存器,是存储计数器的计数值的,两个字节的用于定时器1,两个字节用于定时器0。
  表3中有TF1、TR1、TF0、TR0这4位需要我们理解清楚。两位定时器1的,两位定时器0的,我们只解释定时器1的,定时器0的同理。先看TR1,当我们程序中写TR1 = 1以后,定时器值就会每经过一个机器周期加1,当我们程序中写TR1 = 0以后,定时器值就会保持不变化。TF1,这个是一个标志位,他的作用是告诉我们定时器溢出了。比如我们的定时器设置成16位的定时器,那么每经过一个机器周期,TL1加1一次,当TL1加到255后,再加1,TL1变成0,TH1会加1一次,如此一直加到TH1和TL1都是255(即TH1和TL1组成的16位整型数为65535)以后,再加1一次,那么就会溢出,TH1和TL1同时都变为0,只要一溢出,TF1马上自动变成1,告诉我们定时器溢出了,仅仅是提供给我们一个信号,让我们知道定时器溢出了,它不会对定时器是否继续运行产生任何影响。
  表5 TMOD--定时器方式控制寄存器的位分配(地址 89H)
  不可位寻址;复位值:0x00;复位源:任何复位
  单片机定时器作用原理及学习应用详解

  细心的同学会发现,TCON那个地方标注的是“可位寻址”,TMOD这里标注的是“不可位寻址”。这个地方的意思就是比如TCON有一位TR1,我们可以在程序中直接进行TR1 = 1;这样操作。但是(T1)M1 = 1;这样的操作就是错误的。我们要操作就必须一次操作一个字节,就是必须一次性对TMOD所有位操作,不能对其中某一位单独进行操作。
  表6 TMOD--定时器/计数器方式控制寄存器的位描述
  

单片机定时器作用原理及学习应用详解

  表7 TMOD--定时器方式控制寄存器M1/M0工作模式

单片机定时器作用原理及学习应用详解

  以上这4种模式的配置,其中模式0是为了兼容老的8048单片机而设的,现在的51几乎不会用到这种模式,而模式3根据我的应用经验,他的功能模式2完全可以取代,所以基本上也是不用,那么我们重点就学习模式1和模式2。
  模式1就是THn和TLn组成了一个16位的定时器,取值范围是0到65535,溢出后,只要不对THn和TLn重新赋值,则从0开始计数。模式2的功能是自动装载,就是TLn溢出后,TFn就直接置1了,并且THn的值直接赋给TLn,然后TLn从新赋值的这个数字开始计数。这个功能可以用来产生串口的通信波特率,我们讲串口的时候要用到,本章节我们重点来学习模式1。为了加深大家理解这个定时器原理,我们来看一下他的模式1的电路示意图1。
  图1 定时器/计数器模式1示意图

单片机定时器作用原理及学习应用详解


  我带着大家来分析一下这个示意图,后边如果手册中遇到,大家也就会自己研究了。OSC框表示时钟频率,因为我们1个机器周期等于12个时钟周期,所以那个d就等于12。下边GATA右边的那个门是一个非门电路,再右侧是一个或门,再往右是一个与门电路。
  图上可以看出来,下边部分电路是控制了上边部分,那我们先来看下边是如何控制的,我们以定时器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一次,这也就是计数器功能。
  INT0引脚是P3.2,INT1引脚是P3.3,T0引脚是P3.4,T1引脚是P3.5。
  定时器程序应用
  了解了定时器相关的寄存器,那么我们下面就来做一个定时器的程序,巩固一下我们学到的内容。我们这节课的程序先使用定时器0,在使用定时器的时候,需要以下几个步骤:
  第一步:设置特殊功能寄存器TMOD,配置好工作模式;
  第二步:设置计数寄存器TH0和TL0的初值;
  第三步:设置TCON,通过打开TR0位来让定时器开始计数。
  第四步:判断TCON寄存器的TF0位,监测定时器溢出情况。
  写程序之前,我们要先来学会计算如何用定时器定时时间。我们以晶振是11.0592M为例讲解,时钟周期就是1/11059200,机器周期就是12/11059200,我们假如要定时20ms,就是0.02秒,要经过x个机器周期得到0.02秒,我们来算一下x*12/11059200=0.02,得到x= 18432。那么我们现在16位的定时器溢出值是65536,我们可以这样,先给TH0和TL0一个初值,让他们经过18432个机器周期后刚好溢出,溢出后我们可以通过检测TF0位得知,就刚好是0.02秒。这个初值y = 65536 - 18432 = 47104,转成16进制就是0xB800,那么就是TH0 = 0xB8,TL0 = 0x00。
  那0.02秒我们已经定时出来了,细心的同学会发现,我们如果初值直接给一个0x0000,一直到65536溢出,定时器定时值最大也就是71ms左右,那么我们想定时更长时间怎么办呢?用你小学学过的逻辑,倍数关系就可以解决此问题。
  那好了,我们下面就用程序来实现以下这个功能。
  #include //包含寄存器的库文件
  sbit LED = P0^0;
  sbit ADDR0 = P1^0;
  sbit ADDR1 = P1^1;
  sbit ADDR2 = P1^2;
  sbit ADDR3 = P1^3;
  sbit ENLED = P1^4;
  void main()
  {
  unsigned char counter = 0;
  ENLED = 0; ADDR0 = 0; ADDR1 = 1;
  ADDR2 = 1; ADDR3 = 1; LED = 1; //74HC138和LED灯初始化部分
  TMOD = 0x01; //设置定时器0为模式1
  TH0 = 0xB8;
  TL0 = 0x00; //定时值初值
  TR0 = 1; //打开定时器0
  while(1)
  {
  if(1 == TF0) //判断定时器0是否溢出
  {
  TF0 = 0;
  TH0 = 0xB8; //一旦溢出后,重新赋值
  TL0 = 0x00;
  counter ;
  if(50 == counter) //判断定时器0溢出是否达到50次
  {
  counter = 0; //counter清0,重新计数
  LED = !LED; //LED取反操作,0-->1,1-->0
  }
  }
  }
  }
  程序都有注释,不难理解,这里要解释一个地方,就是两次if判断,细心的同学会发现,if(1 == TF0)这句,我把1写前边,这个地方我推荐新手按照我这样来写,因为如果我们写if(TF0 == 1),作为新手来说,不小心丢掉一个’=’号后,写成if(TF0 = 1),这样实际上在语法上是可以通过的,我们用的Keil4还会出一个警告说明一下,Keil以前的版本以及一些其他软件,可能根本不会出任何错误或者警告提示,但是这样产生的Hex文件下载到单片机里边,程序就错了,大家可以改改试试看。
  本程序实现的结果是小灯点亮持续一秒,熄灭持续一秒,也就是以0.5HZ的频率进行闪烁。

相关阅读

电工必看!变频器实物接线全图解,新手照着接零失误

干电工维修这么多年,变频器接线绝对是新手最容易踩坑的环节!要么接错线烧模块,要么功能用不出来,通电就报警,白忙活大半天。今天这张实物接线图,把常用功能全给你标得明明白白,零基...
2026-05-26
电工必看!变频器实物接线全图解,新手照着接零失误

75例经典电气控制接线图、电子元件工作原理图

今天为大家整理了一些各类电气控制接线图、电子元件工作原理图,还有可控硅整流电路及负反馈调速装置原理等等,希望对大家的工作有所帮助,一起来了解一下吧。 1. 可控硅调速电...
2023-05-30
75例经典电气控制接线图、电子元件工作原理图

MOS管最常见的几种应用电路(开关、放大、时序、双向电平)

一、开关和放大器 MOS管最常见的电路可能就是开关和放大器。 1. 开关电路 G极作为普通开关控制MOS管。 2. 放大电路 让MOS管工作在放大区,具体仿真结果可在上节文章看到。 二、时序电...
2023-06-06
MOS管最常见的几种应用电路(开关、放大、时序、双向电平)

变电站隔离开关电动操作箱二次回路

变电站电气很多人是没有见到的,因为变电站比较特殊,平时很少有人见到变电站电气设备。 今天我们就来看看隔离开关电动操作开关箱的二次电器回路。隔离开关电动开关二次回路主...
2023-03-29
变电站隔离开关电动操作箱二次回路

电工师傅们,日常工作中你们都用哪种方式接线?

在电工师傅的日常工作中 接线 是一项看似简单 实际上却非常考验技术的工作内容 其 一 根据要连接的导线种类和连接形式的不同 接线方式也是不同的 比如铜导线常用的绞合连接 铝导...
2023-06-11

热销商品

耐磨耐油丁腈耐高温氟胶防水环保级硅胶包覆聚四氟橡胶O型密封圈

本款O型密封圈采用多层复合结构设计,外层为环保级硅胶,具备优异的防水、耐候与生物相容性;中间层采用耐磨耐油的丁腈橡胶(NBR),确保在油污环境中长期稳定运行;内层则选用...
1

电焊机焊把线电焊线国标电缆线16 25 35 50 70平方纯铜焊把线

电焊机焊把线,作为焊接作业中不可或缺的一部分,其质量直接关系到焊接质量和安全。国标电缆线1625355070平方纯铜焊把线,严格遵循国家标准,采用纯铜材质,确保了优秀的导...
4.2

100%桑蚕丝香云纱饰品发圈发夹口罩眼罩发带腰封直播专拍单拍无效

100%桑蚕丝香云纱饰品系列,精选天然桑蚕丝与非遗香云纱工艺匠心打造,质感柔滑亲肤,光泽雅致,尽显东方韵味。包含发圈、发夹、口罩、眼罩、发带、腰封等多款实用配饰,适...
1

灭火器检查记录表消防器材点检卡月检查卡套卡片标签定满包邮增票

灭火器检查记录表、消防器材点检卡、月检查卡套、卡片标签等消防器材管理工具,是保障消防设备安全运行的重要辅助工具。这些记录卡和标签用于定期检查灭火器、消防...
0.36

激光保护镜片30*5进口石英焊接机28*4窗口片37*7光纤切割机头配件

激光保护镜片305进口石英焊接机284窗口片377光纤切割机头配件是一种用于激光加工的精密设备,具有高精度、高稳定性和高可靠性的特点。该设备采用了进口石英材料制...
3.5

网站栏目