设计与开发

单片机模块化编程教程 单片机怎么实现模块化编程?实用程度让人发指

小编 2024-11-23 设计与开发 23 0

单片机怎么实现模块化编程?实用程度让人发指

在刚开始从事研发工作的那几年,我主要做单片机软件开发的工作,虽然功能吧都能实现,但是总觉得缺了点什么。

总是感觉自己写的程序不够完美,移植性不够好,功能也不好扩展,每次写完程序最怕的就是客户要改功能。

如果程序架构写的不好,一改会影响到很多功能,哪怕原来是灯每秒闪1次,改成每秒闪3次这种看起来很简单的功能。

对于程序提升这块,如果没有人一个厉害的人带你,真的很难提升。

主要难在两个方面:

1.你的认知

有时候不是你做得越久,写的代码就越好,因为你一直在自己的认知水平内写代码。

如果不提升你的认知,代码自然也不会提升,所以想要提升代码水平,首先要提升的是你的认知。

2.找不到好的教程或实例

终有一天你要做中大型项目的时候就会发现,自己的代码水平和思维要提升了,但是找不到好的教程和方法。

这块最好的提升办法就是去找那些大佬写的代码,比如说公司比较资深的工程师,有事没事多请他们吃吃饭,喝喝水搞好点关系。

一般来说都愿意把自己的代码分享给你,然后你再看他们写的代码,有哪些是值得学习的,最重要的是他们实现功能的思维,然后用代码怎么去实现?

如果别人不愿意分享给你,那可以去挖一下现成稳定的,比如说STM32的标准库,蓝牙协议栈等等。

我当初的提升方法是在某个公司做产品的时候,正好有个工程师离职了,老大把他写的代码给我来维护。

当我第一眼看到他代码的时候,觉得写的很复杂,感觉在秀技术,完全没必要这样去写。

然后我用他的代码拿配套的产品来测试,发现很稳定,我尝试按照我的思维改了以后,就出现了各种问题。

慢慢地,研究越深,我越是深刻体会这位工程师为什么要那样去写,自己跟他完全不是一个级别的。

其实他的就是基于模块化编程的思维去做的,当时还没吃透他的代码,我是从那家公司离职后又过了几年才彻底领悟他的代码。

一、单片机模块化编程怎么实现?

基于他的这种思维和实现方法,再结合我自己多年经验,最后自己又创新了一个全新的架构。

这个架构分为2个部分:

1.内核

内核主要是用来管理任务的,除了管理还提供了一些队列算法接口,方便产品使用。

2.模块化编程思维

对于单片机产品开发来说,我觉得可以分为3层:硬件层、中间层、应用层

我们先来说说中间层应用层

中间层: 就是不算是真正产品的功能代码,比如说解析某种自定义协议,协议解析完以后的数据才是真正产品功能数据。

上图就是对云平台协议进行解析,比如说解析wifi是否连接的命令的程序,相对应用层来说,我们只需要”wifi已连接 ”和”wifi未连接 ”这两个明确的数据,而不做具体解析程序。

这样做最大的好处就是,假设我们换了一家云平台,应用层的程序不用改,只需要改硬件层和中间层程序即可,不至于因为换了一家云平台,导致整个产品程序崩盘的问题

一般来说,如果不是中大项目,我都直接省略中间层,毕竟代码量大了,会浪费批量生产时的时间也浪费单片机资源

硬件层:我们重点来说说这个,这个真的是很多人痛到不能再痛的痛点,也是很多工作几年工程师一直不知道怎么解决的问题, 专门是用来采集单片机输入数据,或者控制硬件电路输出。

采集信号 有很多类型,比如说按键检测、ADC检测、红外信号接收、串口接收、SPI、IIC等这种就是属于硬件层输入数据。

我拿按键输入来举例 ,先来看看原理图:

电路非常简单,就几个按键串上电阻接了单片机引脚,按键按下就会有一个低电平的信号给到单片机,单片机就是通过检测对应引脚是否低电平来判断按键是否按下。

