单片机中LED灯的使用(流水灯、呼吸灯)

本文介绍了如何通过单片机控制LED灯实现流水灯和呼吸灯效果。在初始化阶段,设置了P0口和P2.3引脚为推挽输出,并通过位移操作控制LED的亮灭。流水灯通过延时函数实现动态点亮,而呼吸灯则通过改变点亮时间的占比来调整亮度。代码示例中详细展示了实现这两种效果的具体步骤。
摘要由CSDN通过智能技术生成

LED灯的原理图如下

由原理图不难看出,8个led灯是由P0口和P2.3引脚控制的。为点亮发光二极管,首先需要把P0口和P2.3设置为推挽输出,然后将P2.3置“1”(反向后为“0”),使能发光二极管电路; 

sbit led_sel=P2^3;//定义引脚
void Init()    //led灯初始化函数
{
	P0M1=0x00;    //0000 0000
	P0M0=0xff;    //1111 1111

	P2M1=0x00;    //0000 0000
	P2M0=0x08;    //0000 1000

	led_sel=1;
}

 完成初始化以后,我们就可以根据P0口不同的设置来达到不同的效果。

流水灯:

#include<STC15F2K60S2.H>
#include<intrins.h>
#define uchar unsigned char
uchar led;

void Delay200ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	_nop_();
	i = 9;
	j = 104;
	k = 139;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void main()
{
	Init();    //初始化
	led=0x01;    //0000 0001
	while(1)
	{
		P0=led;
		Delay200ms();
		if(led==0x80)
			led=0x01;
		else
			led=led<<1;
	}
	
}

流水灯其实是一个动态点亮的过程,如果点亮得太快,会导致效果不理想,所以使用了延时函数来使视觉效果停留。

而其中的“<<1”是位移操作,向左移一位,如0000 0001操作后就变为0000 0010。当然也存在右移操作“>>”。 

呼吸灯:

简单点说,呼吸灯其实就是以不同的亮度点亮led灯,关键就在于如何以不同的亮度来点亮led灯,也就是改变led灯的亮度。简单的方法就是在肉眼观察不到的时间范围内,改变led点亮时间的占比,从而形成不同亮度的视觉效果。

可以用以下代码测试看看这样的方法led灯的亮度是否改变(效果应为L0~3比L4~7暗)

#include<STC15F2K60S2.H>
#include<intrins.h>
#define uchar unsigned char
uchar led;
sbit led_sel=P2^3;//定义引脚

void Init()    //led灯初始化函数
{
	P0M1=0x00;    //0000 0000
	P0M0=0xff;    //1111 1111

	P2M1=0x00;    //0000 0000
	P2M0=0x08;    //0000 1000

	led_sel=1;
}

void Delay10us()		//@11.0592MHz
{
	unsigned char i;

	_nop_();
	i = 25;
	while (--i);
}

void Delay70us()		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	_nop_();
	i = 1;
	j = 189;
	do
	{
		while (--j);
	} while (--i);
}

void main()
{
	Init();
	led=0xff;
	while(1)
	{
		P0=led;
		Delay10us();
		P0=0xf0;
		Delay70us();
	}
	
}

(若有不足和错误,还请各位斧正)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值