51单片机学习日志-17

之前介绍了如何对端口进行配置,以及了解了中断的相关知识,下面将对单片机的另一个外设进行讲解,也就是定时器/计数器(一般情况下是作为定时器来使用,所以一般称之为定时器)。这是单片机内部的独立硬件部分,开启之后自动计数,当发生溢出之后,就会产生中断信号,所以说其也可以作为一种中断信号的来源。可以通过对定时器的设置来控制在什么时候发生溢出,下面来介绍一下有关定时器的一些寄存器,总的来说一共有两个相关的寄存器,分别是工作方式寄存器TMOD以及控制寄存器TCON。
截屏2026-04-11 上午9.55.23
截屏2026-04-11 上午9.55.40
对于工作方式寄存器来说,决定了采用定时器模式还是计数器模式,以及四种计数模式。从图中可以看到寄存器TMOD的第四位用来配置T0定时器,而高四位用来配置T1定时器,同时要注意这里的寄存器是不能位寻址的,也就是说不能对单个位上的数据进行修改,只能通过对整个的寄存器进行修改。对于GATE位来说,但其置零时则定时器的启动停止由TCON的TRx决定,而当其置位的时候,由TRx和外部中断引脚共同决定。对于C/T位来说,如果是置零的话,就是定时器模式;如果是置一地话就是计数器模式。而对于剩下的M0和M1来说,就决定了定时器的四种模式,分别为方式0、方式1、方式2以及方式3,如图所示。对于TCON寄存器来说,高四位是用来对定时器进行配置的,也即TF1、TR1以及TF0、TR0,分别对应定时器1和定时器0。对于TF来说,是溢出标志位,当溢出时硬件将该标志位置位,并申请中断程序,而当进入中断程序后,由硬件自动将该数据位进行清零。而TR表示定时器的运行控制位,前面提到的GATE置零时,定时器直接由TR进行开启,也即可以通过软件进行开启;而当GATE置位时,需要外部中断信号引脚为1时,才能通过TR进行开启控制,也就是多了一道程序。下面再来介绍什么是初值寄存器THx、TLx。
对于定时器来说,时间长短和累加的基数有关,同时也和溢出时的门限值有关,而这个门限值就和这两个寄存器以及工作方式有关。如果将单片机设置为工作模式1,也就是以16位计数器运行,也就是计数范围是0~2的16次方减一,如果系统时钟频率为12MHz,而且12个时钟周期为一个机器周期,那么机器周期为1MHz,也就是1微秒。如果初值设置为默认值,则将从0开始计时,一直到2点十六次方,这样的话将计时65536次之后产生溢出信号,也就是约65.5毫秒之后产生一次溢出。而如果想要10毫秒产生一次溢出,那么就需要对初值进行计算,所以要用65536减去初值就得到了需要及时的次数。10毫秒需要计时10000次,于是用65536减去10000得到55536,于是需要将初值设置为55536才能实现目标。而由于初值是要用寄存器进行存储的,所以要将55536转化为二进制数。将55536对2对8次方进行取商,小数点去掉就可以得到高八位的初值TH,而对2的8次方取余就能得到低八位的初值TL。
最后介绍一下定时器的工作模式,一共有四种工作模式。由寄存器的M0和M1来设置。当M0和M1都置零,则定时器工作在模式0下,为13位定时器,初值由TL的低五位和TH的八位进行设置。对于这种模式下,要知道最大计数值为8191,而如果要改变一次溢出的计数时间,需要对初值进行设置,这里要注意TL只用到了低5位,所以计算的时候带入的是5的二次方。对于模式一来说,就是前面说到的16位的定时器。而对于模式2来说,控制方式和前面相同,但是不同的是初值的位数以及初值装载方式。在这种模式下,其初值只有8位,所以说最大的计数次数为255,而当定时器进入中断程序之后,不需要用代码设置定时器的初值,而是由系统将TH寄存器中的值重装入TL中,而TH的值是由软件设置的,所以也就是说通过TH这个寄存器将需要重装的初值进行了存储,而不再需要软件进行重装了,但是也是需要进行对TH的设置。而对于模式3来说,只适用于定时器0,对于定时器1来说该模式下停止工作。当定时器0处于模式3时,TL和TH作为独立的两个8位定时器,而TH此时只能作为定时器来使用,而且使用TR1和TF1进行控制。

posted @ 2026-04-11 12:38  getacat  阅读(12)  评论(0)    收藏  举报