發光二極管,又稱LED。說到LED,那是初學者最容易了解的!
本小節目錄
1,識別LED極性和圖標
2,LED原理圖分析
3,LED流水燈的程序分析
4,DIY酷炫的“愛心”型的LED燈的焊接,調試和程序編寫!
一)識別LED極性及圖標
識別LED正負極是每個學電子人的基本常識,但也是很多初學者常問的問題,包括本人當初也是沒有懂!

圖1-1
1.觀察法(如圖1-1)
直插式LED:看引腳長短來判別發光二極管的正負極,引腳長的為正極,短的為負極。
若引腳被“破壞”,看燈珠內,較小處為正(建議初學者仔細觀察實物可知)
貼片LED:俯視,一邊帶彩色線的是負極,另一邊是正極。
2.萬用表測量法
萬用表檢測發光二極管時,必須使用“R×10k”檔。
LED一般的管壓降為2V,而萬用表處于“R×1k”及其以下各電阻檔時,表內電池僅為1.5V,低于管壓降。無論正、反向接入,發光二極管都不可能導通,也就無法檢測。“R×10k”檔時表內接9V(或15V)高壓電池,高于管壓降,所以可以用來檢測發光二極管。
檢測時,將兩表筆分別與LED兩腳相接,如表針偏轉過半,同時LED中有一發亮光點,表示LED是正向接入,這時與黑表筆(與表內電池正極相連)相接的是正極;與紅表筆相接的是負極。再將兩表筆對調后與發光二極管相接,這時為反向接入,表針應不動。
若正向接入和反向接入,表針都偏轉到頭或不動,則該LED已損壞。
3.LED圖標

圖1-2
謹記:陽極(A)為三角形邊,指向角加一豎即為陰極(K),也有電流從粗面流向細面的意味!
二)LED原理圖分析

圖2—2 開發板LED原理圖
若讓LED能正常發光,則必須使LED內部通過一定的電流和電壓差(2-3.9V左右)才可。通常LED的工作電流為3~20mA左右,所以不能直接將兩端接電源和GND來點亮,需要加一個限流電阻,而如何算這個電阻呢?
通常LED的壓降是1.72~1.98V左右,為使LED有合適的亮度和長壽命,通常讓其工作電流為:3mA,用歐姆定律算可知,限流電阻:R=3.15V/3mA=1.05KΩ,因而需用1K的限流電阻。
初學者看原理圖需懂:
1)原理圖上同樣物理標識的引腳,互相連接一起,如圖2-2中,數字28右邊的LED8與RP4左邊的LED8在開發板上才是連接一起的。
2)圖2-2中D1-D8的LED燈正極都連接電源正極(VCC),負極分別連接單片機P2^0--P2^7口,而為什么不是D1-D8正極連單片機P2口,負極連地(GDN)呢???那是因為單片機一上電后,P2口默認就為高電平,即直接使八個LED完全亮了,根本不需要程序去控制,那不是失去學習單片機的意義了么?
三)LED流水燈的程序分析(傻瓜式)
#include//51單片機的頭文件
#defineUchar8unsignedchar//宏定義(就是用Uchar8替換unsignedchar,方便后面程序編寫
#defineUint16unsignedint
sbitLED1=P2^0; //聲明單片機P2口的第一位,用LED1表示,便于簡化程序
sbitLED2=P2^1;
sbitLED3=P2^2;
sbitLED4=P2^3;
sbitLED5=P2^4;
sbitLED6=P2^5;
sbitLED7=P2^6;
sbitLED8=P2^7;
/*******************************************************/
//函數功能: 約延時毫秒函數
//入口參數: 延時毫秒數(xms)
//出口參數: 無
/*******************************************************/
voidDelayms(Uint16xms)
{
Uint16i,j;
for(i=xms;i>0;i--)
for(j=121;j>0;j--);//這里初學者會問:為什么是121呢?你也可以寫110~122等等
}//可先不深究,知道這個是約延時1ms的函數就足以
voidmain(void)
{
for(;;)//死循環
{
LED1=0;//點亮圖2-2中D1燈亮
Delayms(100);//延時100毫秒,也就是讓D1亮100毫秒
LED1=1;//滅掉D1燈
LED2=0;//滅D1燈后,馬上接著點亮D2燈
Delayms(100);//讓D2燈亮100毫秒
LED2=1;//接著滅掉D2燈
LED3=0;//接著,,,,D3亮,,,,,一直到最后,D8,亮滅,程序就是如此循環執行 Delayms(100);
LED3=1;
LED4=0;
Delayms(100);
LED4=1;
LED5=0;
Delayms(100);
LED5=1;
LED6=0;
Delayms(100);
LED6=1;
LED7=0;
Delayms(100);
LED7=1;
LED8=0;
Delayms(100);
LED8=1;
}
}
傻瓜式程序太多,太麻煩了,那就看看下面簡化版的吧
#include
#include
#defineUchar8unsignedchar
#defineUint16unsignedint
voidDelayms(Uint16xms)
{
Uint16i,j;
for(i=xms;i>0;i--)
for(j=121;j>0;j--);
}
voidmain(void)
{
Uchar8temp;
temp=0xfe;//讓變量temp等于11111110
for(;;)
{
P2=temp;//將11111110賦予P2,即P2最低位P2^0為0,點亮D1燈
temp=_crol_(temp,1);//temp循環左移動1位后再次賦值給temp
Delayms(100);
}
}

