51单片机入门 - 定时器的使用技巧

博主福利:100G+电子设计资料合集icon-default.png?t=N7T8https://dwz.date/fyQa

1、定时器和计数器

时钟周期:单片机时序中的最小单位,集体计算的放法就是时钟源分之一

机器周期:单片机完成一个操作的最短时间,=12个时钟周期

定时器:打开定时器后,定时器“存储寄存器”的值经过一个机器周期自动加1,也就是说,机器周期是定时器的计数周期。

2、定时器的寄存器

TMOD —— 工作模式选择寄存器——常用模式1和模式2.

TCON —— 控制寄存器(TRn定时器开关)

TH/TL —— 定时计数器

3、定时器应用

第一步:设置特殊功能寄存器 TMOD,配置好工作模式。第二步:设置计数寄存器TH0和TL0的初值。第三步:设置TCON,通过TR0置 1来让定时器开始计数。第四步:判断TCON  寄存器的TF0 位,监测定时器溢出情况。

写程序之前,我们要先来学会计算如何用定时器定时时间。我们的晶振是 11.0592M,时钟周期就是 1/11059200,机器周期是12/11059200,时器定时值最大也就是 71ms 左右。

(65536-N)*12/11.0592M = time ---计算出N转换成十六进制

1ms的例子:


TMOD = 0X01;

TH0 = 0XFC;

TL0 = 0X67;

TR0 = 1; 


#include<reg52.h>

 

typedef unsigned char uchar;

 

sbit LED = P0^0;

 

int  main(void)

{

  uchar cnt = 0;  //定义一个计数变量,记录T0溢出次数

 

  TMOD = 0x01;  //设置T0为模式1

  TH0 = 0xFC;  //为T0赋初值0xB800

  TL0 = 0x67;

  TR0 = 1;     //启动T0

 

  while (1)

  {

    if (1 == TF0)        //判断T0是否溢出

    {

      TF0 = 0;         //T0溢出后,清零中断标志

      TH0 = 0xFC;      //并重新赋初值

      TL0 = 0x67;

      cnt++;           //计数值自加1

      if (cnt >= 1000)   //判断T0溢出是否达到50次

      {

        cnt = 0;     //达到50次后计数值清零

        LED = ~LED;  //LED取反:0-->1、1-->0

      }

    }

  }

 

  return 0;

}

4、数码管

共阴与共阳数码管 ——8个LED灯

位选——控制选择多个数码管中的哪一个

段选——选择数码管显示的值


// 秒定时器:

#include<reg52.h>

 

typedef unsigned int uint;

typedef unsigned char uchar;

 

uchar code count[] =

{

  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,

  0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E

};

 

int main(void)

{

  uchar cnt = 0;  //记录T0中断次数

  uchar sec = 0;  //记录经过的秒数

 

  TMOD = 0x01;  //设置T0为模式1

  TH0 = 0xFC;  //为T0赋初值0xB800

  TL0 = 0x67;

  TR0 = 1;     //启动T0

 

  while (1)

  {

    if (TF0 == 1)        //判断T0是否溢出

    {

      TF0 = 0;         //T0溢出后,清零中断标志

      TH0 = 0xFC;      //并重新赋初值

      TL0 = 0x67;

      cnt++;           //计数值自加1

      if (cnt >= 1000)   //判断T0溢出是否达到1000次

      {

        cnt = 0;            //达到1000次后计数值清零

        P0 = count[sec];  //当前秒数对应的真值表中的值送到P0口

        sec++;              //秒数记录自加1

        if (sec >= 16)      //当秒数超过0x0F(15)后,重新从0开始

        {

          sec = 0;

        }

      }

    }

  }

 

  return 0;

}

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C51单片机有两个定时器,分别为Timer 0和Timer 1。定时器的主要功能是计时和延时,可以用于控制程序执行的时间。 以下是C51单片机定时器的基本操作步骤: 1. 设置定时器模式:选择定时器工作模式,如定时器模式或计数器模式。 2. 设置定时器计数值:确定计数器的初始值,即计时的时间。 3. 启动定时器:启动定时器开始计时。 4. 等待定时器计时结束:等待定时器计时结束,即达到设定的计数值。 5. 停止定时器:停止定时器计时。 以下是一个简单的C51单片机定时器示例程序: ``` #include<reg52.h> #define uint unsigned int #define uchar unsigned char void timer0_init(); //定时器0初始化函数 void main() { timer0_init(); //调用定时器0初始化函数 while(1) { //程序执行任务 } } void timer0_init() { TMOD &= 0xF0; //设置定时器0为模式1 TH0 = 0x3C; //给定时器初值,定时1ms TL0 = 0xAF; ET0 = 1; //打开定时器0中断允许 EA = 1; //打开总中断允许 TR0 = 1; //启动定时器0 } void timer0() interrupt 1 using 1 { TH0 = 0x3C; //给定时器初值,定时1ms TL0 = 0xAF; //中断执行任务 } ``` 在上面的程序中,timer0_init()函数用于初始化定时器0,设置为模式1,计时1ms;timer0()函数是定时器0的中断处理函数,当定时器0计时结束后,会自动进入此函数进行中断处理。在这个函数中,可以编写相应的任务执行代码。在主函数中,通过while(1)循环不停地执行程序任务,而定时器0会在后台进行计时和中断处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值