【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.什么是定时器 (1)SoC的一种内部的外设【在单片机里面,但是在CPU外面】 (2)定时器就是CPU的”闹钟“ 2.什么是计数器 (1)定时器就是用计数的原始实现的 (2…...
2023年海南省职业院校技能大赛(高职组)信息安全管理与评估赛项规程
2023年海南省职业院校技能大赛(高职组) 信息安全管理与评估赛项规程 一、赛项名称 赛项名称:信息安全管理与评估 英文名称:Information Security Management and Evaluation 赛项组别:高等职业教育 赛项归属产业&…...
大模型深挖数据要素价值:算法、算力之后,存储载体价值凸显
文 | 智能相对论 作者 | 叶远风 18.8万亿美元,这是市场预计2030年AI推动智能经济可产生的价值总和,其中大模型带来的AI能力质变无疑成为重要的推动力量。 大模型浪潮下,业界对AI发展的三驾马车——算力、算法、数据任何一个维度的关注都到…...
AI文章,AI文章生成工具
在互联网时代,随着信息爆炸式增长,文章的需求愈发旺盛。从博客、新闻、社交媒体到企业宣传,文字作为传达信息、吸引受众的工具变得愈发重要。但问题是,对于很多人来说,创作一篇高质量的文章并不容易。时间、创意、写作…...
mac有必要用清理软件吗?有哪些免费的清理工具
当我们谈到Mac电脑时,很多人都会觉得它比Windows系统更加稳定和高效,也更不容易积累垃圾文件。但实际上,任何长时间使用的操作系统都会逐渐积累不必要的文件和缓存。那么,对于Mac用户来说,有必要使用专门的清理软件吗&…...
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:可靠的有序传输 TCP是一种面向连接的协议,旨在提供可靠、有序的数据传输。它通过以下方式实现这一目标: 1. 连接建立和维护 在使用TCP传输数据之前,必须先建立连接。这个过程包括三次握手,即客户端和服务器之间…...
c++内存对齐
原文在这里。https://blog.csdn.net/WangErice/article/details/103598081 但是内容有错误。我在自己的这里修改并变成红色了。 内存在使用过程并不是单一的依次排列,而是按照某种既定的规则来进行对齐,以方便快速访问.内存的对齐原则有以下三条&#…...
leetcode 33. 搜索旋转排序数组
2023.9.26 本题暴力法可以直接A,但是题目要求用log n的解法。 可以想到二分法,但是一般二分法适用于有序数组的,这里的数组只是部分有序,还能用二分法吗? 答案是可以的。因为数组是经过有序数组旋转得来的,…...
VCS flow学习
VCS VCS 是IC从业者常用软件,该篇文章是一个学习记录,会记录在使用过程中各种概念及options。 VCS Flow VCS Flow 可以分为Two-step Flow和Three-step Flow两类。 两步法 两步法只支持Verilog HDL和SystemVerilog的design,两步法主要包括…...
微信扫码关注公众号登录功能php实战分享
1、安装easywechat 基于easywechat框架开发,首先下载安装easywechat composer require overtrue/wechat 2、公众号配置 先去公众号后台基本配置/ 填写服务器配置配置接口,需要是线上能正确收到微信推送消息的地址,关注如果有关注、扫码、收到消息等事件都会推送到该地址…...
Git 精简快速使用
安装 Git 忽略,自行搜索 新建项目,或者在仓库拉取项目,进入到项目目录 Github 给出的引导,新项目和旧项目 echo "# testgit" >> README.md git init git add README.md git commit -m "first commit"…...
线性约束最小方差准则(LCMV)波束形成算法仿真
常规波束形成仅能使得主波束对准目标方向,从而在噪声环境下检测到目标,但无法对复杂多变的干扰做出响应,所以不能称之为真正意义上的自适应滤波。自适应阵列处理指的是采用自适应算法对空间阵列接收的混合信号进行处理,又可称为自…...
什么是内容运营?
关于内容运营,在不同种类的公司,侧重点也不一样。 电商平台的内容运营岗更偏内容营销;产品功能比较简单的公司,内容运营和新媒体运营的岗位职责差不多;而内容平台的内容运营更多的是做内容的管理和资源整合。...
搭建安信可小安派Windows 开发环境
搭建小安派Windows 开发环境 Ai-Pi-Eyes 系列是安信可开源团队专门为Ai-M61-32S设计的开发板,支持WiFi6、BLE5.3。所搭载的Ai-M61-32S 模组具有丰富的外设接口,具体包括 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第二届世界元宇宙大会并作主题演讲
由中国仿真学会、中国指挥与控制学会和北京理工大学共同主办,上海市嘉定区安亭镇人民政府和中国仿真学会元宇宙专业委员会承办的第二届世界元宇宙大会于2023年9月20日-22日在上海安亭举行。 大会以“虚实相生、产业赋能”为主题,聚焦元宇宙关键技术发展的…...
加密算法、哈希算法及其区别+国密简介
现代加密算法是信息安全领域中常用的算法,用于保护数据的机密性和完整性。以下是一些常用的现代加密算法: 加密算法(Encryption Algorithm) 目标:加密算法的主要目标是保密性(Confidentiality)…...
LeetCode算法二叉树—222. 完全二叉树的节点个数
目录 222. 完全二叉树的节点个数 - 力扣(LeetCode) 代码: 运行结果: 给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。 完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能…...
Scrapy-应对反爬虫机制
参考自https://blog.csdn.net/y472360651/article/details/130002898 记得把BanSpider改成自己的项目名,还有一个细节要改一下,把代码user换成user_agent 禁止Cookie 在Scrapy项目中的settings文件,可以发现文件中有以下代码: COOKIES_ENA…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...



