04:定时器

定时器

  • 1、定时器怎么定时
  • 2、怎样实现计数?
    • 2.1、控制寄存器TCON
    • 2.2、工作模式寄存器TCOM
    • 2.3、定时器T0
  • 3、案例:通过定时器T0控制LED间隔1s亮灭

当定时器用的时候,靠内部震荡电路数数。当配置为定时器使用时,每经过1个机器周期,计数存储器的值就加1。

1、定时器怎么定时

1、通过晶振(晶体振荡器)发出脉冲,记录脉冲的个数来进行定时的。
2、而脉冲的频率为时钟频率,此频率的倒数为震荡周期(时钟周期),也是计算机中最小的时间单位。
在这里插入图片描述

如图:晶体振荡器的频率为11.0592MHz,则他的时钟周期为1/11.0592MHz(秒),既一个脉冲的周期需要这么多秒。

3、机器周期为CPU周期,一个基本操作所需要的时间称为机器周期。一般情况下,一个机器周期由若干个时钟周期组成。一般情况下是12倍/6倍。
在这里插入图片描述

在这里插入图片描述

  • 加1经过了多少时间?
    当晶振频率是11.0592MHz的时候,等于11059.2KHz = 11059200Hz
    机器周期 = 12 x 时钟周期 =12 x (1/时钟频率) 秒 = 12 / 时钟频率 秒 = 12 / 11059200 秒 = 12 000 000/ 11059200 微秒 = 1.085 (us)
    既:当使用12倍数时,每隔1.085us,计数器就+1

2、怎样实现计数?

  通过配置相关的寄存器:如下图为定时器的相关寄存器。
在这里插入图片描述

  • 如图有2中寄存器:第一种为TCON,第二种为TCOM,他们都是各8位。
  • 如图有2种定时器:第一种位定时器T0,第二种为定时器T1,他们都是各16位。

2.1、控制寄存器TCON

在这里插入图片描述

TF0:定时器T0溢出中断标志,当定时器0开始计数时,计数到规定的时间时,定时器产生了溢出。TF0自动由0变位1(由硬件置1)。
如果不用中断,需要手动清零。TR0:定时器T0的控制位,当为1时,定时器T0才能计数,相当于T0的开关(由软件控制)。

2.2、工作模式寄存器TCOM

在这里插入图片描述

GATE:门控制位,当GATE=0时:计数条件只有TR1一个(TR1=1就计数,TR1=0就不计数)。当GATE=1时:是否计数不仅取决于TR1还取决于INT1引脚
C/T :时钟输入选择为,为1时,时钟从外部引脚P3.5口输入;为0时,时钟从内部输入
M1      M0
0        0        :13位定时器,使用高8位和低5位
0        1        :16位定时器,全用
1        0        :8位自动重装载定时器,当溢出时将TH1存放的值自动重装入TL1.
1        1        :定时器无效

2.3、定时器T0

在这里插入图片描述

   定时器T0一共有16位,分为高8位TH0,和低8位TL0。所以一共能计2^16个数(65536),而每计1个数的周期是1.085us,所以默认是从0开始数数,累计计时约71ms。

3、案例:通过定时器T0控制LED间隔1s亮灭

代码①:

#include <REGX52.H>sbit LED1 = P3^7;
void main(void)
{int cnt = 0;LED1 = 1;//先让灯熄灭的状态/*1、选择定时器T0,并配置为16位定时器*/TMOD =0x01;							// 0000 0001/*2、定一个10ms的时间,数1下需要1.085us10ms需要数则需要数9216下,那从65536-9126=56320从56320这里开始数,数9216下就到了65536。当超过了65536时就报表了,控制寄存器TCON的TF0由0变为1	
*/TL0 = 0x00; //0000 0000TH0 = 0xDC;//1101 1100/*3、打开定时器T0*/TR0 = 1;TF0 = 0;//先个溢出标志清零while(1){if(TF0 == 1)//10ms报表了{	TF0 = 0;//软件清零,现在不使用中断TL0 = 0x00; //重新给初值TH0 = 0xDC;cnt++;if(cnt == 100)//数100次,相当于1s{cnt = 0;LED1 = !LED1;}}}
}

【注】

  • 每次报表后,都要给定时器重新一个初值
  • 每隔10毫秒cnt进行加1,当cnt加到100时,说明已经过了1秒了

代码优化②:

#include <REGX52.H>sbit LED1 = P3^7;void Timer0_Init_10ms(void)//定时器初始化10ms
{TMOD =0x01;							TL0 = 0x00; //0000 0000TH0 = 0xDC;//1101 1100TR0 = 1;TF0 = 0;
}void main(void)
{ int cnt = 0;LED1 = 1;//先让灯熄灭的状态Timer0_Init_10ms();while(1){if(TF0 == 1)//10ms报表了{	TF0 = 0;//软件清零,现在不使用中断TL0 = 0x00; //重新给初值TH0 = 0xDC;cnt++;if(cnt == 100)//数100次,相当于1s{cnt = 0;LED1 = !LED1;}}}
}

