51單片機-驅動LED模塊教程

本章思維導圖:

51單片機驅動LED燈模塊

LED燈元器件簡介

????????LED(Light Emitting Diode,發光二極管)?是一種固態半導體器件,通過P-N結中電子與空穴復合直接將電能轉化為光能。其核心結構由P型半導體(空穴主導)和N型半導體(電子主導)組成,當施加正向電壓時,電子與空穴在PN結處復合,以光子形式釋放能量,光的顏色由半導體材料決定(如GaN基材料發藍光,摻雜熒光粉后可得白光)。實物圖如下:

LED燈結構與原理:

????????PN結:由P型半導體(空穴主導)和N型半導體(電子主導)組成,電子與空穴復合時釋放光子。

????????分類:貼片式(0603、0805等)、直插式(3mm、5mm等)、高壓LED、COB(芯片級封裝)。

區分LED的正負:

????????1. 引腳長度:長引腳為正極(陽極),短引腳為負極(陰極)。

????????2. 引腳粗細:正極引腳通常較粗,負極較細(部分型號適用)。原因:正極需承載更大電流,設計上可能更粗以增強導電性。? ??

????????3. 封裝標識:內部結構:觀察LED內部,較小金屬片(或焊盤)連接正極,較大金屬片連接負極。

????????4. 外部標記:某些LED在塑料外殼上印有“+”或“-”符號。扁平封裝LED(如貼片式)可能有綠色或白色標記的一端為負極。

????????5. 燈頭形狀(適用于某些特殊LED):部分LED燈頭設計為“平邊”或“缺口”側為負極,另一側為正極(需參考具體型號說明書)。


硬件電路原理分析

觀察電路圖:可分析出有8個LED燈分別為D1~D8;LED燈左側連接高電平VCC,LED燈右側連接排阻在連接51單片機的P20~P27編號引腳;51單片機P20~P27編號引腳分別對應51芯片P2.0引腳~P2.7引腳;所以要得LED燈點亮電路中51單片機P2.0引腳~P2.7引腳輸出低電平形成電勢差;

排阻在電路中起到的作用是:限制電流,防止LED因過流而損壞,同時確保其正常工作。

總結:驅動LED燈51單片機P2.0引腳~P2.7引腳輸出低電平,不驅動LED燈51單片機P2.0引腳~P2.7引腳輸出高電平;


sbit關鍵字和sft關鍵字

在講解軟件編程設計前,我想給小伙伴們講解sbit關鍵字和sft關鍵字。因為這與我們51單片機軟件編程息息相關;

sbit關鍵字

sbit關鍵字的作用:聲明一個特殊功能寄存器中的某一位的地址,允許單獨操作該位(置1、清0或讀取狀態)。

sbit關鍵字的語法:

sbit 位名 = 寄存器名^位置; // 方式1:通過sfr變量聲明 
sbit 位名 = 地址; // 方式2:直接通過絕對地址聲明(不常用)

示例代碼:

sfr P0 = 0x80; // 先聲明P0寄存器 
sbit P0_0 = P0^0; // 聲明P0端口的第0位(最低位) 
sbit P0_1 = 0x80^1; // 直接通過地址聲明P0的第1位(等效寫法)

sbit關鍵字的注意細節:

????????sbit?必須基于已聲明的?sfr?或絕對地址(0x80~0xFF)。

????????位位置是?0~7(0表示最低位,7表示最高位)。

????????常用于控制單個引腳或標志位(如中斷標志、定時器控制位等)。


sfr關鍵字

sfr關鍵字作用:聲明一個8位特殊功能寄存器的地址,使其可以通過變量名直接訪問。

sfr關鍵字的語法:

sfr 寄存器名 = 地址;

示例代碼:

sfr P0 = 0x80; // 聲明P0端口寄存器,地址為0x80
通過?P0?可以直接讀寫整個8位寄存器,例如:P0 = 0xFF; // 將P0端口所有引腳置高電平

sfr關鍵字的注意細節:

????????51單片機的SFR地址范圍是?0x80~0xFF(128~255)。

????????編譯器會將?sfr?聲明的變量直接映射到對應的硬件地址,操作效率高。


驅動LED燈軟件編程設計

接下來為小伙伴們展示LED燈點亮代碼