圖3-1循環左移動
說明:KeilC51自帶的函數庫,里面有個_crol_()函數(循環左移),即最高位往最低位循環移動,同理循環右移為_cror_()函數也一樣。

圖3-2流水燈示意圖(來自麥光電子)
說明:P2=temp(11111110)時,D1亮,接著P2=11111101時,D2亮,如此循環的點亮8個LED燈!寫到這里,我想,再菜鳥的初學者都明白了吧?
四)DIY酷炫的“心”型的LED燈
DIY的樂趣的無窮的,當你花上幾個小時,幾天甚至幾個星期,親手DIY并調試成功后的那種喜悅感和幸福感,那是別人無法去體會和了解的啊!顯然,本人最初也是受xumb的影響,毅然走上了一條DIY的路,從此我待DIY如初戀,它虐我如后媽呀!
1)“心”原理圖

圖4-1“心”型LED燈原理圖
說明:“心”型LED燈共用了32個燈,剛好接完MCU的P0,P1,P2,P3共32個端口。
注意:全部的LED燈正極分別連接100歐左右電阻后,并連VCC,負極分別連接32個端口即可。

圖4-2“心”型LED焊接布局圖
說明:焊接前,先將全部的LED燈布局好后,看看效果,然后先焊接單片機最小系統,后焊接LED燈。

圖4-3“心”型LED焊接正面布局圖

圖4-4“心”型LED焊接電阻圖
說明:本人用直插電阻直接在萬能板背面焊接,同時晶振和瓷片電路都焊接于單片機插座內,同時本人用的LED燈為紅,黃,蘭,綠相互焊接!

圖4-5“心”型LED焊接背面完成圖
說明:LED燈負極全用焊錫絲連接到單片機端口,建議初焊者用導線連,因為對于初焊者,焊錫絲非常不好連接,而且漂亮!
焊接時注意:焊接完電阻后,千萬要布好局后才焊接負極連接MCU端口,畢竟我們要追求完美的“心”呀!再說了,焊接好了,正面為“心”型,背面也是完美的“心”型,才能算真心,才算浪漫呀!

