51单片机---按键实验(含源码)

实验介绍:利用51单片机的独立按键模块实现按键对LED模块的控制,进而熟悉对51单片机的相关理解,加强自身动手能力;包括按键抖动,延时函数,移位等操作技巧。

实验设备:普中51-实验板

实验目录:

1、独立按键控制LED亮灭

2、独立按键控制LED状态

3、独立按键控制LED显示二进制

4、独立按键控制LED移位

一、硬件部分

        本次实验涉及的硬件部分有两个,一个为LED灯,前面已经介绍过了,在此不在介绍(如果需要可以查看之前的博客(51单片机---点亮LED灯)。另一个是按键,轻触按键,相当于一种电子开关,按下时开关接通,松开时开关断开。实现原理是通过轻触接触内部的金属弹片受力弹动,来实现接触与导通。

        以图中四引脚轻触开关举例,可以发现1、2脚引其实是一个引脚,3、4引脚也是一个常闭引脚,1、2引脚合并成一处,3、4引脚形成一个触点H。

        当按键的弹片受到外力作用时触点1、2、H形成一个回路,此时就触发了导电的功能,即实现轻触开关的功能。

         下图为开发板中独立按键模块,其中4个独立按键,其原理是与上面的相同。 

二、原理图

        下图为开发板的独立按键模块的电路原理图,我们能够看见分别有4个按键K1、K2、K3、K4,其左端的接口为P31、P30、P32、P33,右端与GND相连,当按键按下时,相应的电路导通。

         在原理图的单片机核心部分,我们可以看到上述的P31、P30、P32、P33端,与单片机的P3.0-P3.3连接。

         通过对相关电路图的分析,我们可以得出实验的操作。

        首先在没有按键按下时候,单片机上电,所有IO口默认高电平(即P3.0-P3.3),当相应的按键按下时,对应的电路导通,其IO口为低电平。通过对按键的IO口电平的判断来控制LED灯的状态。

        其次,独立按键模块对应的寄存器为P3寄存器,LED模块对应的寄存器为P2寄存器;

        此外,在LED模块中,我们除了通过控制寄存器P2来控制某个LED的亮灭,每个LED还有一个属于自己的位寄存器,位寄存器的是大小为一位的寄存器。下图为头文件“REGX52.H”中对于相关位寄存器的定义,sbit的定义方式为:sbit 变量名=位地址;后面我们会利用位寄存器实现对LED的相关操作。

三、代码分享

1、独立按键控制LED亮灭

分析:利用按键1控制D1的亮灭,通过判断P31连接的P3.1的高低电平来设置D1的位寄存器P2_0的状态。

代码分享:

#include <REGX52.H>//定义51头文件
	void main()//定义主函数
	{
	while (1)//定义循环,单片机只有靠代码执行,所以此处需要用到循环
	{
	  	if(P3_1==0)//判断按键1是否按下
		P2_0=0;//若按下,点亮D1
		else
		   P2_0=1;//若没有按下,不点亮D2
	 }
	}
	

实验现象:

按键控制LED亮灭

2、独立按键控制LED状态 

         在通过按键控制点亮一个LED灯后,我们提出稍微高的要求, 即通过按键控制LED的状态,解释:当按下按键LED亮(初始状态为灭),再次按下按键后LED灭,以此重复循环。

        在此处我们需要引入按键抖动相关知识;

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

        简单来说就是按键在按下一瞬间时不能够完全达到负状态,会有抖动现象,按键释放一瞬间也不能一瞬间达到正状态,会有相应的抖动现象。

        消除抖动的方式有两种,一种为硬件方法,采用硬件电路,利用触发器时钟等来消除抖动。另一种为软件方式,通过延时函数来消除抖动。硬件方式较为麻烦,此处采用延迟函数的方式进行实现。

代码分享:

#include <REGX52.H>
 void Delay (int xms )		//@12.000MHz  由编译器生成的延时函数
{
	unsigned char i, j;
	  while(xms--)
	  {
	   	i = 2;
	j = 239;
	do
	{
		while (--j);
	} while (--i);
}
}


	void main()//定义主函数
	{
	while (1)//循环,使程序一直执行。
	{
		   if(P3_1==0)//判断是否按下按键,若按下按键
		   {
		   Delay (20);//进行消抖函数,20为延迟函数的时间20ms
		   while(P3_1==0);//判断是否放开按键,如不放开,程序不向下执行
			 Delay (20);//若放开按键,再次进行延时,表示一次按键按下-放开执行完成,
			   P2_0=~P2_0;//进行一次状态转变;
					   }
	}

	}

延时函数的产生:

实验现象: 

按键控制LED状态mp4

3、独立按键控制LED显示二进制

          在通过按键控制一个LED灯的状态后,我们再提出稍微高的要求,通过按键控制更多的LED灯,实现一个二进制的加法。解释:通过LED的亮灭实现二级制的加法。 

        分析:我们利用LED模块的8个LED灯,按下一下进行一次加一,从而达到二进制的效果。定义一个字符型变量,令其初始为0,每按下一次,变量的值+1,再将变量的值取反付给D1的接口 P2_0。

代码分享:

#include <REGX52.H>
   void Delay (int xms )		//@12.000MHz  定义延时函数
{
	unsigned char i, j;
	  while(xms--)
	  {
	   	i = 2;
	j = 239;
	do
	{
		while (--j);
	} while (--i);
}
}
     char i=0;//定义变量C
	void main()
	{
	while (1)
	{
		   if(P3_1==0)
		   {
		   Delay (20);
		   while(P3_1==0);
			 Delay (20);
			  i++;//没按下一次,i的值加一
		      P2=~i;//取反赋值给端口;;
			 } 
	
	}

	}

实验现象:

按键控制LED显示二进制

4、独立按键控制LED移位

        在前面的基础上,我们进行最后一个相关的实验,即通过按键控制LED的移位,取按键K1、K2,按下一次K1亮灯向右移动一位,按下一次K2亮灯向左移动一位。

        此处需要用到两个按键,以及移位功能,设有一变量c,其初始值为0,按下一次K1,c的值加一进行一次左移,左移长度为1,通过控制的左移长度,实现LED亮灯的移动。

代码分享:

#include <REGX52.H>
void Delay (int xms )		//@12.000MHz
{
	unsigned char i, j;
	  while(xms--)
	  {
	   	i = 2;
	j = 239;
	do
	{
		while (--j);
	} while (--i);
}
}

int v2=0;//定义变量V2,并初始化为0
void main()
	{
	P2=~0x01;//令LED的初始状态为D1亮
	while (1)
	{
		   if(P3_1==0)//按键K1按下一次
		   {
		   Delay (20);
		   while(P3_1==0);
			 Delay (20);
			 v2++;//右移长度

			 if(v2>=8)当右移长度超过7位
			 v2=0;再次循环执行
	       	
		   P2=~(0X01<<v2);//进行右移
		  
			 }
			 if(P3_0==0)//按键K2按下一次
		   {
		   Delay (20);
		   while(P3_0==0);
			 Delay (20);
			  if(v2==0)
			 v2=8;
			 v2--;//右移长度减一(即为左移)
			   P2=~(0X01<<v2);//进行左移
		
		 			 }
		 
	}

	}

实验现象:

按键控制LED移位

        总结:本次实验主要是通过51单片机的独立按键模块实现对LED模块的控制,其原理还是通过对单片机中的寄存器进行数值上的更改,来实现相应的操作。

                通过这次实验,我们明白C语言的重要性,所以希望大家在学习单片机之前,一定要将C语言的基本知识进行掌握,这样才能更好的学习,还有就是一定要多加练习,多加实践,孰能生巧!!!

        创作不易,还请大家多多点赞支持!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值