单片机交流
直播中

张红

7年用户 1288经验值
私信 关注
[问答]

如何用最简洁的方式学会51单片机定时器?

如何用最简洁的方式学会51单片机定时器?

回帖(1)

袁沁茹

2021-9-29 14:46:54
☺定时器中断是单片机最重要的一个功能,一开始学的时候遇到了不少的问题,通过不断地学习解决了不少问题,其实学会之后也没有什么。在这里我整理了一下定时器的使用,就用51单片机来举例。像别的STC15等系列的单片机其实原理上差不多的,分享给大家希望能帮助大家。
  定时器相关寄存器

  


  • 中断允许寄存器IE
      



  
   1.EA:cpu总中断允许控制位。EA=1,cpu开放中断。
2.ET0/ET1:定时器T0和定时器T1溢出中断允许位。ET0/ET1=1;允许中断。
3.EX0/EX1:外部中断0和外部中断1中断允许位。EX0/ET1=1;允许中断。
  
  


  • 控制寄存器TCON

      



  
   TF1:定时器/计数器T1溢出标志。T1被允许计数以后,从初值开始加1计数。当最高位产生溢出时由硬件置‘1’,此时向CPU请求中断,一直保持到CPU响应中断时,才由硬件清‘0’。(TF1也可以由程序查询清“0”)
  
  
   TR1:定时器T1的运行控制位,该位是由软件置位和清零。当GATE=0,TR1=1时就允许T1开始计数,TR1=0时禁止T1计数。当GATE=1,TR1=1且外部中断1输入位高电平时,才允许T1计数。
  
  
   TF0:定时器/计数器T0溢出标志。T0被允许计数以后,从初值开始加1计数。当最高位产生溢出时由硬件置‘1’,此时向CPU请求中断,一直保持到CPU响应中断时,才由硬件清‘0’。(TF0也可以由程序查询清“0”)
  
  
   TR0:定时器T0的运行控制位,该位是由软件置位和清零。当GATE=0,TR0=0时就允许T0开始计数,TR0=0时禁止T0计数。当GATE=1,TR0=1且外部中断0输入位高电平时,才允许T0计数。
  
  


  • TMOD寄存器

      



  
   其中低四位定义定时器/计数器T0,高四位定义定时器/计数器T1。
   GATE——门控制。 GATE=1时,由外部中断引脚INT0、INT1和控制寄存器的TR0,TR1来启动定时器。
   GATE=0时,仅由TR0,TR1置位分别启动定时器T0、T1。 Ⅱ,C/T——功能选择位
  
  
   M0、M1——方式选择功能
   由于有2位,因此有4种工作方式
   
   M1M0 工作方式 计数器模式 TMOD(设置定时器模式)
   0 0 方式0 13位计数器 TMOD=0x00
   0 1 方式1 16位计数器 TMOD=0x01
   1 0 方式2 自动重装8位计数器 TMOD=0x02
   1 1 方式3 T0分为2个8位计数器,T1为波特率发生器 TMOD=0x03
  
  定时器工作方式介绍

  方式0:M1=0,M0=0 ,13位定时器/计数器
  方式1:M1=0,M0=1 ,16位定时器/计数器
  方式2:M1=1,M0=0 ,8位自动重载定时器
  方式3:M1=0,M0=0 ,双8位定时器/计数器
  定时器的初始值的计算

  首先要明白单片机的机器周期,关于机器周期的介绍如下。

  

  

我们以单片机的晶振是12MHz为例,假设你要定时1ms,采用定时器0,方式1时,此时为16位定时,16位最大值为2的16次方,也就是65536。
由于12MHz的单片机其机器周期为1us。由于1ms=1000us。所以初始值的大小x=65536-1000=64536.然后把64536转换成16进制.

  

  

该定时器的初始化代码则为:
  void Time0Init() {         TMOD=0X01;//设置定时器0方式为1.         TL0 = 0x18;        //设置定时初值低四位         TH0 = 0xFC;        //设置定时初值高四位         TF0 = 0;         TR0 = 1; }   在这里给大家分享一款定时器计算的的小工具。
链接: 百度网盘.
提取码:gtgm

  

  

  定时器中断的使用。

  功能:使用定时器0计数,使led灯每隔一秒反转一次。
原理图:

  

  


#include"reg51.h"
***it led=P1^0;
void Time0Init();
unsigned int tt;
int main()
{
        Time0Init();
        while(1);
}


void Time0Init()
{
        TMOD=0X01;
        TL0 = 0x18;        //设置定时初值
        TH0 = 0xFC;
        TF0 = 0;       
        TR0 = 1;
        ET0=1;//打开定时器中断
        EA=1;//打开总中断
}
void Time0() interrupt 1
{
        TL0 = 0x18;        //由于定时器工作方式选择的时16位。没有自动重载功能,所以每次溢出之后要手动进行一次初始化。
        TH0 = 0xFC;
        tt++;
        if(tt==1000)
        {
                tt=0;
                led=~led;
        }
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分