圖4-6“心”型LED焊接正面完成圖
說明:電源由4個5號電池提供,焊接時,千萬別焊反正負極,要不然MCU芯片就被燒了!
焊接完后,是該見證奇跡的時候了,下完程序后,如圖4-7,4-8,4-9
[size=0.83em]- #include<reg52.h>
- #include<intrins.h>//循環函數的頭文件
- #define uint unsigned int
- #define uchar unsigned char
- uchar code table0[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//從低位往高位移一個燈
- uchar code table1[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//從高位往低位移一個燈
- uchar code table2[]={0xfe,0xfa,0xf8,0xf0,0xe0,0xa0,0x80,0x00};//從低位到高位逐步全部點亮
- uchar code table3[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};//從高位到低位逐步全部點亮
- uchar code table4[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};//從低位到高位逐步全部熄滅
- uchar code table5[]={0x80,0xa0,0xe0,0xf0,0xf8,0xfa,0xfe,0xff};//從高位到低位逐步全部熄滅
- uchar code table6[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//從低位到高位,滅一個燈移動
- uchar code table7[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//從高位到低位,滅一個燈移動
- uchar i;
- void delay(uint z) //延時函數
- {
-
- uint x,y;
-
- for(x=z;x>0;x--)
-
- for(y=314;y>0;y--);
- }
- ///////////////////////////////////////////////////
- ///////////////////////////////////////////////////
- ///////////////////////////////////////////////////
- void deng123()//
- {
-
- for(i=0;i<8;i++)
-
- {
-
- P2=table1[i];
-
- P0=table1[i];
-
- delay(25);
-
- }
- }
- /***********************************************
- ************************************************/
- void deng0()//所有燈亮一會兒
- {
-
- P0=0x00;
- P1=0x00;
- P2=0x00;
- P3=0x00;
-
- delay(150);
- }
- /////////////////////////////////
- void deng0_1()//所有燈滅一會兒
- {
-
- P0=0xff;P1=0xff;
- P2=0xff;P3=0xff;
-
- delay(150);
- }
- //////////////////////////////////////
-
- void deng1()//兩列燈順時針旋轉2遍,然后逐漸降低
-
- {
-
- uchar c;
-
- P1=0x00;
- P3=0x00;
-
-
- for(c=2;c>0;c--)
-
- {
-
- deng123();
-
- }
-
- ////////////////
-
- P1=0x03;
-
- deng123();
-
- /////////////////
-
- P1=0x0f;
-
- deng123();
-
- ////////////////
-
- P1=0x3f;
-
- deng123();
-
- ///////////////
-
- P1=0xff;
-
- deng123();
-
- ////////////////////////
-
- P3=0x03;
-
- deng123();
-
- //////////////
-
- P3=0x0f;
-
- deng123();
-
- //////////////
-
- P3=0x3f;
-
- deng123();
-
- /////////////
-
- P3=0xff;
-
- deng123();
-
- P2=0xff;P0=0xff;
-
- }
-
- ///////////////////////////////////////////////
-
- void deng2()//四列燈順時針旋轉2遍
-
- {
-
- uchar a;
-
- uchar b;
-
- b=0x77;
-
- P2=b;
-
- P0=b;
-
- P1=0x00;P3=0x00;
-
- for(a=4;a>0;a--)
-
- {
-
- for(i=0;i<8;i++)
-
- {
-
- b=_cror_(b,1);//循環左移
-
- delay(25);
-
- P2=b;
-
- P0=b;
-
- }
-
- }
-
-
- P2=0xff;
- P0=0xff;
- P1=0xff;
- P3=0xff;
-
-
- }
- //////////////////////////////////////////////
-
- void deng3()//單層,向上升
-
- {
-
- P0=0x00;
-
- P2=0x00;
-
-
- for(i=0;i<8;i++)
-
- {
-
- P3=table1[i];
-
- delay(25);
-
- }
-
- P3=0xff;
- /*----------------------*/
-
- for(i=0;i<8;i++)
-
- {
-
- P1=table1[i];
-
- delay(25);
-
- }
-
- P1=0xff;
-
- }
- /////////////////////////////////////////
-
- void deng4()//單層,向下降
-
- {
-
- P2=0x00;
- P0=0x00;
-
- for(i=0;i<8;i++)
-
- {
-
- P1=table0[i];
-
- delay(25);
-
- }
-
- P1=0xff;
- /*----------------------*/
-
- for(i=0;i<8;i++)
-
- {
-
- P3=table0[i];
-
- delay(25);
-
- }
-
- P3=0xff;
- P1=0xff;
- P0=0xff;
- P2=0xff;
-
- }
-
- /////////////////////////////////////////
-
- void deng5()//從上到下,逐層全部點亮】
-
- {
-
- P0=0x00;
- P2=0x00;
-
- for(i=0;i<8;i++)
-
- {
-
- P1=table2[i];
-
- delay(25);
-
- }
-
- for(i=0;i<8;i++)
-
- {
-
- P3=table2[i];
-
- delay(25);
-
- }
-
- P0=0xff;
- P1=0xff;
- P2=0xff;
- P3=0xff;
-
- }
-
- ////////////////////////////////////////
-
- void deng6()//從上到下,逐層全部熄滅】
-
- {
-
- P0=0x00;
- P2=0x00;
-
- P1=0x00;
- P3=0x00;
-
- for(i=0;i<8;i++)
-
- {
-
- P1=table4[i];
-
- delay(25);
-
- }
-
- P1=0xff;
-
- for(i=0;i<8;i++)
-
- {
-
- P3=table4[i];
-
- delay(25);
-
- }
-
- P3=0xff;
-
- P0=0xff;
- P2=0xff;
-
- }
- ///////////////////////////////////
- void deng7()//四組燈,交替兩次
- {
-
- for(i=2;i>0;i--)
-
- {
-
- P1=0x00;P2=0x00;//上左
-
- delay(40);
-
- P1=0xff;P2=0xff;
-
- delay(40);
-
-
-
- /////////////
- P3=0x00;P0=0x00;//下右
-
- delay(40);
-
- P3=0xff;P0=0xff;
-
- delay(40);
-
- /////////////
-
- P3=0x00;
- P2=0x00;//下左
-
- delay(40);
-
- P3=0xff;
- P2=0xff;
-
- delay(40);
-
- /////////////
-
- P1=0x00;P0=0x00;//上右
-
- delay(40);
-
- P1=0xff;
- P0=0xff;
-
- delay(40);
-
- }
-
-
- }
- void deng8()//上半先逐步列點亮,然后再向下點點亮
- {
-
- P0=0xff;
- P2=0xff;
- P3=0xff;
-
- P1=0x00;
-
- for(i=0;i<8;i++)
-
- {
-
- P0=table3[i];
-
- P2=table3[i];
-
- delay(25);
-
- }
-
- delay(70);
-
- P1=0x00;
- P2=0x00;
- P0=0x00;
-
- for(i=0;i<8;i++)
-
- {
-
- P3=table2[i];
-
- delay(25);
-
- }
-
- }
- //////////////////////////////////////
- void deng9()//從中間向上、下點亮,再熄滅
- {
-
- P0=0x00;
- P2=0x00;
-
- for(i=0;i<8;i++)
-
- {
-
- P1=table3[i];
-
- P3=table2[i];
-
- delay(25);
-
- }
-
- for(i=0;i<8;i++)
-
- {
-
- P1=table4[i];
-
- P3=table5[i];
-
- delay(25);
-
- }
- }
- ///////////////////////////////////////////
- void deng10()//從中間向上、下熄滅
- {
-
- P0=0x00;
- P2=0x00;
-
- for(i=0;i<8;i++)
-
- {
-
- P1=table5[i];
-
- P3=table4[i];
-
- delay(25);
-
- }
-
- P1=0xff;
- P3=0xff;
- }
- void deng11()//逆時針逐列點亮所有燈
- {
-
- P1=0x00;
- P3=0x00;
-
- P0=0xff;
- P2=0xff;
-
- for(i=0;i<8;i++)
-
- {
-
- P0=table2[i];
-
- delay(25);
-
- }
-
- for(i=0;i<8;i++)
-
- {
-
- P2=table2[i];
-
- delay(25);
-
- }
-
- P0=0xff;
- P2=0xff;
- P3=0xff;
- P1=0xff;
- }
- ///////////////////////////////////////////
- void deng12()//閃爍
- {
-
- uchar i;
-
- uchar b;
-
- b=0xaa;
-
- P2=b;
-
- P0=b;
-
- P1=b;
-
- P3=b;
-
-
- for(i=0;i<8;i++)
-
- {
-
- b=_cror_(b,1);//循環左移
-
- delay(50);
-
- P2=b;
-
- P0=b;
-
- P1=b;
-
- P3=b;
-
-
- }
-
- P0=0xff;
- P1=0xff;
- P2=0xff;
- P3=0xff;
- }
- void deng13()//兩層燈,分別從中間向上、下移動
- {
-
- P2=0x00;
- P0=0x00;
-
- for(i=0;i<8;i++)
-
- {
-
- P1=table1[i];
-
- P3=table0[i];
-
- delay(25);
-
- }
-
- P2=0xff;
- P0=0xff;
- P1=0xff;
- P3=0xff;
- }
- void deng14_1()//點滿一圈的小函數(限內部用)
- {
-
- P2=0xff;
- P0=0xff;
-
- for(i=0;i<8;i++)
-
- {
-
- P2=table2[i];
-
- delay(15);
-
- }
-
-
- for(i=0;i<8;i++)
-
- {
-
- P0=table2[i];
- delay(15);
-
- }
-
- P2=0xff;
- P0=0xff;
- }
- ///////////////////////////
- void deng14()//從下開始,點滿一圈后,滅,再上升點亮第二圈
- {
-
- P1=0xff;
-
- P3=0x7f;//1層
-
- deng14_1();//點滿一圈的小函數(限內部用)
-
- P3=0xbf;//2層
-
- deng14_1();//點滿一圈的小函數(限內部用)
-
- P3=0xdf;//3層
-
- deng14_1();//點滿一圈的小函數(限內部用)
-
- P3=0xef;//4層
-
- deng14_1();//點滿一圈的小函數(限內部用)
-
- P3=0xf7;//5層
-
- deng14_1();//點滿一圈的小函數(限內部用)
-
- P3=0xfb;//6層
-
- deng14_1();//點滿一圈的小函數(限內部用)
-
- P3=0xfd;//7層
-
- deng14_1();//點滿一圈的小函數(限內部用)
-
- P3=0xfe;//8層
-
- deng14_1();//點滿一圈的小函數(限內部用)
-
- //////////////////
-
- P3=0xff;
-
- P1=0x7f;//1層
-
- deng14_1();//點滿一圈的小函數(限內部用)
-
- P1=0xbf;//2層
-
- deng14_1();//點滿一圈的小函數(限內部用)
-
- P1=0xdf;//3層
-
- deng14_1();//點滿一圈的小函數(限內部用)
-
- P1=0xef;//4層
-
- deng14_1();//點滿一圈的小函數(限內部用)
-
- P1=0xf7;//5層
-
- deng14_1();//點滿一圈的小函數(限內部用)
-
- P1=0xfb;//6層
-
- deng14_1();//點滿一圈的小函數(限內部用)
-
- P1=0xfd;//7層
-
- deng14_1();//點滿一圈的小函數(限內部用)
-
- P1=0xfe;//8層
-
- deng14_1();//點滿一圈的小函數(限內部用)
-
- P1=0xff;
- }
- /*====================================================
- ===================主函數君===========================
- ======================================================*/
- void main()
- {
-
- while(1)
-
- {
-
-
- deng0_1();//所有燈滅一會兒
-
- deng0_1();//所有燈滅一會兒
-
- deng14();//從下開始,點滿一圈后,滅,再上升點亮第二圈
-
- deng4();//單層,向下降
-
-
- deng5();//從上到下,逐層全部點亮
-
- deng6();//從上到下,逐層全部熄滅】
-
- deng8();//上半先逐步點亮,然后再向下點亮
-
- deng0();//所有燈亮一會
-
- deng6();//從上到下,逐層全部熄滅】
-
- deng9();//從中間向上、下點亮,再熄滅
-
- deng9();//從中間向上、下點亮,再熄滅
-
- deng0_1();//所有燈滅一會兒
-
- deng11();//逆時針逐列點亮所有燈
-
- deng10();//從中間向上、下熄滅
-
- deng0_1();//所有燈滅一會兒
-
- deng13();//兩層燈,分別從中間向上、下移動
-
- deng3();//單層,向上升
-
- deng5();//從上到下,逐層全部點亮
-
- deng12();//閃爍
-
- deng12();//閃爍
-
- deng2();//四列燈順時針旋轉2遍
-
- deng1();//兩列燈順時針旋轉2遍,然后逐漸降低
-
- deng0_1();//所有燈滅一會兒
-
- }
- }
復制代碼
|