【mcuclub】定时器/计数器

2023-05-16

一、简介

定时器实际上就是Soc当中的一个内部外设。定时器常与计数器扯到一起,计数器也是Soc当中的一个内部外设,计数器顾名思义是用来计数的,就和我们的秒表一样,秒表实际上就是一个计数器,每隔一个单位走一个格(就是计一个数),因为计数器的计数时间周期是固定的,因此到了一定时间只要用计数值*计数时间周期,就能得到一个时间段,这个时间段就是我们定的时间(这就是定时器了)。计数器和定时器其实是一回事。

二、定时器的原理

定时器计时其实是通过计数来实现的。定时器内部有一个计数器,每隔一个时钟周期,计数器就计数一次,定时器的时间就是计数器计数值x时钟周期。

  • 振荡周期:为单片机提供定时信号的振荡源周期。
  • 状态周期:2个振荡周期为一个状态周期。
  • 机器周期:一个机器周期包含六个状态周期,十二个振荡周期。
  • 指令周期:完成一条指令所占用的全部时间

三、51单片机的定时器

STC89C52有三个16位定时器,T0、T1、T2,单片机内的定时器和CPU是相互独立的,互不影响,所以它们的执行不需要CPU的参与,而软件延迟利用若干次空循环实现,占用CPU。

四、内部结构

定时/计数器的实质是加一计数器(16位),由高8位和低八位两个寄存器TH和TL组成,TMOD是定时/计数器的工作方式寄存器,确定工作方式和功能;TCON是控制寄存器,控制T0,T1的启动和停止及设置溢出标志位。

五、定时器/计数器0和1的相关寄存器

1、定时器/计数器控制寄存器TCON

TCON为定时器/计数器TO、T1的控制寄存器,同时也锁存TO、T1溢出中断源和外部请求中断源等,TCON格式如下:

TF1:定时器/计数器T1溢出标志。T1被允许计数以后,从初值开始加1计数。当最高位产生溢出时由硬件置“1”TF1,向CPU请求中断,一直保持到CPU响应中断时,才由硬件清“0”TF1 (TF1也可由程序查询清“0”)。

TR1:定时器T1的运行控制位。该位由软件置位和清零。当GATE(TMOD.7) =O,TR1=1时就允许T1开始计数,TR1=0时禁止T1计数。当GATE (TMOD.7)=1, TR1=1且INT1输入高电平时,才允许T1计数。

TFO:定时器/计数器TO溢出中断标志。TO被允许计数以后,从初值开始加1计数,当最高位产生溢出时,由硬件置“1”TFO,向CPU请求中断,一直保持CPU响应该中断时,才由硬件清“0”TFO (TFO也可由程序查询清“O”)。

TRO:定时器TO的运行控制位。该位由软件置位和清零。当GATE(TMOD.3)=O,TRO=1时就允许TO开始计数,TRO=0时禁止TO计数。当GATE (TMOD.3)=1,TRO=1且INTO输入高电平时,才允许TO计数。

IE1:外部中断1请求源(INT1/P3.3)标志。IE1=1,外部中断向CPU请求中断,当CPU响应该中断时由硬件清“0”IE1。

IT1:外部中断1触发方式控制位。IT1=0时,外部中断1为低电平触发方式,当INT1(P3.3)输入低电平时,置位IE1。采用低电平触发方式时,外部中断源(输入到INT1)必须保持低电平有效,直到该中断被CPU响应,同时在该中断服务程序执行完之前,外部中断源必须被清除(P3.3要变高),否则将产生另一次中断。当IT1=1时,则外部中断1(INT1)端口由“1”→“0”下降沿跳变,激活中断请求标志位IE1﹐向主机请求中断处理。

IEO:外部中断O请求源(INTO/P3.2)标志。IEO=1外部中断0向CPU请求中断,当CPU响应外部中断时,由硬件清“0”IEO(边沿触发方式)。

ITO:外部中断0触发方式控制位。ITO=0时,外部中断0为低电平触发方式,当INTO (P3.2)输入低电平时,置位IEO。采用低电平触发方式时,外部中断源(输入到INTO)必须保持低电平有效,直到该中断被CPU响应,同时在该中断服务程序执行完之前,外部中断源必须被清除(P3.2要变高),否则将产生另一次中断。当ITO=1时,则外部中断0(INTO)端口由“1”→“0”下降沿跳变,激活中断请求标志位IEO ,向主机请求中断处理。

2.定时器/计数器工作模式寄存器TMOD

