嵌入式 - 硬件:51單片機

本節重點

1. MCU、CPU、GPU、NPU、SOC、MPU、FPU

2. 內存、外存的區別

3. RAM和ROM的區別,單片機RAM大小

4. 三大總線及其特點

5. 發光二極管分類及其特點

6. 數碼管顯示原理

一、嵌入式

以應用為中心,以計算機技術為基礎,軟硬件可裁剪的專用計算機系統。

二、51 單片機

1980 年,由 Intel 公司推出 MCS-51 系列的8051 型號單片機(多用于工業控制領域),實現從 MCU 向類 CPU 功能的拓展。
其他廠商代表型號:

  • Atmel:AT89C51;
  • Philip:P89V5 系列單片機(增強型單片機,支持 ISP 在線編程);
  • STC 宏晶半導體:STC89C51、STC89C52、STC89C52RC。

三、相關概念

術語全稱 & 核心解釋
CPUCentral Processing Unit(中央處理器):負責數據運算、指令處理;CPU 性能越高,指令處理和數據運算速度越快。
MCUMicro Controller Unit(微控制器)--- 單片機:集成度高,將 CPU、RAM、ROM、定時器、UART、IO 等功能集成到單芯片中;適用于簡單控制場景,成本低。
MPUMicro Processing Unit(微處理器):集成度低,僅包含單獨 CPU,需外接外設、存儲模塊;適用于復雜應用領域(如運行 Linux 系統),成本高。
GPUGraphics Processing Unit(圖形處理器) ---- 顯卡:負責圖形處理、圖形渲染;GPU 性能越好,圖形顯示質量越高。
NPUNeural Processing Unit(神經網絡處理器):負責 AI 推理、硬件加速、神經網絡處理(如卷積運算);例如華為 Mate60 的 “達芬奇 NPU” 可實現 AI 自動優化照片。
FPUFloating Point Unit(浮點數運算單元):專門完成浮點數的運算和處理(遵循 IEEE 754 標準);大部分集成在 CPU 內部。
SOCSystem On Chip(片上系統):集成度高,將存儲芯片、外設芯片等多個功能模塊集成到單塊芯片上。

四、RAM 和 ROM

  • 外存:主要存放程序、代碼、指令;掉電數據不丟失,讀寫速度慢,價格便宜(如移動硬盤 1T 約 300 元)。
  • 內存:主要存放程序運行過程中的臨時變量;掉電數據丟失,讀寫速度快,價格昂貴(如內存條 16G 約 300 元)。
  • ROM:Read-Only Memory(只讀存儲器);存放單片機程序、指令,掉電數據不丟失。
  • RAM:Random Access Memory(隨機訪問存儲器);存放臨時變量、臨時數據,掉電數據丟失。

單片機的存儲系統簡化為 “ROM+RAM”,分工明確:

  • ROM(只讀存儲器):單片機的 “程序倉庫”,存放我們編寫的控制程序、指令,掉電后數據不丟失(比如你寫的 “LED 閃爍程序” 就存在這里)。
  • RAM(隨機訪問存儲器):單片機的 “臨時工作臺”,存放程序運行中的臨時變量(比如計算過程中的計數器值、傳感器的實時數據),掉電后數據丟失。

注意:51 單片機的 RAM 容量很小,經典型號(如 STC89C52)的 RAM 僅為256 字節,因此編程時要避免定義過大的變量。

五、單片機內部結構:三大總線 + 核心模塊

51 單片機的內部結構像一個 “微型工廠”,各模塊協同工作,而 “三大總線” 負責連接各模塊。

1. 核心內部模塊

一塊 51 單片機芯片內部集成了以下關鍵模塊,無需外接就能實現基礎控制功能:

  • CPU:核心運算單元,執行程序指令;
  • RAM/ROM:存儲模塊,對應上文的 “臨時工作臺” 和 “程序倉庫”;
  • Timer(定時器):實現定時功能(如 “每隔 1 秒亮一次燈”);
  • PWM(脈沖寬度調制):控制輸出信號的占空比(如調節 LED 亮度、電機轉速);
  • IO 口:輸入 / 輸出接口(如連接 LED、按鍵、數碼管);
  • 中斷:處理緊急事件(如外部按鍵按下時,暫停當前程序優先響應按鍵);
  • UART(串口):實現單片機與電腦的通信(如程序下載、數據上傳)。

