当前位置: 首页 > news >正文

51单片机基础05 定时器

目录

一、为什么要定时器

二、定时器中断

1、定时器中断参数

2、定时器中断程序

3、定时器计数


一、为什么要定时器

        前文提到,比如进行流水灯等操作,都是直接写了delay_ms这类操作。

        但是在51单片机中,其一般就是靠双for进行的循环时延,单片机会浪费这部分时间而不能做其他的事

        其次如果程序很多的情况下,就得根据其他代码执行的时间来调整时延,这非常麻烦。

        那有没有既可以定时、又不影响其他程序的进行呢?        

        比如,通过两个按键控制,按下按键后两个LED延时1s切换状态,如果通过以下代码进行,那么在延时的时候,按键按下另一个KEY就会完全没有反应。

if(KEY0==0)
{delay_ms(10);if(KEY0==0){delay_ms(1000);LED0=~LED0;}
}
if(KEY1==0)
{delay_ms(10);if(KEY1==0){delay_ms(1000);LED1=~LED1;}
}

二、定时器中断

1、定时器中断参数

中断编号中断名中断源
1定时器0溢出中断TF0
3定时器1溢出中断TF1

        可以看到定时器0和定时器1的中断编号分别为1、3,因此T1的中断优先级没有T0高。

中断寄存器功能实现
ET0定时器/计数器T0的溢出中断允许控制位

1:允许T0中断

0:禁止T0中断

ET1定时器/计数器T1的溢出中断允许控制位

1:允许T1中断

0:禁止T1中断

        该寄存器控制了是否允许中断。

中断触发控制位功能实现
TF0定时/计数器T0溢出中断请求标志位

1:进入T0中断

0:未进入T0中断

TF1定时/计数器T1溢出中断请求标志位

1:进入T1中断

0:未进入T1中断

        该寄存器在计数溢出后自动置位为1并进入中断服务函数,需要用户手动清零。

定时器开关控制功能实现
TR0打开或关闭定时器T0

1:打开

0:关闭

TR1打开或关闭定时器T1

1:打开

0:关闭

        配套初始化。

        如下为TMOD的控制,其中D0~D3为定时器0配置,D4~D7为定时器1配置。

D3D2D1D0
GATEC/TM1M0

0:仅要求TR0=1开启定时器

1:同时要求T0引脚为高电平才可以开启定时器

0:定时

1:计数

00:13位计数器8192

01:16位计数器65536

10:8位计数器256,可自动重新装载

11:两组独立8位计时器256,不可同时用

TMOD寄存器,必须直接对整个地址操作,而不像TCON,其可以单位操作。

        定时时间TH0、TL0控制,以定时器01模式为例

        TH0=(65536-XX)/256

        TL0=(65536-XX)%256

        其中XX表示多少us,例如XX=50000,就是50ms,由此可以看出,单次定时时间最大为65536ms,最小为1us。

2、定时器中断程序

举例,还以上面按键控制LED闪烁为例

