模块化设计在单片机编程中的应用

2023-02-19 12:25贵州电子信息职业技术学院张定祥
数字技术与应用 2023年1期
关键词:模块化代码声明

贵州电子信息职业技术学院 张定祥

模块化编程在嵌入式学习中是比较常用的方法。本文以单片机控制温度传感器为例,介绍模块化设计在单片机学习中的应用,阐述了模块化设计的概念、发展历程以及模块化设计在单片机学习中的编写方法,为将来学习开发嵌入式项目打下良好的基础。

学习单片机的同学都会遇到一个疑问。为什么我在课堂上学习单片机之后,却不能做一个复杂的项目?这是因为在设计较复杂的程序时,一般采用自顶向下的方法,将问题划分为几个部分,各个部分再进行细化,直到分解为较好解决问题为止。这就是模块化设计,其基本思想是自顶向下、逐步分解、分而治之,即将一个较大的程序按照功能分割成一些小模块,各模块相对独立、功能单一、结构清晰、接口简单。

模块化设计,就是程序的编写不是一开始就逐条录入计算机语句和指令,而是首先用主程序、子程序、子过程等框架把软件的主要结构和流程描述出来,并定义和调试好各个框架之间的输入、输出链接关系逐步求精的结果,得到一系列以功能块为单位的算法描述。以功能块为单位进行程序设计,实现其求解算法的方法称为模块化。

1 模块化设计的发展历史

模块化程序设计与结构化程序设计和面向对象程序设计密切相关,它们的全部目标都是通过分解成较小的部分来促进大型软件程序和系统的构建,并且都起源于1960 年代。1968 年7 月在信息和系统研究所由拉里·康斯坦丁组织的全国模块化编程研讨会上提出“模块化编程”。1980 年代开始普及模块化编程。最初的Pascal 语言不包含模块,但后来的版本,尤其是UCSD Pascal 和Turbo Pascal,就像Pascal 一样以“单元”的形式包含了它们。1990 年代,由于C++和Java 的流行,模块化编程被面向对象的编程所遮盖,并且常常与之混淆。例如,C 语言家族在C++中支持对象和类和Objective-C,仅支持30 年或更长时间的模块。Java(1995)支持包形式的模块,尽管代码组织的主要单位是类。模块化编程现已普及,并且几乎可以使用1990 年代以来开发的所有主要语言。

2 模块化编程

模块化编程是指将大型、笨拙的编程任务分解为单独的、更小更易于管理的子任务或模块的过程。然后像构建块一样拼凑单个模块以创建更大的应用程序。在传统方法编程方式中,所有的函数均放在主函数(main.c)里,若使用的模块比较多,则一个文件内会出现很多的代码,不利于代码的组织和管理,而且很影响编程者的思路。而模块化编程方式中,把各个模块的代码放在不同的.c 文件里,在.h 文件里提供外部可调用函数声明,其他.c 文件想使用其中的代码时,只需要#include“xxx.h”文件即可。模块化编程强调将程序的功能分为独立的,可互换的模块,这使得模块化设计的系统比传统的整体式设计具有更高的可重用性,因为所有模块都可以在其他项目中重复使用。模块化编程在嵌入式中是必须要掌握的技能。

3 单片机编程中的模块化设计

模块化编程在编程当中十分重要,因为模块化编程的代码可以重复使用,可以减轻编程工作者的工作量,在单片机的编程设计中尤为重要。这里以AT89C51 单片机,在编程软件Keil 环境下实施一个工程,来说明模块化编程具体操作的方法和步骤。例子要实现的功能:采用液晶显示温度传感器DS18B20 提取的温度值,并通过串口将温度值发送出去。

(1)在同一文件夹下新建一个main.c 文件(或主文件或运行文件)和xxx.c 文件(或功能文件)和xxx.h 文件(头文件),其中xxx.c 文件(或功能文件)和xxx.h 文件(头文件)的文件名“xxx”要有意义,最好可以体现该文件的功能。如图1 所示。

图1 代码(code)文件夹下文件Fig.1 Files in the code folder

(2)编写xxx.c 文件(或功能文件)内容(如图2所示):

图2 延时功能模块的C 文件内容Fig.2 C file content of delay function module

1)包含xxx.h 文件(或头文件);

2)声明变量或定义变量;

3)编写功能函数。

注意事项:

模块内不想被外部引用的函数和全局变量需在“.c”文件头冠以static 关键字声明。函数的声明有无extern都行,变量的声明必须加上extern,否则编译器无法识别声明[1]。

(3)编写xxx.h 文件(或头文件)内容(如图3 所示):

图3 延时头文件Fig.3 Delayed header file

注意事项:

函数默认是extern 属性,也就是我们声明函数的时候前面的extern 可有可无。“.h”文件中不可以定义变量,在“.h”中只能声明,不能定义。声明变量不会占用内存,定义变量才会[2]。

(4)编写main.c 文件(或主文件或运行文件)内容(如图4 所示):

图4 函数包含文件Fig.4 Main function contains files

图5 读取温度传感器DS18B20 液晶显示并串口发送的仿真结果Fig.5 Reading the simulation results of temperature sensor DS18B20 LCD display and serial port transmission

4 结语

通过上述实例分析,可以了解模块化编程的方法是将工程划分为不同模块。主函数只调用函数,而不定义函数。在各模块文件中定义功能函数,并将要用到的函数利用同名头文件申明外部函数供其他文件调用。使用模块化编程可以使代码更有序,可以便捷地编写大型项目。模块化将不需要的细节尽可能对外部隐藏,实现函数的封装。便于重复利用代码,实现某一功能代码可以在多处调用,可以在别的项目使用。便于分工合作,团队共同开发一个项目,也可以将程序分为多个模块,每个人只完成一个模块的内容。

引用

[1] 王静霞.单片机基础与应用(C语言版)(第2版)[M].北京:高等教育出版社,2016.

[2] 宋戈,黄鹤松,员玉良,等.51单片机应用开发范例大全[M].北京:人民邮电出版社,2010.

猜你喜欢
模块化代码声明
本刊声明
本刊声明
模块化自主水下机器人开发与应用
模块化住宅
本刊声明
本刊声明
创世代码
创世代码
创世代码
创世代码