2. 三大總線:連接模塊的 “橋梁”

三大總線負責在內部模塊間傳輸數據、地址和控制信號,是單片機工作的 “基礎設施”:

  • 地址總線:“找位置”—— 負責傳輸 RAM 的地址,告訴 CPU “要訪問的臨時數據在 RAM 的哪個位置”。51 單片機的地址總線寬度為 8 位,最大尋址范圍為2^8 = 256字節(對應 RAM 容量),單向傳輸(只能從 CPU 發往 RAM)。
  • 數據總線:“傳數據”—— 在 CPU 和 RAM 之間傳輸實際數據(如變量值),雙向傳輸(可從 RAM 讀數據到 CPU,也可從 CPU 寫數據到 RAM)。
  • 控制總線:“發指令”—— 負責傳輸控制信號,比如 “開始讀數據”“中斷請求”“IO 口控制”,協調各模塊的工作時序(時序控制)

六、硬件基礎:原理圖中的關鍵元素

要讓單片機工作,必須先看懂基礎原理圖,核心關注 “MCU 封裝”“網絡編號” 和 “LED 模塊”。

1. MCU 封裝:以 STC89C52RC 為例

STC89C52RC 最常用的封裝是DIP40(雙列直插式),即芯片有 40 個引腳,這些引腳分為 4 組 IO 口(P0~P3),對應程序中的端口寄存器(如unsigned char P2;—— 通過操作 P2 寄存器就能控制 P2 口的 8 個引腳)。

2. 網絡編號

在實際電路中的一個編號,避免物理連線,相同網絡的編號的引腳在實際電路中是彼此互通

3. LED 模塊:單向導通的 “發光二極管”

具有單向導通性,分為共陽極和共陰極二極管

  • 共陽極 LED:所有 LED 的陽極接電源正極(VCC,5V),陰極接單片機的 IO 引腳。
    導通條件:單片機 IO 引腳輸出低電平(0V),此時陽極(5V)和陰極(0V)形成電壓差,電流流過 LED,使其發光。
  • 共陰極 LED:與共陽極相反,陰極接 GND,陽極接單片機 IO 引腳,需 IO 輸出高電平才能發光。

七、編程核心:位運算(置 1 / 清 0 / 異或)

單片機編程頻繁操作 IO 口的 “某一位”(比如 “讓 P2 口的第 0 位輸出低電平”),這就需要位運算—— 直接操作二進制的每一位(bit)。

1. 三種核心位運算

運算符號名稱規則(對應 bit 比較)核心應用場景示例代碼(以 unsigned char t 為例)
|按位或有 1 則 1,全 0 則 0指定位置 1(讓某 bit=1)

把 t 的 bit0 和 bit7 置 1:

t |= (1 << 0) | (1 << 7);

&按位與全 1 則 1,有 0 則 0指定位清 0(讓某 bit=0)

把 t 的 bit0 和 bit7 清 0:

t &= ~(1 << 0);

t &= ~(1 << 7);

^按位異或相同則 0,不同則 1指定位翻轉(0 變 1,1 變 0)

把 t 的 bit0 翻轉:

t ^= (1 << 0);

2. 練習

已知:unsigned char a = 0x62; unsigned char b = 0xFF;(16 進制轉二進制:0x62=01100010,0xFF=11111111)

(1)將 a 的 bit0 和 bit7 置 1

????????a |= (1 << 0) | (1 << 7);

(2)將 b 的高 4 位清 0

?????????t?&=?~(0x0F?<<?4);?????????
t?&=?~(0xF0?<<?0);?????

八、單片機程序創建、編寫、編譯、下載流程:

掌握 “編寫 - 編譯 - 下載” 流程,你就能讓單片機執行你的指令(比如控制 LED 閃爍),這里以Keil4(51 單片機專用開發軟件)?為例:

步驟 1:安裝 Keil4

步驟 2:新建工程

  1. 點擊菜單欄「Project」→「New Project」,選擇工程保存路徑,命名(如 “LED_Blink”);
  2. 選擇芯片型號:在彈出的 “Select Device for Target” 窗口中,展開「Atmel」→選擇「AT89C51」
  3. 彈出 “Copy Standard 8051 Startup Code to Project Folder” 時,點擊「否」---------------------不拷貝啟動代碼

