按键控制LED实验
按键控制LED,区别于传统控制,即闭合开关电路导通;而是采用按键按下,传递给单片机一个信号,单片机检测到该信号,改变输出LED 管脚电平使LED点亮。
1. 软硬件条件
- 单片机型号:STC89C52RC
- 开发环境:KEIL4
- 烧录软件:stc-isp
2. 原理图
- 按键原理图
由按键原理图可以知道 按键按下时,传递给单片机一个低电平。所以,可以检查对应引脚是否有低电平来判断按键是否按下。
2. LED 原理图
- 单片机原理图
结合单片机与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电平不断翻转。