C51单片机学习笔记(三)——按键对灯、蜂鸣器等器件的控制

C51单片机学习笔记(三)——按键对灯、蜂鸣器等器件的控制

1.独立按键的原理

  • 一般的独立按键有四个脚,无论按键是否被按下,1和2总是相通的,3和4也是相通的。当按键按下时,1、2脚与3、4脚接通,按住不放则保持接通状态
    在这里插入图片描述
  • 按键通断过程的抖动:当按键按下时(释放时)输出的理想波形是标准的矩形波,但是,由于机械触点的弹性作用,闭合时电路不会马上稳定的接通,这中间会出现一连串的抖动,如图所示,抖动时间一般为5~10ms
    在这里插入图片描述
  • 按键的消抖:按键的抖动会造成一次按下被误认为多次按下,所以要进行消抖处理,一般分为硬件消抖和软件消抖,这里讨论软件消抖,方法是当单片机检测到按键闭合时,采用延时程序产生5~10ms的延时,等抖动消失后,再判断是否处于闭合状态,同理释放的时候,也要给延时。
  • 按键给单片机传达指令的基本原理:按键的一端接地,另一断接单片机的任意一个I/O口,当按键没被按下时,单片机的I/O口是高电平,当按键被按下时,就变成低电平,此时单片机就认为按键被按下了。
    在这里插入图片描述

2.独立按键控制蜂鸣器响

  • 蜂鸣器的特点:蜂鸣器按内部是否有震荡器可分为有源蜂鸣器和无源蜂鸣器(声音频率可控,可以控制发出音节)
  • 蜂鸣器的驱动电路:
  • 在这里插入图片描述
  • 图中是PNP型三极管Q2,当P1.5输出低电平时,三极管饱和导通,蜂鸣器鸣响,反之,输出高电平时,三极管截止,蜂鸣器不响。
  • 下面编写按键控制蜂鸣器的代码:
#include<reg52.h>
#define uint unsigned int 	//用uint替换unsigned int
#define uchar unsigned char	//用uchar替换unsigned char
sbit bell = P1^5;		   //用P1.5监听蜂鸣器
sbit S1 = P3^7;			   //用P3.7来检测按键是否被按下
void delay(uint z);			   //延时函数
void main()
{
	uchar i;
	uint k;
	if(S1 == 0)     //第一次检测按键被按下
	{
		delay(8);   //延时8ms进行消抖
		if(S1 == 0)	  //再次检测按键被按下,说明确实被按下了
		{
			for(i=0;i<3;i++)  //for循环控制蜂鸣器响3声
			{	
				for(k=0;k<50000;k++);//延时500ms
				bell = 0;		     //输出低电平,使蜂鸣器鸣叫
				for(k=0;k<50000;k++); //延时500ms
				bell = 1;			//输出高电平,使蜂鸣器停止
			}
		}
	}
}
void delay(uint z)
{
	uint x,y;
	for(x=z;x>0;x--)
		for(y=120;y>0;y--);
}

3.独立按键对流水灯的控制

  • 编程思路:根据前面按键的基本原理,只需要检测到相应按键按下时,将对应得流水灯点亮(其引脚输出低电平),这样就可以通过按键控制流水灯了。
