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(P0、P1、P2、P3)中的任意一个,通过对于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);
}
}
² 8位LED灯循环左移
/* 利用查表的方法左移 */
void LiuShuiDeng()
{
unsigned char i;
for(i = 0;i < 8;i++)
{
LEDPORT = table[i];
delay_ms(200);
}
}
² 8位LED灯循环右移
/* 利用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;
}
}