设计与开发

定时器模式 单片机 单片机怎么做定时器矩阵,彻底解决各种定时问题?

小编 2024-10-05 设计与开发 23 0

单片机怎么做定时器矩阵,彻底解决各种定时问题?

大家好,我是无际。

定时功能非常常用,可以说是刚需,也可以说是很多人的痛点。

做LED闪烁效果要用定时、按键扫描要定时、数码管扫描要定时、滤波要定时等等。

曾经,我在产品开发的时候也被各种定时需求搞得焦头烂额。

还好,后面我自己写了一个定时器的程序架构,今天一步到位,,彻底解决各种定时的问题

最近无际单片机编程有几个学员在学习的时候搞不懂这个。

我借此写了这篇文章,然后基于这个文章内容来给学员们直播讲解。

一、为什么我要搞定时器矩阵

定时器矩阵这个概念是我自创的,简单来说就是很多不同定时时间的软件定时器组合。

因为产品开发这么多年,总有乱七八糟的精准定时需求,有50us的,有1ms的,有10ms的,有50ms的,有100ms的等等。

如果没有一个很好的程序架构的话,不同的精准定时需求一多,代码就会很混乱,而且也不好管理,移植性和可扩展性那些就更不用提了。

二、解决需求的思路

然后我就在想,我能不能设计一个定时器的程序架构,让它能够适应所有的精准定时需求。

我的思维雏形大概是这样的。

图左边是定时器时间源, 类似于我们的时钟源,一般我是用单片机定时器中断做个50us的定时,因为用定时器做时间比较精准。

为什么要用50us?因为我产品的RFD波形定时采集频率是50us采一次。

如果你产品没定时这么频繁的功能需求,你完全可以把定时时间源配置成10ms,甚至100ms,这个是根据不同的产品去调整的。

图右边的就是定时器矩阵, 就是各种乱七八糟的不同定时需求组合,比如LED特效定时功能的定时需求、RFD波形定时采集、RFD重复码滤波延时等等。

最终这些定时器矩阵都有一个时间单位/基准,这个时间单位/基准是由定时器时间源提供,如果我配置定时器中断是50us,那定时器矩阵的时间单位就是50us。

有了这种想法以后,剩下的就是考验你的经验和代码水平了。

三、代码设计思路

一个工程师工作越久,做过的项目越多,就要慢慢形成一个面向对象的思维

虽然上面雏形出来了,但是我相信很多人依然不知道怎么动手去写代码。

这个是正常的,最好的方法就是先抄后超

我是用面向对象的思维去做的 ,对于c语言来说,结构体是实现面向对象最好的方式

这里的对象不是你的男女朋友,而是世间万物皆可以当做一个对象。

比如说人是一个对象,这个对象有很多属性 ,比如说性别、年龄、身高、体重等等。

Ok,那在程序里,如何把这个对象的特征用结构体展现出来呢?

可以通过下面这个代码:

那回到我们定时器矩阵这里,我们把定时器矩阵当做一个对象

那这个定时器矩阵都需要具备哪些共同的特征

我总结了下面几个:

需要有个变量当做开关标志控制该定时器启动/停止 需要有个变量当做当前的定时值 需要有个变量当做该定时器的定时周期。 定时时间到了以后,需要去执行相应动作,为了灵活使用,需要一个函数指针。

那用结构体来表示代码如下:

这里很多人可能有点懵逼,我怎么想不到要这些东西呢?

这个是正常的,不用去纠结,我也不是一开始就把这几个成员都想到的,而是后面做功能的时候慢慢完善的,你刚开始抄我的思维就行了。

后面很多应用都是用这种套路去做的,比如说我们的任务管理、比如菜单这些,用多了自然就熟了,以后你自己也能设计别的对象了。

Ok,这样我们就把定时器矩阵这个对象的特征设计好了。

四、定时器代码实战

1.前面我们用结构体自定义了一个定时器的对象来,下面就要用这个定时器对象”生”出定时器矩阵。

我们直接用定义结构体数组的方式,T_SUM就是我们定时器矩阵的个数,也就是我产品有多少个定时器需求。

后面我们所有的操作都是围绕这个结构体来进行的。

2.配置定时器矩阵时间源,初始化定时器矩阵参数

A). 我们首先要给这个定时器矩阵一个时间源,也就是配置我们要去配置单片机定时器中断。

我们的定时频率配置的是50us,是因为我们产品有的功能最短需要50us的定时。

然后,我们需要写一个初始化函数,去调用这个定时器配置,以及初始化定时器矩阵参数。

B). 然后在这个50us定时器中断函数里,去实现给定时器矩阵定时代码。

这里,我单独写了一个函数。

然后我们在定时器中断函数里调用这个函数,实现给定时器矩阵定时。

3.附加功能

定时器矩阵时间源配置好了,但是我们还需要一些函数来操作定时器矩阵对吧?

