本章思維導圖:
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}}
}
流水燈實現效果:
流水燈實現效果
制作不易!喜歡的小伙伴給個小贊贊!喜歡我的小伙伴點個關注!有不懂的地方和需要的資源隨時問我喲!