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

【51单片机】9-定时器和计数器

1.定时器的介绍

1.什么是定时器

(1)SoC的一种内部的外设【在单片机里面,但是在CPU外面】

(2)定时器就是CPU的”闹钟“

2.什么是计数器

(1)定时器就是用计数的原始实现的

(2)计数器可以计算外部脉冲个数

3.定时器如何工作

(1)第一步:先设置好定时器的时钟源(如果需要的话)---51单片机是不需要设置的

(2)第二步:初始化时钟相关寄存器

(3)第三步:设置定时时间(取决于脉冲计数个数+脉冲的时间)
(4)第四步:设置中断处理程序

(5)第五步:打开定时器

(6)运行时:定时器计数到后产生中断,如何执行中断isr【中断处理程序】

2.软件控制硬件的关键--寄存器

1.什么是寄存器

(1)register

(2)寄存器,寄存,内容可变,一般按位定义

(3)寄存器使用地址访问,编程上像内存一样

2.寄存器的工作原理

(1)寄存器和硬件之间有双向影响

(2)软件可以读写寄存器

(3)总结:寄存器是软件能够控制硬件的关键

3.各种寄存器

(1)单片机的学习主要包括CPU和各种内部外设

(2)各种内部外设的编程接口就是寄存器

(3)熟悉一款单片机其实就是熟悉他的寄存器

(4)寄存器会随着单片机的复杂化而变复杂

(5)学会用C语言操作寄存器的技巧

3.定时器简介

参考数据手册

通用寄存器:可以存放任何数据

特殊功能寄存器:专用寄存器【每一位存放什么已经定义好了】

16位定时器/计数器:可以存储2的16次方位二进制

定时器/计数器的核心部件是一个加法(或者减法)计数器,其本质是对脉冲进行计数。

比如外部12MHz晶振,单片机工作在12T模式下,则内部时钟频率是1MHz,则时钟脉冲宽度为1us(1.1MHz=1us)

如果单片机工作在6T模式下,则内部时钟频率是2MHz,则时钟脉冲宽度为0.5us(1/2MHz=0.5us)

4.定时器的主要寄存器介绍

1. TL0/TH0 

1000==0x3E8 ===》高8位为0x3    低8位为0xE8===》TL0==0xE8  TH0==0x3

8888==0x22B8===》高8位为0x22  低0xB8  =====》TL0 =0xB8  TH0==0x22

2.TCON【定时器控制寄存器】

(1)8个位,但是有4个名字:TR,TF,IE,IT。每一个名字的符号都有2个,后面分别带有0或者1,【TF1表示高位,TF0表示地位】

1.TF:timer flag【定时器标志位】

(1)定时器标志位:硬件直接操控的,是只读(软件只是通过读取TF1来知道硬件的状态,而不用去写这一位来设置硬件的状态)

(2)”最高位溢出“表示达到我们设置的最大位数,则将TF1设置为【1】

(3)timer定时器时间到了会做2件事情:

        第一个是将TF标志改为1【可以检测是否是因为时间到了而达到中断,还是其他意外】

        第二个是产生中断让CPU去中断处理

(4)TF是硬件清零的(由1变0是自动的,不需要软件来干预)。有一些CPU的设计是需要软件去清零,这时候用户的程序就一定要记得给标志位清零,比如就不能重复进入中断或者反复不停的重复进入中断。

2.TR:timer run【定时器启动计数的开关控制位】

(1)定时器的启动计数开关。当我们把整个定时器初始化好了之后,我们给TR位写1就表示可以开启计数。

(2)TR位和GARE位有一定关联性。【在下面有提及】

3.IE:【外部中断请求源标志】

(1)IE也是一个标志位,作用用来展示硬件状态改变的。比如IE1对应外部中断1(INT1)。平时不发生INT1时IE1=0,当INT1发生中断时,硬件自动IE1=1,当CPU处理了INT1时,硬件会自动给IE1=0(硬件自动清零)。

4.IT:【设置外部中断的中断触发方式】

IT用来设置外部中断的中断触发方式。所谓的中断的触发方式,就是指硬件在某种条件下才会被判定为要产生中断,所以其实就是中断产生的条件。中断触发方式一般是:边沿触发和电平触发2种。边沿触发又分为:上升沿触发,下降沿触发,双边沿触发;电平触发方式分为:高电平触发,低电平触发2钟。

电平触发:如果我们设置低电平为发生触发,则如果按键被按下,则就触发中断。【会反复进入中断】---》所以按键,不能使用电平触发

边沿触发:设置为"上升沿”触发或者“下降沿”触发

3.TMOD【定时器模式寄存器】

1.GATE:门控位【TMOD寄存器中的】

用于控制外部信号的

