赞
踩
大多数的编程学习者一开始接触和学习到的程序很小,代码量很少,甚至只有几十行。对于这样短小的程序进行模块化设计不是完全必要的。但是随着学习的深入,代码量的增加,将所有的代码都放在同一个.C文件中的做法越发使得程序结构混乱,虽然可以运行,但是可读性、可移植性变差。即使是自己写的程序,时间长以后对程序的阅读和修改也要花一些时间。模块化编程使得程序的组织结构更加富有层次感,立体感和降低程序的耦合度。
在大规模程序开发中,一个程序由很多个模块组成,很可能,这些模块的编写任务被分配到不同的人。几乎所有商用程序都必须使用模块化程序设计理念。在程序的设计过程中各个开发者分工合作,分别完成某一模块特定的功能,减少开发时间等。
传统方式编程:所有的函数均放在main.c里,若使用的模块比较多,则一个文件内会有很多的代码,不利于代码的组织和管理,而且很影响编程者的思路。
模块化编程:把各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数的声明,其它.c文件想使用其中的代码时,只需要#include "XXX.h"文件即可。使用模块化编程可极大的提高代码的可阅读性、可维护性、可移植性等。如下图所示模块化编程案例
以LED流水灯功能为例设计模块化编程,首先看到原始的工程文件,下图所示。
接下来使用上面这个程序设计模块化编程。
1、创建项目文件夹
新建一个项目文件夹,命名为“项目2-模块化编程”。在该文件夹中在新建四个文件夹,分别命名为“Project”、“Output”、“Listing”、“Source”,下图所示。
打开keil 软件,新建工程命名为“模块化编程”,保存到“Project”文件夹中,下图所示。
2、新建.c和.h文件
点击新建文件按钮分别新建三个文件“main.c”、“delay.c”、“delay.h”,保存到“Source”文件夹中,点开该文件夹可以看到三个文件,下图所示。
对于每一个模块都有相应的.c文件和.h文件,为了阅读调试方便,原则上.c文件和.h文件同名,如delay.c和delay.h。
3、添加“main.c”和“delay.c”文件
把“main.c”和“delay.c”添加到“Source Group 1”中,添加之后的效果,下图所示。
4、建立“main.c”文件模板
编写运行程序的模板,点击“Translate”按钮或者“Ctrl+F7”,把<reg51.h>头文件包含进“main.c”中,下图所示。
5、打开“reg51.h”文件制作“delay.h”文件
该步骤主要查看“reg51.h”头文件的格式,打开之后可以看到两个红框代码,分别在头文件开头和结尾,把这三行代码复制并粘贴到“delay.h”中,并把“#ifndef __REG51_H__”改成“#ifndef __DELAY_H__”,“#define __REG51_H__”改成“#define __DELAY_H__”,下图所示。
注意:其他代码不要修改
6、完善“delay.c”和“delay.h”代码
“delay.c”文件:用来函数定义
“delay.h”文件:用来函数声明
把原来的延时函数定义部分放在“delay.c”文件中,函数声明部分放在“delay.h”文件中,并在“delay.c”文件中引用“delay.h”头文件,选中“delay.c”文件,点击“Translate”按钮或者“Ctrl+F7”,可以看到延时函数的头文件在“delay.c”文件中包含,后下图所示。
假如有两个不同源文件需要调用DelayMs(unsigned int ms) 这个函数,他们分别都通过#include “delay.h”把这个头文件包含了进去。在第一个源文件进行编译时候,由于没有定义过delay.h,因此#ifndef__DELAY_H__条件成立,于是定义_DELAY_H_ 并将下面的声明包含进去。在第二个文件编译时候,由于第一个文件包含时候,已经将_DELAY_H_定义过了。因此#ifndef__DELAY_H__不成立,整个头文件内容就没有被包含。假设没有这样的条件编译语句,那么两个文件都包含了DelayMs(unsigned int ms); 就会引起重复包含的错误。所以在.h文件中,为了防止出现错误都进行防重复包含。
7、完善“main.c”文件
结合之前流水灯程序,把需要的文件复制粘贴到该文件中,点击“Translate”按钮或者“Ctrl+F7”,可以看到下图所示。
8、设置“Output”和“Listing”文件夹路径
设置完毕后把下图红框选中,并点击“OK”按钮,可以“Rebuild”整个项目,下图所示。
模块化编程在后面案例中都会使用,可以提高代码可读性、可维护性、复用性、开发高效。
模块化编程
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。