单片机按键控制led

2019-01-17 19:50:35 qq_27508477 阅读数 2650
#include "reg51.h"

sbit KEY0 = P3^2;
sbit KEY1 = P3^3;
sbit OUT = P0^7;
sbit LED = P0^6;
void delay_ms(int t)
{
    int i;
    while(t--)
    {
        for(i=0; i<110; i++);
    }
}

void main()
{
    while(1)
    {
        if(KEY0==0)
        {
            OUT=0;
			LED=0;
        }
        else if(KEY1==0)
        {
            OUT=1;
			LED=1;
        }
        delay_ms(100);
    }

}
2020-03-04 20:11:40 bhniunan 阅读数 264

        在51单片机的前面的文章中,我们主要讲述了单片机IO口的输出功能的应用,如LED控制、数码管控制等。这篇文章我们来讲解如何用单片机的IO口读取按键的状态,并根据按键的状态来控制LED。关于51单片机按键输入功能的介绍可以参考文章《51单片机(二十四)—— 独立按键工作原理》

        在本文中,实例的代码如下所示。

#define KEY  P2  //定义按键输入端口
#define LED  P0  //定义LED输出端口

/********************************************************************/
/*                              主函数                              */
/********************************************************************/
void main (void)
{
	KEY=0xff; //按键输入端口电平置高
	for(;;)         //主循环
	{
		LED=KEY;
	}
}

代码很简单,主要代码只有for循环中的一行LED=KEY; 这一句代码的作用是将KEY的值赋值给LED。由程序的宏定义可知,KEY是P2,它是与独立按键连接的8个IO口的寄存器。LED是P0,它是与LED连接的8个IO口的寄存器。当某个独立按键按下时,则P2对应的IO口的电平状态被拉低,输入为0,当松开按键时,输入为1,在for循环中,将P2的值赋值给P0,当按键按下时,控制LED的IO口输出为0,则相应的LED点亮。松开按键时,控制LED的IO口输出为1,则相应的LED熄灭。由于赋值代码在for循环中,则LED的状态会实时更新。

2018-03-17 23:41:45 Lzinner 阅读数 17611

1.独立按键的原理(1703A)

1.独立按键一共有四个针脚,两个短针脚之间默认不导通,两个长针脚之间默认导通

2.按下按钮后,会出现“抖动”,消抖后,输入低电平;

2.为什么会出现按下按钮输入低电平?

1.对于p1,p2,p3口而言,是属于准双向IO口结构,在按下按钮(按钮在p3口)后,自然直接从内部输入低电平;

2.对于p1,p2,p3而言,上拉电阻是为了更好的控制高低电平,所以,p0口有外加的上拉电阻

3.而且在内部输入时NOT为非门,所以输入高电平时,到达这里变成了低电平,不能通过三极管,只有输入低电平时,才能转换为高电平,通过三极管(自己的理解,不太准确)

3.关于抖动的问题(转载)

通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖

按键消抖有两种,一种是硬件消抖,一种是软件消抖

参考链接:http://www.eeworld.com.cn/mcu/2012/0806/article_9776.html

4.代码练习

	  #include<reg52.h>
typedef int u16;
typedef char u8;
sbit led1=P2^0;	//D1
sbit led2=P2^1;	//D2
sbit led3=P2^2;	//D3
sbit led4=P2^3;	//D4

sbit k1=P3^1;//定义一个独立按键
sbit k2=P3^2;//定义一个独立按键
sbit k3=P3^3;//定义一个独立按键
sbit k4=P3^4;//定义一个独立按键


//定义延时函数
void delay(u16 i)
{
	while(i--);
}
void keypros()//定义独立按键控制
{
	if(k1==0)//说明按下去了
	{
	  delay(1000);//消抖
	  if(k1==0)
	  {
	  	led1=~led1;//翻转
	  }
	  
	  while(!k1);//按键松开
	}
	if(k2==0)//说明按下去了
	{
	  delay(1000);//消抖
	  if(k2==0)
	  {
	  	led2=~led2;//翻转
	  }
	  
	  while(!k2);//按键松开
	}
	if(k3==0)//说明按下去了
	{
	  delay(1000);//消抖
	  if(k3==0)
	  {
	  	led3=~led3;//翻转
	  }
	  
	  while(!k3);//按键松开
	}
	if(k4==0)//说明按下去了
	{
	  delay(1000);//消抖
	  if(k4==0)
	  {
	  	led4=~led4;//翻转
	  }
	  
	  while(!k4);//按键松开
	}
}
void main()
{
while(1)
{
	keypros();
}
}







