单片机sleep函数的头文件_单片机代码模块化设计思想浅谈

前言:前段时间分享的文章【单片机裸机代码框架设计思路】,很多读者给我留言,觉得很不错,对于初学者而言,这是一个进阶的技巧,对于我而言,这是对自己总结和表达能力的一个提升。

本文章我们再谈谈单片机代码的模块化设计思想是如何设计的。之前的【单片机裸机代码框架设计思路】文章为了尽量简洁的表达,我几乎所有代码都放在了main.c中,这个在实际项目中,或者说当任务比较多的时候,几乎是不太现实的。

模块化设计的目的是让代码高内聚,低耦合,是为了降低程序复杂度,使程序设计、调试和维护等操作简单化

第一点:单独的功能模块各自独立建立xxx.c和xxx.h文件

这一点相信大家可能都知道,因为51单片机的书都有讲,如果您已经知道了,请跳过第一点。

下面以之前的文章单片机裸机代码为例进行说明:如下图所示

我把功能代码分成了4大块:

  • 定时器功能代码:timer0.c、timer0.h
  • Task裸机框架功能代码:task.c、task.h
  • 中断函数功能代码:interrupt.c、interrupt.h(任务很少,也可以不分出来,看具体情况)
  • 公共函数功能代码:public.c、public.h(存放一些公共的函数和全局变量)
12cb0c82e6c42be6270a87af943da8e2.png

(1)定时器功能代码:timer0.c、timer0.h

可以看出:timer0.c包含了3个常用函数,和1个定时器结构体变量,定时器中断是放在interrupt.c里面

8db5eade15f7b0328bb105bc4f5912d6.png

timer0.h包含一些常用的宏定义,和结构体变量类型定义,对于常用的2ms/5ms/10ms定义初始值,可以使用宏定义,修改起来就会很方便,如下所示,这是一个小技巧

为什么使用TIMER_VALUE来代替T5ms时,是因为如果不使用这个宏,那么定时器初始化的时候要给TL0/TH0赋值T5ms,在定时器中断函数中还要赋值一次,我需要改动两个地方,中断赋值很容易被忽略掉,所以使用TIMER_VALUE宏定义代码,我就可以只需要改T5ms就可以一次性更改定时器中断的时间。

c3f3d9b92755c49dab9e43c7d793f22b.png

(2)Task裸机框架功能代码:task.c、task.h

task.c包含裸机代码框架中功能所有代码,心跳函数,初始化任务,启动任务,停止任务还有任务处理函数

b6d45350babb0f2a463c7ffb4765fa8c.png

task.h代码如下:包含任务的数组定义等等

fa124b2476d3bf818d1f10324750ee43.png

(3)中断函数功能代码:interrupt.c、interrupt.h

这个范例代码比较简单,只有1个定时器的中断函数,如下所示

a57f87dfa79c9c0e9f083e1322fa1b1c.png

(4)公共函数功能代码:public.c、public.h

存放公共函数,比如禁止总中断,使能总中断,软件延时函数等等

0c0f37885dc5ae6c57daa825b6c1eec8.png

要特别提到的一点,这是一个小技巧:public.h包含所有外设的头文件和常用的C语言库头文件,这样做的好处是,只需要修改这一个地方,其余.c文件只需要包含一条include "public.h"就可以了。

ac5a2c093a399c08df0b729ef78cdc4f.png

第二点:结构化封装外设

这个才是本文章我想提到的重点,对于一般初学者而言,可能写的最多的就是Timer0_Init(); 然后和Timer0_ISR() 函数,然后main.c调用就完事了。这种写法的确简单,也好理解,但是如果你的外设特别多,如果还有ADC,传感器,等等,你需要定义全局变量传递参数时,外设越多,那么全局变量就越多,后续修改起来,你就会发现太痛苦了,能把功能实现就不错了。

我们现在把定时器0就当做一个外设,

[1]、在外设对应头文件中,比如timer0.h中,声明一个结构体变量类型,如下图图所示,里面包含了3个函数指针,也可以在结构体中定义变量,比如浮点数,比如数组等等。不过定时器用不着。这里就只有函数指针了。

8dd4bc2095e64a945b86fcf8caa4aba3.png

[2]、在外设对应的源文件中,比如timer0.c中,定义一个Timer0_t类型的结构体变量,并同时赋值,注意顺序不能错,因为前面定义的是函数指针,所以我们只需要用对应的函数名称赋值就好,这种做法,也可以称呼为注册回调函数.这些回调函数因为是通过结构体变量来调用,所以前面请加static修饰,表示只能在本文件中使用,如果是其他文件要使用,请直接通过结构体变量来调用,这就达到了封装的目的。

