单片机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,一经查实,立即删除!

相关文章

html中显示数据库中的一条数据,如何使用html表显示数据库中的数据

我正在尝试在HTML表中显示数据库中的数据。主要问题是:该表未出现。IdStringArray// Mostrar dadosecho "{$databaseName visteon;$pdo new Pdo(mysql:host127.0.0.1;dbname . $databaseName, root, );$result $pdo->query(SHOW TABLES FROM . $databas…

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.属性表基础——字段…

v-if 表单验证_避免许多if块进行验证检查

v-if 表单验证在某些情况下,我们需要先验证输入数据,然后再将其发送到业务逻辑层进行处理,计算等。这种验证在大多数情况下是孤立进行的,或者可能包括与外部数据或其他输入的一些交叉检查。 看下面的示例,该示例验证用…

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

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

html图片平铺div,前端小知识——图片平铺问题

图片平铺有两种方式,直接写img标签或者通过background-image方式1,img标签HTML:CSS:.row{margin:0,auto;width:100%;}img{width:100%;height:100%;margin: 0 auto;display: block;font-size: 0;}这样写的话,三张图片能够垂直平铺&…

JMetro版本11.6.8和8.6.8发布

另一个版本,这次是较短的更新。 撰写文档和博客文章有点不知所措,但是我认为我不得不更新文档,因为它已经被更新了大约一年或更长时间。 因此,对于此发行版,我也专注于此。 这是链接: Javafx主题JMetro页面…

python用pip安装numpy mac_小白入门Python,mac下如何安装pip、ipython

作为一枚小白,最近在学习用Python写科学计算器,因为Mac不自带pip,安装的时候找了好几个帖子,才成功安装。做一下简单分享,希望对大家有帮助: 安装环境: Mac系统版本:OS X 10.11.1 Py…

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

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

html网页设如何置访问密码,利用JS给单页html加上简单访问密码,需要密码才能访问!...

本文最后更新于【 2019-12-21 22:28:00 】,某些文章具有时效性,若有错误或已失效,请在下方 留言 或联系 小P君 。今天在搞一个简单的短域名生成网页的时候,以防被滥用,所以想给html加一个简单的密码,需要…

python装饰器作用噜咕_python 装饰器的实际作用有哪些

终于知道python的装饰器是怎么回事,那在工作中,到底能干吗用呢? 尤其对我这个只会写写脚本又不做python开发的小测试/手动无辜脸。 先说结论,肯定是有用处滴。 一、自动化测试中使用 就拿写的自动化测试来说吧,如果我想…

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

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

html5新变化,HTML5的新变化,分享

1、新的2、图形元素 figure ,将与相结合,使图片标题与图片相搭配%3、不需要为链接和脚本标签添加类型的属性4、h5中不需要用引号将属性包裹起来5、使得内容可编辑。”contenteditable”,它将允许用户编辑元素(包括他的子元素)内包含的任何文本…

javafx属性_JavaFX技巧11:更新只读属性

javafx属性自定义控件通常具有“只读”属性。 这意味着不能从控件外部进行设置,甚至不能从自己的皮肤类别进行设置。 通常,控件的行为会导致更改只读属性。 在JavaFX中,此行为可以在控件本身和皮肤中实现。 因此,有时我们最终希望…

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

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

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

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

计算机应用能力文字录入,2017全国专业技术人员计算机应用能力考试题库-Excel,Word,XP.pdf...

《博大考神》2006版之excel2003题库版3一、Excel的应用基础3二、excel界面4三、数据的输入6四、插入对象8五、编辑工作表9六、创建公式11七、使用函数和主要函数12八、普通函数13九、工作表的格式设置(一)14十、工作表的格式设置(二)15十一、打印16十二、管理工作表和保护数据1…

用python turtle库画正方形_用Python Turtle画一个正方形

你的主要错误是这两行顺序错误:window.exitonclick() #click the screen to close it draw_square() exitonclick(),或mainloop(),或done()应该是最灵活的,针对上述和样式问题,你的代码需要重新编写:import…

HATEOAS的RESTful服务。 超媒体:REST的秘密要素

在这篇文章中,我们将介绍有关HATEOAS的RESTful服务的综合文章。 超媒体是REST的秘密成分。 1.简介 在本教程的前一部分中,我们花了一些时间来刷新有关REST体系结构样式的基本原理的知识。 业界对REST状态的批判性眼光揭示了一个令人失望的事实&#xf…