51单片机---按键实验(含源码)
利用51单片机的独立按键模块实现按键对LED模块的控制,进而熟悉对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语言的基本知识进行掌握,这样才能更好的学习,还有就是一定要多加练习,多加实践,孰能生巧!!!
创作不易,还请大家多多点赞支持!!!
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)