(1)GATE是TMOD寄存器中的,也有2个分别对应T0和T1。GATE位中文名叫门控位,工作方式是:GATE=0时(相当于门是打开的,此时GATE位是可以忽略的),此时定时器开关就只受TR位影响,具体就是TR=1开启计数,TR=0结束计数。当timer处于定时器工作模式时GATE就要等于0;GATE一般是在timer处于计数器模式时使用的。当timer用来计数时,很关键的是什么条件下计数,什么条件下不计数。当GATE=0时,计数条件只有TR1一个(TR1=1就计数,TR1=0看不计数—),当GATE=1时是否计数不仅取决于TR1还取决于INT1引脚(P3.3),实际规则是:当TR1=1并且INT1引脚也为高电平时才会计数。

2.C/T

设置T0/T1工作子啊定时器模式还是计数器模式。

当输入是【1】表示计数器,【0】时表示定时器。

3.M0/M1

2位一起来表示T0/T1处于哪一种工作模式下,一般有4种:13位,16位,8位自动重载,双8位。

5.定时器编程实践

1.实验目的

(1)实验定时器来完成LED闪烁

(2)用来实现闪烁时中间的延迟是用delay函数实现,在delay的过程中CPU要一直耗在这里不能去做别的事情。这是之前的缺点。

(3)本节用定时器来定一个时间(比如0.3s),在这个定时器定时内CPU还可以去做主线任务,定时时间产生中断,在中断处理程序isr中让LED闪烁即可。

2.如何编程

(1)定时(timer初始化)

(2)主程序该干嘛干嘛

(3)中断处理程序

一般我们写编程时都是参考数据手册中的代码进行修改

定时器的时间周期

我们开发板的定时器最多可能订多长时间?

内部时钟频率是1MHz,时钟周期是1us,最多能定65535(16位定时器),也就是说最大定时时间为65535*1us=65535us=65.535ms

如果要定比较长的时间(比如2s),定时器直接是不能满足的,解决办法是多次定时后加起来成一个长时间。

计算TL0和TH0

(1)确定自己定时时间,定为50ms

(2)确定内部时钟周期,因为12T模式,外部晶振12MHz,所以:1us

(3)定时个数就是:50ms/1us=50000

(4)计数个数就是50000,那么写进入TL0和TH0里面的计数值应该是65535-50000=15535【因为我们是加法定时器,所以加法应该是对应从后往前】

(4)TL0=50000%256【取余表示低8位】   TH0=50000/256【取商表示高8位】

50000====》0xC350===》TL0=0x50【表示低8位】   TH=0xC3【表示高8位】

中断处理程序

//中断处理程序
void timer0_isr(void) interrupt 1 using 1	//表示外部中断号【在“中断”数据手册中有】
{//因为我们要多次进行中断处理程序,所以我们要自己手动修改计数值,要不然进行一次就结束//如果不想多次中断,则不要进行手动重载TL0和TH0TL0=15535%256;TH0=15535/256;if(count--==0){//说明中断了10次,500ms到了,干活了//LED取反LED=!LED;count=CNT;//我们要进行10,所以一定要进行再次赋值}
}

完整代码