#include<reg52.h>
#define uint unsigned int 	//用uint替换unsigned int
#define uchar unsigned char	//用uchar替换unsigned char
sbit bell = P1^5;		   //用P1.5监听蜂鸣器
sbit S1 = P3^7;			   //用P3.7来检测按键是否被按下
sbit S2 = P3^6;
sbit S3 = P3^5;
sbit S4 = P3^4;
sbit S5 = P3^3;
sbit S6 = P3^2;
sbit LED1 = P2^0;
sbit LED2 = P2^1;
sbit LED3 = P2^2;
sbit LED4 = P2^3;
sbit LED5 = P2^4;
sbit LED6 = P2^5;
sbit LED7 = P2^6;
sbit LED8 = P2^7;
void delay(uint z);
void main()
{
	uchar i;
	uint k;
	if(S1 == 0)     //第一次检测按键被按下
	{
		delay(8);   //延时8ms进行消抖
		if(S1 == 0)	  //再次检测按键被按下,说明确实被按下了
		{
			for(i=0;i<3;i++)  //for循环控制蜂鸣器响3声
			{	
				for(k=0;k<5000;k++);//延时500ms
				bell = 0;		     //输出低电平,使蜂鸣器鸣叫
				for(k=0;k<10000;k++); //延时500ms
				bell = 1;			//输出高电平,使蜂鸣器停止
			}
		}
	}
	if(S2 == 0)     //第一次检测按键被按下
	{
		delay(8);   //延时8ms进行消抖
		if(S2 == 0)	  //再次检测按键被按下,说明确实被按下了
		{
			LED1 = 0;     //正向流动
			delay(500);
			LED1 = 1;
	
			LED2 = 0;
			delay(500);
			LED2 = 1;
			
			LED3 = 0;
			delay(500);
			LED3 = 1;
	
			LED4 = 0;
			delay(500);
			LED4 = 1;
	
			LED5 = 0;
			delay(500);
			LED5 = 1;
	
			LED6 = 0;
			delay(500);
			LED6 = 1;
	
			LED7 = 0;
			delay(500);
			LED7 = 1;
	
			LED8 = 0;
			delay(500);
			LED8 = 1;		
		}
	}
	if(S3 == 0)     //第一次检测按键被按下
	{
		delay(8);   //延时8ms进行消抖
		if(S3 == 0)	  //再次检测按键被按下,说明确实被按下了
		{
			LED8 = 0;       //反向流动
			delay(500);
			LED8 = 1;
	
			LED7 = 0;
			delay(500);
			LED7 = 1;
			
			LED6 = 0;
			delay(500);
			LED6 = 1;
	
			LED5 = 0;
			delay(500);
			LED5 = 1;
	
			LED4 = 0;
			delay(500);
			LED4 = 1;
	
			LED3 = 0;
			delay(500);
			LED3 = 1;
	
			LED2 = 0;
			delay(500);
			LED2 = 1;
	
			LED1 = 0;
			delay(500);
			LED1 = 1;
		}
	}
	if(S4 == 0)     //第一次检测按键被按下
	{
		delay(8);   //延时8ms进行消抖
		if(S4 == 0)	  //再次检测按键被按下,说明确实被按下了
		{
			LED1 = 0;   //1、3、5、7亮
			LED2 = 1;
			LED3 = 0;
			LED4 = 1;
			LED5 = 0;
			LED6 = 1;
			LED7 = 0;
			LED8 = 1;
		}
	}
	if(S5 == 0)     //第一次检测按键被按下
	{
		delay(8);   //延时8ms进行消抖
		if(S5 == 0)	  //再次检测按键被按下,说明确实被按下了
		{
			LED1 = 1;    //2、4、6、8亮
			LED2 = 0;
			LED3 = 1;
			LED4 = 0;
			LED5 = 1;
			LED6 = 0;
			LED7 = 1;
			LED8 = 0;
		}
	}
	if(S6 == 0)     //第一次检测按键被按下
	{
		delay(8);   //延时8ms进行消抖
		if(S6 == 0)	  //再次检测按键被按下,说明确实被按下了
		{
			LED1 = 1;  //全部灯灭
			LED2 = 1;
			LED3 = 1;
			LED4 = 1;
			LED5 = 1;
			LED6 = 1;
			LED7 = 1;
			LED8 = 1;
		}
	}
}
void delay(uint z)
{
	uint x,y;
	for(x=z;x>0;x--)
		for(y=120;y>0;y--);
}

猜你喜欢

转载自blog.csdn.net/qq_40181592/article/details/88897098