热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

051单片机:利用定时器0让你的程序更加高效

1、视频学习也还是这两个图定时计数器:两个功能定时器可以实现准确定时。定时功能,计数功能。一个低电平一个高电平就是一个脉冲。定时器作用:精确事件定时如何使用定时计数器:首先是启动定

1、视频学习

也还是这两个图

定时/计数器:两个功能

定时器可以实现准确定时。

定时功能,计数功能。

一个低电平一个高电平就是一个脉冲。

定时器作用:精确事件定时

如何使用定时计数器:

首先是启动定时计数器,怎么去启动他来。通过特殊功能寄存器TCON来启动。

然后是设计定时计数器的工作模式 ,通过TMOD特殊功能寄存器。

可以通过查询方式来判断定时计数器是否溢出。

它内部有一个16位的定时计数器,如果我们把它设定在定时模式下,每隔一个机械周期这个16位寄存器就会加1,当他们一直加加满的时候(65535)他就会溢出,这个时候单片机就会自动的把TF这一位变成1.  加满了我们通常认为是定时时间到。给他一个初值然后判断需要定时的时间。可以把16的定时计数器放一个初值,让他从这个初值上面加。加满以后TF位会变为1. 

 

低四位与外部中断有关的。B0-B4

用定时器0为例。

TR0:该位由软件置位和清零:就是说由编程去给他赋值1还是赋值0;


TF0:中的当T0被允许计数后也就是说TR0启动。产生溢出时,也就说加满的时候,16位加满65535的时候,他就溢出了,TF0由硬件给他置1的。

有cpu置1.时间到了,可以去做一些指定的工作。必须由软件给他清零。

当使用中断的时候我们不用程序给他清零,他会由硬件给他清零。没用到中断就要用软件清零。

TMOD

 

 有8位,上电的时候默认每一位都是0.不可位寻址。不能直接M0=1;必须用十六位赋值

第七位最高位:

定时器0在里面的第四位。

GATE默认是0,当置1的时候需要满足两个条件。

C/T:0默认是定时器、配置定时还是计数模式

TH0高八位  TL0第八位   这两个可以用来设置初值。

TH0=1  TL0=0  设置的初值就是256   因为是0001 0000 0000 用的是二进制转10进制

加到65535然后TF0就会等于1

8位自动重装串口通讯的时候会用到。

初值放在TH0

使用定时器有几个步骤;首先TCON控制器启动它

                      然后,通过TMOD设置模式。

加入我要定时10ms毫秒  就是10000us微妙除以1.085这是我们的机器周期,

把初值设置为65535减去刚才算的数,


读取TF是不是1就知道是不是溢出了

th初值设为256

定时

关于定时器0的初始化:




2、教材再理解


一、定时器初步认识

时钟周期:是时序中最小的时间单位,具体计算的方法就是 1/时钟源频率,我们 KST-51 单片机开发板上用的晶振是 11.0592M,那么对于我们这个单片机系统来说,时钟周期=1/11059200 秒。

机器周期:一个机器周期是 12 个时钟周期,也就是 12/11059200 秒

定时器和计数器。定时器和计数器是单片机内部的同一个模块,通过配置 SFR(特殊功能寄存器)可以实现两种不同的功能, 

定时器就是用来进行定时的

定时器内部有一个寄存器,我们让它开始计数后,这个寄存器的值每经过一个机器周期就会自动加 1

 这个定时器就是每过一个机器周期的时间,也就是 12/11059200 秒,数字自动加 1。

16 位的定时器,也就是 2 个字节,最大值就是 65535,那么加到 65535 后,再加 1 就算溢出,


二、定时器的寄存器:

标准的 51 单片机内部有 T0 和 T1 这两个定时器

表 5-1 的寄存器是存储定时器的计数值的。TH0/TL0 用于 T0,TH1/TL1 用于 T1。 

表 5-2 是定时器控制寄存器 TCON 的位分配,表 5-3 是则是对每一位的具体含义的描述。

 只要写到硬件置 1 或者清 0 的,就是指一旦符合条件,单片机将自动完成的动作,只要写软件置 1 或者清 0 的,是指我们必须用程序去完成这个动作,后续遇到此类描述就不再另做说明了。 

看 TR1,当我们程序中写 TR1 = 1 以后,定时器值就会每经过一个机器周期自动加 1,当我们程序中写 TR1 = 0以后,定时器就会停止加 1,其值会保持不变化。

 TF1,这个是一个标志位,他的作用是告诉我们定时器溢出了

