现在咱们在学习和开发单片机时广泛选用 c 言语进行编程,当咱们开发的单片机项目较小时,或许咱们所写的操练程序很小时,咱们总是习惯于将一切代码编写在同一个 c 文件下,由于程序代码量较少,一般为几十行或许上百行, 此刻这种操作是可行便利的, 也没有什么问题。但假如要开发的项目较大,代码量上千行或许上万行乃至更大,假如你还持续将一切代码悉数编写在仅有的一个 c 文件下, 这种办法的弊端会凸显出来, 它会给代码调试、更改及后期保护都会带来极大的不方便。试想一下,当你尝试着从几千几万行代码中定位到某一方位或许去寻觅某一错误点,上下拉动巨长的滚动条慢慢地、一点点地阅读整个 c 文件, 是件多么令人目不暇接,头昏眼花的事。 模块化编程可解决这个问题,咱们只需依据实际需求运用模块化编程的思想将具有不同功用的程序封装在不同模块中,将各个不同模块寄存在不同的 c 文件中。 模块化编程后的程序不光使全体的程序功用结构明晰明晰,一起也进步程序代码的运用率,有些模块代码咱们能够直接进行移植或许经简略修正就可另作他用,比如封装好的函数。
那么什么是模块化呢?首要咱们来简略来聊聊模块概念,咱们或许听说过电源模块,通讯模块,这些是硬件模块,它们都供给一些接口,比如电源模块会有输出额外电压电流的接口,通讯模块或许供给了RS232、 USB等接口。那么对软件来说模块是怎样的呢?软件里的模块跟硬件模块相似,抽象地说就像一个黑盒子,盒子内部细节咱们能够不予理睬,咱们只关怀盒子给咱们供给什么东西,即供给了什么接口,运用这些接口咱们能完结什么功用。
咱们把相对独立,具有独立功用用代码编写在一个 c 文件下,把需求对外的函数或变量进行声明供外部运用, 把不需求的细节尽或许对外部屏蔽起来,这便是软件模块化编程的思想。
这样不同的模块占用不同 c 文件,一个个 c 文件将整个项目串接起来完结一切的功用。
1. 模块化编程的准则:
模块化编程一般要遵从以下几个准则:
? 每一个 c 文件对应一个同名的 h 头文件
一个 h 文件随同相应 c 文件存在, 头文件是为了声明对外揭露的接口。假如一个 c 文件不需求对外发布任何接口,则其就不应当存在,除非它是程序的进口,如 main 函数地点的文件,一起 main 函数地点文件能够没有对应的头文件。 如有一个 led.c,那应该一起制造一个 led.h 头文件。
? 头文件中合适放置接口的声明,不合适放置完结
头文件是模块的对外的接口,供外部程序调用。头文件中应放置对外部的声明,如对外供给的函数声明、宏界说、变量类型声明等。 函数的完结、变量的赋值、句子的操作等决不能放在头文件中。由于头文件的功用是向外供给接口,比如函数,变量,详细怎么完结是在 c 文件中进行,头文件仅是进行了描绘声明。
? 恣意一个 c 文件只需运用了其他 c 文件供给的接口, 都要一起包括其对应的头文件,每个 c 文件应该头文件自包括
恣意一个 c 文件只需运用了其他 c 文件供给的接口, 都要将其对应的头文件包括到该 c文件中,没有运用到其他 c 文件的接口就不应该将其匹配的头文件包括,而且每个 c 文件都应该包括自己的头文件。
? 防止头文件被重复包括
防止一个头文件被重复包括,一般运用条件编译指令#ifndef–#endif,如下示例:
示例 1:
#ifndefTIME_H#defineTIME_H……#endif
示例 2:
#ifndefLED_H#defineLED_H……#endif
其间#define FILENAME_H 为根本格局, FILENAME_H 为头文件称号,但要悉数运用大写办法,运用单下划线后紧跟一个 H 标明是头文件。 不要在宏名最前面加上“ _“或“ __” ,即运用 FILENAME_H 替代_FILENAME_H_, 由于一般以”_“和” __”最初的标识符为体系保存或许规范库运用。
2. 模块化编程实例
咱们运用 AT89C52 单片机,在编程软件 keil 环境下施行一个工程,来阐明模块化编程详细操作的办法和过程。比如要完结的功用:和 P1 相连的 8 个 LED 灯每 500ms 亮灭替换闪耀,经过串口将数字 0-9 发送给单片机并显现在一个数码管上。 LED 闪耀的时刻运用守时器 0 中止办法来操控, T0 每 50ms 溢出发生中止,界说一个计数器,每次 T0 中止就计数一次,累计计数 10 次,那么时长为 500ms,作为 LED 闪耀时刻距离。 单片机的时钟为11.0592MHz。那么运用模块化编程的办法, 整个项目将会有如下表中的文件。
表 1 工程文件清单
C 文件H 头文件描绘main.c无Main 文件能够没有对应的头文件TImer0.cTImer0.h守时器 0 守时 50ms 中止led.cled.hLed 闪耀完结uart.cuart.h串口通讯装备完结digitron.cdigitron.h数码管显现
2.1创立工程过程
2.1.1新建工程文件目录
新建工程文件目录(如 test),在工程目录下创立 Project、 Source、 Output、 Listing 和Readme 这 5 个文件夹,并在文件夹 Readme 下创立 Readme.txt 文件。 这样做的意图是为
了增强工程文件的可读性及结构化,便于保护和办理。
? Project 寄存工程文件
? Source 寄存用户编写的 c 文件及 h 头文件
? Output 寄存各种输出文件,如 hex 文件
? Listing 寄存编译过程中发生的各种中心文件
? Readme 寄存工程项意图阐明文件
2.1.2创立keil工程
( 1) 发动软件 Keil μVision, 点击东西栏上的 Project,挑选 NewμVision Project,新建 test工程到目录 Project 下。
( 2) 挑选方针器材,点击“ OK”承认。
( 3) 呈现是否增加发动文件到工程中对话框,挑选否。
( 4) 方针选项设置, 点击 target option 东西进入选项装备界面。
( 5) 选中 Target 项,依据实际情况设置晶振频率。本比如频率为 11.0592MHz。
( 6) 选中 output 选项,点击“ Select Folder for Objects…”挑选工程目录下的 Output 文件夹, 将“ Create HEX File”勾选中。
( 7) 选中 Listing 选项,点击“ Select Folder for Listings…”挑选工程目录下的 Listing 文件夹。
( 8) 最终点击“ OK”保存各选项的设置,至此完结 Target Option 的装备。
( 9)新建 5 个文件,以 c 为后缀名保存到工程目录的 Source 文件下,并别离命名为 main.c、led.c、 uart.c、 timer0.c 和 digitron.c。右击“ Source Group1”挑选“ Add Existing Flies to Group‘Source Group1’”,将以上新建的 5 个文件增加到工程中。
(10) 至此,就完结整个 keil 工程的创立。