Bootstrap

51单片机基础3——按键控制LED

按键控制LED实验

按键控制LED,区别于传统控制,即闭合开关电路导通;而是采用按键按下,传递给单片机一个信号,单片机检测到该信号,改变输出LED 管脚电平使LED点亮。

1. 软硬件条件

  • 单片机型号:STC89C52RC
  • 开发环境:KEIL4
  • 烧录软件:stc-isp

2. 原理图

  1. 按键原理图
    在这里插入图片描述

由按键原理图可以知道 按键按下时,传递给单片机一个低电平。所以,可以检查对应引脚是否有低电平来判断按键是否按下。
2. LED 原理图
在这里插入图片描述

  1. 单片机原理图
    在这里插入图片描述
    结合单片机与LED原理图,可以理清楚控制关系如下:
0
0
按键按下
单片机
LED

即,按键按下对应引脚电平拉低给MCU,MCU检测到低电平后拉低LED对饮引脚的电平。

3. 代码

按照上述描述最简单的方法就是,不断的去判断对应按键是否按下,也就是查询法按键控制方式。

#include "reg52.h"

// 查询法按键控制灯

sbit key2 = P2^0;
sbit key1 = P2^1;
sbit led1 = P3^7;

// reset 重新上电
void init(){
	led1 = 1;
}

void main()
{
	init();
	while(1)
	{
		if(key1 == 0) // 按键被按下
		{
			led1 = 0; // 灯亮
		}
		if(key2 == 0)
		{
			led1 = 1; // 灯灭
		}
	}

}

上述代码,太过理想在未考虑到按键按下,或者抬起过程中,按键拨片可能会发生抖动。于是有了按键消抖方案——使用延迟避开抖动时间。这里只检测按下 。
在这里插入图片描述

#include "reg52.h"

sbit key1 = P2^1;
sbit key2 = P2^0;
sbit led = P3^7;

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

	i = 90;
	j = 163;
	do
	{
		while (--j);
	} while (--i);
}

void init(){
	key1 = 1;
	key2 = 1;
	led = 1;
	
}

void main(){
	// 查询方式实现按键控制LED
	init();
	while(1){
		if(key1 == 0 ){
			Delay50ms();
			if(key1 == 0) led = !led;
			while(key1 == 0);
		}
		if(key2 == 0){
			Delay50ms();
			if(key2 == 0) led = 1;
			while(key2 == 0);
		}
	}
}

这边如果不用while,可能会由于人为原因一直按下按键没有松开,导致LED电平不断翻转。

;