定时和计数功能由特殊功能寄存器TMOD的控制位CT进行选,TMOD寄存器的各位信息如下表所列。可以看出,2个定时/计数器有4种操作模式,通过TMOD的M1和MO选择。2个定时/计数器的模式0、1和2都相同,模式3不同,各模式下的功能如下所述。

六、两个重要概念

1、TH和TL用来干嘛?

TH和TL是计数器的初始计数值,计数器会从这个值开始向上计数。

2、什么时候触发中断?

配置成模式1时,当计数值计数到65536时,溢出中断触发,进入中断服务函数。

七、配置定时器/计数器

1、标准定时器(以T0为例)

/****

*******定时器0初使化函数

*****/

void Timer0_Init(void)

{

   TMOD &= 0xF0;              //清除 T0 的工作模式

   TMOD |= 0x01;              //配置 T0 的GATE=0; C/T=0; M1=0; M0=1;(模式1(16位))

   TH0 = (65536-921)/256;     //配置 T0 高8位计数初始值

   TL0 = (65536-921)%256;     //配置 T0 低8位计数初始值

   TR0 = 1;                   //启动 T0

   ET0 = 1;                   //启动 T0 中断

   EA = 1;                   //打开总中断

}

/****

*******T0计时中断函数

1s的定时次数= 1/(12/11059200)=921600,16位计数器最大可计数65536次,所以通常定时ms为单位,比如定时1ms,则循环1000次为1s,则计数次数为921600/1000=921,则初值为

TH0 = (65536-921)/256;

TL0 = (65536-921)%256;

*****/

void Timer0_Handler(void) interrupt 1   //0:外部中断1的中断号; 1:定时器0的中断号; 2 外部中断2的中断号; 3:为定时器1的中断号; 4 串口中断的中断号;

{

   static uint timer0_count;

   TH0 = (65536-921)/256;           //重新赋初值

   TL0 = (65536-921)%256;

   if(flag_timer_begin == 1)        //开始计时

   {

      timer0_count++;

      if(timer0_count >= 1000)      //定时1s

      {

         timer0_count = 0;

         flag_1s = 1;

      }

   }

   else                            //停止计时,清除标志位

   {

      timer0_count = 0;

      flag_1s = 0;

   }

}

2、触发定时器(以T0为例,引脚INT0必须为高电平才开启定时器)

/****

*******定时器0初使化函数

*****/

void Timer0_Init(void)

{

   TMOD &= 0xF0;                 //清除 T0 的工作模式

   TMOD |= 0x09;                 //配置 T0 的GATE=1; C/T=0; M1=0; M0=1;(模式1(16位))

   TH0 = (65536-921)/256;        //配置 T0 高8位计数初始值

   TL0 = (65536-921)%256;        //配置 T0 低8位计数初始值

   TR0 = 1;                     //启动 T0

   ET0 = 1;                     //启动 T0 中断

   EA = 1;                      //打开总中断

}

/****

*******T0计时中断函数

1s的定时次数= 1/(12/11059200)=921600,16位计数器最大可计数65536次,所以通常定时ms为单位,比如定时1ms,则循环1000次为1s,则计数次数为921600/1000=921,则初值为

TH0 = (65536-921)/256;

TL0 = (65536-921)%256;

*****/

void Timer0_Handler(void) interrupt 1   //0:外部中断1的中断号; 1:定时器0的中断号; 2 外部中断2的中断号; 3:为定时器1的中断号; 4 串口中断的中断号;

{

   static uint timer0_count;

   TH0 = (65536-921)/256;              //重新赋初值

   TL0 = (65536-921)%256;

   timer0_count++;

   if(timer0_count >= 1000)            //定时1s

   {

      timer0_count = 0;

      flag_1s = 1;

   }

}

3、计数器(以T0为例,P3.4引脚由高电平到低电平跳变,计数值+1)

/****

*******定时器0初使化函数

*****/

void Timer0_Init(void)

{

   TMOD &= 0xF0;           //清除 T0 的工作模式

   TMOD |= 0x05;           //配置 T0 的GATE=0; C/T=1; M1=0; M0=1;(模式1(16位))

   TH0 = (65536-10)/256;   //配置 T0 高8位计数值

   TL0 = (65536-10)%256;   //配置 T0 低8位计数值

   TR0 = 1;                //启动 T0

   ET0 = 1;                //启动 T0 中断

   EA = 1;                 //打开总中断

}

/****

*******T0计时中断函数

1s的定时次数= 1/(12/11059200)=921600,16位计数器最大可计数65536次,所以通常定时ms为单位,比如定时1ms,则循环1000次为1s,则计数次数为921600/1000=921,则初值为

TH0 = (65536-921)/256;

TL0 = (65536-921)%256;

*****/

