大家好,我是无际。

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

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

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

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

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

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

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

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

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

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

二、解决需求的思路

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

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

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

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

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

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

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

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

三、代码设计思路

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

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

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

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

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

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

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

可以通过下面这个代码:

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

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

我总结了下面几个:

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

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

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

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

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

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

四、定时器代码实战

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

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

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

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

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

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

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

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

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

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

3.附加功能

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

A). 编写创建定时器

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

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

B). 复位定时器

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

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

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

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

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

  1. 独立按键和矩阵按键c语言,单片机独立按键与矩阵按键原理图

    当前位置:电工之家 > 电工知识 > 单片机 > 正文 单片机独立按键与矩阵按键原理图 时间:2017-02-22 12:40 来源:电工之家 单片机独立按键与矩阵按键原理图 独立按 ...

  2. 51单片机学习-5定时器与中断

    5 定时器与中断 [toc] 注:笔记主要参考B站江科大自化协教学视频"51单片机入门教程-2020版 程序全程纯手打 从零开始入门". 注:工程及代码文件放在了本人的Github ...

  3. 51单片机可以用来做什么?单片机可以做的小产品

    51单片机麻雀虽小五脏俱全,在家用.玩具等消费类领域有非常多的应用. 新手刚学习完51单片机以后,不要直接就进阶到STM32. 而是通过51单片机来做一些小产品来巩固下编程基础,当你轻松玩转几个项目的 ...

  4. 单片机能做什么,你有什么有单片机或开源硬件做的有意思的作品吗

    单片机能做什么,你有什么有单片机或开源硬件做的有意思的作品吗 NiceDay,桌面天气预报,3天天气预报,北京时间校准. 前几天刚完成的的一个小玩意,放桌面上挺好看的,STM32+ESP8266,心知 ...

  5. 51单片机中断与定时器计数器,基于普中科技HC6800-ESV2.0

    目录 寄存器 置位复位 中断系统 中断概念 中断系统 中断系统构造 外部中断 计时器.定时器中段 串口中断 中断允许控制(控制中断方式) 总中断 各个中断 中断请求标志(控制触发方式) 外部中断触发方 ...

  6. 【STC8A8K64S4A12开发板】—开始做 定时器/计数器 实验啦

    版权声明:本文为博主原创文章,转载请附上原文出处链接. 文章目录 前言 一.硬件设计 1.TIMER概念介绍 2.STC8A8K64S4A12系列单片机定时器/计数器介绍 3.定时器/计数器工作模式 ...

  7. C51单片机——中断与定时器

    中断是大多数CPU最精彩的部分之一,下面我们通过讲解和编程练习学习中断和定时器相关概念 目录 1.1.什么是中断 1.2.中断的种类 1.3中断的相关概念 1.4. 51单片机可用中断及相关引脚 1. ...

  8. 51单片机可以做什么实用的产品?

    我用51的单片机做过不少于10款产品了. 我看到很多文章,说51已经过时了,新手没必要学习51单片机,可以直接学STM32. 我个人认为这种说法存在一定的误导,51还是有很大的市场. 很多人想从事嵌入 ...

  9. 单片机要学多久才能自己开发?学单片机以后做什么?

    大家好,我是无际单片机编程的徐工. 要说学多久才能自己开发,不妨我给大家分享一下我的单片机学习之路. 我学习单片机一方面是因为大一的时候进入了学校电子大赛实验室,另一方面是因为我从中学开始就对电子比较 ...

最新文章

  1. 简述nodejs、npm及其模块在windows下的安装与配置
  2. 我为什么用ES做Redis监控,不用Prometheus或Zabbix?
  3. Tutorial on Variational AutoEncoders
  4. android 电源管理 wakelock 唤醒锁机制
  5. CompletableFuture java 8新增加异步处理
  6. 舒服了!淘宝、支付宝等阿里系App取消开屏广告:秒开
  7. toadstool sql格式化
  8. 一段.net 发邮件的代码
  9. 调用sklearn包中的PLA算法[转载]
  10. intellij idea 2016.3.5 控制台取消行数限制
  11. 大数据认知实习的实习目的_如何在数据实习中取得成功
  12. Asterisk 入门教程
  13. 基于java嗖嗖移动业务大厅
  14. chrome浏览器版本与驱动不匹配问题的解决办法
  15. easyui 合并列_Easyui 合并单元格_EasyUI 教程
  16. python绘制单线图_如何绘制管道单线图
  17. Hbuild-X使用生成签名证书失败,怎么解决 +云打包
  18. 紫书之路——5-9 数据库
  19. 区块链革命 - 推荐序二 区块链已成为金融科技的底层技术
  20. 阿里云云计算专业考试线上视频培训课程(ACP级)

热门文章

  1. 一文带你看懂Springboot核心功能及优缺点
  2. 一些改进模型速度/精度的工程方法
  3. 你真的了解深度学习生成对抗网络(GAN)吗?
  4. 15个相见恨晚的 Linux 神器,你可能一个都没见过
  5. mac下找不到.m2文件解决方法
  6. Django源码分析5:session会话中间件分析
  7. Django模板之jinja2模板和CSRF
  8. 数据结构之二叉搜索树(BST)
  9. 如何更改linux文件目录拥有者及用户组
  10. 目标检测算法终结篇:YOLOv7(非正式版)正式开源