51单片机快速入门之定时器和计数器

51单片机快速入门之定时

断开外部输入

晶振振荡 假设为 12MHz

12分频之后,为1MHz 当其从0-65536 时,需要65536μs 微秒 也就是65.536ms 毫秒

溢出(值>=65536 时)>中断>执行中断操作

假设需要1ms后产生溢出,则需要设置初始值为64536

此时定时器会从  64536 开始计数 (1000μs 微秒 = 1 ms 毫秒 )    

51单片机快速入门之计数器

计算外部输入的脉冲信号
假设设置其为16位计数器,其最大计数值为 2^16=65536
溢出(值>=65536 时)>中断>执行中断操作

假设需要100个脉冲后产生溢出,则需要设置初始值为65436

此时计数器会从  65436 开始计数   

结构原理

由 两个8位 计数器构成的  16位 计数器
TCON 寄存器 控制 开(1) / 关(0)
TMOD 寄存器 设置 工作方式 (定时还是计数)

TMOD寄存器

以下图片来源于stc89c52官方数据手册:

 这个GATE用于IO口控制 定时器  使用(1) / 不使用(0)  如果需要IO口控制 需设置其为 1

C/T 设置是 定时器 断开引脚输入 还是 计数器 从引脚输入

M1 M0 为模式选择,有不同的搭配

0   0 时 为13位 模式 (由 两个8位 计数器构成的  16位 计数器)  一计数器低5位 | 二计数器全8位

低五位计数器溢出时,它会向高八位计数器提供一个进位信号,这个信号会使高八位计数器的值加1。此时,低五位计数器会自动复位为其最小值(通常为0)


低 5 位”通常是指一个二进制数的最右边的 5 个比特位 从右向左数

举例:16位二进制数 1010 1100 0101 1001 低五位 就为 10011


0  1 时 为16位 两个8位全用

1  0 时  为8位自动重载 第一个计数器溢出之后,先转移当前值到 第二个计数器中,再复位为0

每次溢出时,第二个计数器的值就会增加(或减少,取决于计数方向)

1   1 时 停止计数(暂停)

这里要注意数据手册上标注 当M1 M0 都为 1 时  定时器 0 的工作方式

第一个计数器可以设置成   8位定时器/计数器 受 定时器 0 控制

但是 第二个计数器 只能是 8位定时器 受 定时器 1 控制

TCON寄存器 

以下图片来源于stc89c52官方数据手册: 

 定时器1

TF1 溢出标志位 (溢出时其为 1 ,会向CPU 请求中断 ,CPU响应后 0) 可手动设置

TR1 运行控制位 (控制开/关 ) 这里要注意TMOD中 GATE 的设置


 定时器0

 TF0 溢出标志位 (溢出时其为 1 ,会向CPU 请求中断 ,CPU响应后 0) 可手动设置

 TR0 运行控制位 (控制开/关 ) 这里要注意TMOD中 GATE 的设置


IE1 / IE0  分别为 外部中断1 / 外部中断0 请求标志位

有请求时为1 处理后  由硬件自动清0(默认为0)


IT1 / IT0 分别为外部中断1 / 外部中断 0 触发方式控制位 为0 是低电平触发

程序设计时:在中断服务例程(ISR)的开始部分直接控制IO拉高(低电平触发时)

假设设置为 低电平 触发

低电平时 IE0或IE1 会被置位,即设置为1 表示有一个中断请求待处理

中断请求来时,以下步骤会发生:

  1. 中断请求使IE0或IE1置位(设置为1)。
  2. CPU响应中断请求,暂停当前的任务,并跳转到中断服务例程(ISR)。
  3. 在ISR中,你处理中断请求,完成相应的任务。
  4. 在ISR结束之前,你需要手动或自动 清零IE0或IE1,以表示中断请求已经被处理完毕。

定时器 程序设计 

例子:产生1kHz方波信号  时钟频率12MHz
分析:
        信号周期T=1/f  T=1/1000 =1ms 
        高低电平设计为0.5ms(500μs)
        定时初始值计算公式:2^16-定时值=2^16-500=65036
第一计数器 A 存储 初值 高八位,第二计数器 B 存储 初值 低八位

