51单片机定时器

这篇具有很好参考价值的文章主要介绍了51单片机定时器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言

一、定时器的介绍及其作用

二、定时器的内部构造及其原理

计算机周期

定时器的工作模式与流程

定时器中断相关寄存器

寄存器的配置

 三、程序

总结


前言


        下面来介绍学习51单片机第一个也是最常用的片上外设——定时器。该硬件是集成在单片机内部的,与板上外设不同的是,它不会受到外界的干扰,只会听从cpu的命令。在小编看来,51单片机上的外设虽没有stm32的复杂,但配置起来要比stm32难,stm32配置片上外设只需要调用函数库输入指定的参数即可,相比于51单片机来的更方便,而51单片机则更底层些,需要从配置寄存器开始,设置初值等等一步一步地打通通道。

        *ps:学习基础外设部分一定一定要学会查资料!

一、定时器的介绍及其作用


         传统51单片机有3个定时器(T0,T1,T2),51系列单片机的更新迭代都是向下兼容的。定时器的资源和单片机的型号是关联在一起的,不同的型号可能会有不同的定时器个数和操作方式,但一般来说,T0和T1的操作方式是所有51单片机所共有的。

        那么,我们为什么要使用定时器呢?回想一下之前写的程序,在实现延时这一功能时,我们使用了delay() 函数,这个函数并没有采用任何外设,只是写了两个循环嵌套,让cpu计数,当计数完成也就代表延时结束,简单点说就是让cpu通过不停的计数来消耗时间,所以这种方式有个很大的弊端,就是当cpu “死跑” 延时的时候,是做不了其他事情的,这个时候就需要一个额外的工具来帮助cpu完成计时,这就是定时器的作用。举个例子,比如你想在十分钟后做某件事,如果身边没有任何工具的话,你只能自己默数600秒,而你在数数的时候是肯定不能分心做其他事情的哈,而如果你身边有块表,那就可以定一个十分钟后的闹钟,让它帮你计时,在这十分钟期间你就可以放心地做其他事情了。   

        定时器还有一些其他作用,比如用于计时系统,可实现软件计时,或者使程序每隔一固定时间完成一项操作。注意:定时器的大部分使用场景都要配合中断。

二、定时器的内部构造及其原理


        51单片机的最小系统板上有一个12Mhz的晶振。

51单片机定时器,51单片机

         那为什么是12Mhz为不是其他的频率呢?

计算机周期

        想理解它就需要了解三个概念:时钟周期、指令周期和机器周期。

        指令周期是取出一条指令并执行这条指令的时间。一般由若干个机器周期组成,是从取指令、分析指令到执行完所需的全部时间。

        机器周期也称为CPU周期。在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段(如取指、译码、执行等),每一阶段完成一个基本操作。完成一个基本操作所需要的时间称为机器周期。一般情况下,一个机器周期由若干个时钟周期组成。 

        时钟周期也称为振荡周期,定义为时钟频率的倒数。时钟周期是计算机中最基本的、最小的时间单位。在一个时钟周期内,CPU仅完成一个最基本的动作。时钟周期是一个时间的量。时钟周期表示了SDRAM所能运行的最高频率。更小的时钟周期就意味着更高的工作频率。

        因此,晶振可以理解为单片机的 “心脏” ,它为单片机提供了时钟周期,晶振频率会直接影响时钟周期的大小,二者的关系为:时钟周期 =  1 / 晶振频率 无论你的晶振频率是多少,对于单片机来说,它内部都是固定的关系 ,在设计之初,由于51单片机性能和制程工艺等因素,出厂时把51单片机的机器周期严格的控制在12个时钟周期,指令周期一般是由1 2 4 个机器周期组成。

        OK那,我们回到上面问题为什么晶振是12Mhz?我们计算下:时钟周期 = 1 / (12M) (s) =  1/12000000 (s) = 1/12 (us),51单片机一个机器周期是12个时钟周期,即机器周期=12*1/12 (us) = 1 (us) ,这样执行1条指令的时间就控制在了1(us)、2(us)、4(us)。

定时器的工作模式与流程

       STC89C52RC的T0和T1均有4种工作模式:

  • 模式0:13位定时器/计数器
  • 模式1:16位定时器/计数器 (常用)
  • 模式2:8位自动重装模式
  • 模式3:两个8位计数器

        本篇只介绍模式1,模式1也是平时最常用的,其他3种模式应用场景不是很多,看完本篇讲解亦能使用其他三种模式。模式1的内部连接方式如下:

51单片机定时器,51单片机

        这种图很唬人,乍一看很复杂,但其实很简单的,莫慌,我们把它差分成三个部分:时钟 → 计数 → 中断

