【51单片机系列】点亮LED灯

目录

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)

  • 4
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值