void Timer0_Handler(void) interrupt 1   //0:外部中断1的中断号; 1:定时器0的中断号; 2 外部中断2的中断号; 3:为定时器1的中断号; 4 串口中断的中断号;

{

   flag_finish = 1;

}

八、流程设计

首先清除定时器工作模式,然后配置定时器工作模式为模式1,接着配置定时器高八位和低八位计数初始值,接着启动定时器、启动定时器中断、打开总中断。当计数值溢出时,触发中断,进入中断服务函数,在中断服务函数中重新赋值计数初始值,进行计时处理。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【mcuclub】定时器/计数器 的相关文章

  • redis分布式锁

    1 Redis分布式锁最简单的实现 想要实现分布式锁 xff0c 必须要求 Redis 有 互斥 的能力 xff0c 我们可以使用 SETNX 命令 xff0c 这个命令表示SET if Not Exists xff0c 即如果 key 不
  • 网络边界安全

    防火墙 防火墙的分类 按物理特性划分 软件防火墙硬件防火墙 按性能划分 百兆级防火墙千兆级防火墙 按防火墙结构划分 单一主机防火墙路由集成防火墙分布式防火墙 按防火墙技术划分 包过滤防火墙应用代理防火墙状态检测防火墙 防火墙的功能 访问控制
  • 控制台报错--Module not found: Error: Can‘t resolve ‘core-js/fn/promise‘

    报错信息 xff1a 解决方法 xff1a 原因是vscode会自动导入 import resolve from 39 core js fn promise 39 这一行代码
  • 如何测量无人机电机和螺旋桨的效率?

    为什么要测试电机和螺旋桨 xff1f 首先要确认我们和最终用户的需求是什么 xff1f 因为它将帮助我们发现哪些内容需要优化 xff1a 是否希望增加无人机不间断航拍的续航时长 xff1f 是否希望增加无人机的净载荷 xff1f 是否需要加
  • Jmeter性能测试(23)--分布式测试

    关于jmeter的介绍和元件作用 xff0c 之前的博客介绍过 xff0c 很多其他同行的博客也够详细的 xff0c 这里不做介绍 xff0c 对jmeter不甚了解的可以参考之前的博客 xff1a jmeter xff1a 菜鸟入门到进阶
  • 无人机的电调及其工作原理是什么?

    电子速度控制器 ESC 是电力推进系统的重要硬件组成部分 它就像系统的大脑一样 xff0c 根据从油门控制器接收到的数据信号告诉电机以多快的转速运行 对于无人机和遥控车辆等小型场景应用 xff0c 该控制器的名称为 ESC xff0c 而对
  • 三自由度无人机飞手培训、PID调试、飞行教学、飞控算法验证、故障仿真平台

    无人机在研制过程中需要不断地进行飞行测试 xff0c 而测试的过程不是万无一失的 xff0c 飞行过程中发生任何错误都有可能会导致无人机的损毁或破坏 xff0c 更严重地甚至会造成外界伤害 基于此我们推出了无人机的三旋转自由度 3 DOF
  • shell脚本的执行

    标题 shell脚本的执行 概述 当shell脚本运行时 xff0c 首先会查找系统环境变量ENV xff0c 环境变量指定了环境文件 xff08 加载顺序 etc profile bash profile bashrc etc bashr
  • prometheus(普罗米修斯)

    prometheus 什么是普罗米修斯 xff1f Prometheus是一个开源系统监控和警报工具包 xff0c 最初是在 SoundCloud 上构建的 自2012年成立以来 xff0c 许多公司和组织都采用了Prometheus xf
  • 装机环境配置笔记

    装机过程中需要修改系统中的环境参数以及配置 xff01 xff01 xff01 http t csdn cn Ste4n xff08 记录在这里 xff09 运行环境配置文档 xff08 参考使用非必须 xff09 Notion The a
  • SDN系统方法 | 8. 网络虚拟化

    第8章 网络虚拟化 如第2章所述 xff0c 网络虚拟化和本书介绍的其他部分有所不同 xff0c 这是SDN第一个成功的商业用例 网络虚拟化可以在服务器上实现 xff0c 通常不需要物理网络中的交换机提供任何帮助 网络虚拟化可以实现为现有网
  • 算法设计与分析

    两个例子 调度问题与投资问题 例1 xff1a 调度问题 问题 有 n 项任务 xff0c 每项任务加工时间已知 从 0时刻开始陆续安排到一台机器上加工 每个任务的完成时间是从 0 时刻到任务加工截止的时间 求 总完成时间 xff08 所有
  • 偏航角、俯仰角、横滚角的理解

    最近研究IMU陀螺仪 xff0c 经过一早上的调试 xff0c 最后发现根本看不懂xyz三个角度的度数是怎么来的 xff0c 看了一些教程 xff0c 也觉得不够直观 xff0c 去了b站找了个视频 xff0c 发现讲解的还不错 xff0c
  • ubuntu20.04版本 安装ros1与px4、mavros、QGroundControl

    基于个人安装时的操作以及所浏览的链接 xff0c 仅供参考 文章目录 前言一 pandas是什么 xff1f 二 使用步骤 1 引入库2 读入数据总结 前言 使用ubuntu下载ros px4似乎是一件十分繁琐以及困难的事情 xff0c 但
  • ros中无人机基于话题<geographic_msgs/GeoPoseStamped.h>的指点飞行控制

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言一 话题认识二 完整代码总结 前言 本篇文章是作者在学习ros时根据自己的认识所写的代码 xff0c 主要是基于话题 lt
  • Jmeter性能测试(24)--dubbo接口测试

    一 Dubbo简介 dubbo是一个分布式服务框架 xff0c 致力于提供高性能和透明化的RPC远程服务调用方案 xff0c 以及SOA服务治理方案 其核心部分包含如下几点 xff1a 1 远程通讯 xff1a 提供对多种基于长连接的NIO
  • 自定义mavlink及收发测试(px4固件V1.11.0,QGC源码4.0)

    一 实现收 1 先定义uORB消息 a01 GPS msg uint64 timestamp time since system start microseconds uint64 lat Latitude uint64 lon Longi
  • 自定义mavlink及收发测试2(px4固件V1.11.0,QGC源码V4.0)

    一 1 下载安装一个mavlink文件或者在原文件上修改 安装步骤 xff08 包含mavlink generator xff09 可参照文章 PX4自定义Mavlink消息 xff08 一 xff09 px4发送 Sense97的博客 C
  • Ubuntu20.04 | 更新软件源 sudo apt-get update 出现错误

    之前使用了清华的官方源 清华大学开源软件镜像站 Tsinghua Open Source Mirror 错误提示 xff1a 忽略 1 https mirrors tuna tsinghua edu cn ubuntu focal InRe
  • PCB封装库的制作

    以下几个元件制作为例 xff1a 元件SMA封装 步骤 xff1a 1 创建PCB库文件 xff1a 单击 File 菜单 xff0c 选择 New 选项中的 Library 选项 xff0c 再选择 PCB Library xff0c 进

