51单片机定时器讲解

控制/MCU

1828人已加入

描述

前面我们讲解了通用IO输入输出,延时函数和外部中断,今天我们讲解单片机另一个重要的功能,定时器。顾名思义,定时器就是用来定时的,与延时函数的设置不同,延时函数是不精确定时,是用来解决一些不需要精确定时的问题的。而定时器以单片机的时钟频率为基准,定时都是十分精确的。

定时器

在原理图的设计中,有一个单片机最小系统必不可少的模块,晶振电路模块。

定时器

采用两个电容并接晶振Y1的方式设计晶振电路,为单片机的运行提供时钟,频率由外部晶振Y1的值决定,这里是11.0592MHz。时钟的周期为t=1/11.0592M s。51单片机中1个机器周期等于12个振荡周期,振荡周期也叫时钟周期。定时时间以机器周期计算,也就是计数值N乘以机器周期T(=12*t)就是定时时间t 。

51单片机定时模式有4种,数据手册中由工作模式寄存器TMOD决定:

定时器

高四位控制定时器1,低四位控制定时器0,具体详细寄存器信息大家百度即可,我就不多赘述了。然后我们简单说一下四种工作模式为模式0(13位定时器/计数器),模式1(16位定时器/计数器模式),模式2(8位自动重装模式),模式3(两个8位定时器/计数器)。定时器/计数器1除模式3外,其他工作模式与定时器/计数器0相同,T1在模式3时无效,停止计数。平时使用最多的是模式1,模式2通常由T1使用,为串口通信配置波特率。

定时时,16位计数器默认从0开始,计数到65535记满,多记一个溢出,也就是计数65536就会让定时器溢出,因此我们要注意设置初值时要用65536去减。比如我们需要定时50ms,假定计一个数是1us(实际是12*1/11.0592M s),需要计数50000次,那么计数初值设置为65536-50000,而不是65535-50000,这是许多初学者弄不清楚的地方。

除了工作模式寄存器,还有TCON控制寄存器,IE中断设置寄存器(我们需要中断来给定时器重新赋初值)。

代码贴在下面,大家自行借鉴。

#include"reg52.h"


sbit LED1=P1^1;
void delay(unsigned char time)
{
  unsigned char i,j;
  for(i=0;i< time;i++)
    for(j=0;j< 120;j++);
}
void init_timer0()
{
  TMOD=0x21; //0方式1,1方式2
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;

  ET0=1;
  EA=1;
  TR0=1;
}
int main()
{
  init_timer0();
  while(1);
}


void timer0() interrupt 1
{
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;
  num++;//50ms*60=3s定时3s
  if(num==60)
  {
    LED0=~LED0;
  }
}
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分