#include<reg51.h>unsigned char count;//10次,对应500mssbit LED=P0^1;	//LED对应的CPIO定义#define CNT 20//中断处理程序
void timer0_isr(void) interrupt 1 using 1	//表示外部中断号【在“中断”数据手册中有】
{//因为我们要多次进行中断处理程序,所以我们要自己手动修改计数值,要不然进行一次就结束//如果不想多次中断,则不要进行手动重载TL0和TH0TL0=15535%256;TH0=15535/256;if(count--==0){//说明中断了10次,500ms到了,干活了//LED取反LED=!LED;count=CNT;//我们要进行10,所以一定要进行再次赋值}
}void main(){//0000 0001//因为我们控制的是T0,所以前四位为0【前四位为T1】//【第5个0】:GATE,我们此时是定时器,与外部程序无关,所以设置为0//【第6个0】:C/T,0表示定时器,1表示计数器//【第7-8个0】:表示在16位定时器TMOD=0x01;  //T0设置工作在定时器模式下,16位定时器//我们定时50ms//因为是12HMz的晶振,所以50ms/1us=50000//设置TL0【低8位】===>256是2的8次方TL0=15535%256;//设置TH0【高8位】TH0=15535/256;TR0=1;//开启计数器ET0=1; //开启T0中断EA=1;//中断总开关count=CNT;while(1);			//主任务}

6.定时时间设置

1.加法定时器和减法定时器

(1)定时器的原理是计数器,加法定时器计数方法是从我们给定的值开始计数,直到溢出(比如我们16位定时器最大值位0xffff,也就是65535,计数值到达这个值就溢出了)。减法定时器是从我们给定的值开始减1,减到0就溢出。

(2)实例来看,比如16位定时器,我们设置计数值为1000,则如果是减法定时器那么计数个数就是1000,如果是加法定时器则计数个数是65535-1000=64535

(3)51单片机就是典型的加法定时器

(4)现代的单片机或者嵌入式SoC,一般常用的都是减法定时器。虽然我们加法定时器和减法计时器都可以实现功能,但是明显减法定时器更加直观

相关文章:

【51单片机】9-定时器和计数器

1.定时器的介绍 1.什么是定时器 &#xff08;1&#xff09;SoC的一种内部的外设【在单片机里面&#xff0c;但是在CPU外面】 &#xff08;2&#xff09;定时器就是CPU的”闹钟“ 2.什么是计数器 &#xff08;1&#xff09;定时器就是用计数的原始实现的 &#xff08;2&#xf…...

2023年海南省职业院校技能大赛(高职组)信息安全管理与评估赛项规程

2023年海南省职业院校技能大赛&#xff08;高职组&#xff09; 信息安全管理与评估赛项规程 一、赛项名称 赛项名称&#xff1a;信息安全管理与评估 英文名称&#xff1a;Information Security Management and Evaluation 赛项组别&#xff1a;高等职业教育 赛项归属产业&…...

大模型深挖数据要素价值:算法、算力之后,存储载体价值凸显

文 | 智能相对论 作者 | 叶远风 18.8万亿美元&#xff0c;这是市场预计2030年AI推动智能经济可产生的价值总和&#xff0c;其中大模型带来的AI能力质变无疑成为重要的推动力量。 大模型浪潮下&#xff0c;业界对AI发展的三驾马车——算力、算法、数据任何一个维度的关注都到…...

AI文章,AI文章生成工具

在互联网时代&#xff0c;随着信息爆炸式增长&#xff0c;文章的需求愈发旺盛。从博客、新闻、社交媒体到企业宣传&#xff0c;文字作为传达信息、吸引受众的工具变得愈发重要。但问题是&#xff0c;对于很多人来说&#xff0c;创作一篇高质量的文章并不容易。时间、创意、写作…...

mac有必要用清理软件吗?有哪些免费的清理工具

当我们谈到Mac电脑时&#xff0c;很多人都会觉得它比Windows系统更加稳定和高效&#xff0c;也更不容易积累垃圾文件。但实际上&#xff0c;任何长时间使用的操作系统都会逐渐积累不必要的文件和缓存。那么&#xff0c;对于Mac用户来说&#xff0c;有必要使用专门的清理软件吗&…...

React 全栈体系(十八)

第九章 React Router 6 二、代码实战 6. 路由的 params 参数 6.1 routes /* src/routes/index.js */ import About from "../pages/About"; import Home from "../pages/Home"; import Message from "../pages/Message"; import News from &q…...

TCP/UDP

TCP&#xff1a;可靠的有序传输 TCP是一种面向连接的协议&#xff0c;旨在提供可靠、有序的数据传输。它通过以下方式实现这一目标&#xff1a; 1. 连接建立和维护 在使用TCP传输数据之前&#xff0c;必须先建立连接。这个过程包括三次握手&#xff0c;即客户端和服务器之间…...

c++内存对齐

原文在这里。https://blog.csdn.net/WangErice/article/details/103598081 但是内容有错误。我在自己的这里修改并变成红色了。 内存在使用过程并不是单一的依次排列&#xff0c;而是按照某种既定的规则来进行对齐&#xff0c;以方便快速访问.内存的对齐原则有以下三条&#…...

leetcode 33. 搜索旋转排序数组

2023.9.26 本题暴力法可以直接A&#xff0c;但是题目要求用log n的解法。 可以想到二分法&#xff0c;但是一般二分法适用于有序数组的&#xff0c;这里的数组只是部分有序&#xff0c;还能用二分法吗&#xff1f; 答案是可以的。因为数组是经过有序数组旋转得来的&#xff0c;…...

VCS flow学习

VCS VCS 是IC从业者常用软件&#xff0c;该篇文章是一个学习记录&#xff0c;会记录在使用过程中各种概念及options。 VCS Flow VCS Flow 可以分为Two-step Flow和Three-step Flow两类。 两步法 两步法只支持Verilog HDL和SystemVerilog的design&#xff0c;两步法主要包括…...

微信扫码关注公众号登录功能php实战分享

1、安装easywechat 基于easywechat框架开发,首先下载安装easywechat composer require overtrue/wechat 2、公众号配置 先去公众号后台基本配置/ 填写服务器配置配置接口,需要是线上能正确收到微信推送消息的地址,关注如果有关注、扫码、收到消息等事件都会推送到该地址…...

Git 精简快速使用

安装 Git 忽略&#xff0c;自行搜索 新建项目&#xff0c;或者在仓库拉取项目&#xff0c;进入到项目目录 Github 给出的引导&#xff0c;新项目和旧项目 echo "# testgit" >> README.md git init git add README.md git commit -m "first commit"…...

线性约束最小方差准则(LCMV)波束形成算法仿真

常规波束形成仅能使得主波束对准目标方向&#xff0c;从而在噪声环境下检测到目标&#xff0c;但无法对复杂多变的干扰做出响应&#xff0c;所以不能称之为真正意义上的自适应滤波。自适应阵列处理指的是采用自适应算法对空间阵列接收的混合信号进行处理&#xff0c;又可称为自…...

什么是内容运营?

关于内容运营&#xff0c;在不同种类的公司&#xff0c;侧重点也不一样。 电商平台的内容运营岗更偏内容营销&#xff1b;产品功能比较简单的公司&#xff0c;内容运营和新媒体运营的岗位职责差不多&#xff1b;而内容平台的内容运营更多的是做内容的管理和资源整合。...

搭建安信可小安派Windows 开发环境

搭建小安派Windows 开发环境 Ai-Pi-Eyes 系列是安信可开源团队专门为Ai-M61-32S设计的开发板&#xff0c;支持WiFi6、BLE5.3。所搭载的Ai-M61-32S 模组具有丰富的外设接口&#xff0c;具体包括 DVP、MJPEG、Dispaly、AudioCodec、USB2.0、SDU、以太网 (EMAC)、SD/MMC(SDH)、SP…...

XML文件反序列化读取

原始XML文件 <?xml version"1.0" encoding"utf-8" ?> <School headmaster"王校长"><Grade grade"12" teacher"张老师"><Student name"小米" age"18"/><Student name&quo…...

会议剪影 | 思腾合力受邀参加2023第二届世界元宇宙大会并作主题演讲

由中国仿真学会、中国指挥与控制学会和北京理工大学共同主办&#xff0c;上海市嘉定区安亭镇人民政府和中国仿真学会元宇宙专业委员会承办的第二届世界元宇宙大会于2023年9月20日-22日在上海安亭举行。 大会以“虚实相生、产业赋能”为主题&#xff0c;聚焦元宇宙关键技术发展的…...

加密算法、哈希算法及其区别+国密简介

现代加密算法是信息安全领域中常用的算法&#xff0c;用于保护数据的机密性和完整性。以下是一些常用的现代加密算法&#xff1a; 加密算法&#xff08;Encryption Algorithm&#xff09; 目标&#xff1a;加密算法的主要目标是保密性&#xff08;Confidentiality&#xff09;…...

LeetCode算法二叉树—222. 完全二叉树的节点个数

目录 222. 完全二叉树的节点个数 - 力扣&#xff08;LeetCode&#xff09; 代码&#xff1a; 运行结果&#xff1a; 给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 完全二叉树 的定义如下&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能…...

Scrapy-应对反爬虫机制

参考自https://blog.csdn.net/y472360651/article/details/130002898 记得把BanSpider改成自己的项目名&#xff0c;还有一个细节要改一下&#xff0c;把代码user换成user_agent 禁止Cookie 在Scrapy项目中的settings文件&#xff0c;可以发现文件中有以下代码: COOKIES_ENA…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...

数据结构第5章:树和二叉树完全指南(自整理详细图文笔记)

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 原创笔记&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 上一篇&#xff1a;《数据结构第4章 数组和广义表》…...

ArcPy扩展模块的使用(3)

管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如&#xff0c;可以更新、修复或替换图层数据源&#xff0c;修改图层的符号系统&#xff0c;甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...

云原生安全实战:API网关Envoy的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关 作为微服务架构的统一入口&#xff0c;负责路由转发、安全控制、流量管理等核心功能。 2. Envoy 由Lyft开源的高性能云原生…...

基于Python的气象数据分析及可视化研究

目录 一.&#x1f981;前言二.&#x1f981;开源代码与组件使用情况说明三.&#x1f981;核心功能1. ✅算法设计2. ✅PyEcharts库3. ✅Flask框架4. ✅爬虫5. ✅部署项目 四.&#x1f981;演示效果1. 管理员模块1.1 用户管理 2. 用户模块2.1 登录系统2.2 查看实时数据2.3 查看天…...

02-性能方案设计

需求分析与测试设计 根据具体的性能测试需求&#xff0c;确定测试类型&#xff0c;以及压测的模块(web/mysql/redis/系统整体)前期要与相关人员充分沟通&#xff0c;初步确定压测方案及具体的性能指标QA完成性能测试设计后&#xff0c;需产出测试方案文档发送邮件到项目组&…...