目录
1.LED是什么
2. 点亮LED
2.1 点亮P0.0
2.2 实现流水灯
2.3 同时点亮和熄灭D1~D8
2.4 花式流水灯
1.LED是什么
LED是发光二极管,是一种半导体固体发光器件。
二极管的特点是单向导电性,电流只允许从一个方向通过,二极管当中的正向电流从无色环流向有色环当中。
对LED来说,亮灯的条件是两端有电势差。
如下是普中STC89C52单片机上的LED模块的电路图,8个LED灯阳极接电源VCC,阴极串联一个电阻,然后与单片机的P2口连接,如果要点亮某个灯,只需把对应的IO口赋为低电平(即=0),这是共阳极LED。
LED共阴极指的是LED共同的接点是GND,共阳极指LED共同的接点是电源(如上图)。
LED亮度的颜色和工作电压根据所选择的发光二极管来决定,越鲜艳的颜色二极管的工作电压也就越高。
2. 点亮LED
要点亮LED首先要看LED的电路是怎样的。
分析 如下电路图中,D1~D8是共阳极LED,阴极分别连接到P0口的0~7端口,所以对D1~D8操作时,需要对应的IO口赋为低电平。
2.1 点亮P0.0
点亮P0.0,只需使P0.0端口为低电平。
sbit LEDP00 = P0^0; // P0.0端口
void ledp00_light_up()
{
LEDP00 = 0;
while(1){}
}
2.2 实现流水灯
流水灯就是D1~D8依次点亮,D8电流后,D7~D1依次,点亮,D1点亮后,D2~D8依次点亮....如此循环。如下代码需要添加头文件:#include "intrins.h"
#define LED0 P0 // P0口
void loop_led0()
{
u8 i;
u16 deley_times = 300;
LED0 = ~0x01;
delay_ms(deley_times);
while(1)
{
LED0 = ~0x01;
delay_ms(deley_times);
for(i=0;i<7;i++)
{
LED0 = _crol_(LED0,1); // 左移一位,如11111110变为11111101
delay_ms(deley_times);
}
for(i=0;i<7;i++)
{
LED0 = _cror_(LED0,1); // 右移一位 01111111变为10111111
delay_ms(deley_times);
}
}
}
2.3 同时点亮和熄灭D1~D8
#define LED0 P0 // P0口
void led0_ctr_sync()
{
LED0 = 0;
while(1)
{
LED0 = ~LED0;
delay_ms(500);
}
}
2.4 花式流水灯
花式流水灯结合连接P2口的D9~D16 ,实现的功能:
? P0口为共阳极(低电平点亮),P2口为共阴极(高电平点亮), ? 1. 从D1开始依次点亮,直到D16,间隔0.3s; ? 2. 流水灯结束后,D9~D16全部点亮,D1~D8全部不亮,间隔0.3s; ? 3. 然后D1~D8全部点亮,D9~D16全部不亮;间隔0.3s; ? 4. D1~D8和D9~D16全部不亮,间隔0.3s
如下代码也需要添加头文件:#include "intrins.h"
#define LED0 P0 // P0口
#define LED2 P2 // P2口
/*
P0口为共阳极(低电平点亮),P2口为共阴极(高电平点亮),
1. 从P0.0开始依次点亮,直到p2.7,间隔0.3s;
2. 流水灯结束后,P2口全部点亮,P0口全部不亮,间隔0.3s;
3. 然后P0口全部点亮,P2口全部不亮;间隔0.3s;
4. P0口和P2口全部不亮,间隔0.3s
*/
void anode_po_cathode_p2()
{
u8 i;
u16 delay_times = 300;
// 初始状态
LED2 = 0x00; // P2口全部不亮
LED0 = ~0x01;
delay_ms(delay_times);
while(1)
{
LED0 = ~0x01;
delay_ms(delay_times);
for(i=0;i<7;i++)
{
LED0 = _crol_(LED0,1); // 左移一位,如11111110变为11111101
delay_ms(delay_times);
}
LED0 = 0xFF;
delay_ms(delay_times);
LED2 = ~0xFE;
delay_ms(delay_times);
for(i=0;i<7;i++)
{
LED2 = _crol_(LED2,1);
delay_ms(delay_times);
}
LED2 = 0x00; // P2口全部不亮
delay_ms(delay_times);
// 流水灯结束
LED2 = 0xff; // P2口全部点亮
LED0 = 0xFF; // P0口全部不亮
delay_ms(delay_times);
LED2 = 0x00; // P2口全部不亮
LED0 = 0x00; // P0口全部点亮
delay_ms(delay_times);
LED2 = 0x00; // P2口全部不亮
LED0 = 0xff; // P0口全部不亮
delay_ms(delay_times);
}
}
使用Proteus仿真+keil编译的结果:
参考:
1.?(4条消息) 【Proteus】梦开始的地方〔LED灯〕_謓泽的博客-CSDN博客
2.?LED 共阴共阳的区别 - 风吹来的砂 - 博客园 (cnblogs.com)
|