单片机-定时器

时间:2021-04-09 23:30:47

简介:

  主要介绍定时器的使用。

中断资源:

  8051中断有5种:外部中断0、定时器/计数器0、外部中断1、定时器/计数器1、串口中断。

TMOD寄存器:

  TMOD是定时器/计数器的模式控制寄存器。

  单片机-定时器

  其中高四位控制定时器1,低四位控制寄存器0。

  GATE置为0,仅由TRx控制是否启动。

  C/T置为0,为定时器模式。

  M1和M0控制定时器的工作模式,置为01,为16位定时器。

机器周期:(以12M晶振为例,1M = 10^6)

  时钟周期:1/12M = 1/12 us

  机器周期:12*时钟周期 = 1us ;

          注意普通单片机以12个时钟周期为一个机器周期,一些增强型单片机比如12T增强型单片机,以1个时钟周期为一个机器周期;

TH0和TL0:

   T0为1个16位的寄存器,用来设置定时器0的初值,当T0加满到2^16即65536就完成了一次定时。

   由于51单片机是8位的,所以T0表示为TH0和TL0.

   假设要定时n个us,那么

    TH0 = (65536-n)/256

         TL0 = (65536-n)%256

      256表示,低位的八位

中断服务程序:

  void 函数名() interrupt 中断号{

    //中断服务程序内容

  }

  中断服务程序无需主动调用。

中断号:

  0:外部中断0

  1:定时器/计数器0

  2:外部中断1

  3:定时器/计数器1

  4:串口中断

  如果是8052单片机,如AT89S52,还有一个定时器2,中断号为5

启动定时器:

    TMOD=0x01;                      //设置定时器0位工作模式1

    TH0=(65536-1000)/256;     //定时1ms

    TL0=(65536-1000)%256;   //定时1ms

    EA=1;             //开总中断

    ET0=1;           //开定时器0中断

    TR0=1;           //启动定时器0

示例:

  功能:用定时器0控制led以300ms的周期闪烁

#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int
sbit led1=P2^7;
uint num;
uint numTimer0 = 1000;  //定时器定时时间1ms
void main()
{ 
  TMOD=0x01;                      //设置定时器0为16位定时器
  TH0=(65536-numTimer0)/256;  
  TL0=(65536-numTimer0)%256;
  EA=1;    //开总中断
  ET0=1;   //开定时器0中断
  TR0=1;   //启动定时器0
  while(1)
  {
     if(num==300)       //num == 300,即300ms
         {
            led1=~led1;    //让发光管状态取反
            num=0;
         }
  }
}
void T0_time()interrupt 1
{
   TH0=(65536-numTimer0)/256;  //重新装载初值
   TL0=(65536-numTimer0)%256;
   num++;    
}