07f2ada1a23cd13187b20ab6efc43910.png

很多人不明白回调函数,这里简单提一下,将函数名称作为参数传递给函数指针,通过函数指针来调用该函数的功能,赋值的过程,就是注册回调函数.如果不注册,那么函数指针为null,指向空地址,就会出问题,我们定义的这个函数就是回调函数。

[3]、在外设对应头文件中,请一定写上 externTimer0_t timer0,表示外部文件可以调用 timer0结构体。

[4]、如果需要调用定时器的这些函数,只需要通过timer0结构来调用,如下所示,timer0.Init(TIMER_VALUE),

另外,VS Code的智能补全非常棒,你只需要输入结构体变量timer0.里面的函数或变量全部都出来了,如果这样封装,那么编辑代码体验也很棒。

8899c0b57aa98ef1a4083c6728e7cf54.png

根据结构体封装的思想,我再多举两个例子,假如对DHT11温湿度传感器进行封装,封装哪些会比较合理呢?如下所示

计算的湿度和温度浮点数,必不可少。

单总线40bits源数据,根据实际需求,如果你是和上位机通信,也必须发送这个源数据,那么就封装在这里,如果不需要,可以不封装。

读取湿度和温度的函数必须要封装.

78f81d920120dc3fc97152cfd8e1a9b8.png

调用的时候,就可以通过如下方式,通过串口打印出源数据和计算后的温湿度数据

759845e6688defbdba350cb77d475da5.png

喜欢这篇文章,帮忙点个“关注 + 收藏”哦,谢谢

本文章的例子是基于STC89C52单片机来调试的,想获取源码,请“”关注 + 收藏“后,私信给我,发送文字 [单片机代码模块化设计思想浅谈]。

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

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

相关文章

jquery 字符串查找_JQuery、Vue等考点

一. 写出下面程序的运行结果for结果:1秒后一下子打印出5个5。当循环完成时才会轮到setTimeout异步执行其回调函数function,此时i已经变成5,故5个console.log(i)里的i全使用的是5。易错点:千万别写成“打印5个4”啊!暴风…

html网页效果分析,熟手的html编写风格与原因分析_HTML/Xhtml_网页制作

一、导航:无序列表 对 其它标签元素用最常用的“无序列表“来写导航的理由是显而易见的,它代表一列链接,这本身就有足够的理由应选择列表标签。但需要移除list列表的默认样式,以使其更有意义。另一个好处可能超出你的想象&#xf…

qgis 图片_QGIS入门教程公告!!!

从本周开始,我将每周日更新一期QGIS入门教程视频,带讲解,估计这也是很多朋友所希望的。操作中用到的数据下载链接我会放在每一期的视频下方。以下是入门课程的目录:1.开启你的QGIS之旅——制作你的第一张地图2.属性表基础——字段…

css less 不要作用到子对象_CSS-预处理语言Sass、Less简述

CSS作为前端开发的三驾马车之一,无时无刻不在影响着前端的发展。为了让 CSS 变得更加的好用,出现了一些预处理语言。 它们让 CSS 彻底变成一门可以使用变量 、循环 、继承 、自定义方法等多种特性的标记语言,逻辑性得以大大增强SassSass是成熟…

js 点击侧边栏展示内容_上海SEO优化网站侧边栏一般添加什么内容

相关推荐:https://www.huisheng.com/上海SEO优化网站侧边栏一般添加什么内容?企业做网站每个板块都是非常重要的,之前跟大家解析了关于导航栏的布局,哪些内容该添加,哪些内容不该添加,而今天小编要跟大家解…

机器人辅助的符文天赋_10.5版本T1辅助盘点 进攻型辅助主宰下路

摘要:今天为大家推荐10.5版本的三大T1辅助,在当前版本每层塔钱增加到160后,这些前期进攻性较强的辅助更容易上分,他们都有直接或间接击毁镀层的能力,赛娜推线压制后的远程点塔,机器人靠着钩子的威胁上前、日…

dataframe 选择输出_使用 Python 实现机器学习特征选择的 4 种方法

(给数据分析与开发加星标,提升数据技能)英文:Sugandha Lahoti,转自:数据派(ID:datapi),翻译:李洁注:本文节选自Ankit Dixit所著的《集成机器学习》(Ensemble Machine Learning)一书。…

ps一点等于多少厘米_企业展厅设计关于展台你了解多少?

发 现 生 活 中 最 美 好 的 设 计打开音乐聆听设计伽的声音水北展陈今日份文章:企业展厅设计关于展台你了解多少?企业展厅设计展台是各种展品、实物、模型以及沙盘的展示介质之一。企业展厅设计展台的设计和选用要从企业展厅设计展品的特征出…