回到我们程序部分,按键检测过程我就不讲解了,我们的关键在于检测到某个按键按下以后,要怎么把这个值传给应用层。

那我是使用了回调函数来传递的,这样做的好处就是,真正能做到这个按键硬件层检测代码和应用层产品程序独立,增强移植性。

我们要使用按键功能的时候,直接注册下按键回调函数就可以了,如下图:

这样做还是比较灵活的,不管是应用层,还是中间层,哪里需要用到按键功能,我就在哪里调用注册函数。

Ok,硬件层采集数据基本上都可以用这种方式来处理,这样就能做到真正的模块化,这个也是我以前一直想不通研究了很久的处理方式。

下面说说控制硬件电路输出,这种输出型的没什么好说的,不涉及到硬件层的采集数据传递到应用层 ,直接调用硬件层的控制接口就行了。

比如说我应用层要控制一个LED灯点亮,代码简单到令人发指!

由于文章篇幅有限,很多代码不方便展示,如果想学程序架构这块的系统教程可以找无际单片机编程拿。

这套课程的内容我个人认为至少价值3000以上,每节课都为解决产品痛点,没有一个知识点是多余的,原本是录出来卖的,后面工作一忙就没时间去搞。

现在正好在做这块的,纠结了很久还是开源给大家学习,就当是对我铁粉的一些回馈,原创非常不易,如果你拿了,麻烦也给我点回馈,给我安排个三连就行!

【51单片机】模块化编程的一般步骤和基础说明

51 单片机的模块化编程是将程序按照功能划分为不同的模块,每个模块具有相对独立的功能,分别放在不同的 .c 文件和 .h 文件中。

以下是进行 51 单片机模块化编程的一般步骤和基础说明:

1. 模块划分:确定程序中的各个功能模块,例如延时函数、数码管显示函数、LCD 显示函数等。每个模块应具有明确的功能和相对独立的代码。

2. 创建 .c 文件**:为每个模块创建一个对应的 .c 文件,用于实现该模块的具体功能。在 .c 文件中编写函数的定义和相关代码。

3. 创建 .h 文件(头文件)**:为每个 .c 文件创建一个同名的 .h 文件。头文件用于声明模块中可供外部调用的函数、变量等。头文件的内容通常使用预处理指令 #ifndef 、 #define 和 #endif 来防止重复包含,例如:

#ifndef __MODULE_H__

#define __MODULE_H__

// 函数声明、变量声明等

#endif

 

4. 在 .c 文件中实现功能**:在对应的 .c 文件中具体实现模块的功能,编写函数的代码逻辑。

5. 在头文件中声明函数和变量**:在 .h 文件中声明在 .c 文件中定义的函数、全局变量等,以便其他文件可以使用这些函数和变量。例如:

void function1(void);

int variable1;

 

6. 在主程序或其他需要使用该模块的文件中包含头文件**:使用 #include "module.h" 语句将所需模块的头文件包含到主程序或其他 .c 文件中,这样就可以调用头文件中声明的函数和使用相关变量。

7. 调用模块功能**:在主程序或其他模块中,根据需要调用相应模块的函数来实现具体功能。

通过模块化编程,可以提高代码的可读性、可维护性和可移植性。各个模块可以独立开发、测试和修改,而不会影响其他部分的代码。同时,也方便多人协作开发,以及在不同项目中复用已有的模块。

例如,假设有一个数码管显示模块,包含数码管显示函数和相关的段码表。以下是示例代码:

数码管显示的 .c 文件( nixie.c ):

#include

#include "delay.h" // 包含延时函数的头文件,因为要使用其中的延时功能

// 数码管段码表

unsigned char NixieTable() = {

0x3F, 0x06, 0x5B, 0x4F,

0x66, 0x6D, 0x7D, 0x07,

0x7F, 0x6F

};

// 数码管显示子函数

