1. 概述
在嵌入式开发中,仅包含一个 main.c 文件的工程通常称为"单文件结构"或单文件工程。这是最基础、最简化的项目组织形式,特别适合学习阶段或小型测试项目。
单文件结构是指将所有代码(包括主函数、外设控制、逻辑处理、宏定义、变量声明和延时函数等)集中编写在一个.c文件中,通常命名为main.c。
这种方式虽然简单直观,但一旦项目稍微复杂起来,就会陷入"代码越来越长、维护越来越难"的泥潭。
为了解决这个问题,我们通常采用 "多文件工程结构 (Multi-file Structure )" 来组织代码,也称为模块化设计,多文件结构通过将各个功能模块的代码独立存放,形成清晰的工程目录层级,以提高代码的可读性、可维护性与可移植性。

2. 介绍
多文件结构是指将工程代码按功能或职责 进行划分,分别存放在多个 .c 源文件和 .h 头文件中,常见模块包括主函数、外设驱动、公共函数、类型定义等,并通过模块化接口进行调用。每个功能模块通常拥有自己独立的一对 .c/.h 文件,主函数只负责调用这些模块接口。
3. 创建多文件工程
以 II2C-EEPROM 为例,演示创建流程,并展示其实验源代码结构如下:

3.1 创建文件夹
创建一个文件夹(II2C-EEPROM),在该文件夹下创建四个子文件夹
① App:存放驱动外设文件,如 LED,数码管,定时器等
② Obj:存放编译产生的(c/汇编/链接)列表清单、调试信息、hex文件、预览信息、封装库等文件
③ Public:存放 51 单片机公共的文件,如延时、51头文件、变量类型重定义等
④ User:存放用户主函数文件夹,如 main.c


3.2 新建工程
如创建单文件项目步骤相同。
实现效果如下:

详细步骤如下:




3.3 分组管理
按照需要将工程文件分组并添加相应文件,最终效果如下:

这里将工程分为3组:User、App和Public。建议 "KEIL 中的工程组的命名(User、App、Public)" 与 "电脑硬盘上源文件中的文件夹名称" 保持一致,便于快速定位文件位置。
详细操作如下:

Obj 文件夹则无需在工程中显示,因为它仅包含编译器生成的中间文件和 .hex 可执行文件,分组后效果如下所示:

以文件形式存放对应功能的驱动程序时,会创建两个文件:
.c 源文件用于存放外设驱动程序(如按键检测函数)
.h 头文件则用于定义管脚、声明变量和函数等
以 key.c 为例,其对应的头文件是 key.h。key.c 源文件会首先调用与其对应的头文件 key.h,这样就能在源文件中直接使用头文件定义的内容
给每个组新建对应的 .c/.h 文件(User 文件夹只需 main.c 文件):







3.4 向工程添加文件
在 KEIL 中将新建的文件添加到之前新建的工程分组中,最终效果如下:

详细步骤如下:



其他文件夹按照上一步骤:





3.5 配置魔术卡选项
常见问题如编译后未生成HEX文件或编译报错找不到头文件,往往源于此处配置不当
**Output:**将输出文件夹定位到源文件目录 I2C-EEPROM 下的 Obj 文件夹。如需生成 hex 文件,请勾选 Create HEX File 选项。具体配置如下:

**Listing :**把输出文件夹也定位到我们实验目录下的Obj 文件夹。其它设置默认,配置如下:

**C51 :**将前面添加到工程组中的文件路径包括进来,否则程序中调用其他文件夹的头文件则会报错找不到头文件路径,具体步骤如下:


添加的头文件路径是指,在 I2C-EEPROM 实验文件夹下里面,哪些文件夹内含有.h 头文件,并且需要被调用到的,通常会把只要含有头文件的文件夹都选择进去。比如本例程中 App 内含有很多子文件夹,它们里面都含有头文件,因此要分别添加,Public 也含有头文件,所以也要添加。