做特色菜的网站,深圳短视频制作公司,wordpress 分页 未找到页面,惠州住房和城乡建设部网站前言#xff1a;前段时间分享的文章【单片机裸机代码框架设计思路】#xff0c;很多读者给我留言#xff0c;觉得很不错#xff0c;对于初学者而言#xff0c;这是一个进阶的技巧#xff0c;对于我而言#xff0c;这是对自己总结和表达能力的一个提升。本文章我们再谈谈…前言前段时间分享的文章【单片机裸机代码框架设计思路】很多读者给我留言觉得很不错对于初学者而言这是一个进阶的技巧对于我而言这是对自己总结和表达能力的一个提升。本文章我们再谈谈单片机代码的模块化设计思想是如何设计的。之前的【单片机裸机代码框架设计思路】文章为了尽量简洁的表达我几乎所有代码都放在了main.c中这个在实际项目中或者说当任务比较多的时候几乎是不太现实的。模块化设计的目的是让代码高内聚低耦合是为了降低程序复杂度使程序设计、调试和维护等操作简单化第一点单独的功能模块各自独立建立xxx.c和xxx.h文件这一点相信大家可能都知道因为51单片机的书都有讲如果您已经知道了请跳过第一点。下面以之前的文章单片机裸机代码为例进行说明如下图所示我把功能代码分成了4大块定时器功能代码timer0.c、timer0.hTask裸机框架功能代码task.c、task.h中断函数功能代码interrupt.c、interrupt.h(任务很少也可以不分出来看具体情况)公共函数功能代码public.c、public.h(存放一些公共的函数和全局变量)(1)定时器功能代码timer0.c、timer0.h 可以看出timer0.c包含了3个常用函数和1个定时器结构体变量定时器中断是放在interrupt.c里面timer0.h包含一些常用的宏定义和结构体变量类型定义对于常用的2ms/5ms/10ms定义初始值可以使用宏定义修改起来就会很方便如下所示这是一个小技巧为什么使用TIMER_VALUE来代替T5ms时是因为如果不使用这个宏那么定时器初始化的时候要给TL0/TH0赋值T5ms在定时器中断函数中还要赋值一次我需要改动两个地方中断赋值很容易被忽略掉所以使用TIMER_VALUE宏定义代码我就可以只需要改T5ms就可以一次性更改定时器中断的时间。(2)Task裸机框架功能代码task.c、task.h task.c包含裸机代码框架中功能所有代码心跳函数初始化任务启动任务停止任务还有任务处理函数task.h代码如下包含任务的数组定义等等(3)中断函数功能代码interrupt.c、interrupt.h这个范例代码比较简单只有1个定时器的中断函数如下所示(4)公共函数功能代码public.c、public.h存放公共函数比如禁止总中断使能总中断软件延时函数等等要特别提到的一点这是一个小技巧public.h包含所有外设的头文件和常用的C语言库头文件这样做的好处是只需要修改这一个地方其余.c文件只需要包含一条include public.h就可以了。 第二点结构化封装外设这个才是本文章我想提到的重点对于一般初学者而言可能写的最多的就是Timer0_Init(); 然后和Timer0_ISR() 函数然后main.c调用就完事了。这种写法的确简单也好理解但是如果你的外设特别多如果还有ADC,传感器等等你需要定义全局变量传递参数时外设越多那么全局变量就越多后续修改起来你就会发现太痛苦了能把功能实现就不错了。我们现在把定时器0就当做一个外设[1]、在外设对应头文件中比如timer0.h中声明一个结构体变量类型如下图图所示里面包含了3个函数指针也可以在结构体中定义变量比如浮点数比如数组等等。不过定时器用不着。这里就只有函数指针了。[2]、在外设对应的源文件中比如timer0.c中定义一个Timer0_t类型的结构体变量并同时赋值注意顺序不能错因为前面定义的是函数指针所以我们只需要用对应的函数名称赋值就好这种做法也可以称呼为注册回调函数.这些回调函数因为是通过结构体变量来调用所以前面请加static修饰表示只能在本文件中使用如果是其他文件要使用请直接通过结构体变量来调用这就达到了封装的目的。 很多人不明白回调函数这里简单提一下将函数名称作为参数传递给函数指针通过函数指针来调用该函数的功能赋值的过程就是注册回调函数.如果不注册那么函数指针为null指向空地址就会出问题我们定义的这个函数就是回调函数。[3]、在外设对应头文件中请一定写上 externTimer0_t timer0,表示外部文件可以调用 timer0结构体。[4]、如果需要调用定时器的这些函数只需要通过timer0结构来调用如下所示timer0.Init(TIMER_VALUE),另外VS Code的智能补全非常棒你只需要输入结构体变量timer0.里面的函数或变量全部都出来了如果这样封装那么编辑代码体验也很棒。根据结构体封装的思想我再多举两个例子假如对DHT11温湿度传感器进行封装封装哪些会比较合理呢如下所示计算的湿度和温度浮点数必不可少。单总线40bits源数据根据实际需求如果你是和上位机通信也必须发送这个源数据那么就封装在这里如果不需要可以不封装。读取湿度和温度的函数必须要封装.调用的时候就可以通过如下方式通过串口打印出源数据和计算后的温湿度数据喜欢这篇文章帮忙点个“关注 收藏”哦谢谢本文章的例子是基于STC89C52单片机来调试的想获取源码请“”关注 收藏“后私信给我发送文字 [单片机代码模块化设计思想浅谈]。