void Nixie(unsigned char Location, Number) {

switch (Location) // 位码输出

{

case 1:

P2_4 = 1;

P2_3 = 1;

P2_2 = 1;

break;

case 2:

P2_4 = 1;

P2_3 = 1;

P2_2 = 0;

break;

// 省略其他 case 情况

}

P0 = NixieTable(Number); // 段码输出

delay(1); // 显示一段时间

P0 = 0x00; // 段码清 0,消影

}

 数码管显示的 .h 文件( nixie.h ):

#ifndef __NIXIE_H__

#define __NIXIE_H__

void Nixie(unsigned char Location, Number);

#endif

 在主程序( main.c )中使用该数码管显示模块时,只需包含 nixie.h 头文件,然后就可以调用 Nixie 函数来显示数字:

#include

#include "nixie.h" // 包含数码管显示模块的头文件

void main() {

while (1) {

Nixie(1, 6); // 在数码管的第 1 位置显示 6

}

}

 这样,通过模块化编程,将数码管显示的功能封装在一个模块中,使得主程序更加简洁清晰,易于理解和维护。如果需要修改数码管显示的相关代码,只需在 nixie.c 和 nixie.h 中进行修改,而不会影响到主程序的其他部分。同时,在其他项目中如果也需要使用数码管显示功能,只需将这两个文件添

相关问答

单片机模块化编程 讲解?

单片机模块化编程是将整个程序划分为多个独立、可重复使用的模块进行开发,每个模块都是一个完整的功能单元,可以通过接口相互调用与通信,从而实现程序的高效开...

用C语言编写51 单片机 显示数码管00~99频率可调程序( 模块化 )-Z...

我写好了,但是模块化的程序怎么贴进来,完全没法贴有用(0)回复s5023这个程序很简单啊,自己编吧,还可以提高下水平有用(0)回复novembermoon百度文库里面有...

51 单片机 没有系统 怎么运行?

没有系统就没有办法运行。KeilC51是一款51单片机的开发工具,要运行该工具需要先安装该软件,并连接好相应的单片机开发板。连接好硬件之后,在KeilC51中新建...

关于max485与 单片机 连接的问题?

[回答]传统的单片机实验系统因其购买成本高、系统使用烦琐,已经越来越不适合当前以培养学生实际能力为主要方向的高等教育,本系统可以帮助学校轻松组建单...

麻烦各位同志 在线等!急急急! 单片机编程 ?,单片机编程如何选??

[回答]公司方案设计水平真不错,技术过硬,我们跟他们合作过,项目开发非常负责,顺利帮我们完成了产品的量产。还不错的,他们专业承接单片机解决方案,以前朋...

单片机 与PLC的区别?

单片机和PLC(可编程逻辑控制器)都是用于自动化控制的电子设备,但它们之间存在一些区别:1.结构不同:单片机是一种集成电路芯片,内部集成了处理器、存储器...

单片机 和图形化 编程 哪个好?

现在市面上大部分图形化编程,都是基于Scratch改造或类似的。Scratch诞生于2007年,是麻省理工学院的“终身幼儿园团队”开发的图形化(模块化)编...图形化编程...

学习 单片机 需要什么知识基础?

朋友们好,我是电子及工控技术,我来回答这个问题。单片机作为一种实践性非常强的技术,要想入门单片机就要有做一些准备,有一句话叫“兵马未动,粮草先行”,我...1,...

PLC和 单片机 有什么区别?

PLC(可编程逻辑控制器)和单片机是工业控制领域常用的两种控制设备,它们有以下区别:1.功能:PLC主要用于工业自动化控制系统,能够处理大规模的控制任...PLC(...

PLC和 单片机 有什么区别?

PLC(可编程逻辑控制器)和单片机是工业控制领域常用的两种控制设备,它们有以下区别:1.功能:PLC主要用于工业自动化控制系统,能够处理大规模的控制任...PLC(...

猜你喜欢