51 單片機單文件多文件結構工程模板的創建教程

? ? ? ? 本章將詳細介紹KEIL C51軟件的使用方法及51單片機工程的創建流程。通過本章學習,掌握建立51單片機工程模板的技能,為后續51 單片機編程學習奠定基礎。

單文件與多文件結構對比

對比項單文件結構多文件結構
項目規模小項目、實驗項目中大型項目、正式開發
可讀性初期好,后期差良好,結構清晰
維護性改一個容易牽一發而動全身模塊獨立,維護方便
可移植性極差模塊可復用,易于移植
學習曲線入門簡單需要理解模塊化設計

單文件結構工程模板的創建

? ? ? ? 在嵌入式開發中,僅包含一個 main.c 文件的工程通常稱為"單文件結構"(Single File Structure)或單文件工程。這是最基礎、最簡化的項目組織形式,特別適合學習階段或小型測試項目。

單文件結構定義

? ? ? ? 單文件結構是指將所有代碼(包括主函數、外設控制、邏輯處理、宏定義、變量聲明和延時函數等)集中編寫在一個.c文件中,通常命名為main.c。

適用場景

  • 初學者練習:剛接觸Keil C51時,推薦使用單文件練習LED控制、按鍵檢測和延時等基礎功能
  • 簡單演示:適合開發小型demo,不建議堆砌過多功能
  • 過渡學習:掌握基本語法后,應及時轉向模塊化開發方式

典型工程結構

創建流程

1、新建工程

? ? ? ? 在電腦上任意位置新建一個名為"51 單片機工程模板創建"的文件夾。接著打開KEIL C51軟件,新建一個工程。建議使用英文命名工程文件(如template),避免使用中文名稱可能導致的異常問題。將新建的工程直接保存在之前創建的"51 單片機工程模板創建"文件夾中。具體操作步驟如下:

2、選擇 CPU 型號

? ? ? ? 這個根據你所使用的開發板上使用的CPU型號選擇對應芯片,我的開發板(普中A7)采用的是STC89C52芯片。在 KEIL C51 軟件內找不到這種型號的單片機選項,但因為 51 內核單片機具有通用性,所以在這里可以任選一款89C52 進行開發。Keil軟件的關鍵在于程序代碼編寫,硬件選擇并非重點。本文以Atmel的89C52為例示范,具體操作步驟如下:

? ? ? ? 點擊 OK 鍵后,彈出如下對話框:

? ? ? ? 該對話框提示是否要將8051啟動文件添加到工程中。選擇"否",因為KEIL C51已自動處理了啟動過程,只需編寫應用程序代碼即可。選擇"否"后的界面如下:

3、給工程添加文件

? ? ? ? 選擇“File->New...”或點擊工具欄的圖標新建一個文件后點擊保存。保存時系統會自動跳轉到工程目錄,直接在文件名欄輸入新文件名即可。請注意:51單片機工程必須包含且僅有一個 main 函數,因此建議將文件命名為 main.c(也可按個人習慣使用其他英文名稱)。保存操作步驟如下:

? ? ? ? 將新建的 main.c 文件添加到工程中,具體操作步驟如下:

  1. 右鍵點擊工程組"Source Group1"
  2. 選擇"Add Files to Group 'Source Group 1'..."
  3. 在彈出的窗口中選中對應的 xxx.c 文件
  4. 依次點擊"Add"和"Close"按鈕

? ? ? ? 完成上述操作后,文件將顯示在工程列表中。

4、配置魔術棒選項卡

? ? ? ? 這一步的配置非常關鍵,許多用戶在自行編譯程序時遇到找不到.HEX文件的問題,或者使用51仿真器時出現仿真失敗的情況,往往都是由于配置不當造成的。具體配置步驟如下:

? ? ? ? 配置Output 選項。選擇魔術棒工具的 Output 選項卡,勾選紅色框3,即程序編譯成功后會產生 HEX 文件。具體操作如下:

? ? ? ? 51 仿真器配置(僅針對有仿真器的同學去配置)。當你購買了 51 仿真器,且你的仿真器已經安裝好驅動,且已經連接好了電腦和開發板,便可開始配置工作。先安裝安裝51 仿真器,步驟如下:

  1. 將51仿真器插入單片機卡座
  2. 連接電腦端USB接口,此時仿真器會同時為開發板供電,因此無需額外連接電源線

? ? ? ? 如果想要使用51仿真器進行在線程序調試,需在KEIL軟件中進行相應配置,具體的配置如下(注意:以下配置基于普中51仿真器已連接開發板的情況):

? ? ? ? 點擊OK確認設置。完成以上圖中 1 到 10 步的設置后,即可開始在線仿真調試了。雙擊工程組中的main.c文件,輸入以下代碼:

#include "reg52.h"
void main() {while(1) {}
}

? ? ? ? 編譯結果顯示0錯誤0警告,說明51單片機工程創建完全正確,如下所示:

補充:上圖紅色方框?1 中三個按鈕都可以對代碼編譯,但其功能不同:

  • 第一個:它是編譯當前界面所在的一個 C 文件。
  • 第二個:聯合編譯整個工程,發生修改的文件重新編譯,并生成可執行文件。
  • 第三個:聯合編譯整個工程,所有文件都重新編譯,并生成可執行文件。

? ? ? ? 從上面說明可以看出,一般情況下,我們不使用第三個編譯按鈕,第二個最常用。因為第三個每次都把所有的文件都重新編譯,需要消耗大量的時間。當工程比較小的時候,感覺不到,但是工程較大的時候就不行了。

多文件結構工程模板的創建

? ? ? ? 在嵌入式 C(以 Keil C51 為代表)開發中,很多初學者常常將所有代碼寫在 main.c 文件中,比如 LED 控制、按鍵掃描、數碼管顯示、定時器中斷、串口通信等等。這種方式雖然簡單直觀,但一旦項目稍微復雜起來,就會陷入“代碼越來越長、維護越來越難”的泥潭。

? ? ? ? 為了解決這個問題,我們通常采用 “多文件工程結構Multi-file Structure來組織代碼,也稱為模塊化設計,多文件結構通過將各個功能模塊的代碼獨立存放,形成清晰的工程目錄層級,以提高代碼的可讀性、可維護性與可移植性。

? ? ? ? 下面將詳細介紹如何在 Keil 項目中構建一套標準的多文件結構,并結合實際案例(本文以I2C-EEPROM 實驗?為例)講解其優點和實現方法。

多文件結構定義

? ? ? ? 多文件結構是指將工程代碼按功能或職責進行劃分,分別存放在多個 .c 源文件和 .h 頭文件中,常見模塊包括主函數、外設驅動、公共函數、類型定義等,并通過模塊化接口進行調用。每個功能模塊通常擁有自己獨立的一對 .c/.h 文件,主函數只負責調用這些模塊接口。

適用場景

  • 項目逐漸復雜:適合功能較多的中大型嵌入式工程,如包含 LED、按鍵、數碼管、串口通信、定時器等多個模塊。
  • 團隊協作開發:多人分模塊協同開發時,模塊隔離便于分工、測試和集成。
  • 功能復用需求:通用模塊如延時函數、I2C 驅動等可直接在多個項目中重用。
  • 工程化管理:代碼清晰、結構合理,方便調試、維護、版本控制及文檔生成。
  • 向更高層次開發過渡:為后續學習 STM32、RTOS、裸機+模塊化架構打下良好基礎。

典型工程結構

? ? ? ? 一個規范的 Keil 多文件項目結構大致如下:

? ? ? ? 具體示例:I2C-EEPROM 實驗項目源代碼結構如下所示:?

創建流程

1、創建多文件工程

? ? ? ? 首先在電腦上創建一個名為"I2C-EEPROM"的文件夾(與教程保持一致),然后在該文件夾內新建以下四個子目錄:

  • App 文件夾:存放外設驅動程序,如LED、數碼管、定時器等模塊
  • Obj 文件夾:存放編譯生成的文件,包括c/匯編/鏈接的列表清單、調試信息、hex文件等
  • Public 文件夾:存放51單片機公共文件,如延時函數、頭文件、類型定義等
  • User 文件夾:存放用戶主函數文件main.c