在计算机科学中,一个字节由8位二进制数字组成。这8位数字可以分为高四位和低四位,也可以称为高四位和低四位。

  • 高八位:指的是这个字节中最左边的8位,也就是最高位的那一部分。
  • 低八位:指的是这个字节中最右边的8位,也就是最低位的那一部分。

65036(10进制)转换成16进制为 0xFE0C   A存储FE  B存储0C

因 65036 数过大,计算比较费劲 所以要适当 缩小 

65036/256=取商得到  254

计数器值常需除以256,因计算机处理数据以字节为单位,每字节8位,可表256个值(0-255)。此操作适用于字节操作、防止溢出、图像处理中表示颜色深度、遵循数据格式及简化数学计算。

在计算机科学和电子工程中,计数器的值经常需要  除以256,这通常是因为以下几个原因:

1. 字节操作:

        计算机中的数据通常以字节(byte)为单位处理,而一个字节等于8位(bit)。由于256等于2的8次方(2^8),它刚好是一个字节可以表示的最大整数值(从0到255)。因此,当处理字节或进行位操作时,256是一个关键的参考点。


2. 溢出和模运算:

        计数器在增加过程中可能会超过其最大表示范围,导致溢出。如果一个计数器是用一个字节表示的,那么当它的值超过255时,就会从0开始循环。这种现象可以用模运算(即取余数)来描述,而模数通常是256。


3. 颜色深度:

        在图形和图像处理中,每个像素的颜色可能由若干个字节表示,比如RGB色彩模型中,每个颜色分量(红、绿、蓝)通常用一个字节表示,因此有256种可能的强度级别。


4. 协议和数据格式:

        某些通信协议或数据格式可能规定了特定的字段长度或计数范围,这时候使用256作为基数可以帮助确保兼容性和标准化。


5. 数学和算法:

        在一些数学算法和数据结构中,256因其与二进制系统的紧密关系,常常被用作基数或除数,以简化计算和逻辑操作。

总的来说,除以256的操作反映了计算机系统中对字节边界和模运算的常见需求。

65036%256=取余数 12

在计算机科学和数学中,取余数(模运算)是一种非常常见的操作。当我们对一个数进行除法运算时,余数是除不尽的部分。取余数的操作可以帮助我们解决以下几类问题:

  1. 溢出处理:在某些系统中,例如基于字节的操作,我们需要确保数值不会超过某个范围(如0到255)。通过取余数,我们可以使数值“循环”回这个范围内,避免溢出。

  2. 周期性事件:如果我们想要跟踪每隔一定数量的事件发生的情况(比如每256个事件),取余数可以帮助我们确定是否到达了这个周期的某个特定点。

  3. 密码学:在密码学中,模运算是基础操作之一,用于创建和解密密码系统。

  4. 数据校验和压缩:在数据传输和存储中,模运算可以用于生成和验证校验和,以检测错误。在某些压缩算法中,它也被用来减少数据的大小。

  5. 数学算法:许多数学算法和公式中会用到模运算,因为它可以简化计算,特别是在处理大数时。

对于65036除以256的情况,取余数的操作可以告诉我们65036在256的倍数之间的“剩余”部分是多少。

 定时器 程序代码

设置工作模式 :第一计数器 A 存储 初值 高八位,第二计数器 B 存储 初值 低八位

TMOD=0X01;
//0x01 是一个十六进制数,它代表的二进制数是 0000 0001
A=65036/256;//存储高八位
B=65036%256;//存储低八位
EA=1;//打开总中断
ET0=1;//允许定时器0中断
TR0=1;//打开定时器0

定时器 中断函数代码 

 void T0(void) interrupt 1 using 1

{

A=65036/256;//存储高八位   复位
B=65036%256;//存储低八位 复位

这里放入中断后需要做的操作

}

 代码解释:
  1. void T0(void):这是一个函数声明,表明函数 T0 不接受任何参数,并且不返回任何值。
  2. interrupt 1:这是关键字和参数,用于指定这个函数是一个中断服务例程,其中 1 表示中断号。不同的中断号对应不同的中断源.
  3. using 1:这是另一个关键字和参数,用于指定该中断服务例程使用的工作寄存器组。在一些微控制器中,允许程序员在中断服务例程中使用不同的工作寄存器组,以避免与主程序中的寄存器冲突。这里的 1 表示使用第1个工作寄存器组。