步驟 3:添加 C 語言文件

  1. 點擊菜單欄「File」→「New」,新建空白文本;
  2. 按「Ctrl+S」保存,命名為 “main.c”(必須加.c 后綴,保存到工程同一目錄);
  3. 雙擊左側Grpup,點擊Add?將文件加入到對應的Group下。

步驟 4:編寫程序(以 LED 閃爍為例)

1? .#include?<reg51.h>,?加入51單片機頭文件

2 .需要加入while(1)避免程序跑飛

示例代碼:

#include <reg51.h>// 延時函數(簡單延時,約1秒)
void delay() {unsigned int i, j;for(i = 0; i < 60000; i++)for(j = 0; j < 10; j++);
}void main() {while(1) {P2 = 0xFE;  // P2口bit0=0(低電平),其他bit=1,對應LED亮delay();    // 延時1秒P2 = 0xFF;  // P2口全為1(高電平),LED滅delay();    // 延時1秒}
}

步驟 5:編譯生成 HEX 文件

  1. 點擊菜單欄「Project」→「Options for Target 'Target 1'」(或直接點工具欄 “魔術棒” 圖標);
  2. 切換到「Output」選項卡,勾選「Create HEX File」(生成可下載的十六進制文件),點擊「OK」;
  3. 點擊工具欄「Build」(或按 F7),編譯工程,下方 “Build Output” 窗口顯示 “0 Errors” 即編譯成功,工程目錄下會生成 “LED_Blink.hex” 文件。

步驟 6:下載程序到單片機

(1)打開ISP軟件,連接串口線

(2)選擇單片機芯片型號:STC89C52/C51/C52RC

(3)根據串口識別的端口號,選擇對應的端口??COM4

(4)選擇"打開程序文件"?->?對應目錄下的hex文件

(5)點擊"下載/編程"按鈕,將單片機復位后程序即可下載到單片機ROM中

九、數碼管:單片機的 “顯示窗口”

4 位共陰極數碼管

數碼管:51單片機搭載一個4位共陰極數碼管,每一位數碼管可以顯示一些獨立數值,數碼管同一時刻只能顯示一位

核心是 “位選 + 段選” 的配合。

1. 基本原理

4 位數碼管看似能同時顯示 4 個數字(如 “1234”),但同一時刻只能顯示 1 位—— 利用 “視覺暫留效應”(人眼對光的殘留時間約 0.1 秒),快速切換 4 位數碼管的顯示,讓人感覺 “同時亮”。

2. 核心概念

  • 位選:“選哪一位顯示”—— 選中某一位數碼管(將P1寄存器對應bit位置1)

  • 段選:“顯示什么數字”—— 數碼管的每一段(a~g 段 + dp 小數點)對應一個 IO 口,通過控制 “段選端” 的高低電平,顯示 0~9 的數字(如顯示 “0” 需要 a~f 段亮,g 段滅)。

3. 顯示流程(以顯示 “1234” 為例)

  1. 位選選中第 1 位,段選輸出 “1” 的段碼,顯示 “1”,延時 1ms;
  2. 位選選中第 2 位,段選輸出 “2” 的段碼,顯示 “2”,延時 1ms;
  3. 位選選中第 3 位,段選輸出 “3” 的段碼,顯示 “3”,延時 1ms;
  4. 位選選中第 4 位,段選輸出 “4” 的段碼,顯示 “4”,延時 1ms;
  5. 循環執行 1~4 步,由于切換速度快(總周期 4ms),人眼看到 “1234” 同時顯示。


十、重點總結 + 工具推薦

必背重點(面試 / 實操高頻)

  1. 概念辨析:MCU(集成度高、簡單控制)vs MPU(需外接外設、復雜應用);
  2. 存儲區別:RAM(臨時變量、掉電丟失)vs ROM(程序指令、掉電不丟);
  3. 三大總線:地址總線(單向、尋址)、數據總線(雙向、傳數據)、控制總線(時序控制);
  4. LED 導通:共陽極需陰極接低電平,共陰極需陽極接高電平;
  5. 位運算應用|置 1、&清 0、^翻轉;
  6. 程序流程:Keil 編譯生成 HEX,STC-ISP 下載,復位單片機生效。

實用工具推薦

  • 文檔編寫:Typora(用 Markdown 寫技術文檔,可導出 PDF);
  • 截圖工具:PixPin(精準截圖,支持標注,適合畫原理圖注釋);
  • AI 輔助:騰訊元寶、ima(解決編程報錯、原理疑問,提升學習效率)。

編寫? .h


十一、實戰練習

1.流水燈

main.c

led.c

2.數碼管顯示

main.c

digiter.c

digiter.h

delay.c? delay.h

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

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

相關文章

Java Spring Boot 中 Redis 緩存穿透問題排查與解決方案

前言 作為一名普通的 Java 程序開發者&#xff0c;日常開發中難免會遇到一些看似簡單但實際排查起來非常棘手的問題。在最近的一個項目中&#xff0c;我遇到了一個 Redis 緩存穿透的問題&#xff0c;導致系統在高并發下性能急劇下降&#xff0c;甚至出現服務響應超時的情況。這…

Ubuntu下配置并遠程連接MySQL

1、安裝mysql-serverapt update apt install mysql-server2、修改配置文件/etc/mysql/mysql.conf.d/mysqld.cnfbind-address 0.0.0.0 mysqlx-bind-address 0.0.0.03、啟動并設置服務為開機自啟動systemctl enable mysql.service --now4、查看服務狀態systemct…

開源 C++ QT Widget 開發(九)圖表--儀表盤

文章的目的為了記錄使用C 進行QT Widget 開發學習的經歷。臨時學習&#xff0c;完成app的開發。開發流程和要點有些記憶模糊&#xff0c;趕緊記錄&#xff0c;防止忘記。 相關鏈接&#xff1a; 開源 C QT Widget 開發&#xff08;一&#xff09;工程文件結構-CSDN博客 開源…

怎么為服務器設置或重置服務器密碼?

創建服務器后&#xff0c;您可以設置服務器的登錄密碼&#xff0c;如果你忘記了密碼&#xff0c;可以重新設置實例的密碼。本文講一下如何重置阿里云服務器密碼。使用限制&#xff1a;離線重置密碼僅支持在控制臺設置或重置服務器管理員賬號的密碼。?Windows 實例的默認用戶名…

【線性代數入門 | 那忘算8】洛谷P3389 高斯消元(內附行列式教學)

想了想還是單開了一篇&#xff0c;數學王子值得&#xff01; 專欄指路&#xff1a;《再來一遍一定記住的算法&#xff08;那些你可能忘記了的算法&#xff09;》 前置知識&#xff1a; 矩陣&#xff1a;數的集合&#xff0c;一般是方程的系數。 題面&#xff1a; 洛谷P3389 …

GEM5學習(3):如何快速創建一個組件

通過一個圖并行計算的測試用例&#xff0c;來學習如何快速構建一個目標組件 其核心思想是通過繼承現有組件再拓展自定義參數 創建腳本 如何創建腳本&#xff0c;具體還可以看官方說明&#xff1a;gem5: Adding cache to configuration script mkdir configs/tutorial/part1/…

數據血緣中的圖數據庫如何選擇

Neo4j 和 ArangoDB 都是非常優秀的圖數據庫&#xff0c;但它們的設計哲學、核心架構和適用場景有顯著的區別。 簡單來說&#xff0c;核心區別在于&#xff1a; Neo4j 是原生圖數據庫&#xff0c;專為處理圖數據和圖查詢而設計和優化。ArangoDB 是多模型數據庫&#xff0c;同時支…

第27章學習筆記|學無止境:從“會用命令”到“會做工具”的進階路線

第27章學習筆記|學無止境:從“會用命令”到“會做工具”的進階路線 你已經能用 PowerShell 解決很多日常問題了。接下來最重要的,就是把零散命令升級為可復用的工具,并在真實場景中不斷打磨。 一、為什么下一步是“工具化(Toolmaking)” 當任務開始“重復、多人用、可移…

C++編程語言:標準庫:第37章——正則表達式(Bjarne Stroustrup)

第 37章 正則表達式(Regular Expressions) 目錄 37.1 正則表達式(規范表達式)(Regular Expressions) 37.1.1 正則表達式相關符號(Regular Express Notation) 37.2 regex 37.2.1 匹配結果(Match Results) 37.2.2 格式化(Formatting) 37.3 正則表達式函數 37.3.1 …

sciml包scixgboost函數發布,輕松完成機器學習xgboost分析

Xgboost是Boosting算法的其中一種&#xff0c;Boosting算法的思想是將許多弱分類器集成在一起&#xff0c;形成一個強分類器。因為Xgboost是一種提升樹模型&#xff0c;所以它是將許多樹模型集成在一起&#xff0c;形成一個很強的分類器。 我目前整合了多個R包&#xff0c;編寫…

Ubuntu中配置JMmeter工具

1、檢查是否已安裝Java 環境java -version若未安裝&#xff0c;執行以下命令安裝 OpenJDKsudo apt update sudo apt install openjdk-11-jdk # 或 openjdk-17-jdk2、用wget直接下載JMeter壓縮包wget https://dlcdn.apache.org/jmeter/binaries/apache-jmeter-5.6.3.tgz將下載的…

LeetCode 925.長按鍵入

你的朋友正在使用鍵盤輸入他的名字 name。偶爾&#xff0c;在鍵入字符 c 時&#xff0c;按鍵可能會被長按&#xff0c;而字符可能被輸入 1 次或多次。 你將會檢查鍵盤輸入的字符 typed。如果它對應的可能是你的朋友的名字&#xff08;其中一些字符可能被長按&#xff09;&#…

9.3 模擬

lc190 顛倒二進制ret (ret << 1) (n >> i & 1);class Solution { public:uint32_t reverseBits(uint32_t n) {uint32_t ret 0;for (int i 0; i < 32; i)ret (ret << 1) (n >> i & 1);return ret;} };lc14 flag checkclass Solution {…

esp32小智ai對話機器人

ESP-IDF 環境搭建與問題解決 下載與安裝 ESP-IDF 官方下載地址&#xff1a;https://dl.espressif.com/dl/esp-idf建議使用穩定版本&#xff0c;避免開發版可能存在的兼容性問題 中文編碼問題解決方案 $env:PYTHONIOENCODING "utf-8" $env:PYTHONUTF8 "1&q…

11.類與對象

目錄 1. 創建類與對象示例 1.1 __init__ 初始化器: 1.2 __new__構造器 1.3 什么時候需要重寫 __new__? 1.4 init和new對比 2. 屬性 2.1 實例屬性 2.2 類屬性 3. 作用域命名約定 3.1 非公共屬性 3.2 公共屬性 3.3 名稱修飾 3.4 一眼看懂三種“可見性” 4. 方法 …

【js】Promise.try VS try-catch

前言JavaScript 正為 Promise 添加一個新的方法&#xff0c;使得處理異步函數更加清晰和安全。Promise.try 允許將任何函數包裝在 Promise 中&#xff0c;無論它是否異步。使用 Promise.try 可避免傳統 try/catch 結構與 Promise 鏈的混合使用&#xff0c;代碼更簡潔。try-catc…

MySQL-表的約束(上)

表的約束在 MySQL 中&#xff0c;表的約束&#xff08;Constraints&#xff09;用于確保數據庫中數據的完整性和一致性。它們定義了對表中數據的規則和限制&#xff0c;防止無效或不一致的數據被插入、更新或刪除。常見的 MySQL 表約束包括主鍵約束&#xff08;PRIMARY KEY&…

Frida + FART 聯手:解鎖更強大的 Android 脫殼新姿勢

版權歸作者所有&#xff0c;如有轉發&#xff0c;請注明文章出處&#xff1a;https://cyrus-studio.github.io/blog/ Frida FART 聯手能帶來什么提升&#xff1f; 增強 FART 的脫殼能力&#xff1a;解決對抗 FART 的殼、動態加載的 dex 的 dump 和修復&#xff1b; 控制 FART…

TLS/SSL(傳輸層安全協議)

文章目錄一、核心概念二、為什么需要 TLS/SSL&#xff1f;三、工作原理與詳細流程握手步驟詳解&#xff1a;1.ClientHello & ServerHello&#xff1a;2.服務器認證 (Certificate, ServerKeyExchange)&#xff1a;3.客戶端響應 (ClientKeyExchange, Finished)&#xff1a;4.…

什么是 AWS 和 GCE ?

AWS 和 GCE 是兩種不同廠商提供的云計算服務&#xff0c;主要區別在于提供商和產品定位。AWS全稱&#xff1a;Amazon Web Services提供商&#xff1a;亞馬遜 (Amazon)簡介&#xff1a;全球最大的云計算平臺之一&#xff0c;提供完整的云服務&#xff0c;包括&#xff1a; 計算&…