? ? ? ? 采用這種多文件管理方式的原因在于:本章實驗需要用到獨立按鍵、數碼管、EEPROM等多個功能模塊。如果將所有代碼都寫在main.c中,會導致文件過于冗長,嚴重影響代碼的可讀性和可維護性。通過合理的目錄劃分,可以顯著提升工程的組織性和可移植性。操作方法如下:

2、新建工程

? ? ? ? 打開 KEIL 軟件,新建一個工程,建議使用英文命名工程文件(如template),避免使用中文名稱可能導致的異常問題,并保存在“I2C-EEPROM ”文件夾下,然后選擇芯片類型為“AT89C52”,注意不要勾選系統創建啟動文件的選項。具體操作如下圖所示:

? ? ? ? 上述操作與前面介紹的創建工程模板是一樣的,下面才開始在工程中進行分組管理。

3、向工程添加文件

? ? ? ? 按照需要將工程文件分組并添加相應文件。這里我們將工程分為3組:User、App和Public。建議 “KEIL 中的工程組的命名(User、App、Public)” 與 “電腦硬盤上源文件中的文件夾名稱” 保持一致,便于快速定位文件位置。分組操作如下:

? ? ? ? 分組后,在KEIL -> Project 框中就會出現剛才的分組列表,與電腦硬盤上源文件中的文件夾名稱保持一致,如下所示:

? ? ? ? 至于Obj文件夾則無需在工程中顯示,因為它僅包含編譯器生成的中間文件和.hex可執行文件,如下所示:

? ? ? ? 然后就是給每個組新建對應的.c /.h 源文件,如下所示:

? ? ? ??在 App 文件夾中可以發現,驅動文件按外設類型分別存放在對應的子文件夾中,這種組織方式極大提升了程序的可移植性和可維護性。

? ? ? ? 通常,在以文件形式存放對應功能的驅動程序時,會創建兩個文件:一個.c 源文件用于存放外設驅動程序(如按鍵檢測函數),另一個.h 頭文件則用于定義管腳、聲明變量和函數等。以 key.c 為例,其對應的頭文件是 key.h。key.c 源文件會首先調用與其對應的頭文件key.h,這樣就能在源文件中直接使用頭文件定義的內容。

? ? ? ? 接著,需要在KEIL 中將新建的文件添加到之前新建的工程分組中,如下所示:

? ? ? ? 也可以直接鼠標左鍵雙擊需要添加的.c 文件(紅色標記 5)完成添加操作,從而免去了點擊紅色標記 6 這步。添加成功后,右側區域Files會顯示對應組中已添加的文件,如下圖所示:

? ? ? ? 同樣的方法,將 App、Public 工程組中的文件也添加進去。如下所示:

? ? ? ? 此時可以看到,在工程欄下每組都已經加入了剛才添加的源文件,如下所示:

? ? ? ? 如果有遺漏的文件未添加,可按上述方法重新添加。此時若直接編譯工程會出現大量錯誤,因為在KEIL中尚未指定頭文件路徑。

4、配置魔術棒選項卡

? ? ? ? 這一步的配置至關重要。常見問題如編譯后未生成HEX文件或編譯報錯找不到頭文件,往往源于此處配置不當:
? ? ? ? 在Output選項?中,將輸出文件夾定位到源文件目錄 I2C-EEPROM 下的Obj文件夾。如需生成hex文件,請勾選Create HEX File選項。具體配置如下:

? ? ? ? Listing 選項?中把輸出文件夾也定位到我們實驗目錄下的Obj 文件夾。其它設置默認,配置如下:

? ? ? ? C51 選項?配置,此處目的是將我們前面添加到工程組中的文件路徑包括進來,否則程序中調用其他文件夾的頭文件則會報錯找不到頭文件路徑,具體步驟如下:

? ? ? ? 添加的頭文件路徑是指,在 I2C-EEPROM 實驗文件夾下里面,哪些文件夾內含有.h 頭文件,并且需要被調用到的,通常會把只要含有頭文件的文件夾都選擇進去。比如本例程中 App 內含有很多子文件夾,它們里面都含有頭文件,因此要分別添加,Public 也含有頭文件,所以也要添加。添加完成后如下:

5、 51 仿真器配置

? ? ? ? 51 仿真器配置和上一節相關內容一致,此處不再重復。最后編譯一下工程,編譯后結果: 0 錯誤 0 警告,表明創建的多文件工程沒有問題。如下:

? ? ? ? 至此,我們就成功創建好一個多文件工程模板。凡是涉及到多個外設資源模塊的都可以使用該工程模板的方法整理項目代碼,尤其是對重復利用已編寫過的外設驅動。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/91111.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/91111.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/91111.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Git】實用Git操作指南:從入門到高效協作

目錄 1. Git 工作流程圖 2. 基本配置 3. 獲取本地倉庫 4. 基礎操作 5. 分支 6. Git遠程倉庫 6.1 常用的托管服務[遠程倉庫] 6.2 注冊碼云 6.3創建遠程倉庫 6.4 配置SSH公鑰 6.5 操作遠程倉庫 7. 在IDEA中使用Git 附:鐵令 下載地址:Git - Downloads 安裝&…

InstructBLIP:通過指令微調邁向通用視覺-語言模型

溫馨提示: 本篇文章已同步至"AI專題精講" InstructBLIP:通過指令微調邁向通用視覺-語言模型 摘要 大規模預訓練和指令微調在構建通用語言模型方面取得了顯著成功。然而,構建通用視覺-語言模型仍然面臨挑戰,這主要源于…

[python][flask]flask藍圖使用方法

在 Flask 中,藍圖(Blueprint)是一種用于組織和管理代碼的機制,可以將應用分解為多個模塊,每個模塊專注于特定的功能。以下是使用藍圖的基本步驟和方法:1. 創建藍圖首先,需要創建一個藍圖對象。藍…

學習dify:一個開源的 LLM 應用開發平臺

Dify 是一個開源的 LLM 應用開發平臺。其直觀的界面結合了 AI 工作流、RAG 管道、Agent、模型管理、可觀測性功能等,讓您可以快速從原型到生產。以下是其核心功能列表: 1. 工作流: 在畫布上構建和測試功能強大的 AI 工作流程,利用以下所有…

VEX實現物體沿線條流動

1. 效果如下:float offset fit01(rand(ptnum654),0.5,1)*Time*chf("speed") rand(ptnum547);int num nprimitives(1); vector pos primuv(1,"P",ptnum%num,offset%1);P pos;2.效果如下: float min detail(1,"min");…

puppeteer 系列模塊的系統性、詳細講解

puppeteer 系列模塊的系統性、詳細講解 🧩 一、核心模塊介紹 1. puppeteer全功能 Puppeteer 包,默認包含 Chromium 瀏覽器npm install puppeteer包含內容:Puppeteer API Chromium 瀏覽器適合場景: 想直接運行,不關心瀏…

golang實現一個規則引擎,功能包括實時增加、修改、刪除規則

以下是一個用 Go 實現的輕量級規則引擎,支持實時增加、修改、刪除規則,并基于表達式評估觸發規則動作: package mainimport ("errors""fmt""sync" )// Rule 定義規則結構體 type Rule struct {ID string // 規則唯一標…

算法訓練營day34 動態規劃② 62.不同路徑、63. 不同路徑 II、343整數拆分、96.不同的二叉搜索樹

動態規劃的第二篇博客!進階題目,有一說一,尤其最后一道題,真的難想到這種解法 找規律!!! 62.不同路徑 注意本題是路徑不是路程!!! 動態規劃 確定dp數組&am…

Spring 5 事務詳解

