记录一些关于本人实验课的总结,由于本人是新手小白,许多程序和电路图较为粗略。
提前看了一眼实验一信号机控制实验,虽然名字有点高大上但是最后就是一个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程序