单片机怎么做定时器矩阵,彻底解决各种定时问题?
大家好,我是无际。
定时功能非常常用,可以说是刚需,也可以说是很多人的痛点。
做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). 复位定时器
如果说我们需要循环定时的话,在定时时间到了以后就需要复位定时器,让定时器重新启动。
除了以上以外,其他功能可以自己去完善,比如说控制定时器状态、删除定时器、获取定时器时间,这里就不一一举例了。
完整的代码和视频教程,大家可以找无际单片机编程来拿。
有了这个定时器程序架构,以后开发产品再也不怕有各种定时需求啦,使用方便,移植性也强,如果加个动态分配,就更完美了。
单片机怎么做定时器矩阵,彻底解决各种定时问题?相关推荐
- 独立按键和矩阵按键c语言,单片机独立按键与矩阵按键原理图
当前位置:电工之家 > 电工知识 > 单片机 > 正文 单片机独立按键与矩阵按键原理图 时间:2017-02-22 12:40 来源:电工之家 单片机独立按键与矩阵按键原理图 独立按 ...
- 51单片机学习-5定时器与中断
5 定时器与中断 [toc] 注:笔记主要参考B站江科大自化协教学视频"51单片机入门教程-2020版 程序全程纯手打 从零开始入门". 注:工程及代码文件放在了本人的Github ...
- 51单片机可以用来做什么?单片机可以做的小产品
51单片机麻雀虽小五脏俱全,在家用.玩具等消费类领域有非常多的应用. 新手刚学习完51单片机以后,不要直接就进阶到STM32. 而是通过51单片机来做一些小产品来巩固下编程基础,当你轻松玩转几个项目的 ...
- 单片机能做什么,你有什么有单片机或开源硬件做的有意思的作品吗
单片机能做什么,你有什么有单片机或开源硬件做的有意思的作品吗 NiceDay,桌面天气预报,3天天气预报,北京时间校准. 前几天刚完成的的一个小玩意,放桌面上挺好看的,STM32+ESP8266,心知 ...
- 51单片机中断与定时器计数器,基于普中科技HC6800-ESV2.0
目录 寄存器 置位复位 中断系统 中断概念 中断系统 中断系统构造 外部中断 计时器.定时器中段 串口中断 中断允许控制(控制中断方式) 总中断 各个中断 中断请求标志(控制触发方式) 外部中断触发方 ...
- 【STC8A8K64S4A12开发板】—开始做 定时器/计数器 实验啦
版权声明:本文为博主原创文章,转载请附上原文出处链接. 文章目录 前言 一.硬件设计 1.TIMER概念介绍 2.STC8A8K64S4A12系列单片机定时器/计数器介绍 3.定时器/计数器工作模式 ...
- C51单片机——中断与定时器
中断是大多数CPU最精彩的部分之一,下面我们通过讲解和编程练习学习中断和定时器相关概念 目录 1.1.什么是中断 1.2.中断的种类 1.3中断的相关概念 1.4. 51单片机可用中断及相关引脚 1. ...
- 51单片机可以做什么实用的产品?
我用51的单片机做过不少于10款产品了. 我看到很多文章,说51已经过时了,新手没必要学习51单片机,可以直接学STM32. 我个人认为这种说法存在一定的误导,51还是有很大的市场. 很多人想从事嵌入 ...
- 单片机要学多久才能自己开发?学单片机以后做什么?
大家好,我是无际单片机编程的徐工. 要说学多久才能自己开发,不妨我给大家分享一下我的单片机学习之路. 我学习单片机一方面是因为大一的时候进入了学校电子大赛实验室,另一方面是因为我从中学开始就对电子比较 ...
最新文章
- 简述nodejs、npm及其模块在windows下的安装与配置
- 我为什么用ES做Redis监控,不用Prometheus或Zabbix?
- Tutorial on Variational AutoEncoders
- android 电源管理 wakelock 唤醒锁机制
- CompletableFuture java 8新增加异步处理
- 舒服了!淘宝、支付宝等阿里系App取消开屏广告:秒开
- toadstool sql格式化
- 一段.net 发邮件的代码
- 调用sklearn包中的PLA算法[转载]
- intellij idea 2016.3.5 控制台取消行数限制
- 大数据认知实习的实习目的_如何在数据实习中取得成功
- Asterisk 入门教程
- 基于java嗖嗖移动业务大厅
- chrome浏览器版本与驱动不匹配问题的解决办法
- easyui 合并列_Easyui 合并单元格_EasyUI 教程
- python绘制单线图_如何绘制管道单线图
- Hbuild-X使用生成签名证书失败,怎么解决 +云打包
- 紫书之路——5-9 数据库
- 区块链革命 - 推荐序二 区块链已成为金融科技的底层技术
- 阿里云云计算专业考试线上视频培训课程(ACP级)