一、核心使用方式聲明式事務(推薦)通過 Transactional 注解實現,需配合配置啟用:Configuration EnableTransactionManagement public class AppConfig {Beanpublic PlatformTransactionManager txManager(DataSource dataSource) …

[ctfshow web入門]web99 in_array的弱比較漏洞

信息收集 array_push(array, value):向數組最后的位置插入value in_array(value, array, type):其中value是要查找的值,array是需要查找的的數組,type是查找的類型,如果沒有指定類型,則以弱比較方式查找 i…

mysql5.6 常用查詢sql

mysql5.6 常用查詢sql 文章目錄 mysql5.6 常用查詢sql 1.查詢版本 2.MySQL 運行狀態(Ping) 3.慢查詢數量 4.連接數 5.最大連接數 6.InnoDB 緩沖池命中率 7.表鎖等待次數 8.二進制日志狀態 9.表空間使用率 10.查詢緩存效率 11.每次自動擴展空間大小 12.導入導出 ? 一、導出(…

【在Unity游戲開發中Dictionary、List介紹】

在Unity游戲開發中&#xff0c;Dictionary和List是最核心的兩種數據結構&#xff0c;它們各自有優勢和應用場景。以下是介紹&#xff1a;&#x1f9e0; 數據結構本質對比特性Dictionary<TKey, TValue>List底層結構哈希表&#xff08;Hash Table&#xff09;動態數組&…

windows平臺計劃任務批處理實現定時任務

無限循環加定時延時計劃任務用戶登錄執行一次下文中300代表300秒執行一次第2,3,4行為vbs隱藏窗口C:\me\corn\test.batecho off if "%1""hide" goto CmdBegin start mshta vbscript:createobject("wscript.shell").run("""%~0&quo…

深入理解 TCP 協議:從原理到實踐的技術解析

目錄 一、TCP 協議的核心定位與特性 1.1 協議棧中的位置 1.2 五大核心特性 二、TCP 連接建立與終止的底層邏輯 2.1 三次握手&#xff08;連接建立&#xff09; 2.2 四次揮手&#xff08;連接終止&#xff09; 三、TCP 可靠傳輸的核心機制 3.1 序列號與確認機制 3.2 滑…

JAVA后端開發——“全量同步”和“增量同步”

“全量同步”和“增量同步”是數據處理、系統集成和數據庫領域中兩個基本概念。描述了兩種截然不同的數據同步策略&#xff0c;理解它們的區別對于設計任何數據系統都至關重要。全量同步 核心思想&#xff1a;全部替換&#xff0c;一步到位。在技術上&#xff0c;全量同步通常意…

修改CentOS的SSH登錄端口(22端口)

要修改CentOS系統的SSH服務默認端口(22端口)&#xff0c;請按照以下步驟操作&#xff1a; 備份SSH配置文件 sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak編輯SSH配置文件 sudo vi /etc/ssh/sshd_config查找并修改端口設置 找到以下行(大約在第13行左右)&#xff1a;…

python導包機制-更優方式

在學習某個大模型應用的后端時&#xff0c;發現&#xff1a; xxx |-----src |------\---modules |------\------\------b.py |-----app.py在app.py中可以使用src.modules.b來進行導入。之前我導入時是形如.modules.b這種形式&#xff08;前面有.&#xff09;&#xff0c;但是當…

檢索召回率優化探究一:基于 LangChain 0.3集成 Milvus 2.5向量數據庫構建的智能問答系統

背景 基于 LangChain 0.3集成 Milvus 2.5向量數據庫構建的 NFRA&#xff08;National Financial Regulatory Administration&#xff0c;國家金融監督管理總局&#xff09;政策法規智能問答系統&#xff0c;第一個版本的檢索召回率是 79.52%&#xff0c;尚未達到良好、甚至是優…

《整合Spring Cache:本地緩存、Redis與Caffeine對比實踐》

&#x1f680; 整合Spring Cache&#xff1a;本地緩存、Redis與Caffeine對比實踐 &#x1f4cc; 前言 在高并發、高性能的系統設計中&#xff0c;緩存始終扮演著不可替代的角色。Spring Cache 作為 Spring 框架原生提供的緩存抽象層&#xff0c;極大簡化了緩存接入的復雜度。…