51单片机定时器,51单片机

         可以看到,计数器里有两个时基单元,TL0(低8位)和 TH0(高8位)总共16位,所以叫16位定时/计数器,它最多可以计数 2^16=65535次。

        计数器由时钟提供脉冲信号,经过分频器,每来一次脉冲计数+1,我们可以先设置一个计数器的初值 x,当计次超过65535时,下一个脉冲就会产生溢出,触发溢出中断,程序可以捕获到这个中断,就可以得知此次经历了(65535-x+1)us,这样就完成了一次定时。

        举个例子:我们可以把初值定位64535,这样到溢出值65535还需计数1000次,需要1000us,这就是个1ms的定时器。

定时器中断相关寄存器

        首先看到左上角部分,可以看到定时器的时钟来源其实是二选一的,由C/T这个开关控制:

51单片机定时器,51单片机

        上面的时钟system clock也就是系统时钟了, 下面这个T0 pin,它是一个单片机的外部接口:

51单片机定时器,51单片机

         它接在了P3_4引脚上,可以检测外部的脉冲信号,当该引脚外界其他设备时,它由引脚上的设备提供时钟,就变成了一个计数器,每当这个引脚有脉冲变化,内部时基单元同样会+1,这样就可以计脉冲的次数,当然这个功能也不常用。

        上面的开关是选择分频器,选择12分频,12Mhz进行12分频就是1Mhz,每个周期就是1us,这样配置通这条线路送到计数器,每隔1us就要记1次数。

51单片机定时器,51单片机

         接下来看左下角这一大堆逻辑门,看到它们也不要慌,其实就是共同控制了一个门控端:

51单片机定时器,51单片机

        该门控制时钟信号是否进入计数器,当GATE为0,经过非门变为1,进入下一个或门,或门是有1即出1,所以下面的INT0就不参与控制,再进入下一个与门,与门是有0即出0,所以TR0也得是1才能出1,这样contorl开关才能接通。当GATE为1,那INT0必须是1,TR0也得是1时才能接通。这样说可能有点乱哈,大概意思就是当GATE为0时只由TR0控制,当GATE为0时由INT0和TR0共同控制,INT0是外部中断0,它的默认优先级要高于定时器中断,所以它会介入到定时器是否通断的控制。TR0我盲猜一下应该是Timer Ready的缩写,0就代表定时器0,用TR0来反映定时器是否准备好,在这段逻辑电路中有一票否决权,当它为0时表示定时器没有准备好,就一定不会接通。这个GATE其实我也不大清楚它的作用,感兴趣可以去查下手册。

        关于计数器部分上面已经介绍的差不多了,就是由两个8位的时基单元拼接成16位,分为高8位和低8位,在写程序的时候可以设定它的初值,当计次超过溢出值时会触发TF0(Timer Flag)中断允许标志位,从而进入中断:

51单片机定时器,51单片机

        接下来进入到中断部分的介绍,手册上关于中断的定义是这样说的:

        中断系统是为使 CPU 具有对外界紧急事件的实时处理能力而设置的。
        当中央处理机 CPU 正在处理某件事的时候外界发生了紧急事件请求,要求 CPU 暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。

        可以用下面这张图形象地理解:

51单片机定时器,51单片机

         可以看到中断并不会影响主程序的内容,可以理解为在主程序执行的过程中加急处理一项任务,这些任务也有轻重缓急之分,所以中断也会有优先级的高低之别,本篇介绍的定时器0的中断优先级排在第二,仅次于外部中断0。不同的中断会进入不同的入口通道,在程序里用中断号来区分不同类型的中断服务程序。

        传统51单片机有5个中断源,2个外部中断(INT0 和 INT1)和3个定时器中断(T0、T1、T2 )。开发板上的STC89C52RC有8个中断源,多加了一个串口中断(UART)、一个外部中断2(INT2)和外部中断3(INT3),是向下兼容的,所以我找了一张老款的图,比较简单一些哈,原理和新款是相同的:

51单片机定时器,51单片机

         所以这里要进入到第二个通道,触发条件就是TF0(定时器0中断允许标志位),ET0为定时/计数器0溢出中断允许控制位,当它置为1时才允许T0的溢出可以触发中断,EA为中断总开关,直接配置为1就好,PX0为定时器0中断优先级,应该有四个优先级可选的,这里给简化了,不过由于本次实验就这一个中断,所以随便配就好。

        这样就接通了这条通道进入到中断,执行中断中的内容。把定时器和中断两部分连接起来,整个定时器中断流程如下:

51单片机定时器,51单片机

