51单片机功能模块学习笔记 — 发光二极管

1. 发光二极管简介

 

发光二极管是半导体二极管的一种,可以把电能转化成光能。常简写为LED(lightemittingdiode)。

 

发光二极管与普通二极管一样也具有单向导电性当给发光二极管加上正向电压(大于LED的正向压降)就会发光,当给发光二极管加上负向电压就不会发光发光二极管的发光

 

亮度与通过的工作电流成正比,一般情况下,LED的正向工作电流在10mA左右,若电流过大时会损坏LED,因此使用时必须串联限流电阻以控制通过管子的电流限流电阻R可用下式计算:

R=(E-UF)/IF

 

式中E为电源电压,UF为LED的正向压降,IF为LED的一般工作电流。

 

普通发光二极管的正向饱和压降为1.4~2.1V,正向工作电流为5~20mA.

 


2. 开发平台硬件连接原理




由以上的原理图,我们可以看出,八个发光二极管的左端连接到公共的电源。若是想要使得二极管发光,根据其单向导电性,我们应该在其右端的对应端口置0”。



 

² 那么如何使得LED的端口置“0”呢?

可以将如图所示的LED模块连接到单片机的四个I/O(P0P1P2P3)中的任意一个,通过对于I/O的操作,来控制LED模块的亮灭。

例如,将上图的LED模块连接到单片机的P1口(基于开发板的各个模块都是独立模块的情况下)。从原理图上看,也就是将LED1~LED8连接到单片机的P1.0~P1.7口。那么,如果我们想要使得LED1点亮,就应该给单片机的P1.0口送“0”;如果我们想要点亮全部的灯,就应该将P1.0~P1.7空全部置“0”。

弄懂了原理,下面来写程序^_^


 

 

3.LED模块实验程序


² 程序一:点亮一个LED灯(分别利用位定义和直接对I/O空操作)

/*利用位定义的方法:点亮P1.0口,即LED1灯*/

#include <reg52.h>

sbit LED1 = P1^0;   //定义LED1

void main()
{
    while(1)
    {
        LED1 = 0;   //点亮LED1灯
    }
}
/* 直接对端口进行操作:点亮一个LED灯*/

#include <reg52.h>

void main()
{
    while(1)
    {
        P0 = 0xfe;   //1111 1110
    }
}



² 程序二:使得一个LED灯闪烁(直接在程序一上修改)

#include <reg52.h>

sbit LED1 = P1^0;   //定义LED1


void delay(unsigned int i)
{
    while(--i);
}


void main()
{
    while(1)
    {
        LED1 = 0;   //点亮LED1灯
        delay(30000);
        LED1 = 1;   //熄灭LED1灯
        delay(30000);
    }
}


² 8LED灯循环左移


/* 利用查表的方法左移 */
void LiuShuiDeng()
{
    unsigned char i;

    for(i = 0;i < 8;i++)
    {
        LEDPORT = table[i];
        delay_ms(200);
    }
}



² 8LED灯循环右移


/* 利用C语言位定义的方法右移 */
void LedBlink()
{
    unsigned char i,temp;

    temp = 0x7f;    //0111 1111
    delay_ms(200);
    for(i = 0;i < 8;i++)
    { 
       temp = (temp>>1) | 0x80;
       delay_ms(200);
       LEDPORT = temp;
    }
}


猜你喜欢

转载自blog.csdn.net/csdnxmj/article/details/79174408