springboot 单测加入参数_Spring Boot集成Elasticsearch实战分享

作者|java梦想口服液|简书最近有读者问我能不能写下如何使用 Spring Boot 开发 Elasticsearch(以下简称 ES) 相关应用,今天就讲解下如何使用 Spring Boot 结合 ES。可以在 ES 官方文档中发现,ES 为 Java REST Client 提供了两种方式的 Client&#xff1a…

计算机主机安装系统安装系统安装软件,电脑安装软件时提示安装过程出错系统设置未被修改怎么办...

‍电脑安装软件,尤其是安全管理这一类软件,可能会出现安装失败的情况,提示安装过程出现错误,未修改系统设置等。这是怎么回事?这些软件在安装的时候可能会修改系统相关的核心设置,所以电脑系统会阻止其安装。下面让我…

ps图片拖不进去_PS教学:你的logo还不够高大上?7步教做出黄色金属质感logo

今天美迪君向大家分享一下,如何用ps简单制作带有黄色金属质感的logo方法,难度不仅不大,且制造出来的logo也是非常漂亮,值得大家学习。接下来就为大家演示一下制造的方法。1、打开PS,CtrlN新建一个1920*1080的画布(根据…

简单比对照片是否相同_小新说法 | 如何认定商标是否侵权?

如何认定商标是否侵权?原创 | 高姗 江苏东能律师事务所商标是商品的生产者、经营者在其生产、制造、加工、拣选或者经销的商品上或者服务的提供者在其提供的服务上采用的,用于区别商品或服务来源的,包括文字、图形、字母、数字、三维标志、颜…

单片机拼字程序怎么做_家装行业做小程序怎么样?

对于家装行业,给大家提到了很多获客引流的方式,无论是线上还是线下,只要坚持去做,最后肯定会取得成果的。关于线下的给大家提到最多的就是合作共赢的模式来拓客,线上主要就是打电话和表单或者进入平台的形式&#xff0…

python 删除csv第一行_python 标准库学习之 csv

本文由作者 凭海临风 授权刊登。原文地址:https://jeffsui.github.io/2020/01/02/python-standard-library-csv/文档路径官方文档:https://docs.python.org/zh-cn/3.8/library/csv.htmlCSV 文件格式文件扩展名为.csv,通用的电子表格文件格式&…

idea java主题_IDEA变身超级形态,需要这个酷炫主题

码个蛋(codeegg) 第 1090 次推文作者:CodeWhite7链接:https://blog.csdn.net/weixin_46146269/article/details/104793277前言IDEA,全称 IntelliJ IDEA ,是 Java 语言的集成开发环境, IDEA 在业界被公认为是最好的 jav…

百度云盘照片导入华为相册里_必须知道的相册管理工具

相信很多人都会在手机上存许多值得回忆的照片,为了避免丢失,我们常常会使用网盘工具来管理我们的照片,例如,比较常用的有百度网盘、天翼云盘、115网盘这三款工具,那么这三款网盘在相册功能上有什么特色呢?今…

优化自定义函数_Pandas常见的性能优化方法

文章来源于Datawhale ,作者阿水Pandas是数据科学和数据竞赛中常见的库,我们使用Pandas可以进行快速读取数据、分析数据、构造特征。但Pandas在使用上有一些技巧和需要注意的地方,如果你没有合适的使用,那么Pandas可能运行速度非常…

pycharm cant open file_PyCharm

1.创建项目PyCharm是一种Python IDE.PyCharm的功能到底有多强大,我也说不清楚,今天只是介绍一下关于Pycharm创建项目的问题.✦ PyCharm可以将一个文件夹作为工程(或项目)进行打开.如图1所示,先创建两个文件夹(pyc1和pyc2),在文件夹…

如何通过示例使用Java中的Exchanger

大家好,如果您在并发Java应用程序中工作,那么您可能听说过java.util.concurrent包的Exchanger类。 Java中的Exchanger是Java 1.5中与CountDownLatch , CyclicBarrier和Semaphores一起引入的另一个并发或同步实用程序。 顾名思义, …

外星人跑深度学习_上海港汇外星人店,51M2020开光追和DLSS2.0畅玩《赛博朋克2077》...

上海外星人港汇恒隆广场店是外星人布局上海的首家3.0店面,坐落在繁华的徐家汇商圈港汇恒隆广场南座6楼。门店传承了外星人高端高品质,以服务客户为宗旨,立足上海,辐射周边,服务所有外星人客户。近日,让全球…