unsigned int count0=0;
unsigned int count1=0;
char flag0 = 0;
char flag1 = 0;
void main()
{EA=1;            //开启总中断TMOD =0x01;TH0=(65536-50000)/256;    //50msTL0=(65536-50000)%256;TR0=1;         //打开定时器T0ET0=1;         //允许中断while(1){if(key0==0){delay_ms(10)if(key0==0) flag0=1;}if(key1==0){delay_ms(10)if(key1==0) flag1=1;}}
}
void time0() interrupt 1
{TF0=0;          //清除触发位,实现再次计数TH0=(65536-50000)/256;    //50ms 装初值TL0=(65536-50000)%256;if(flag0==1)count0+=1;if(count0>=20){led0=~led0;count0=0;}if(flag1==1)count1+=1;if(count1>=20){led1=~led1;count1=0;}}

        可以看到定时器50ms的中断,判断到按键按下后,在中断额外进行计数,达到20,说明达到了1秒,从而进行LED反转,不影响main内的有关代码执行。

3、定时器计数

前文提到,T0引脚是定时器的引脚,但是前面的定时代码怎么都和T0无关呢。

        当51单片机的定时器工作在计数模式时,它会通过外部引脚(如T0或T1引脚)接收外部输入的脉冲信号。这时,I/O口就有直接关系了。外部设备产生的脉冲通过这些引脚输入到单片机,定时器/计数器累加这些脉冲来实现计数功能。举例来说,假如你需要用定时器0来测量输入信号的频率,你可以将信号输入到T0引脚,然后配置定时器0为计数模式,它会根据输入脉冲增加计数值。

        计数模式C/T=1,16位M1M0=01,即TMOD=0101=0X05;

#include <reg51.h>// 定义定时器的控制位
sbit T0_PIN = P3^4; // T0口作为输入信号(定时器0外部输入)// 定义全局变量
unsigned int count = 0; // 计数器计数值
unsigned long frequency = 0; // 测得的频率值void Timer1_Init(void) {TMOD |= 0x10; // 设置定时器1为模式1(16位定时模式)TH1 = 0x3C; // 高字节初值(1秒定时器)TL1 = 0xB0; // 低字节初值ET1 = 1;   // 使能定时器1中断EA = 1;    // 总中断使能TR1 = 1;   // 启动定时器1
}void Timer0_Init(void) {TMOD |= 0x05; // 设置定时器0为模式5(16位计数模式)TR0 = 1;      // 启动计数器0
}void Timer1_ISR(void) interrupt 3 {TR1 = 0; // 关闭定时器1// 计算频率count = (TH0 << 8) | TL0; // 读取定时器0的计数值TH0 = 0; // 清零高字节TL0 = 0; // 清零低字节frequency = count;count = 0; // 计数值清零// 重装载定时器1初值TH1 = 0x3C;TL1 = 0xB0;TR1 = 1; // 重启定时器1
}void main(void) {Timer0_Init(); // 初始化定时器0(计数器模式)Timer1_Init(); // 初始化定时器1(定时器模式)while (1) {// 这里可以添加代码来显示频率值frequency,如通过串口输出}
}

        注意:中断服务函数理应不要放太多的代码,尤其是延时是要完全避免的,否则会影响相关的精度。

相关文章:

51单片机基础05 定时器

目录 一、为什么要定时器 二、定时器中断 1、定时器中断参数 2、定时器中断程序 3、定时器计数 一、为什么要定时器 前文提到&#xff0c;比如进行流水灯等操作&#xff0c;都是直接写了delay_ms这类操作。 但是在51单片机中&#xff0c;其一般就是靠双for进行的循环时延&…...

tdengine学习笔记实战-jdbc连接tdengine数据库

先上代码&#xff0c;里面有两种获取连接的方式&#xff0c;一个单例&#xff0c;一个连接池 package com.tdengine.utils;import com.alibaba.druid.pool.DruidDataSource;import java.sql.*; import java.util.Properties;public class TDConnectUtils {// 单例对象private …...

vue3项目执行npm install下载依赖报错问题排查方法

1、检查当前node与npm的版本 nodejs 和 npm 的版本是有适配的&#xff0c;具体可以看官网&#xff1a;nodejs 和 npm 的版本是有适配的 若是版本不兼容&#xff0c;修改node或者npm的版本即可&#xff0c;建议使用nvm版本管理工具&#xff0c;切换方便&#xff1b; 2、清除缓…...

【vue】项目迭代部署后 自动清除浏览器缓存

前言&#xff1a; vue项目打包部署上线后&#xff0c;因浏览器缓存问题&#xff0c;导致用户访问的依旧是上个迭代批次的旧资源&#xff0c;需要用户手动清除缓存才能更新至最新版本&#xff0c;影响用户体验。 解决方法&#xff1a; html根文件添加以下标签 <meta http-eq…...

Leetcode(滑动窗口习题思路总结,持续更新。。。)

讲解题目&#xff1a;长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target &#xff0c;找出该数组中满足其和 ≥ target 的长度最小的连续子数组。如果不存在符合条件的连续子数组&#xff0c;返回 0。示例: 输入: target 7, nums [2,3,1,2,4,3] 输出: 2 解…...