A). 编写创建定时器

我希望定时器能像任务一样,想要的时候创建,所以就有了创建定时器函数。

我们创建定时器的时候这样调用就可以了。

B). 复位定时器

如果说我们需要循环定时的话,在定时时间到了以后就需要复位定时器,让定时器重新启动。

除了以上以外,其他功能可以自己去完善,比如说控制定时器状态、删除定时器、获取定时器时间,这里就不一一举例了。

完整的代码和视频教程,大家可以找无际单片机编程来拿。

有了这个定时器程序架构,以后开发产品再也不怕有各种定时需求啦,使用方便,移植性也强,如果加个动态分配,就更完美了。

《51单片机基础》:定时器

咱们今天就聊一聊那些年单片机关于定时器与中断方面的事儿,其实定时器实质上就是一个加1计数器。它随着计数器的输入脉冲进行自加1,也就是说当每来一个脉冲,计数器就会自动加1,如果当加到计数器为全1时,再输入一个脉冲就使计数器回零,且计数器的溢出使相应的中断标志位置1,向CPU发出就会发出中断请求。

再讲讲中断吧,有不少单片机初学者对中断有些懵,不知道它的用法,讲个生活例子就是比如你在家里看电视,突然门铃响啦此时你的第一选择就是去开门,打断你做原来事情让你优先去做开门这件事,这就是所谓中断。

当你这件事情结束之后,你又可以继续去看电视。关于单片机中断优先级的问题,小伙伴一定要勤于动手,勤于动脑的查找资料。所以接下来写一个关于定时器与中断的实验,将数码管上电之后8位都显示6,然后定个时间就两秒后全显示2,因为一些原因只能给小伙伴们截两张图片,不过有兴趣的小伙伴可以验证代码的正确性,都这样说啦,代码都是作者亲自验证过的(哈哈哈),行,接下来直接给小伙伴们上图

主函数部分:

定时器主要代码:

实验现象:

哈哈,今天的实验就分享到这里,也希望小伙伴们能够喜欢、点赞。

相关问答

单片机 的振荡频率为6MHZ,设 定时器 工作在方式1需要定时1MS,...

[最佳回答]工作在方式1,定时时间为1000微秒晶振频率=6MHZ则定时时间T=(2的16次方-X)12/6MHZ=1000解出X=2的16次方-500工作在方式1,定时时间为1000微秒...

单片机定时器 一直执行吗?

单片机定时器如果配置了自动重载,那是一直执行的。单片机定时器的原理就是给单片机定时器模块的计数单元赋一个初值,使能定时器后,计数器值开始在初值的基础...

51 单片机 T0 定时器 4种方式的定时时长分别是多少 - 懂得

51单片机最大硬件定时时间,就是定时器能定时的时间,最长时间=65536*TcTc=fosc/12,fosc是单片机的晶振频率。以频率=12M为例吧,Tc=1us最大定时时间=6...

单片机定时器 工作原理?

1、实质是计数器,脉冲每一次下降沿,计数寄存器数值将加1。2、计数的脉冲如果来源于单片机内部的晶振,由于其周期极为准确,这时称为定时器。3、计数的脉冲如...

定时器 单片机 的区别?

它们的区别是,单片机包含了定时器,定时器是单片机的一个单元,它们的区别是,单片机包含了定时器,定时器是单片机的一个单元,

51 单片机 用C语言或者汇编程序如何实现定时1秒?如何设定初始值?如何计算?如何输出方波?如何对外部?

使用定时器实现1秒定时;初始值要看单片机配置的晶振频率了,若12M晶振,初始值为TH0=0x3c;TL0=0xb0;这才是50ms,还要一个单元做计数器,计数20次才是1秒方波...

51 单片机 中设置 定时器模式 时,TMOD|=0x01和TMOD=0x01有什么区别?

TMOD是51单片机内的定时器寄存器名称,TimerMode即为定时模式的意思51单片机的定时模式有四种,所以用TMOD=?来选择哪一种,10h表示的是16进制数,也可表示为...

8051 单片机定时器 原理?

8051单片机定时器工作原理及用法TMOD:控制定时器的工作方式。8个bit,高四位bit控制T1,、低四位bit控制T0。因为定时器有4种工作方式;TMOD=0x00(工...

单片机 汇编语言的 定时器 如何定义和调用使用?

TMOD定时器/计数器模式控制寄存器写入模式TH0,TL0写入初值一般为中断调用要使能计时器0时间中断,还要使能中断有效这样开中断,就可以了TMOD定时器/计数...

单片机 定时/计数器和中断到底有什么用?

定时器用来计算时间,固定时间触发中断。计数器用来对引脚输入的信号下降沿进行计数。和中断相关,但不一定要开中断。可以单独用。定时器用来计算时间,固定...

猜你喜欢