随机推荐

  • PCB板自动布线

    自动布线 步骤 xff1a 1 整体删除同层的走线 xff1a 打开PCB文件 xff0c 在层的选项卡中选择顶层 Top Layer xff0c 在 Edit 菜单下选择 Select 选项 xff0c 选择 All on Layer 选
  • 独立按键实验

    按键简介 按键是一种电子开关 xff0c 使用时 xff0c 按下按钮 xff0c 则开关接通 xff0c 松开手时 开关断开 开发板上使用的按键及内部简易图如下图所示 xff1a 按键管脚两端距离长的表示默认是导通状态 xff08 1 2
  • IO 扩展(串转并)-74HC595-16*16LED点阵实验

    51 单片机的IO 口非常有限 xff0c 有时候若想要连接更多外围设备 xff0c 需要通过 IO 扩展来实现 本文介绍一种 IO 口扩展方式 串转并 xff0c 使用的芯片是 74HC595 若有4个 74HC595 芯片 xff0c
  • LED 点阵实验~点亮一个点、数字、汉字、图

    LED 点阵简介 LED 点阵是由发光二极管排列组成的显示器件 xff0c 如下所示为8 8LED 点阵 xff1a 以 16 16LED 点阵为例 xff0c 其内部结构图如下所示 xff1a 16 16 点阵共由 256 个发光二极管组
  • 定时器中断

    定时器简介 介绍定时器之前 xff0c 先说明几个CPU 时序的有关知识 振荡周期 xff1a 为单片机提供定时信号的振荡源的周期状态周期 xff1a 1 个状态周期 61 2 个振荡周期机器周期 xff1a 1 个机器周期 61 6 个状
  • 红外遥控实验

    红外线简介 人眼所能看到的可见光 xff0c 按波长从长到短排列 xff0c 依次为红 xff08 660nm xff09 橙 xff08 610nm xff09 黄 xff08 585nm xff09 绿 xff08 555nm xff0
  • Jmeter性能测试(25)--linux环境运行jmeter并生成报告

    jmeter是一个java开发的利用多线程原理来模拟并发进行性能测试的工具 xff0c 一般来说 xff0c GUI模式只用于创建脚本以及用来debug xff0c 执行测试时建议使用非GUI模式运行 这篇博客 xff0c 介绍下在linu
  • 题目:输入三个整数x,y,z,把这三个数由小到大输出

    程序分析 xff1a 方式一 xff1a 先将两个数比较 xff0c 再将较大值与第三个数比较 xff0c 得到最大值 然后比较剩余的两个值 最后 xff0c 将数值以X lt Y lt Z的顺序输出 方式二 xff1a 将三个数分别两两进
  • 对话框QDialog

    对话框是 GUI 程序中不可或缺的组成部分 很多不能或者不适合放入主窗口的功能组件都必须放在对话框中设置 对话框通常会是一个顶层窗口 xff0c 出现在程序最上层 xff0c 用于实现短期任务或者简洁的用户交互 Qt 中使用QDialog类
  • 布局管理器~登录界面的搭建实例

    所谓的图形用户界面 xff08 GUI xff09 xff0c 本质上就是一堆组件的叠加 创建一个窗口 xff0c 把按钮放上面 xff0c 把图标放上面 xff0c 这样就成了一个界面 因此 xff0c 组件位置的放置尤其重要 xff0c
  • 常用控件及自定义控件

    QLabel QLabel可以用来显示文本 xff0c 图片和动画等 显示文本 xff08 普通文本 HTML xff09 通过QLabel类的setText函数设置显示的内容 void setText const QString amp
  • Dev-c++ 5.11版本调试方法(七小时折磨调试成功,超详细版)

    一 出现的问题是 1 设置断点之后点调试不出现蓝行 2 点了调试之后出现黑框 然后又闪退 3 添加查看之后也看不了变量的值 等等各种问题 xff08 查找 一个个试验 xff0c 还有整理 xff0c 花了起码六七小时 xff0c 几乎一天
  • Pycharm调试Debug篇(详细)

    pycharm中的debug模式 首先 xff0c 还是用示例说话 xff0c 我们书写一段简短的代码 xff0c 来帮我们完成今天要讲的内容 def sum demo x y for in range 2 x 43 61 1 y 43 6
  • Qt --- 信号与槽

    信号与槽概述 信号与槽是 Qt 框架引以为豪的机制之一 所谓信号与槽 xff0c 实际就是观察者模式 发布 订阅模式 当某个事件发生之后 xff0c 比如 xff0c 按钮检测到自己被点击了一下 xff0c 它就会发出一个信号 xff08
  • 不可不知道的串口常识

    串口 xff1a 串口是一个泛称 xff0c UART xff0c TTL xff0c RS232 xff0c RS485都遵循类似的通信时序协议 xff0c 因此都被通称为串口 串口 UART口 COM xff08 cluster com
  • 【Linux】磁盘分区和挂载

    目录 Linux磁盘分区和挂载 linux分区 查看所有设备挂载情况 挂载案例 步骤1 xff1a 新建一块硬盘 操作步骤2 xff1a 虚拟机硬盘分区 步骤3 xff1a 虚拟机硬盘分区格式化 步骤4 xff1a 将磁盘挂载到根目录下ne
  • RealSense D435i + imu 标定 Ros Melodic

    准备工作 ubuntu ros melodic环境 librealsense realsense ros 一 修改rs camera launch文件中的参数 修改之前装好的realsense环境中的 src realsense ros r
  • Jmeter性能测试(26)---生成HTML性能测试报告

    性能测试工具Jmeter由于其体积小 使用方便 学习成本低等原因 xff0c 在现在的性能测试过程中 xff0c 使用率越来越高 xff0c 但其本身也有一定的缺点 xff0c 比如提供的测试结果可视化做的很一般 不过从3 0版本开始 xf
  • 【mcuclub】时钟模块DS1302

    一 实物图 二 原理图 编号名称功能1VCC2双供电配置中的主电源供应引脚 DS1302工作于 VCC1和VCC2中较大者 当VCC2比VCC1高0 2V 时 xff0c VCC2 给 DS1302供电 当VCC1比VCC2高时 VCC1给
  • 【mcuclub】定时器/计数器

    一 简介 定时器实际上就是Soc当中的一个内部外设 定时器常与计数器扯到一起 xff0c 计数器也是Soc当中的一个内部外设 xff0c 计数器顾名思义是用来计数的 xff0c 就和我们的秒表一样 xff0c 秒表实际上就是一个计数器 xf