【UNIAPP】uniapp版图片压缩工具

二次封装的uniapp版本图片压缩、上传工具&#xff0c;支持全端&#xff08;H5、小程序、APP&#xff09; 新建文件&#xff1a;file-util.js class FileUtil {/*** [文件上传]* param {[object]} fileObj [图片地址]* param {[object]} formData [参数]* param {[str…...

PaddlePaddle 开源产业级文档印章识别PaddleX-Pipeline “seal_recognition”模型 开箱即用篇(一)

AI时代到来&#xff0c;各行各业都在追求细分领域垂直类深度学习模型&#xff0c;今天给大家介绍一个PaddlePaddle旗下&#xff0c;基于PaddleX Pipeline 来完成印章识别的模型“seal_recognition”。 官方地址&#xff1a;https://github.com/PaddlePaddle/PaddleX/blob/relea…...

Vue3 + Vite 项目引入 Typescript

文章目录 一、TypeScript简介二、TypeScript 开发环境搭建三、编译方式1. 自动编译单个文件2. 自动编译整个项目 四、配置文件1. compilerOptions基本选项严格模式相关选项&#xff08;启用 strict 后自动包含这些&#xff09;模块与导入相关选项 2. include 和 excludeinclude…...

微信小程序实战篇-分类页面制作

一、项目背景与目标 在微信小程序开发中&#xff0c;分类页面是一个常见且重要的功能模块。它能够帮助用户快速定位和浏览不同类别的商品或信息&#xff0c;提升用户体验和操作效率。今天&#xff0c;我们将深入探讨如何制作一个实用的微信小程序分类页面&#xff0c;先来看一下…...

第三十七章 如何清理docker 日志

如何清理docker 日志 目标 掌握docker 日志设置掌握docker日志的清理办法背景 在现代软件开发和部署环境中,Docker 容器技术因其轻量级、可移植性和高效资源利用的特点,已成为许多企业和开发团队的首选。Docker 容器在运行过程中会产生大量的日志信息,这些日志对于监控容器…...

二刷代码随想录第七天