将定时器T0初始化封装成一个函数,当需要的时候直接调用即可。
但是使用TMOD = 0x01;这样初始化也与缺陷:

假如定时器T1正在使用,且为16位定时器。则TMOD的高4位应该为:0x1(0001)
而我们使用定时器T0时TMOD初始为0x01,则TMOD的高4位为0x0(0000),则把定时器T1变为一个13位定时器了。所以还需要改进

代码优化③:

#include <REGX52.H>sbit LED1 = P3^7;void Timer0_Init_10ms(void)		//10毫秒@11.0592MHz
{//AUXR &= 0x7F;		//定时器时钟12T模式TMOD &= 0xF0;		//设置定时器模式TMOD |= 0x01;		//设置定时器模式TL0 = 0x00;		//设置定时初值TH0 = 0xDC;		//设置定时初值TF0 = 0;		//清除TF0标志TR0 = 1;		//定时器0开始计时
}void main(void)
{ int cnt = 0;LED1 = 1;//先让灯熄灭的状态Timer0_Init_10ms();while(1){if(TF0 == 1)//10ms报表了{	TF0 = 0;//软件清零,现在不使用中断TL0 = 0x00; //重新给初值TH0 = 0xDC;cnt++;if(cnt == 100)//数100次,相当于1s{cnt = 0;LED1 = !LED1;}}}
}

我们发现TMOD的初始化为:

TMOD &= 0xF0;		//设置定时器模式
TMOD |= 0x01;		//设置定时器模式

这样初始化有什么好处?

假如定时器T1正在使用,且为16位定时器。则TMOD的高4位应该为:0x1(0001),而要使用定时器T0,且也为16位定时器,则TMOD =  0x11;
TMOD &= 0xF0;表示TMOD = TMOD & 0xf0,则与出来的TMOD = 0x10,由此可见,这一步就是让TMOD的高4位不变,低4位清零。
TMOD |= 0x01;表示TMOD = TMOD | 0x01,则或出来的TMOD = 0x11,由此可见,这一步就是让TMOD的高4位不变,低4位初始化。
通过这样初始化,既保证了TMOD的高4位不变(不改变定时器T1的初始化),由对低4位进行了改变(对定时器T0初始化)。
当然:也可以直让TMOD = 0x11;

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

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

相关文章

WPS打开PDF文件的目录

WPS打开PDF文件的目录 其实WPS中PDF文件并没有像Word那样标准的目录&#xff0c;但是倒是有书签&#xff0c;和目录一个效果 点击左上角书签选项&#xff0c;或者使用Alt Shift 1快捷键即可

下载动画人物

1、网址&#xff1a;动画 2、点击Characters 3、搜索人物 4、点击弹出的人物&#xff0c;弹出对话框选择USE THIS CHARACTER 5、下载 6、点击Animations&#xff0c;搜索walk 7、点击UPLOAD CHARACTER&#xff0c;看到男孩步行&#xff0c;选择In Place&#xff0c;点击下载&…

Vue3框架搭建4:配置说明-eslint配置

配置说明&#xff1a; .eslintrc.cjs&#xff1a; /* eslint-env node */ //node环境&#xff0c;并引入一个模块解析补丁 require(rushstack/eslint-patch/modern-module-resolution)module.exports { //继承其他配置root: true, //跟配置文件&#xff0c;ESLint不会在父目…

顺序表(python)

文章目录 1.创建顺序表2.按址查找元素的位置3.增加元素3.1在头部增加元素3.2在尾部增加元素3.3在中间任意位置增加元素 4.删除元素4.1删除第一个元素4.2删除指定的元素 5.顺序表清空 在计算机科学中&#xff0c;数据结构是组织、管理和存储数据的方式。顺序表&#xff0c;也称为…

【安全设备】APT攻击预警平台

一、什么是APT 高级持续性威胁&#xff08;APT&#xff09;是一种高度复杂和长期的网络攻击&#xff0c;旨在通过持续监视和访问特定目标来窃取敏感信息或进行其他恶意活动。这种攻击结合了多种先进的技术手段和社会工程学方法&#xff0c;以极高的隐蔽性实现长期潜伏和信息窃…

基于RHCE基础搭建简单服务

目录 项目标题与需求一 配置IP地址server机node02机 二 配置web服务三 搭建dns服务器四 开启防火墙server firewalld 五 配置nfs服务器node02 nfsserver autofs 六 开启SELinux七 验证是否能访问www.rhce.com 项目标题与需求 项目标题&#xff1a; 项目需求&#xff1a; 现有…

c++ 建造者模式

文章目录 建造者模式为什么使用建造者模式建造者模式实现步骤实现示例建造者模式优缺点 建造者模式 建造者模式&#xff08;Builder Pattern&#xff09;是面向对象设计模式中的一种&#xff0c;主要用于创建复杂对象。这种模式将对象的构建过程与其表示分离&#xff0c;允许用…

python+Selenium自动化之免登录(cookie及token)

