【单片机基础】定时器/计数器的工作原理

单片机中的定时器/计数器(Timer/Counter)是用于时间测量和事件计数的重要模块。它们可以用来生成精确的延时、测量外部信号的频率或周期、捕获外部事件的时间戳等。理解定时器/计数器的工作原理对于单片机编程和系统设计非常重要。以下是定时器/计数器的基本工作原理和常见功能的详细介绍:

1. 定时器/计数器的基本概念

1.1 定时器(Timer)
  • 功能:用于生成精确的时间延迟。
  • 工作原理:定时器通过内部时钟源(通常是单片机的系统时钟)进行递增计数,达到设定值后产生中断或触发特定事件。
1.2 计数器(Counter)
  • 功能:用于对外部事件进行计数。
  • 工作原理:计数器通过外部输入信号进行递增计数,达到设定值后产生中断或触发特定事件。

2. 定时器/计数器的结构

2.1 计数寄存器(Counter Register)
  • 功能:存储当前的计数值。
  • 位宽:常见的位宽有8位、16位和32位。
2.2 预分频器(Prescaler)
  • 功能:对输入时钟进行分频,降低计数频率。
  • 作用:增加定时器/计数器的范围和分辨率。
2.3 模寄存器(Mode Register)
  • 功能:设置定时器/计数器的工作模式。
  • 常见模式
    • 定时器模式:内部时钟源计数。
    • 计数器模式:外部时钟源计数。
    • 自动重装载模式:计数器达到设定值后自动重新加载初始值。
    • 捕捉模式:捕获外部事件的时间戳。
    • 比较模式:比较计数值和预设值,匹配时产生中断。
2.4 控制寄存器(Control Register)
  • 功能:控制定时器/计数器的启停、中断使能等。
  • 位设置
    • 启动位:控制定时器/计数器的启停。
    • 中断使能位:控制是否产生中断。
    • 工作模式位:设置定时器/计数器的工作模式。

3. 定时器/计数器的工作原理

3.1 定时器模式
  • 工作过程
    1. 初始化:设置定时器的工作模式、初始值和中断使能。
    2. 启动:通过控制寄存器启动定时器。
    3. 计数:定时器根据内部时钟源递增计数。
    4. 比较:当计数值达到设定值时,产生中断或触发特定事件。
    5. 重载:如果是自动重装载模式,计数器自动重新加载初始值,继续计数。
3.2 计数器模式
  • 工作过程
    1. 初始化:设置计数器的工作模式、初始值和中断使能。
    2. 启动:通过控制寄存器启动计数器。
    3. 计数:计数器根据外部输入信号递增计数。
    4. 比较:当计数值达到设定值时,产生中断或触发特定事件。
    5. 重载:如果是自动重装载模式,计数器自动重新加载初始值,继续计数。

4. 定时器/计数器的配置

4.1 设置工作模式
  • 示例代码(C语言,假设使用8051单片机)
    // 设置定时器0为模式1(16位定时器)
    TMOD = 0x01;  // 设置定时器0的工作模式
    TH0 = 0xFC;   // 设置高8位初始值
    TL0 = 0x18;   // 设置低8位初始值
    TR0 = 1;      // 启动定时器0
    ET0 = 1;      // 使能定时器0中断
    EA = 1;       // 使能全局中断
4.2 设置预分频器
  • 示例代码(C语言,假设使用STM32单片机)
    // 设置定时器2的预分频器
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_TimeBaseStructure.TIM_Period = 9999;   // 自动重装载值
    TIM_TimeBaseStructure.TIM_Prescaler = 7199; // 预分频器值
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
    TIM_Cmd(TIM2, ENABLE); // 启动定时器2
4.3 中断处理
  • 示例代码(C语言,假设使用8051单片机)
    void Timer0_ISR() interrupt 1 {// 清除定时器0中断标志TF0 = 0;// 执行中断服务程序// ...
    }void main() {// 初始化定时器0TMOD = 0x01;  // 设置定时器0为模式1TH0 = 0xFC;   // 设置高8位初始值TL0 = 0x18;   // 设置低8位初始值TR0 = 1;      // 启动定时器0ET0 = 1;      // 使能定时器0中断EA = 1;       // 使能全局中断while (1) {// 主程序循环}
    }

5. 实际应用示例

5.1 定时器生成延时
  • 示例代码(C语言,假设使用8051单片机)
    #include <8051.h>void Timer0_ISR() interrupt 1 {static unsigned int count = 0;TF0 = 0;  // 清除定时器0中断标志count++;if (count >= 1000) {  // 延时1秒count = 0;// 执行延时后的操作}
    }void main() {TMOD = 0x01;  // 设置定时器0为模式1TH0 = 0xFC;   // 设置高8位初始值TL0 = 0x18;   // 设置低8位初始值TR0 = 1;      // 启动定时器0ET0 = 1;      // 使能定时器0中断EA = 1;       // 使能全局中断while (1) {// 主程序循环}
    }