中断号解释:  interrupt
  1. 外部中断0 (INT0)         中断号0
  2. 定时器/计数器0 (T0)    中断号1
  3. 外部中断1 (INT1)         中断号2
  4. 定时器/计数器1 (T1)    中断号3
  5. 串行口中断 (串行I/O)   中断号4
寄存器组解释: using 参考链接icon-default.png?t=O83Ahttps://blog.csdn.net/cssdl/article/details/41674095?sharetype=blogdetail&sharerId=41674095&sharerefer=PC&sharesource=qq_43422073&sharefrom=from_link

R0-R7在数据存储器里的实际地址是由特殊功能寄存器PSW里的RS1、RS0位决定的。

using 0时
        设置 RS1=0,RS0 =0,用第0组寄存器,R0--R7的在数据存储区里的实际地址是00H-07H。R0(00H)....R7(07H)


using 1时
        设置 RS1=0,RS0 =1,用第1组寄存器,R0--R7的在数据存储区里的实际地址是00H-07H。R0(08H)....R7(0FH)


using 2时
        设置 RS1=1,RS0 =0,用第2组寄存器,R0--R7的在数据存储区里的实际地址是08H-0FH。R0(10H)....R7(17H)


using 3时
        设置 RS1=1,RS0 =1,用第3组寄存器,R0--R7的在数据存储区里的实际地址是00H-07H。R0(18H)....R7(1FH)

计数器为什么要复位 :

在单片机编程中,特别是涉及到定时器/计数器的中断服务例程时,经常会看到这样的情况:在中断服务例程的开始部分,会将一些寄存器的值重新赋值给计数器。

1. 防止溢出:

        定时器/计数器在达到最大值后会溢出并从零开始计数。如果不重新赋值,计数器可能会继续从溢出点开始计数,导致不正确的结果。通过在中断服务例程中重新赋值,可以确保计数器从预期的值开始计数。


2. 实现精确的定时:

        在一些应用中,需要实现非常精确的定时。通过在中断服务例程中重新赋值计数器,可以调整定时器的计数值,从而实现更精确的定时。


3. 初始化计数器:

        在中断服务例程中,可能需要对计数器进行初始化,以便从一个已知的状态开始。这在处理复杂的定时任务或多任务环境中尤为常见。


4. 实现周期性任务:

        如果中断服务例程需要周期性地执行某些任务,可以通过重新赋值计数器来实现这一点。例如,如果中断服务例程每1毫秒执行一次,可以在中断服务例程的开始部分将计数器设置为一个适当的值,以确保下次中断发生在1毫秒后。


5. 处理中断嵌套:

        在多中断环境下,可能会出现中断嵌套的情况。在这种情况下,需要确保每次中断服务例程执行时,计数器的值是正确的。通过在中断服务例程中重新赋值计数器,可以确保这一点。


中断相关资料 

EX0:EX0=1,允许外部中断0中断;EX0=0,禁止中断
ET0:ET0=1,允许T0中断;ET0=0,禁止中断
EX1:EX1=1,允许外部中断1中断;EX1=0,禁止中断
ET1:ET1=1,允许T1中断;ET1=0,禁止中断
ES:ES=1,允许串行口中断;ES=0,禁止中断

EA:EA=1,CPU开放中断;EA=0,CPU禁止所有的中断请求

中断相关 参考链接icon-default.png?t=O83Ahttps://blog.csdn.net/weixin_43398418/article/details/121916218?sharetype=blogdetail&sharerId=121916218&sharerefer=PC&sharesource=qq_43422073&sharefrom=from_link


 TMOD=0X01;
//0x01 是一个十六进制数,它代表的二进制数是 0000 0001

 这里操作的是 定时器0  按位带入以下图片中 可以知道定时器0 的 M1=0 M0=1

M1=0 M0=1 时 为16位 两个8位全用


计数器程序代码 

