【51单片机】LED灯的进阶操作(闪烁、流水)

发布时间:2024年01月05日

上篇文章我们讲到了Keil5STC的使用方式点亮第一个LED灯
这篇将继续进行一些LED灯的进阶操作

LED灯闪烁:

上文我们说只要通过P2这个寄存器就可以控制LED亮灭,现在我们要将其变为闪烁状态,故:

void main()
{
	while(1)
	{
		P2 = 0xFE;
		P2 = 0xFF;
	}
}

但由于寄存器的速度是非常快的,达到MHz(每秒100次)的等级,就导致这两句代码执行的特别快,最后的结果就是整体变暗一点

故我们需要进行一定的延时
这里说一下我们的STC软件中有一个下图的软件延时计算器在这里插入图片描述
我们可以通过设置系统频率(与你的开发板有关,我们使用的是STC89C52,用的是12MHz的频率)与定时长度,得到一段延时你目标秒数的代码,我们复制粘贴就可以使用

---------------------生成的代码-------------------

void Delay500ms()		//@12.000MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 4;
	j = 205;
	k = 187;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

这段代码中_nop_的含义是
出自丿Zero
---------------------生成的代码-------------------

我们将其引用在C程序中

#include <REGX52.H>
#include <intrins.h>

void Delay500ms()		//@12.000MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 4;
	j = 205;
	k = 187;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


void main()
{
	while(1)
	{
		P2 = 0xFE;
		Delay500ms();
		P2 = 0xFF;
		Delay500ms();
	}
}

这样就可以得到一个闪烁的LED灯了

LED流水灯

普通LED流水灯

流水灯的话,让每个灯按次序亮灭就可以得到,再嵌套一个循环。
我们说到,写程序时不能写P2 = 1111 1111这样的命令,要使用16进制,那么在这里插入图片描述
我们就可以

void main()
{
	while(1)
	{
		P2 = 0xFE;//1111 1110
		Delay500ms();
		P2 = 0xFD;//1111 1101
		Delay500ms();
		P2 = 0xFB;//1111 1011
		Delay500ms();
		P2 = 0xF7;//1111 0111
		Delay500ms();
		P2 = 0xEF;//1110 1111
		Delay500ms();
		P2 = 0xDF;//1101 1111
		Delay500ms();
		P2 = 0xBF;//1011 1111
		Delay500ms();
		P2 = 0x7F;//0111 1111
		Delay500ms();
	}
}

这样就得到一个流水灯了

LED流水灯PLUS

我们每次进行软件延时时都去调节比较麻烦,我们可以利用C语言的基础,用传参去解决每次都要调节的问题
我们先生成一个延时1ms的子函数,对这个子函数进行传参

void Delay1ms(unsigned int xms)		//@12.000MHz
{
	while(xms--)
	{
		unsigned char i, j;

		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
  }
}

运用到程序函数中就可以得到一个可以自由控制秒数的LED等啦

#include <intrins.h>

void Delay1ms(unsigned int xms)		//@12.000MHz
{
	while(xms--)
	{
		unsigned char i, j;

		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
  }
}

void main()
{
	while(1)
	{
		P2 = 0xFE;//1111 1110
		Delay1ms(100);
		P2 = 0xFD;//1111 1101
		Delay1ms(100);
		P2 = 0xFB;//1111 1011
		Delay1ms(100);
		P2 = 0xF7;//1111 0111
		Delay1ms(100);
		P2 = 0xEF;//1110 1111
		Delay1ms(100);
		P2 = 0xDF;//1101 1111
		Delay1ms(100);
		P2 = 0xBF;//1011 1111
		Delay1ms(100);
		P2 = 0x7F;//0111 1111
		Delay1ms(100);
	}
}

欢迎讨论

文章来源:https://blog.csdn.net/2301_78636079/article/details/135400415
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。