51单片机——多文件结构模板

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 也含有头文件,所以也要添加。

相关推荐
Bona Sun1 小时前
单片机手搓掌上游戏机(二十一)—pico运行doom之修改编译
c语言·c++·单片机·游戏机
松涛和鸣1 小时前
23、链式栈(LinkStack)的实现与多场景应用
linux·c语言·c++·嵌入式硬件·ubuntu
意法半导体STM321 小时前
STM32N6 如何配置EMMC启动 LAT1581
stm32·单片机·嵌入式硬件·mcu·嵌入式ai·stm32n6·stm32开发
逆小舟1 小时前
【STM32】IIC→OLED显示
stm32·单片机·嵌入式硬件
沉在嵌入式的鱼1 小时前
STM32--HX711称重传感器
stm32·单片机·嵌入式硬件·hx711·称重传感器
richxu202510012 小时前
嵌入式学习之路>单片机核心原理>(3)定时器
单片机·嵌入式硬件·学习
Darken032 小时前
基于单片机STM32中的OLED显示屏
stm32·单片机·oled·显示屏
Bona Sun2 小时前
单片机手搓掌上游戏机(十九)—pico运行doom之硬件连接
c语言·c++·单片机·游戏机
Darken033 小时前
什么是SPI协议?
单片机·spi