5.2 计数器测量外部信号频率
  • 示例代码(C语言,假设使用STM32单片机)
    #include "stm32f10x.h"void TIM2_Config(void) {TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;// 使能TIM2和GPIOA的时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// 配置PA0为输入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  // 上拉输入GPIO_Init(GPIOA, &GPIO_InitStructure);// 配置TIM2TIM_TimeBaseStructure.TIM_Period = 65535;  // 自动重装载值TIM_TimeBaseStructure.TIM_Prescaler = 7199; // 预分频器值TIM_TimeBaseStructure.TIM_ClockDivision = 0;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);// 配置TIM2的输入捕获通道TIM_ICInitTypeDef TIM_ICInitStructure;TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;TIM_ICInitStructure.TIM_ICFilter = 0x00;TIM_ICInit(TIM2, &TIM_ICInitStructure);// 使能TIM2的中断TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);// 配置NVICNVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);// 启动TIM2TIM_Cmd(TIM2, ENABLE);
    }void TIM2_IRQHandler(void) {if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) {// 清除中断标志TIM_ClearITPendingBit(TIM2, TIM_IT_Update);// 执行中断服务程序// ...}
    }int main(void) {TIM2_Config();while (1) {// 主程序循环}
    }

总结

定时器/计数器是单片机中非常重要的模块,通过合理配置和使用,可以实现多种时间测量和事件计数功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/61493.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在自动驾驶进行大数据量因果推理实验时,如何减少无用功,提高实验效率?

在对实验结果做反事实推理时&#xff0c;通常需要对数据进行多次循环&#xff0c;然后对多次循环的结果进行处理&#xff0c;如果只在最后结果结束时&#xff0c;再进行处理&#xff0c;可能会由于反事实过程中某个参数设置错误&#xff0c;导致整个反事实实验出现错误&#xf…

浅谈软件开发中的yield关键字:从餐厅服务理解异步编程之美

在现代软件开发中&#xff0c;处理大量数据流时经常会遇到性能和内存消耗的问题。传统的编程方式往往是一次性获取所有数据&#xff0c;这就像餐厅厨师要把所有菜品做完才上菜一样&#xff0c;既不高效也不够灵活。而yield关键字的出现&#xff0c;为我们提供了一种优雅的解决方…

绕过CDN寻找真实IP

在新型涉网案件中&#xff0c;我们在搜集到目标主站之后常常需要获取对方网站的真实IP去进一步的信息搜集&#xff0c;但是现在网站大多都部署了CDN&#xff0c;将资源部署分发到边缘服务器&#xff0c;实现均衡负载&#xff0c;降低网络堵塞&#xff0c;让用户能够更快地访问自…

前后端请求响应

引入 在之前的例子中&#xff0c;我们编写了一个简单的web类&#xff0c;我们运行启动类&#xff0c;启动内嵌的tomcat后就可以在浏览器通过特定的路径访问tomcat中的应用程序。 但之前编写的程序仅仅是个简单的java类&#xff0c;其并未实现某个接口或继承某个类&…

深度学习:神经网络中的损失函数的使用

深度学习&#xff1a;神经网络中的损失函数的使用 损失函数是监督学习中的关键组成部分&#xff0c;用于衡量模型预测值与真实值之间的差异。优化算法&#xff08;如梯度下降&#xff09;通过最小化损失函数来调整模型参数&#xff0c;以提高模型的预测精度。以下是几种常用的…

ThreeJS入门(142):THREE.WebGLRenderTarget 知识详解,示例代码

作者&#xff1a; 还是大剑师兰特 &#xff0c;曾为美国某知名大学计算机专业研究生&#xff0c;现为国内GIS领域高级前端工程师&#xff0c;CSDN知名博主&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;webgl&#xff0c;ThreeJS&#xff0c;canvas&#xf…

GitLab 部署和配置指南

GitLab 部署和配置指南 1. GitLab 容器配置概述 在部署 GitLab 时&#xff0c;可能涉及以下几部分内容&#xff1a; 内置 Nginx 的配置和调整。HTTPS 证书的申请、使用和续期。通过 FRP 映射内网服务到外部服务器。阿里云服务器的 Nginx 配置和反向代理。 本文将完整涵盖这…

Streamlit + AI大模型API实现视频字幕提取

简介 在本文中&#xff0c;我将带你探讨如何使用Streamlit和AI大模型API来实现视频字幕提取的技术。Streamlit是一个开源的Python库&#xff0c;用于快速构建数据应用的Web界面&#xff0c;而AI大模型API&#xff0c;如OpenAI&#xff0c;提供了强大的语言处理能力&#xff0c…

SpringBoot - spring.profiles.active最佳实践

文章目录 Pre概述为什么需要多环境配置多环境配置实现步骤1. 配置文件准备2. 激活特定环境方法1&#xff1a;命令行参数方法2&#xff1a;环境变量方法3&#xff1a;IDE 配置方法4&#xff1a;全局配置文件默认设置 3. 配置文件加载顺序配置生效的原理 4. 常见问题多个配置文件…

深入理解 Vue 3 中的 emit

深入理解 Vue 3 中的 emit 在 Vue 3 中&#xff0c;组件通信是开发中非常重要的一部分&#xff0c;其中通过 emit 实现父子组件通信是最常见的方式之一。emit 的作用是&#xff1a;子组件可以通过触发自定义事件将数据传递给父组件。 在本篇文章中&#xff0c;我们将从以下几…

C++结构型设计模式之适配器模式概述

适配器模式的意图和动机 意图&#xff1a;适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;其意图是将一个类的接口转换成客户端所期望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的类可以协同工作。 动机&#xff1a…

网安瞭望台第2期:零日漏洞密集爆发、2024年常见网络安全漏洞类型及分析

国内外要闻 Ubuntu 服务器 Needrestart 软件包惊现严重安全漏洞 近日&#xff0c;Ubuntu 服务器&#xff08;自 21.04 版本起默认安装&#xff09;的 Needrestart 软件包被曝存在多个可追溯至数十年前的安全漏洞。这些漏洞允许本地攻击者在无需用户交互的情况下获取根…

【Linux】apt 关闭 ssl 认证

【注意】apt 关闭 ssl 认证可能会引起软件安装风险&#xff0c;请尽量避免关闭。 执行以下命令可以实现全局关闭 sll 验证。 echo Acquire::https::Verify-Peer "false"; >> /etc/apt/apt.conf.d/99disable-signature-verificationecho Acquire::https::Verif…

Java前端基础——CSS

一、CSS介绍 1.1 什么是CSS CSS(Cascading Style Sheet)&#xff0c;层叠样式表,用于控制页面的样式. CSS 能够对网页中元素位置的排版进行像素级精确控制, 实现美化页面的效果. 能够做到页面的样式和结构分离. 1.2 基本语法规范 选择器 {⼀条/N条声明} • 选择器决定针…

浅议Flink中的通讯工具: Akka

在Flink中&#xff0c;各个组件之间需要频繁交换数据和控制信息。Flink选择了基于Actor模型的Akka框架作为通信基础。 Akka是什么 Actor模型 Actor模型是用于单个进程中并发的场景。 在Actor模型中&#xff1a; ActorSystem负责管理actor生命周期 将每个实体视为独立的 Ac…

Java-05 深入浅出 MyBatis - 配置深入 动态 SQL 参数、循环、片段

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 大数据篇正在更新&#xff01;https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了&#xff1a; MyBatis&#xff…

Vue.js 自定义指令:从零开始创建自己的指令

vue使用directive 前言vue2使用vue3使用 前言 关于使用自定义指令在官网中是这样描述的 vue2:对普通 DOM 元素进行底层操作&#xff0c;这时候就会用到自定义指令。 vue3:自定义指令主要是为了重用涉及普通元素的底层 DOM 访问的逻辑。 在 Vue.js 中使用自定义指令&#xf…

uni-app快速入门(十一)--常用JS API(上)

在前面学习了uni-app的布局、组件、路由等知识点以后&#xff0c;还要掌握uni-app的JS API ,也可以理解为基于uni-app的java script。本节介绍uni-app的request请求、文件上传、数据缓存、获取位置、获取系统信息、获取手机的网络状态、拨打电话API。 一、request请求 使用uni…

Ubuntu24.04解决向日葵安装libgconf-2-4依赖问题

最近在加装的ssd上加装了个Ubuntu&#xff0c;当然要装最新的长期支持稳定版啦&#xff0c;24.04.1&#xff0c;却发现常用的向日葵不好安装成功&#xff0c;即使是官方的说明&#xff0c;应该是用这个版本系统的人还不多。 找到了一个帅哥的解决方案&#xff0c;是可行的 但是…

工厂模式-工厂方法模式实现

具体的产品有具体的工厂类生产,这样当新增商品时,不需要修改原来的工厂类 主要有4个角色 抽象工厂 具体工厂 抽象产品 具体产品 1. 定义抽象产品,本文以生产手机为例 /*** @desc 抽象产品**/ public interface Phone { } 2. 定义具体产品-Apple /*** @desc 具体产品…