发光二极管,又称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();//所有灯灭一会儿
-
- }
- }
复制代码
|