寄存器的配置

        寄存器是连接软硬件的媒介。好好理解下这句话,在单片机中寄存器就是一段特殊的RAM存储器,一方面,寄存器可以存储和读取数据,另一方面,每一个寄存器背后都连接了一根导线,控制着电路的连接方式 寄存器相当于一个复杂机器的 “操作按钮” 。可见对于单片机来讲,寄存器无疑是至关重要的!

        定时器的相关寄存器如下:

51单片机定时器,51单片机

         依然是STC官方手册里的表,TCON就是 “Timer Control” 的意思,也就是定时器控制寄存器,TMOD就是 “Timer Mode”的意思,也就是定时器模式寄存器。

        值得一提的是,这些位地址符号后面是0的就代表是定时器0的相关位地址符号,后面是1的就是定时器1的相关位地址符号。这样的话这些位地址符号也就不陌生了,我们在上面基本也都见过并了解了,那我们直接来看配置方法:

51单片机定时器,51单片机

        先来看一下这个TCON寄存器,定时器1的不用管所以只看低四位,门控端GATE直接给0就可以,C/T也给0,让系统时钟做脉冲源。

        我们想让它工作在哪个模式要配置M1和M0两位,具体参考下面这张图:

51单片机定时器,51单片机

         定时器0的工作模式由这两位共同决定,那我们需要定时器工作在16位定时器模式,所以M1=0,M0=1。

        这里标注了不可以位寻址,只能整体赋值,高4位为定时器1的部分,随便给任何值都可以,因为后面压根就不会进到中断,就都给它置0吧,这样TMOD的8位就是0000 0001也就是TMOD=0x01。

51单片机定时器,51单片机

         再来配置下这个TCON寄存器,TF1和TR1是定时器1的不用管他,TF0上面说了是中断允许标志位,在初始化的时候应先对其清零,TR0手册里叫定时器0运行控制位,我们给他置1,这个IE0和IT0都不需要配,因为上面的门控端GATE已经置0,所以IE0和IT0并不会影响。TCON寄存器是可以进行位寻址的,所以直接单独赋值即可:TF0=0,TR0=1,只需要配置这两位。

        接下来是TL0和TH0,给这高8位和低8位都要设置好初值,就拿1模式为例,那初值就要设置为64535,2的8次方是256,想要取出64535的高8位就可以用 64535 / 256,低8位就是64535 % 256,这个原理就和十进制取高低位一样,只不过十进制 / 和 % 的是10的几次方,这里是2的几次方,那么TH0=64535 / 256,TL0=64535 % 256。

        定时器的所有内容就都配置好了,下面来看中断的寄存器配置:

51单片机定时器,51单片机

         中断的配置并不需要看这张表,可以了解一下。我们只需要参考上面的图就可以,很简单,只需要把ET0、EA和PT0这三道闸门打通即可进入中断,中断的配置是可以位寻址的,直接写ET0=1,EA=1,PT0置1或0无所谓,默认是0,那我们就也给0,PT0=0。

        这样整个流程就都配置好了!你会发现看似很多内容,实现在代码上不过几行而已。关于中断服务程序和其他一些详细的内容都放到了代码的注释里,那我们直接来看代码吧:

  三、程序


#include <REGX52.H>

void Timer0Init(void)  //初始化函数
{
	TMOD=0x01;		//设置定时器模式
	TL0=64535%256;		//设置定时初值
	TH0=64535/256;		//设置定时初值
	TF0 = 0;		    //清除TF0标志
	TR0 = 1;		    //定时器0开始计时
	ET0=1;
	EA=1;
	PT0=0;
}

        定时器初始化函数要在主函数开始调用以开启定时器,当定时器触发中断后就会跳转到中断服务程序:

#include <REGX52.H>

void Timer0_Routine() interrupt 1  //中断服务程序的固定格式,1是中断号
{ 
	TL0 = 64535%256;	//给定时器重新赋初值	
	TH0 = 64535/256;    //给定时器重新赋初值
	
    //这里可以写中断函数要执行的操作
}

        中断函数是特殊的函数,interrupt是<REG52.H>文件中的关键字,1是中断号,中断触发后会根据中断号跳转到相应的中断函数,注意:中断服务程序不能像常规函数一样被外部调用

总结


        定时器和中断都是单片机常用的外设资源,需要牢牢掌握其原理和用法。

        对于这些基础外设的学习,学会查资料会非常有帮助,我们可以在STC的官网上找一下STC89C52RC的芯片手册,里面对相关寄存器的介绍十分详细。文章来源地址https://www.toymoban.com/news/detail-754117.html

