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

news2024/12/24 0:14:42

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和TH0
		TL0=15535%256;
		TH0=15535/256;
		if(count--==0){
			//说明中断了10次,500ms到了,干活了
			//LED取反
			LED=!LED;
			count=CNT;//我们要进行10,所以一定要进行再次赋值
		}
}

完整代码

#include<reg51.h>


unsigned char count;//10次,对应500ms

sbit LED=P0^1;	//LED对应的CPIO定义

#define CNT 20


//中断处理程序
void timer0_isr(void) interrupt 1 using 1	//表示外部中断号【在“中断”数据手册中有】
{
	//因为我们要多次进行中断处理程序,所以我们要自己手动修改计数值,要不然进行一次就结束
	//如果不想多次中断,则不要进行手动重载TL0和TH0
		TL0=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,一般常用的都是减法定时器。虽然我们加法定时器和减法计时器都可以实现功能,但是明显减法定时器更加直观

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

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

相关文章

PyCharm中使用pyqt5的方法2-2

1.2 是否下载成功 按照以上步骤安装了“pyqt5”、“pyqt5-tools”模块和“pyqt5designer”模块后&#xff0c;可以打开保存这三个模块的路径&#xff0c;找到其对应的文件夹&#xff0c;即可验证是否下载成功。 获取PyCharm保存下载模块路径的方法是&#xff0c;在PyCharm界面…

Blender 之创建一个简单的笔筒

文章目录 成品图实现步骤 你是不是想创建一个笔筒捏&#xff1f; follow me! 成品图 实现步骤 先添加一个柱体 选中柱体&#xff0c;然后按tab 进入编辑模式 切换到面模式 &#xff08;可以按主键盘的 3 键&#xff09; 分别选中上下面&#xff0c;鼠标右键&#xff0c;选…

风力发电一键求助可视对讲终端

SV-11SV 风力发电一键求助可视对讲终端 SIP可视对讲终端SV-11SV是专门针对行业用户需求研发的一款高性价比SIP可视对讲产品&#xff0c;外观精致&#xff0c;功能强大&#xff0c;集智能安防、音/视频对讲和广播功能于一体&#xff0c;性价比高。支持壁挂式安装方式。防护等级满…

安达发|在国外APS自动排程软件案例比比皆是

在国外&#xff0c;APS&#xff08;自动排程系统&#xff09;的应用已经非常普遍&#xff0c;它们在各个领域都取得了显著的成果。本文将为您详细介绍国外APS自动排程的案例&#xff0c;以及它们在实际生产中的价值和意义。 1. 制造业 在制造业领域&#xff0c;APS自动排程系统…

JDK下载安装配置教材

1.JDK下载 目前市面上的公司大多数采用的是jdk8进行开发 &#xff0c;所以本文就以jdk8的下载安装配置为例来讲解。 因为Oracle的官网地址访问网速比较慢&#xff0c;所以下载速度较慢&#xff0c;本文我演示的是jdk8的下载&#xff0c;如果需要下载jdk8的小伙伴可以直接在我…

26047-2022 一次柱式锂电池绝缘子 思维导图

声明 本文是学习GB-T 26047-2022 一次柱式锂电池绝缘子. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了一次柱式锂电池绝缘子产品的分类和标记、技术要求、试验方法、检验规则、标志、包 装、运输、贮存和随行文件及订货单内容…

【JVM】第四篇 垃圾收集器ParNewCMS底层三色标记算法详解

导航 一. 垃圾收集算法详解1. 分代收集算法2. 标记-复制算法3. 标记-清除算法4. 标记-整理算法二. 垃圾收集器详解1. Serial收集器2. Parallel Scavenge收集器3. ParNew收集器4. CMS收集器三. 垃圾收集底层三色标记算法实现原理1. 垃圾收集底层使用三色标记算法的原因?2. 垃圾…

C++ - set 和 map 的实现(下篇)- set 和 map 的迭代器实现

前言 在上篇当中我们为了 让红黑树适用于 set 和 map 对红黑树进行了修改&#xff0c;还是实现了红黑树的迭代器&#xff0c;因为 set 和 map 的底层都是使用 红黑树&#xff0c;那么&#xff0c;set 和 map 的迭代器也就实现了。具体可以看本博客的上篇&#xff1a;C - map 和…

Windows提权辅助工具WES-NG使用

Windows提权辅助工具WES-NG使用 1.下载安装2.开始使用1.下载安装 WES-NG 执行此命令更新CVE数据库: python wes.py --update2.开始使用 首先,生成系统systeminfo信息,并重定向一个txt文件中: systeminfo > systeminfo.txt查找提权可以利用的CVE: python wes.py s…

还不知道数据类岗位的相关技能和职责吗?涤生大数据告诉你(二)

续接上文&#xff1a;还不知道数据类岗位的相关技能和职责吗&#xff1f;涤生大数据告诉你&#xff08;一&#xff09; 1.数据治理工程师 工作职责 数据治理工程师的工作职责主要包括以下几个方面&#xff1a; 1. 数据管理策略制定&#xff1a;制定和实施数据管理策略&#…

【HCIE】VXLAN

VXLAN简介 介绍VXLAN的定义、目的和收益。 定义 RFC7348定义了VLAN扩展方案VXLAN&#xff08;Virtual eXtensible Local Area Network&#xff09;。VXLAN采用MAC in UDP&#xff08;User Datagram Protocol&#xff09;封装方式&#xff0c;是NVO3&#xff08;Network Virt…

YashanDB向量化执行引擎如何给海量数据分析提速

作者介绍&#xff1a;李伟超&#xff0c;数据库系统架构师&#xff0c;YashanDB架设技术开发负责人&#xff0c;10年以上数据库内核技术开发经验。 *全文4510个字&#xff0c;阅读时长约11分钟。 背景 海量数据OLAP场景&#xff0c;通常具有数据规模大、查询复杂度高、处理速…

【ESP-IDF篇】搭建ESP-IDF软件开发环境,包括手动命令行和VSCode两种方式

忘记过去&#xff0c;超越自己 ❤️ 博客主页 单片机菜鸟哥&#xff0c;一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2023-09-27 ❤️❤️ 本篇更新记录 2023-09-27 ❤️&#x1f389; 欢迎关注 &#x1f50e;点赞 &#x1f44d;收藏 ⭐️留言&#x1f4dd;&#x1f64…

三相无感正弦波 BLDC 驱动MS39539/MS39535

产品简述 MS39539 和 MS39535 是无感三相直流电机驱动芯片&#xff0c;采用 正弦波驱动方式&#xff0c;具有低噪声及低震动的特点。 MS39539 和 MS39535 特别针对电机启动进行了优化&#xff0c;相比 MS39549 和 MS39545 适用于反向电动势更小的电机。 有一个速…

《数据结构、算法与应用C++语言描述》-栈的应用-列车车厢重排问题

列车车厢重排问题 一列货运列车有 n 节车厢&#xff0c;每节车厢要停靠在不同的车站。假设 n个车站从 1 到n 编号&#xff0c;而且货运列车按照从n到1的顺序经过车站。车厢的编号与它们要停靠的车站编号相同。为了便于从列车上卸掉相应的车厢&#xff0c;必须按照从前至后、从…

c语言练习68:文件的随机读写

文件的随机读写 fseek fseek 根据⽂件指针的位置和偏移量来定位⽂件指针。 1 int fseek ( FILE * stream, long int offset, int origin ); 例子&#xff1a; /* fseek example */ #include <stdio.h> int main () {FILE * pFile;pFile fopen ( "example.txt&…

接口测试的总结文档

接口测试的总结文档 第一部分&#xff1a;主要从问题出发&#xff0c;引入接口测试的相关内容并与前端测试进行简单对比&#xff0c;总结两者之前的区别与联系。但该部分只交代了怎么做和如何做&#xff1f;并没有解释为什么要做&#xff1f; 第二部分&#xff1a;主要介绍为什…

Java流的体系结构(一)

文章目录 一、文件读写操作FileReader和FileWriter1.main()2.FileReader1.说明&#xff1a;2.代码案例 3.对read()操作升级&#xff1a;使用read的重载方法4.FileWriter的使用1.说明2.代码 4.FileReader和FileWriter综合使用 二、使用步骤1.引入库 二、测试FileInputStream和Fi…

新型信息基础设施IP追溯:保护隐私与网络安全的平衡

随着信息技术的飞速发展&#xff0c;新型信息基础设施在全球范围内日益普及&#xff0c;互联网已经成为我们社会和经济生活中不可或缺的一部分。然而&#xff0c;随着网络使用的增加&#xff0c;隐私和网络安全问题也引发了广泛关注。在这个背景下&#xff0c;IP&#xff08;In…

XML文件反序列化读取

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