比如我们的定时器设置成 16 位的模式,那么每经过一个机器周期,TL1加 1 一次,当 TL1 加到 255 后,再加 1,TL1 变成 0,TH1 会加 1 一次,如此一直加到 TH1和 TL1 都是 255(即 TH1 和 TL1 组成的 16 位整型数为 65535)以后,再加 1 一次,就会溢出了,TH1 和 TL1 同时都变为 0,只要一溢出,TF1 马上自动变成 1,告诉我们定时器溢出了,

 表 5-4  TMOD——定时器模式寄存器的位分配(地址 0x89、不可位寻址) 

C/T: 定时器或计数器选择位。该位被清零时用作定时器功能(内部系统时钟),被置 1 用作计数器功能。 

 模式 1,是 THn 和 TLn 组成了一个 16 位的定时器,计数范围是 0~65535,溢出后,只要不对 THn 和 TLn 重新赋值,则从 0 开始计数。

 模式 2,是 8 位自动重装载模式,只有 TLn做加 1 计数,计数范围 0~255,THn 的值并不发生变化,而是保持原值,TLn 溢出后,TFn就直接置 1 了,并且 THn 原先的值直接赋给 TLn,然后 TLn 从新赋值的这个数字开始计数。

 

要想让定时器工作,就是自动加 1,从图上看有两种方式,第一种方式是那个开关打到上边的箭头,就是 C/T = 0 的时候,一个机器周期 TL 就会加 1 一次,当开关打到下边的箭头,即 C/T =1 的时候,T0 引脚即 P3.4 引脚来一个脉冲,TL 就加 1 一次,这也就是计数器功能。 


三、定时器的计算

 时钟周期=12/11059200=1.085069

假如要定时 20ms,就是 0.02 秒

计时器计数是没过一个时钟周期加1,也就是每过1.085069加1

要经过x个机器周期到达0.02秒

x*12/11059200=0.02

得到 x= 18432

十六位定时器溢出是65535

我们可以给给 TH0 和 TL0一个初始值,让它们经过 18432 个机器周期后刚好达到 65536

 初值 y = 65536 – 18432 = 47104

转成 16 进制就是 0xB800,也就是 TH0 = 0xB8,TL0 = 0x00。  

也可以TH0= 47104/256

TL1=47104%256


利用定时器准确定时

由1秒加到10秒

先判断是否溢出了也就是TF0=1代表定时了50ms,然后循环mSec++,加一次是50ms,当加到20次的时候正好是1s

然后清零mSec,秒数加1变成1秒,当sec大于10秒清零从0再开始重复。

计数器配置

定时器1和2 

定时器1和2 公用一个端口会覆盖掉,只需要写一个或等于就互不影响,tc写入1,计数模式







推荐阅读
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文详细介绍了云服务器API接口的概念和作用,以及如何使用API接口管理云上资源和开发应用程序。通过创建实例API、调整实例配置API、关闭实例API和退还实例API等功能,可以实现云服务器的创建、配置修改和销毁等操作。对于想要学习云服务器API接口的人来说,本文提供了详细的入门指南和使用方法。如果想进一步了解相关知识或阅读更多相关文章,请关注编程笔记行业资讯频道。 ... [详细]
  • 本文介绍了基于c语言的mcs51单片机定时器计数器的应用教程,包括定时器的设置和计数方法,以及中断函数的使用。同时介绍了定时器应用的举例,包括定时器中断函数的编写和频率值的计算方法。主函数中设置了T0模式和T1计数的初值,并开启了T0和T1的中断,最后启动了CPU中断。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了在Docker容器技术中限制容器对CPU的使用的方法,包括使用-c参数设置容器的内存限额,以及通过设置工作线程数量来充分利用CPU资源。同时,还介绍了容器权重分配的情况,以及如何通过top命令查看容器在CPU资源紧张情况下的使用情况。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 显卡驱动对游戏的影响及其提升效果的研究
    本文研究了显卡驱动对游戏体验的提升效果,通过比较新旧驱动加持下的RTX 2080Ti显卡在游戏体验上的差异。测试平台选择了i9-9900K处理器和索泰RTX 2080Ti玩家力量至尊显卡,以保证数据的准确性。研究结果表明,显卡驱动的更新确实能够带来近乎50%的性能提升,对于提升游戏体验具有重要意义。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 记录一次es集群load过高问题(待更新)
    toptop-H-ppid按shiftp以cpu来排序按shiftm以memory来排序将10进制线程pid转为16进制printf%x\npidjstackjstackP ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文讨论了在iOS平台中的Metal框架中,对于if语句中的判断条件的限制和处理方式。作者提到了在Metal shader中,判断条件不能写得太长太复杂,否则可能导致程序停留或没有响应。作者还分享了自己的经验,建议在CPU端进行处理,以避免出现问题。 ... [详细]
author-avatar
手机用户2502863963
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有