51单片机--点亮LED灯和流水灯

前言

大家好,这里是诡异森林。我使用的是普中科技的A2的51开发板,适合新手入门。用到的应用是Keil5和Stc-isp,第一个软件主要用来写代码的,第二个是将代码程序输送到单片机上,当然上面还提供一些经常使用的函数模块。
在这里插入图片描述
在这里插入图片描述

LED模块的原理

在这里插入图片描述

上图是LED模块的原理图,LED是基于数字信号控制LED灯的亮灭。在这里,是一行由8个LED灯组成的模块。电流会向LED发送高电平信号,使LED处于熄灭状态,我们可以通过改变信号的状态来决定它的亮灭。
首先电路从正极(VCC)出发,然后通过一个1k欧的电阻(限流作用),然后流入发光二极管的正极,负极流出,最后到电路中的P2口。
这个P2口是与芯片链接的。

在这里插入图片描述
在这里插入图片描述
如上图,P2是寄存器,CPU可通过程序来直接控制寄存器;寄存器通过驱动器控制电压,当驱动器为1时,为高电平(5V),为0时低电平(0V),所以程序可以通过二进制1/0来控制电路的高低电平,进而控制LED的亮灭。

点亮一个LED灯

在电路中,能识别的信号就是正负极,我们用1/0的二进制数字信号来进行表示,在写程序中,习惯用16进制来进行表示。
当电路接通后,电路中的LED默认为高电平(1),我们需要把它改为低电平(0),LED灯才会被点亮,所以我们可以这么写:

#include <REGX52.H>
//这是一个51单片机的头文件
int main()
{
    
    
		P2=0xFE;//P2已被包含在文件中,表示寄存器,可控制LED
		//二进制为 1111 1110
}

效果:
在这里插入图片描述

LED灯的闪烁

我们可以通过程序让它不断形成高低电平,那么LED灯将会闪烁。所以可以用while循环,但这里要注意的是,由于led引脚的电平持续在0、1之间变化,变化频率非常快,在MHz量级,导致的结果就是百直接看不到灯闪烁。所以我们还需要一个延迟函数减缓它的闪烁频率。

#include <REGX52.H>
#include <INTRINS.H>//包括nop函数
void Delay500ms()		//@11.0592MHz
{
    
    
	unsigned char i, j, k;
	_nop_();//单周期指令,可由晶振频率来延迟时间
	i = 4;
	j = 129;
	k = 119;
	do
	{
    
    
		do
		{
    
    
			while (--k);
		} while (--j);
	} while (--i);
}


int main()
{
    
    
	while(1)
	{
    
    
		P2=0xFE;
		//亮 1111 1110
		Delay500ms();
		//延迟500毫秒
		P2=0xFF;
		//灭 1111 1111
		Delay500ms();
	}
}

LED流水灯

当我们明白这些原理之后,就可以通过控制每一个LED灯来跑流水灯了。
代码:

#include <REGX52.H>
void Delay1ms(unsigned int x)		//@11.0592MHz
{
    
    
	unsigned char i, j;
	while(x--)//可通过循环来延迟时间频率
	{
    
    

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

int main()
{
    
    
	int i;
	char hex[8]={
    
    0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
	//写一个数组表示不同灯亮起
	while(1)
	{
    
    
		for( i=0;i<8;i++)
		{
    
    
			P2=hex[i];
			Delay1ms(500-50*i);
			//时间频率越来越快
		}
	}
}

猜你喜欢

转载自blog.csdn.net/m0_74068921/article/details/131518414