2019-05-15 11:00:36 Steele_Jun 阅读数 1666

独立按键的使用较为简单,一般需特别注意按键的抖动;因为按键的开关都有抖动,而如果在抖动时间内检测按键状态就会不准确,所以一般延时10ms~20ms检测,延时时间可能需要具体修改。
写程序之前先弄明白自己按键连接的引脚,以及按下按键后电平的改变状态。

  • 按键k1连接在P3.1口; 按下按键,按键电平变为低电平;
  • led1连接在P2.0口;led1低电平点亮;

按键控制LED亮灭

#include "reg52.h"	

typedef unsigned int u16;	

sbit k1=P3^1;	 //定义P31口是k1
sbit led=P2^0;	 //定义P20口是led


void delay(u16 i)    // 10*i us
{
	while(i--);	
}

void key()
{
	if(k1==0)		  //检测按键是否按下
	{	
		delay(1500);   //抖动延时15ms
		if(k1==0)	 //再次判断按键是否按下
		{
			led=~led;	  //按键按下,led状态取反
		}
		while(!k1);	 //检测按键是否松开,松开则退出;确保按键松开,不加这句控制不准确
	}		
}

void main()
{	
	while(1)
	{	
		key();  //按键
	}		
}
2019-08-19 21:48:16 qq_45420694 阅读数 7178

51单片机 4个独立按键控制LED灯 仿真操作及代码展示 _ (protues仿真)_(C语言版)

一、思路及相关问题

1、逻辑思路:

当按下key1时 led1亮起来 因为按下去具有瞬时性不用while,用if语句,当松开时,用while(!key1) ,函数调用。
先在脑海里想象它的大致运行过程,其次在仿真软件protues上摆好元器件并连接,最后用keil4写对应代码。
需注意keil4软件上的设置如波特率,添加文件,勾选等等。
至少要了解C语言程序设计的基本功。

2、关于消抖:

通常的按键所用开关为机械性开关,当机械触电断开、闭合时、由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定的接通,在断开时也不会一下子断开、因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖
按键消抖有两种,
一种是 软件消抖: ;硬件消抖是通过采用外加零件来消除干扰抖动杂脉冲波,通常采用电容滤波、单稳延时电路等等。
一种是 软件消抖: 延时函数
参考链接:http://www.eeworld.com.cn/mcu/2012/0806/article_9776.html

二、有proteus及keil进行仿真效果

第一步找到芯片 AT89C51第二步找到按键开关BUTTON及LED灯还有电阻第二步找到按键开关BUTTON及LED灯还有电阻
在这里插入图片描述
第三步 将相关元器件连好线
第三步 将相关元器件连好线

三、打开keil4创建工程 代码及注释 调好波特率及添加文件相关工作 -----代码如下

#include<reg52.h>

unsigned int i;
sbit led1=P2^0; //定义第一个led灯
sbit led2=P2^1; //定义第二个led灯
sbit led3=P2^2; //定义第三个led灯
sbit led4=P2^3; //定义第四个led灯

sbit key1=P3^1; __ //定义第一个开关__
sbit key2=P3^2; //定义第二个开关
sbit key3=P3^3; //定义第三个开关
sbit key4=P3^4; //定义第四个开关

void delay() //延时函数 用于消抖
{
for(i=0;i<10;i++);
}
void key()
{
if(key10)
{
delay(); //延时 消抖
if(key1
0) //表示K1按下去
{
led1=0; // led1灯点亮
}
while(!key1); //表示_松开_按键key1
}
if(key20)
{
delay(); //延时 消抖
if(key2
0) //表示key2键被按下
{
led2=0; // led2灯点亮
}

  while(!key2);     //表示松开按键key2
}
if(k3==0)     
{
  delay();           //延时 消抖

  if(key3==0)    //表示key3键被按下
  {
  	led3=0;       // led3灯点亮
  }
  while(!key3);    //表示松开按键key3
}
if(key4==0)       
{
  delay();            //延时 消抖
  if(key4==0)   //表示key4键被按下
  {
  	led4=0;        // led4灯点亮
  }
  while(!key4);        //表示松开按键key4
}

}

void main()
{
while(1)
{
key();
}
}

四、运行程序后成功后,打开proteus右键单击单片机AT89C51,找到编辑,然后添加hex文件

STM32按键控制LED灯

阅读数 6157