单片机–点亮LED灯

导读:本篇文章讲解 单片机–点亮LED灯,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

目录

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共阴极指的是LED共同的接点是GND,共阳极指LED共同的接点是电源(如上图)。

LED亮度的颜色和工作电压根据所选择的发光二极管来决定,越鲜艳的颜色二极管的工作电压也就越高。

2. 点亮LED

要点亮LED首先要看LED的电路是怎样的。

分析 如下电路图中,D1~D8是共阳极LED,阴极分别连接到P0口的0~7端口,所以对D1~D8操作时,需要对应的IO口赋为低电平。

单片机--点亮LED灯

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编译的结果:

单片机--点亮LED灯

参考:

1. (4条消息) 【Proteus】梦开始的地方〔LED灯〕_謓泽的博客-CSDN博客

2. LED 共阴共阳的区别 – 风吹来的砂 – 博客园 (cnblogs.com)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/46137.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!