到了这里,关于51单片机定时器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 51单片机之定时器篇

    首先,学好单片机必须要搞懂定时器,定时器是单片机重要的组成部分之一,总之,学不好定时器,单片机相当于没学,下面就让我介绍如何学好单片机定时器。 学习单片机首先要明白的: 1,51单片机有两组定时器/计数器,既可以定时,又可以计数,总称之定时器 2,单片

    2024年02月11日
    浏览(54)
  • 51单片机 | 定时器中断实验

      这一节介绍51单片机的定时器中断。 STC89C5X 含有 3 个定时器:定时器 0、定时器 1、定时器 2(注意: 51 系列单片机一定有基本的 2 个定时器(定时器 0 和定时器 1),但不全有 3 个中断,需要查看芯片手册,通常我们使用的是基本的 2 个定时器:定时器 0/1)。本节要实现

    2024年02月06日
    浏览(111)
  • 51单片机PWM(定时器)

    目录 前言 一、PWM的介绍 二、在定时器中配置PWM 三、代码  总结         PWM普遍应用于惯性系统,我们知道单片机几乎只能输出“1”和“0”两种状态,即开和关,想要输出模拟量是不太容易实现的,那么怎样才能使单片机输出平滑的线性信号呢?没接触过PWM的小伙伴可能第

    2024年02月09日
    浏览(55)
  • 【51单片机】:定时器的详解(包括对单片机定时解释、各类定时方式,以及中断方式)

              51定时/计数器的详解。                   码字不易,如有帮助请收藏,点赞哦。         前提:首先我们知道51单片机内部有21~26个特殊功能寄存器: P.x口寄存器:P0、P1、P2、P3 数据指针寄存器:DP0H、DP0L、DP1H、DP1L 定时器: TH1、TL1、TH0、TL0、TMOD、TCON 串口:

    2024年02月07日
    浏览(98)
  • 51单片机定时器基础知识

    经验总结:定时器0工作方式1的溢出中断初始值计算 1.晶振11.0592M 11.0592MHz除12为921600Hz,就是一秒921600次机器周期,50ms=46080次机器周期。 65536-46080=19456(4c00) TH0=0x4c,TL0=0x00 2.晶振12M 12MHz除12为1MHz,也就是说一秒=1000000次机器周期。50ms=50000次 机器周期。 65536-50000=15536(3cb0) TH0=0x

    2024年02月04日
    浏览(115)
  • 51单片机定时器中断TMOD

    最近在学定时器中断TMOD,写程序时,要对定时器进行配置 对TMOD进行赋值时,拌了好久。。。。 如何根据所用的      定时器0/1 ,  工作方式0/1/2/3      对TMOD赋值呢? 我们知道: 1.TMOD长这样 :  由八位组成,前四位是T1的参数;后四位是T0的参数;GATE 和 C/T\\\' 不用多讲,

    2024年02月12日
    浏览(47)
  • 51单片机中断定时器1用法

    中断为使单片机具有对内部或外部随机发生的事件实时处理而设置的。 中断技术不仅解决了快速主机与I/O设备的数据传送问题,而且还有具有如下的优点: 1. 分时操作:CPU可以分时为多个I/O设备服务,提高了计算机的利用率。 2. 实时操作:CPU能够及时处理应用系统的随机事

    2024年02月06日
    浏览(61)
  • 【单片机c51】定时器应用1

    1.系统时钟为12MHz,编程实现从P1.0引脚输出一个周期为2ms的方波。 注:要想产生一个周期2ms的方波,定时器应产生1ms的周期性的定时,定时对P1.0求反。选择定时器T0,方式1定时,采用中断方式,GATE不起作用。   注:1.EA=1 所有的中断请求被开放 2.ET0=1  允许T0溢出的请求 3.T

    2024年02月04日
    浏览(54)
  • 51单片机-定时器(简易时钟的实现)

    最近在学习51单片机,学到了 定时器 这块,由于自己的基础不太扎实,在这方面花了很多时间,这里通过对定时器和中断的介绍,用 简易时钟 这个例子来对学习的内容进行加深巩固,把自己的经验分享给大家,希望对大家能够有帮助。 其实就是单片机的内部,通过系统时钟

    2024年02月03日
    浏览(68)
  • C51单片机——中断与定时器

    中断是大多数CPU最精彩的部分之一,下面我们通过讲解和编程练习学习中断和定时器相关概念 目录 1.1.什么是中断 1.2.中断的种类 1.3中断的相关概念 1.4. 51单片机可用中断及相关引脚 1.4.寄存器 1.5.中断优先级 在未进行任何关于优先级的设置情况下,51 单片机(52 单片机)中断

    2024年02月03日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包