51单片机定时器
对定时器 计数模式和计时模式的理解:
计时模式是指定时器向定时时间进行倒计时,并在定时时间到达后触发中断或者产生输出信号。在计时模式下,定时器的工作方式类似于一个计时器,可以用来进行定时任务。常见的应用场景包括脉冲计数、延时控制等。
计数模式是指定时器对外部信号进行计数,并在计数到一定数值后触发中断或者产生输出信号。在计数模式下,定时器的工作方式类似于一个计数器,可以用来计数外部事件的数量。常见的应用场景包括测量脉冲数、计数器、频率计等。
说白了就是一个是计时 一个计数
不太理解也没关系,这里主要用计时模式多一些
硬件清0就是单片机自动清零,硬件清零指的是通过特定的硬件电路将某个寄存器或者状态清零
就比如在外部中断中是硬件清零
但在定时器中如果不使用中断一般用软件清零:软件清零是指通过编写程序的方式,对特定寄存器或变量进行清零操作。
if(TF0 == 1)//判断是否溢出 通过程序查询
{
TF0 = 0;//软件清零溢出标志位
定时器工作模式的配置
所以说在配置的时候,不管TMOD.7还是TMOD.3都是直接置0,再由TR1和TR0来控制定时器的开关,因为如果TMOD.7和TMOD.3置1的话,还需要对INT0和INT1进行配置,INT0和INT1看起来眼熟吧,是不是外部中断的标志位
再看那什么是可位寻,什么是不可位寻的那:
可位寻(bit-addressable)指的是可以单独访问到一个数据的每一位,即可以像访问一个单独的变量一样访问一个字节中的任意一位。在51单片机中,有些特殊功能寄存器(如P0、P1、P2、P3等)可以进行可位寻的操作,也就是可以直接读写一个特定引脚的状态。
不可位寻(not bit-addressable)指的是不能单独访问到一个数据的每一位,而是需要将整个字节读出或写入。在51单片机中,一些寄存器(如定时器控制寄存器)只能进行不可位寻的操作,需要通过读取或写入整个寄存器来对其进行操作。
这是笼统的说法;
在我看来就是,以上面的TCON寄存器为例,它是可位寻的,就是可以直接写TF0=1,TR0=1,
TF1=1,TR1=1,就是可以直接对某位直接进行置0或置1
再看TMOD寄存器 ,不可位寻,就不能直接进行置0或置1,也就是不能直接写成TMOD.7=0,TMOD.3=0,M0=0,M1=0,需要按16进制来对TMOD寄存器进行配置,需要写成TMOD=0x__;的形式。
定时器配置步骤:
- 启动定时器0或定时器1 由于说过后面的TMOD.7和TMOD.3是配置成0的,所以这里直接 TR1=1或TR0=1 就直接打开定时器了
- 配置定时器0或定时器1 的工作模式,大多数都是用计时模式,和16位定时器所以我就以这种模式举例,比如配置定时器0为16位定时器计时模式
即TMOD =0x01;
如果是定时器1的话,就是TMOD=0x10;
- 由于是16位定时器,所以需要配置,低8位TL0和高8位TH0,来确定定时时间
机械周期为1.085微秒,先把定时时间由毫秒化为微秒,除以1.085得到需要计数多少次才到规定时间,初值为65535—计数次数得到初值,得到得初值可以用电脑计算器,化为16进制。
就以50ms为例,50000/1.085=46082,65535-46082=19453,这里19453就是初值,化为16进制0x4bfd,所以TH0=0x4b,TL0=0xfd;
由于16位计数,所以计时完成后要重放初值
void timer0Init() //定时器0的初始化
{
TR0 = 1; //启动定时器0
TMOD = 0X01; //定时器工作模式1,16位定时器计数模式
TH0 = 0x4b;
TL0 = 0xfd; //定时50ms
}
下面再来看定时器中断:
只需要再把中断打开即可,计时模式下每次计时到就产生中断
EA = 1; //打开总中断
ET0 = 1;//打开定时器0中断
TR0 = 1; //启动定时器0
TMOD = 0X01; //定时器工作模式1,16位定时模式
TH0 = 0xED;
TL0 = 0xFF; //定时5ms
搞懂定时器后这后面得定时器中断就比较好理解了
就是到5ms到了就产生中断,这里就是硬件清零,自动检测
一样的这里要注意关键字和对应的入口号
每次都要重新放初值