目录 cookie免登录 通过接口获取cookie 启用浏览器绕过登录 添加token 使用登录可以减去每次登录的重复操作&#xff0c;直接操作系统登录后的菜单页面&#xff0c;也可以减少安全验证登录&#xff0c;如图像验证登录的操作。注意&#xff1a;cookie和token都有有效期。 c…

京东.Vision首登苹果Vision Pro 背后的技术探索

去年6月&#xff0c;苹果正式发布首款头显设备Apple Vision Pro&#xff0c;今年6月28号&#xff0c;Apple Vision Pro正式在中国发售。京东.Vision作为首批原生应用登陆Vision Pro平台&#xff0c;首期以家电家居与潮流数码产品作为切入口&#xff0c;未来将逐步拓展至全品类&…

递推(C语言)

文章目录 1.斐波那契数列2.太波那契数列3.二维递推问题4.实战4.1 力扣509 斐波那契数4.2 力扣70 爬楼梯4.3 力扣119 杨辉三角|| 递推最通俗的理解就是数列&#xff0c;递推和数列的关系就好比 算法 和 数据结构 的关系&#xff0c;数列有点 像数据结构中的线性表(可以是顺序表&…

第11章 规划过程组(三)(11.11规划成本管理)

第11章 规划过程组&#xff08;三&#xff09;11.11规划成本管理&#xff0c;在第三版教材第403~404页&#xff1b; 文字图片音频方式 第一个知识点&#xff1a;成本管理概述 1、成本的类型&#xff08;重要知识点&#xff09; 直接成本 如项目团队差旅费、工资、项目使用的…

【简历】西安某211大学研究生:Java简历面试通过率低

注&#xff1a;为保证用户信息安全&#xff0c;姓名和学校等信息已经进行同层次变更&#xff0c;内容部分细节也进行了部分隐藏 简历说明 这个同学是211研究生的一份Java简历,这个简历版面没有问题,但是因为主项目重复度过大,所以导致这个简历的简历通过率会大大降低,面试通过…

从基础到进阶:无线局域网技术解析

在局域网刚刚问世后的一段时间内&#xff0c;无线局域网的发展比较缓慢&#xff0c;其原因是价格贵、数据传输速率低、安全性较差。但自20世纪80年代末以来&#xff0c;由于人们工作和生活节奏的加快&#xff0c;以及移动通信技术的飞速发展&#xff0c;无线局域网逐步进入市场…

el-dialog弹框里面的组件第二次打开create不生效

问题: el-dialog弹框嵌套了一个组件,第二次打开create不生效. 原因:display&#xff1a;none和display&#xff1a;block来控制显示隐藏的&#xff0c;dom元素不会被删除&#xff0c;所以dialog弹框里面的内容只会初始化的时候创建dom元素渲染页面&#xff0c;如果里面有组件且…

浅谈ES6

ES6&#xff1a;即 ECMAScript 6&#xff0c;是 JavaScript 语言的重要版本更新&#xff0c;引入了众多新的语法和特性&#xff0c;如箭头函数、模板字符串、类、模块等&#xff0c;使 JavaScript 编程更加简洁和强大。 ESM&#xff1a;全称 ECMAScript Modules&#xff0c;是 …

前端新手小白的React入坑指南

有个小伙伴跟我说&#xff0c;已经毕业了&#xff0c;开始实习了。但公司现在用的还是Vue&#xff0c;领导说是过段时间让他用React做项目&#xff0c;先自己学习起来。 我给他找了一些文档&#xff0c;顺便着呢&#xff0c;反正自己也写博客&#xff0c;自己也写一份吧&#x…

归并树的带权路径长度

归并树&#xff08;又称霍夫曼树&#xff0c;Huffman Tree&#xff09;是一种用于数据压缩的树形结构&#xff0c;通过构建具有最小带权路径长度的树来实现高效编码。在归并树中&#xff0c;带权路径长度&#xff08;Weighted Path Length&#xff0c;WPL&#xff09;是衡量树的…

破解Memcached缓存数据不均:优化策略与实践指南

破解Memcached缓存数据不均&#xff1a;优化策略与实践指南 Memcached作为广泛使用的高性能分布式内存缓存系统&#xff0c;在处理大规模数据缓存时&#xff0c;可能会遇到缓存数据分布不均的问题。这不仅影响缓存效率&#xff0c;还可能导致系统性能瓶颈。本文将深入探讨Memc…

无需构建工具,快速上手Vue2 + ElementUI

无需构建工具&#xff0c;快速上手Vue2 ElementUI 在前端开发的世界中&#xff0c;Vue.js以其轻量级和易用性赢得了开发者的青睐。而Element UI&#xff0c;作为一个基于Vue 2.0的桌面端组件库&#xff0c;提供了丰富的界面组件&#xff0c;使得构建美观且功能丰富的应用变得…

前端JS特效第30集:jQuery焦点图插件edslider

jQuery焦点图插件edslider&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下(全部代码在文章末尾)&#xff1a; <!DOCTYPE html> <html lang"zh"> <head> <meta charset"UTF-8"> <meta http-equiv"X-UA-Compatib…