51单片机——定时器

单片机——定时器

 

宗旨:技术的学习是有限的,分享的精神是无限的。

 

1、定时器和计数器

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

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

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

 

2、定时器的寄存器

 

 

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

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

TH/TL —— 定时计数器

 

3、定时器应用

第一步:设置特殊功能寄存器 TMOD,配置好工作模式。
第二步:设置计数寄存器TH0TL0的初值。
第三步:设置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;
}

 

 

 

  • 7
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
引用\[1\]中提到了使用定时器来定时扫描独立按键和数码管,以代替延时函数。定时器的好处是可以在主函数中的延时不影响按键检测和数码管扫描的情况下进行定时扫描。定时器会在溢出时执行中断程序,实现定时的扫描。 在引用\[2\]中,主程序利用定时器0,每隔2ms对Shuma_Loop函数进行一次调用,以实现动态数码管的显示。每2ms显示一位数码管。 而在引用\[3\]中,主程序利用定时器0,每隔20ms对Key_Loop函数进行一次调用,以实现对按键的检测。 综上所述,通过使用定时器,可以实现51单片机的秒表定时器功能。可以根据需要设置定时器的时间间隔,并在定时器中断中调用相应的函数来实现所需的功能。 #### 引用[.reference_title] - *1* [51——单片机秒表(定时器扫描独立按键和数码管)](https://blog.csdn.net/ssssshhbh/article/details/129229740)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [51单片机秒表(定时器扫描按键数码管)](https://blog.csdn.net/qq_42786221/article/details/123566767)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值