基于51单片机按键控制LED的相关操作

独立按键控制LED亮灭操作

要点

  1. 循环结构:程序通过无限循环 while(1),实现了一直执行其中的内容。
  2. 条件语句:程序使用了一个条件语句 if (P3_1== 0),当条件成立时执行 P2_0=0;,否则执行 P2_0=1;。
  3. IO口控制:程序通过对单片机的 IO 口进行读取和控制,实现了对按键和 LED 灯的控制。其中,P3_1 对应单片机的 P3 口的第 1位,表示按键的输入状态;P2_0 对应单片机的 P2 口的第 0 位,表示 LED 灯的输出状态。
  4. 按键检测:程序使用了按键检测技术,即通过读取 IO 口的状态,判断是否有按键被按下,按键按下时默认为低电平。
  5. LED 灯控制:程序通过对单片机的 IO 口进行控制,实现了对 LED 灯的控制。当满足条件时,将 LED 灯点亮;否则,将 LED 灯熄灭。
#include <REGX51.H>

void main()
{
	while(1)
	{
		if(P3_1==0)	//如果K1按键或K2按键按下
		{
			P2_0=0;		//LED1输出0,点亮
		}
		else
		{
			P2_0=1;		//LED1输出1,熄灭
		}
	}
}

独立按键控制LED状态

要点

  1. 头文件引入:使用 #include <REGX52.H> 引入了 REGX52.H头文件,该头文件包含了8052系列单片机的寄存器定义和函数声明。
  2. 延时函数:定义了一个名为 Delay 的延时函数,用于实现延时功能。该函数通过嵌套的 for 循环进行延时,参数 xms表示延时的毫秒数。
  3. 主函数:程序的入口函数,命名为 main。主函数中的逻辑如下:
    ·使用一个无限循环 while(1),表示程序将一直执行下去。 检测 P3_1 引脚的状态,判断是否按下了 K1 按键。
    ·若检测到 K1按键被按下,则进行按键消抖处理;
    ·首先进行一次 20ms 的延时。 然后通过一个 while 循环等待 K1 按键释放,即不断检测P3_1 引脚的状态,直到松手为止。
    ·最后再进行一次 20ms 的延时来消除松手可能引起的抖动信号。 当 K1 按键被按下且释放后,执行 P2_0=~P2_0,将 LED1 的输出状态取反,实现 LED 状态的切换。
```c
#include <REGX52.H>  

void Delay(unsigned int xms)  // 定义延时函数,参数为需要延时的毫秒数
{
	unsigned char i, j;  // 定义循环计数变量
	for(; xms > 0; xms--)  // 循环 xms 次,每次减少 1
	{
		for(i = 2; i > 0; i--)  // 嵌套的 for 循环,用于实现延时
		{
			for(j = 239; j > 0; j--);  // 嵌套的 for 循环,用于实现延时
		}
	}
}

void main()  
{
	while(1)  
	{
		if(P3_1==0)	// 如果K1按键按下
		{
			Delay(20);	// 延时消抖
			while(P3_1==0);	// 松手检测,等待按键释放
			Delay(20);	// 延时消抖
			
			P2_0=~P2_0;	// LED1取反,改变LED1的状态
		}
	}
}

51单片机实现LED流水灯闪烁

要点

  1. 引入头文件:程序开始时,引入了REGX52.H头文件,该头文件包含了8052单片机的寄存器定义和函数声明。
  2. 定义延时函数:程序中定义了一个延时函数Delay,用于实现延时功能。该函数使用嵌套的循环来进行粗略延时。
  3. 初始化变量:在main函数中,首先初始化了一个名为led的变量,初始值为0x01,即只有LED1亮。
  4. 无限循环:程序进入一个无限循环,保证流水灯的效果可以一直持续。
  5. 控制LED亮灭:每次循环开始时,通过按位取反操作符~将led变量的值按位取反后赋给P2端口,从而控制LED灯的亮灭状态。
  6. 延时:在LED灯亮灭状态改变后,调用延时函数Delay延迟一段时间(500ms),控制LED灯的亮灭时间间隔。
  7. 位移操作:通过左移位操作<<=,将led变量的值左移一位,将亮灯位置移至下一个LED。
  8. 条件判断:如果led的值等于0x10,即LED4亮完后回到LED1的位置,将led变量重置为0x01,重新从LED1开始。
#include <REGX52.H>  

void Delay(unsigned int xms)  // 定义延时函数,参数为需要延时的毫秒数
{
	unsigned char i, j;  // 定义循环计数变量
	for (; xms > 0; xms--)  // 循环 xms 次,每次减少 1
	{
		for (i = 2; i > 0; i--)  // 嵌套的 for 循环,用于实现延时
		{
			for (j = 239; j > 0; j--);  // 嵌套的 for 循环,用于实现延时
		}
	}
}

void main()
{
	unsigned char led = 0x01;  // 初始化LED变量为0x01
	unsigned int i;
	while (1)  // 主循环,程序将一直执行这个循环
	{
		for (i = 0; i < 8; i++)  // 循环控制LED的点亮和熄灭
		{
			P2 = ~(led << i);  // 将P2端口的值设置为led的按位取反,即只有一个LED亮,其他LED熄灭
			Delay(500);  // 延时500ms,控制LED的显示时间
		}
		if (led == 0x00)  // 如果led等于0x0,即LED8亮完后回到LED1
		{
			led = 0x01;  // 将led重置为0x01,重新从LED1开始
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值