例子: 50kHz方波信号  时钟频率12MHz

TMOD=0X20;
//0X20 是二进制 0010000 控制的是定时器1
//结合上图M1=1 M0=0为8位自动重载 第一个计数器A1溢出之后,先转移当前值到 第二个计数器B1中,再复位为0
A1=246;//设置初始值 溢出相关
B1=246;//设置初始值
//246-256 需要10μs 
EA=1;//打开总中断
ET1=1;//打开定时器1中断
TR1=1;//启动定时器1
void T1(void) interrupt 3 using 1
{
//因为是8位重载所以不用初始化计数器
//这里放入需要做的操作}

注意:以上代码省略了main()主函数

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

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

相关文章

xss-labs-master通关教程

一.level1 先来进行一下代码审计 <?php ini_set("display_errors", 0);//关闭错误显示 $str $_GET["name"]; //接受URL来的get形式的name传参 echo "<h2 aligncenter>欢迎用户".$str."</h2>";//在网页输出&#x…

引领AI PC浪潮,Arm人工智能创新应用大赛火热报名中

AI PC&#xff0c;即搭载人工智能技术的个人电脑&#xff0c;正成为个人电脑市场的新宠儿。而正在如火如荼进行中的 Arm人工智能创新应用大赛&#xff0c;则为敏锐的开发者探索 AI PC 应用开发掘金之路提供了平台。 点击报名 挑战10万奖金池 AI PC 增长强劲&#xff0c;年出货…

【Hadoop|HDFS篇】HDFS的读写流程

1. HDFS的写流程 1.1 剖析文件的写入 副本存储节点的选择问题&#xff1a; 第一个副本在Client所在的节点上&#xff0c;如果客户端在集群外&#xff0c;随机选一个。第二个副本在另一个机架的随机一个节点上。第三个副本在第二个副本所在的机架的随机节点上。 2. HDFS的写流…

2024CCPC网络预选赛

vp链接&#xff1a;Dashboard - The 2024 CCPC Online Contest - Codeforces B. 军训 II 序列 a 从小到大排列或者从大到小排列时&#xff0c;不整齐度是最小的。方案数是所有相同数字的个数的排列数的乘积。如果首尾的数字不同的话&#xff0c;还要再乘个 2。 #include <…

Social Network Influence Maximization Based on Graph Attention Mechanisms

摘要 社交网络中的关键节点对整个网络具有重要的影响力&#xff0c;而社交网络中的一些节点可能位于网络的中心&#xff0c;而另一些节点则可能位于网络的边缘&#xff0c;传统的影响力最大化算法忽略了这种不平衡。通过忽略位于网络边缘但连接到中心的节点来导致信息的传播。为…

Java项目: 基于SpringBoot+mybatis+maven医院管理系统(含源码+数据库+任务书+开题报告+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismaven医院管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、…

【LeetCode】每日一题 2024_9_13 预算内的最多机器人数目(滑动窗口、单调队列)

LeetCode 启动&#xff01; 每日一题的题解重新开始连载&#xff01; 题目&#xff1a;预算内的最多机器人数目 题目链接&#xff1a;2398. 预算内的最多机器人数目 题目描述 代码与解题思路 func maximumRobots(chargeTimes []int, runningCosts []int, budget int64) (an…

期权组合策略有什么风险?期权组合策略是什么?

今天期权懂带你了解期权组合策略有什么风险&#xff1f;期权组合策略是什么&#xff1f;期权组合策略是通过结合不同期权合约&#xff08;如看涨期权和看跌期权&#xff09;&#xff0c;以及标的资产&#xff08;如股票&#xff09;来实现特定投资目标的策略。 期权组合策略市…

改进大语言模型的最全方法!

这是一篇关于适应开源大语言模型&#xff08;LLMs&#xff09;的三部系列博客的第一篇。本文探讨将LLM适应领域数据的各种方法。 第二部分讨论如何确定微调&#xff08;fine-tuning&#xff09;是否适合您的用例。第三部分探讨策划良好训练数据集的一些经验法则。 0 引言 大…

【IP协议】IP协议报头结构(上)

IP 协议报头结构 4位版本 实际上只有两个取值 4 > IPv4&#xff08;主流&#xff09;6 > IPv6 IPv2&#xff0c;IPv5 在实际中是没有的&#xff0c;可能是理论上/实验室中存在 4位首部长度 IP 协议报头也是变长的&#xff0c;因为选项个数不确定&#xff0c;所以报头长…

突破瓶颈:Java并发编程的最佳实践与技巧,你了解了吗?

文章目录 1 什么是 Executor 和 ExecutorService &#xff1f;这两个接口有什么区别&#xff1f;2 java.util.concurrent 标准库中 ExecutorService 的可用实现是什么 &#xff1f;3 什么是 Java 内存模型&#xff08; JMM &#xff09;&#xff1f;描述下其目的和基本思想4 JM…

Spring扩展点系列-ApplicationContextAwareProcessor

文章目录 简介源码分析示例代码示例一&#xff1a;扩展点的执行顺序运行示例一 示例二&#xff1a;获取配置文件值配置文件application.properties内容定义工具类ConfigUtilcontroller测试调用运行示例二 示例三&#xff1a;实现ResourceLoaderAware读取文件ExtendResourceLoad…

论文翻译:arxiv-2024 Benchmark Data Contamination of Large Language Models: A Survey

Benchmark Data Contamination of Large Language Models: A Survey https://arxiv.org/abs/2406.04244 大规模语言模型的基准数据污染&#xff1a;一项综述 文章目录 大规模语言模型的基准数据污染&#xff1a;一项综述摘要1 引言 摘要 大规模语言模型&#xff08;LLMs&…

css——网格布局

名词解释 div{$}*9tab键&#xff0c;快捷生成 记首字母gtc 网格布局&#xff1a;display: grid; grid-template-columns: 100px 100px 100px; grid-template-rows: 100px 100px 100px; &#xff08;父元素&#xff09; <!DOCTYPE html> <html lang&q…

如何构建适合企业需求的即时通讯与音视频通话私有化平台?

在数字化转型的浪潮中&#xff0c;企业对于内部沟通的需求日益复杂化和多元化。传统的沟通方式已难以满足高效协作、信息安全及个性化定制的需求。因此&#xff0c;“即时通讯音视频通话”集成的私有化部署软件应运而生&#xff0c;成为企业优化内部沟通、提升工作效率的得力助…

PN IO设备ET 200SP支持R1模式

IA博途V18除了支持性能大幅提升的V3.0版本S7-1500 CPU&#xff08;不包含S7-1517/18 CPU&#xff09;外&#xff0c;还支持我们一直期待的R1模式的PROFINET IO设备ET200SP&#xff01;这样使S7-1500H 冗余系统的PN IO设备配置更加灵活。 1. PN 设备接口模式 以前的S7-1500R/…

【重学 MySQL】二十七、七种 join 连接

【重学 MySQL】二十七、七种 join 连接 union 的使用UNION 的基本用法示例UNION ALL 的用法 七种 join 连接代码实现语法格式小结 union 的使用 UNION 在 SQL 中用于合并两个或多个 SELECT 语句的结果集&#xff0c;并默认去除重复的行。如果希望包含重复行&#xff0c;可以使…

jmeter之setUP、tearDown线程组

setUp线程组&#xff1a; 用于在执行常规线程组之前执行一些必要的操作 ------会在普通线程组执行前被触发 应用场景举例&#xff1a; A、测试数据库操作功能时&#xff0c;用于执行打开数据库连接操作 B、测试用户购物功能时&#xff0c;用于执行用户的注册、登录等操作 tea…

DMDPC单副本集群安装

1. 环境描述 2. 部署步骤 2.1. 安装DM数据库软件启动DMAP [dmdbalei1 ~]$ DmAPService status DmAPService (pid 1269) is running.2.2. 初始化数据库实例 [dmdbalei1 data]$ dminit path/dmdba/data/sp1 instance_nameSP1 port_num5236 ap_port_num6000 dpc_modeSP initdb …

Java项目: 基于SpringBoot+mybatis+maven旅游管理系统(含源码+数据库+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismaven旅游管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、…