#include "reg52.h"
sbit P2_0=P2^0;	 //sbit 是Keil C51特有的關鍵字,用于聲明單個引腳變量。
sbit P2_1=P2^1;
sbit P2_2=P2^2;
sbit P2_3=P2^3;
sbit P2_4=P2^4;
sbit P2_5=P2^5;
sbit P2_6=P2^6;
sbit P2_7=P2^7;
int main()
{while(1){//第一種方法:直接對每一個引腳進行輸出低電平操作,前提大家要使用sbit關鍵字先對P2寄存器的每個位進行聲明P2_0=0;P2_1=0;P2_2=0;P2_3=0;P2_4=0;P2_5=0;P2_6=0;P2_7=0;//第二種方法:直接對寄存器進行賦值操作P2=0x00;}
}

效果展示圖:?????


配置LED燈流水燈函數

要實現流水燈效果函數我們首先實現簡單延時函數,原理就是使MCU芯片跑空循環任務,消耗時間。

延時函數代碼示例:延時函數的形參為填入的要延時的時間,例如填入1延時時間為10微秒

void Delay_10us(u16 us)//當傳入形參us=1時,時間大概為10us
{while(us--);
}

實現流水燈函數:有三個實現方法小伙伴們可以參考啦

方法一:直接對P2寄存器進行整體賦值操作

#include "reg52.h"
typedef unsigned int u16;
typedef	unsigned int u8; 
void Delay_10us(u16 us)//當傳入形參us=1時,時間大概為10us
{while(us--);
}
int main()
{u8 i=0;while(1){for(i=0;i<8;i++){P2=~(0x01<<i);//點亮一個LED燈Delay_10us(500000);//延時時間為480msP2=0xff;//關閉全部LED燈Delay_10us(500000);//延時時間為480ms}}
}

方法二:對單個引腳一個一個賦值操作

#include "reg52.h"
sbit P2_0=P2^0;	 //sbit 是Keil C51特有的關鍵字,用于聲明單個引腳變量。
sbit P2_1=P2^1;
sbit P2_2=P2^2;
sbit P2_3=P2^3;
sbit P2_4=P2^4;
sbit P2_5=P2^5;
sbit P2_6=P2^6;
sbit P2_7=P2^7;
typedef unsigned int u16;
void Delay_10us(u16 us)//當傳入形參us=1時,時間大概為10us
{while(us--);
}
int main()
{P2=0xff;//對LED燈初始化關閉LED燈while(1){P2_0=0;//點亮第一個LED燈Delay_10us(500000);//延時時間480usP2_0=1;//關閉第一個LED燈,后面由此類推P2_1=0;Delay_10us(500000);//延時時間480usP2_1=1;P2_2=0;Delay_10us(500000);//延時時間480usP2_2=1;P2_3=0;Delay_10us(500000);//延時時間480usP2_3=1;P2_4=0;Delay_10us(500000);//延時時間480usP2_4=1;P2_5=0;Delay_10us(500000);//延時時間480usP2_5=1;P2_6=0;Delay_10us(500000);//延時時間480usP2_6=1;P2_7=0;Delay_10us(500000);//延時時間480usP2_7=1;}
}

方法三:使用C51自帶庫文件" intrins.h"文件中的_crol_循環左移函數和_cror_循環右移

函數介紹:_crol_循環左移函數:

形參:value為要移位的無符號字符(8位)shift為移位位數

返回值:循環左移后的結果(unsigned char)。

unsigned char _crol_(unsigned char value, unsigned char shift);

函數介紹:_cror_循環右移函數:

形參:value為要移位的無符號字符(8位)shift為移位位數

返回值:循環右移后的結果(unsigned char)。

unsigned char _cror_(unsigned char value, unsigned char shift);

代碼示例:

#include "reg52.h"
#include "intrins.h"
typedef unsigned int u16;
typedef unsigned char u8; 
void Delay_10us(u16 us)//延時函數,形參輸入1,延時時間10us
{while(us--);
}
int main()
{u8 i=0;P2=~(0x01);//OLED模塊初始化點亮第一個燈while(1){for(i=0;i<7;i++){P2=_crol_(P2,1);//使用左移循環函數Delay_10us(50000);//延時480ms}}
}

流水燈實現效果:

流水燈實現效果


制作不易!喜歡的小伙伴給個小贊贊!喜歡我的小伙伴點個關注!有不懂的地方和需要的資源隨時問我喲!

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

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

相關文章

Git 完全手冊:從入門到團隊協作實戰(2)

Hello大家好&#xff01;很高興我們又見面啦&#xff01;給生活添點passion&#xff0c;開始今天的編程之路&#xff01; 我的博客&#xff1a;<但凡. 我的專欄&#xff1a;《編程之路》、《數據結構與算法之美》、《C修煉之路》、《Linux修煉&#xff1a;終端之內 洞悉真理…

c語言中堆和棧的區別

1.棧區(stack):由編譯器自動分配釋放&#xff0c;棧主要用于存儲局部變量、函數參數、函數調用和返回信息等。其操作方式類似于數據結構中的棧。 2.堆區(heap):一般由程序員分配釋放&#xff0c;若程序員不釋放&#xff0c;則可能會引起內存泄漏。注堆和數據結構中的堆棧不一樣…

華為實驗WLAN 基礎配置隨練

業務vlan 20 192.168.20.x管理vlan 100 192.168.100.x步驟① 網絡互通Core sw:vlan batch 20 100 dhcp enable int vlanif 20IP add 192.168.20.1 24dhcp select interfaceinterface GigabitEthernet0/0/1/2port link-type trunkport trunk pvid vlan 100port trunk allow-pas…

CMake 如何查找 Python2和Python3

問題 在一個CMakeLists.txt文件里面看到了下面的這句話 find_package(Python2 COMPONENTS Interpreter Development NumPy)這個好有趣啊&#xff0c;Python2也是一個C的庫嗎&#xff0c;也有Python2Config.cmake或者FindPython2.cmake? 回答 find_package(Python2 COMPONENTS …

心靈筆記:刻意練習

心靈筆記&#xff1a;刻意練習提要 所有人都以為“杰出”源于“天賦”&#xff0c;而“天才”卻說&#xff1a;我的成就源于“正確的練習”&#xff01; 定義&#xff1a;刻意練習是一種有目的、有方法、能帶來能力持續提升的結構化訓練方式&#xff0c;它并非簡單的重復勞動&a…

langchain入門筆記03:使用fastapi部署本地大模型后端接口,優化局域網內的問答響應速度

文章目錄前言一、fastapi的簡單入門1&#xff1a;安裝必要的包&#xff08;python3.11&#xff09;&#xff1a;2&#xff1a;快速搭建一個fastapi&#xff1a;二、提升問答的響應速度1. fastapi部署后端接口&#xff0c;在局域網內訪問的方法2. 局域網內的測試&#xff1a;“未…

【CDA 新一級】學習筆記第1篇:數據分析的時代背景

作者&#xff1a;CDA持證人 張九領我們要學習數據分析&#xff0c;就要從當前時代的數據特點&#xff0c;找到在時代特點下企業需要數據分析的痛點&#xff0c;然后理解數據分析在企業中的作用。當前時代&#xff0c;數據分析的特征是哪些呢&#xff1f;我們用VUCA來概括數據分…

Vite 為什么比 Webpack 快?原理深度分析

Hi&#xff0c;我是布蘭妮甜 &#xff01;在現代前端開發中&#xff0c;構建工具的性能直接影響開發體驗和生產力。Webpack 作為傳統打包工具的代表&#xff0c;長期以來主導著前端構建領域&#xff0c;而 Vite 作為新一代的前端構建工具&#xff0c;憑借其出色的開發服務器啟動…

數字電路上的通訊速度是越快越好還是越慢越好?

昨天我突發奇想&#xff0c;修改了一下MCU和INA226以及DAC8551的通訊速率。之前的INA226用的是I2C通訊&#xff0c;之前設置的速率是100Kbps&#xff0c;DAC8551是SPI通訊&#xff0c;速率是10Mbps&#xff0c;昨天修改之前輸出位置的測試結果如圖&#xff1a;可以看到&#xf…

Google Gemini 的深度研究終于進入 API 階段

Google Gemini 最強大的功能之一是深度研究&#xff0c;但到目前為止&#xff0c;它一直嚴格限制在 Gemini 界面上。這種情況可能很快就會改變。 通過 Gemini 中的深度研究&#xff0c;您可以搜索幾乎任何內容&#xff0c;包括學者、現有研究論文等。 谷歌將深度研究描述為一…

通過beeware制作安卓apk用于獲取cpolar網址

我們都知道&#xff0c;沒有付費的cpolar用戶&#xff0c;要不時更新cpolar網址。每次都要自己登錄去獲取遠程的cpolar個人網址比較麻煩&#xff0c;好在可以用python去自動獲取。這里說的是&#xff0c;比如用手機裝termux軟件&#xff0c;再在termux中裝cpolar&#xff0c;然…

Swift 實戰:用鏈表和哈希表寫出高性能的貪吃蛇引擎(LeetCode 353)

文章目錄摘要描述解決方案解析問題與解決方案關鍵細節逐條講示例與運行結果時間復雜度空間復雜度總結摘要 這題的目標是設計一個“貪吃蛇”核心引擎&#xff1a;給定棋盤大小和一串食物位置&#xff0c;支持不斷調用 move(direction) 推進游戲&#xff0c;返回當前分數&#x…

2025-08-15:按對角線進行矩陣排序。用go語言,給你一個 n × n 的整數矩陣,要求返回一個按下面規則調整后的矩陣: - 將每一條與主對角線平行的斜線視為一個序列。對于位于主對角線及其下方的

2025-08-15&#xff1a;按對角線進行矩陣排序。用go語言&#xff0c;給你一個 n n 的整數矩陣&#xff0c;要求返回一個按下面規則調整后的矩陣&#xff1a;將每一條與主對角線平行的斜線視為一個序列。對于位于主對角線及其下方的那些斜線&#xff08;即所在位置的行索引 ≥ …

MySQL相關概念和易錯知識點(5)(索引、事務、MVCC)

目錄1.索引&#xff08;1&#xff09;局部性原理a.局部性原理在計算機中的地位b.pagec.池化技術&#xff08;Buffer Pool&#xff09;&#xff08;2&#xff09;如何理解索引&#xff08;3&#xff09;索引的原理a.page的構成b.多層目錄c.基于B樹的索引①B樹的特性在索引中的作…

SQLite 子查詢

SQLite 子查詢 SQLite 是一個輕量級的數據庫管理系統&#xff0c;廣泛應用于移動設備、嵌入式系統和桌面應用。在處理復雜的查詢時&#xff0c;子查詢&#xff08;Subquery&#xff09;是SQLite數據庫查詢語言中的一個強大工具。本文將詳細介紹SQLite子查詢的概念、用法及其在數…

區塊鏈系統審計方法論:全面指南與Python實踐

目錄 區塊鏈系統審計方法論:全面指南與Python實踐 1. 引言 2. 區塊鏈審計框架 3. 智能合約審計關鍵技術 3.1 靜態代碼分析 3.2 符號執行(Symbolic Execution) 4. 共識機制審計 4.1 PoW共識驗證 4.2 PBFT共識模擬 5. 數據完整性審計 5.1 Merkle樹驗證 6. 完整審計系統實現 7.…

分布式鎖—Redisson的公平鎖

1.Redisson公平鎖RedissonFairLock概述 (1)非公平和公平的可重入鎖 一.非公平可重入鎖 鎖被釋放后&#xff0c;排隊獲取鎖的線程會重新無序獲取鎖&#xff0c;沒有任何順序性可言。 二.公平可重入鎖 鎖被釋放后&#xff0c;排隊獲取鎖的線程會按照請求獲取鎖時候的順序去獲取…

上網行為安全概述和組網方案

一、上網行為安全概述1. 背景與需求互聯網的雙刃劍特性&#xff1a;網絡普及改變工作生活方式&#xff0c;業務向互聯網遷移。缺乏管理導致風險&#xff1a;帶寬濫用、監管困難、信息泄露、網絡違法、安全威脅。核心問題&#xff1a;帶寬濫用&#xff1a;P2P/流媒體占用70%帶寬…

某處賣600的【獨角仙】尾盤十分鐘短線 尾盤短線思路 手機電腦通用無未來函數

通達信指標【獨角仙】尾盤十分鐘套裝-主圖-副圖-選古指標&#xff0c;支持手機電腦使用。在股市收盤的前十分鐘第二天沖高賣出&#xff0c;信號可以盤中預警也可以尾盤選股&#xff0c;如果要保證信號固定建議是尾盤選股即可&#xff0c;當天信號固定后&#xff0c;不會產生漂移…

日志數據鏈路的 “搬運工”:Flume 分布式采集的組件分工與原理

flume詳解&#xff1a;分布式日志采集的核心原理與組件解析 在大數據體系中&#xff0c;日志采集是數據處理的第一步。Flume 作為 Apache 旗下的分布式日志采集工具&#xff0c;以高可用、高可靠、易擴展的特性&#xff0c;成為處理海量日志數據的首選方案。本文將從 Flume 的…