454. 四数相加 II 先用map记录前两个数的和num1 num2的值出现了多少次再在后两个数组里找0 - (num1 num2),找到后就累加map中的次数 class Solution { public:int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3…...

1.tree of thought (使用LangChain解决4x4数独问题)

本教程将介绍如何使用LangChain库和chatglm API来解决一个4x4的数独问题。我们将通过以下步骤实现这一目标&#xff1a; 初始化chatglm 的聊天模型。定义数独问题和解决方案。创建一个自定义的检查器来验证每一步的思考。使用ToTChain来运行整个思考过程。 1. 初始化chatglm4…...

网络基础(4)IP协议

经过之前的学习对传输协议的学习&#xff0c;对于传输协议从系统底层到应用层对于socket套接字的学习已经有了一套完整的理论。 对于网络的层状结构&#xff0c;现在已经学习到了应用层和传输层: 在之前的学习中&#xff0c;通信的双方都只考虑了双方的传输层的东西&#xff0…...

124. 二叉树中的最大路径和【 力扣(LeetCode) 】

文章目录 零、原题链接一、题目描述二、测试用例三、解题思路四、参考代码 零、原题链接 124. 二叉树中的最大路径和 一、题目描述 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径…...

echarts:简单实现默认显示两柱子折线,点击按钮后显示新的柱子

问&#xff1a; 用echarts实现&#xff1a;默认显示两柱子折线&#xff0c;点击“税率”按钮&#xff0c;显示税率柱子&#xff0c;之前的两柱子折线消失 回答&#xff1a; <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8…...

视频里的音频怎么提取出来成单独文件?音频提取照着这些方法做

在数字时代&#xff0c;视频与音频的分离与重组已成为日常需求之一。无论是出于制作背景音乐、保存讲座内容&#xff0c;还是编辑播客素材&#xff0c;提取视频中的音频并将其保存为单独文件都显得尤为重要。视频里的音频怎么提取出来成单独文件&#xff1f;本文将详细介绍几种…...

Excel——宏教程(精简版)

一、宏的简介 1、什么是宏&#xff1f; Excel宏是一种自动化工具&#xff0c;它允许用户录制一系列操作并将其转换为VBA(Visual Basic for Applications)代码。这样&#xff0c;用户可以在需要时执行这些操作&#xff0c;以自动化Excel任务。 2、宏的优点 我们可以利用宏来…...

C++中的std::tuple和std::pair

在C标准库中&#xff0c;std::tuple和std::pair是两种极具实用性的数据结构&#xff0c;它们都具备存储多个元素的功能&#xff0c;但各自有其独特的适用环境和特性。本文旨在深入探讨这两者之间的区别&#xff0c;并阐述在不同应用场景下应如何合理选择使用。 一、基本概念 s…...

引力搜索算法

引力搜索算法过程&#xff0c;包括了初始化、适应度评估、质量计算、加速度计算、更新速度和位置的一些步骤。 import numpy as np import random as rd from math import exp, sqrt import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from matplotli…...

【时间之外】IT人求职和创业应知【35】-RTE三进宫

目录 新闻一&#xff1a;京东工业发布11.11战报&#xff0c;多项倍增数据体现工业经济信心提升 新闻二&#xff1a;阿里云100万核算力支撑天猫双11&#xff0c;弹性计算规模刷新纪录 新闻三&#xff1a;声网CEO赵斌&#xff1a;RTE将成为生成式AI时代AI Infra的关键部分 认知…...

Linux的目录结构

/ ├── bin # Binary - 存放用户可以直接使用的基本二进制可执行文件 ├── sbin # System Binaries - 存放系统管理员专用的二进制可执行文件 ├── usr # Unix System Resources - 存放用户使用的软件和库文件 │ ├── bin # Binary - 用户级应用程序…...

python: generator IDAL and DAL using sql server 2019

其它数据库也是一样的思维方式 create IDAL # encoding: utf-8 # 版权所有 2024 ©涂聚文有限公司 # 许可信息查看&#xff1a;言語成了邀功盡責的功臣&#xff0c;還需要行爲每日來值班嗎 # 描述&#xff1a; # Author : geovindu,Geovin Du 涂聚文. # IDE : P…...

命令执行简单

前言&#xff1a;小迪安全2022第一节反弹shell&#xff0c;小迪用的是两台都是云服务器&#xff0c;没有服务器可以在自己的主机上搭建也是可以的&#xff0c;主机上搭两个网站 思路&#xff1a;生成一个木马文件&#xff0c;下载到本机&#xff0c;然后利用本机上传到目标主机…...

【一句话经验】亚马逊云EC2 ubuntu24.04.1开启ROOT登录Permission denied (publickey)

按照常规的方法SSH登录会一直报错&#xff1a; Permission denied (publickey) 因为亚马逊云的默认配置不是在/etc/ssh/sshd_config&#xff0c;而是在引入的文件里了&#xff0c;所以在instance控制台输入这行命令来解除登录限制&#xff1a; sudo sed -i s/^PasswordAuthe…...

百度智能云千帆大模型平台引领企业创新增长

本文整理自百度世界大会 2024——「智能跃迁 产业加速」论坛的同名演讲。 更多大会演讲内容&#xff0c;请访问&#xff1a; https://baiduworld.baidu.com 首先&#xff0c;跟大家分享一张图&#xff0c;这个是我们目前大模型应用落地的场景分布。可以看到&#xff0c;大模型…...

【Linux】深入理解GCC/G++编译流程及库文件管理

目录 1.背景知识 2.gcc/g如何完成编译 (1) 预处理&#xff08;进行宏替换&#xff09; (2) 编译&#xff08;生成汇编&#xff09; (3) 汇编&#xff08;生成机器可识别代码&#xff09; (4) 链接&#xff08;生成可执行文件或库文件&#xff09; (5) 总结 (6) 函数库 …...

【Unity基础】对比Unity中两种粒子系统

在Unity中&#xff0c;Particle System和Visual Effect Graph (VFX) 都是用于创建粒子效果的工具&#xff0c;但它们的设计目标、使用场景和功能特点有所不同。以下是详细对比&#xff1a; 1. Particle System 特点 传统粒子系统&#xff0c;Unity自带的模块化粒子特效工具。…...

琐碎笔记——pytest实现前置、后置、参数化、跳过用例执行以及重试

pytest的fixture中文介绍可参考&#xff08;不过文档稍微有点老&#xff09;&#xff1a; https://www.osgeo.cn/pytest/fixture.html#what-fixtures-are pytest各个作用域的fixture scope “function” 可作用于每个用例 fixture使用的声明放在类定义前面&#xff0c;类中的…...

C# 深层副本与浅层副本 深拷贝与浅拷贝

C# 深层副本与浅层副本 数据复制是编程中的重要任务。 对象是 OOP 中的复合数据类型。 对象中的成员字段可以按值或按引用存储。 可以以两种方式执行复制。 浅表副本将所有值和引用复制到新实例中。 引用所指向的数据不会被复制&#xff1b; 仅指针被复制。 新的引用指向原始…...

CH06_Lambda表达式

第6章&#xff1a;Lambda表达式 本章目标 为什么要学习C#编程语言 了解C#相关常识 C#开发工具Visual Studio安装 掌握C#程序的开发步骤 掌握C#的注释 掌握C#的常用转义符 本章内容 lambda表达式演变史 C# 匿名函数的演变历史可以追溯到 C# 语言的不同版本&#xff0c;…...

四川 法治政府建设 网站/长沙网络推广小公司

北上广深等一线城市的人口日益增多&#xff0c;职场白领群体增加&#xff0c;而办公软件的使用&#xff0c;更是帮助白领们提高效率、企业节省运营成本的有效方式&#xff0c;而对于个人邮箱品牌的选择上&#xff0c;更是有种选优&#xff0c;TOM VIP邮箱凭借独特的优势&#x…...

推广网站的公司/缅甸最新新闻

应该是非常简单的动态规划了&#xff0c;要随时的记录每个点的状态&#xff0c;这样递归的时候直接用就可以了&#xff0c;不需要再次寻找&#xff0c;大大减少时耗。 重点是状态转移方程 dp[x][y]max(dp[x-1][y], dp[x1][y], dp[x][y-1], dp[x][y1])1 当前的最长长度&#xff…...

石家庄网站建设机构/好用的磁力搜索引擎

四大函数类型一. 局部和全局变量二. 引用三. 匿名函数四. 递归前言作者&#xff1a;神的孩子都在跳舞 关注我的csdn博客&#xff0c;更多python知识还在更新 一. 局部和全局变量 局部变量 &#xff08;1&#xff09;含义&#xff1a;就是在函数内部定义的变量&#xff08;作用…...

ui设计的网站/企业seo如何优化

下载源码和示例1 原理&#xff1a;启动一个线程来刷时间&#xff0c;缺点是不太精确&#xff0c;可能跟线程的优先级有关系。会有0-10ms的误差。精确到0.1s是没有问题的。packagetimer;publicclassTimer ...{ private long interval; // private boolean enabled; pri…...

重庆seo整站优化系统/企业推广策划书

什么是联合索引?联合索引又叫复合索引。对于复合索引:Mysql从左到右的使用索引中的字段&#xff0c;一个查询可以只使用索引中的一部份&#xff0c;但只能是最左侧部分。例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找&#xff0c;但不支持 b,c进行查找…...

网站关键词推广企业/营销策划的六个步骤

什么是进程进程(Process)是计算机中的程序关于某数据集合上的一次运行活动&#xff0c;是系统进行资源分配和调度的基本单位&#xff0c;是操作系统结构的基础。进程的特征:动态性&#xff1a;进程的实质是程序在多道程序系统中的一次执行过程&#xff0c;进程是动态产生&#…...