实验课总结2 实验一

记录一些关于本人实验课的总结,由于本人是新手小白,许多程序和电路图较为粗略。
提前看了一眼实验一信号机控制实验,虽然名字有点高大上但是最后就是一个51点灯实验,附上实验要求、代码、protues仿真结果。

实验要求

按键控制信号灯状态,按键按下时对应灯点亮,再按下对应灯熄灭。流程图就不画了,首先是键盘扫描检测判断是第几次按下按键,然后作出对应效果

原理

由于是小白,所以去网上搜了一下对应的程序,发现了很多对应的程序啥的,找到了我认为容易理解可操作性强的方法
附上网址:
链接: 学习总结——按下按键灯亮,再次按下按键,灯灭.

这篇博客介绍了两种方法,我觉得都可以试验一下,本人选用了第一种方法,就是引入一个变量,在检测到按键按下后进行++操作,用取余操作(%)判断奇偶数,进行判断第几次按下按键。

具体实现

 先来看看电路图吧,51单片机与LED加上电阻和按键就OK了,这里还是偷懒没画上晶振时钟电路和上电复位电路
 
 这里画上了三个LED灯分别可以用KEY0、1、2控制,KEY3用于控制最后两个灯的亮灭。

按键采用了上拉电阻的方式,至于上拉电阻与下拉电阻的一些注意事项可以参考Bilbil网站的一个视频链接: 电子元件从零到精通-通过实验深刻理解“下拉电阻”.

在这里插入图片描述
接下来就是码代码了
下面展示一些 内联代码片

#include "reg52.h"

//引脚初始化
sbit LED1=P1^0;
sbit LED2=P1^1;
sbit LED3=P1^2;
sbit KEY1=P1^3;
sbit KEY2=P1^4;
sbit KEY3=P1^5;
sbit KEY4=P1^6;
//变量定义
unsigned int a=0,b=0,c=0,d=0,flag0=0,flag1=0,flag2=0,flag3=0;

//函数声明
void key_config();
void delay(unsigned int n);

//函数定义
void key_config()
{
	//按键1
	//按下为0  上拉电阻
	if(KEY1==0&&flag0==0)	
	{
		flag0=1;
	}
	if(flag0==1&&KEY1==1)
		{
			if(a%2==0)
				LED1=0;
			if(a%2==1)
				LED1=1;
		    flag0=0;
		    a++;
		}

	//按键2
	if(KEY2==0&&flag1==0)	
	{
		flag1=1;
	}
	if(flag1==1&&KEY2==1)
		{
			if(b%2==0)
				LED2=0;
			if(b%2==1)
				LED2=1;
		    flag1=0;
		   	b++;
		}
		
	//按键3
	if(KEY3==0&&flag2==0)	
	{
		flag2=1;
	}
	if(flag2==1&&KEY3==1)
		{
			if(c%2==0)
				LED3=0;
			if(c%2==1)
				LED3=1;
			  flag2=0;
			  c++;
		}

	//按键4
	if(KEY4==0&&flag3==0)	
	{
		flag3=1;
	}
	if(flag3==1&&KEY4==1)
		{
			if(d%2==0)
			{
				LED3=0;
			  LED2=0;
			}
		
			if(d%2==1)
			{
				LED3=1;
			  LED2=1;
			}
		    flag3=0;
				d++;
		}
}

int main()
{
	while(1)
	{
		key_config();
	}
}
#if 0
void delay(unsigned int n);
//延时函数消抖
void delay(unsigned int n)
{
	unsigned int i=0,j=0;
	for(i=0;i<n;i++)
	{
		for(j=0;j<120;j++);
	}
}
void key_config()
{
	
	//按键1
	if(KEY1==0)
	{
		delay(100);//消除抖动
		if(KEY1==0)
		{
			a++;
			if(a%2==0)
				LED1=0;
			if(a%2==1)
				LED1=1;
		}
	}
}
#endif

代码写的很冗余,作为刚刚起步的小白只能复制粘贴相同功能的if语句。。。。

首先包含一下头文件,这有两种方式#include“xxx.h”和#include<>区别大概是使用“”可以自己指定头文件的路径,使用<>包含头文件是在keil安装路径寻找头文件。

然后就是引脚初始化,相当于一个映射功能使得可以配置IO口输出输入0或1,具体应该是通过配置寄存器实现的

之后就是疯狂复制粘贴if语句使用的变量,先声明一下函数,开始函数定义。

由于按键按下后产生一个脉冲,会有抖动情况出现,导致按下一次按键后的状态与配置的状态不一致,关于按键消抖有两个方法,第一是编写延时函数,在代码最后使用宏注释#if 0 xxx #endif的方法进行了注释,注释的内容就是使用延时函数进行按键消抖的方法。第二是使用变量标志位,通过与的形式产生一个类似延时的效果。个人在使用方面偏向于引入标志位的方法,觉得延时消除抖动的方法并不是很好,很难把握时间。

上文所说的原理在if语句里实现了,对于按键1引入一个变量a用于判断按键按下次数。
main 函数当然是必不可少的,使用while(1)的方式不停的循环执行函数。

结语

本次实验较为简单学习了基本的protues操作和基本的keil编辑51程序

猜你喜欢

转载自blog.csdn.net/qq_43710355/article/details/106200111