proteus仿真51单片机原理图(基于proteus的51单片机开发实例)

1. 基于proteus的51单片机开发实例(7)--按键的检测

1.1. 实验目的

图1是本实例的电路图。

proteus仿真51单片机原理图(基于proteus的51单片机开发实例)(1)

图1 独立按键检测电路

本实例我们来了解如何使用51单片机检测按键。在之前的实例中我们已经了解过,通过发光二极管和按键几乎可以把51单片机的大部分功能模拟实现。发光二极管可以看作是51单片机最基础、最典型的输出控制实现,而按键可以作为51单片机最典型的输入检测功能实现。

通过本实例,了解到如何编程实现51单片机如何检测按键的状态,但是程序毕竟是看不见摸不着的东西。如何直观地提示大家按键是被按下了还是松开了呢?我们通过发光二极管的亮灭来指示,这样就简单、直观的实现了按键状态的检测。

1.2. 设计思路

本例实现的功能是通过编程实现51单片机检测按键的状态。为了能够直观的观察程序运行的正确性,我们又加入了一个LED。

通过检测按键被按下时,LED发光;按键松开后,LED熄灭。从而完美实现本实例的目的。

1.3. 基础知识

1.3.1. 51单片机端口的输入和输出

简单来说,在端口作为通用I/O口时,输入主要用以检测端口的状态,通过识别端口是处于高电平还是低电平来判断外电路的工作状态。而输出则是通过给端口施加高电平或者低电平来控制外电路的工作状态。

1.3.2. 按键的检测方法

图2是按键的实物图。可以看到,按键有4个引脚,如果我们用万用表测量的话,会发现这4个管脚实际分为两组,每组2个引脚,在按键未被按下时。这两个引脚始终处于“常闭”状态,也就是说,每组的两个引脚始终是导通的,而在这两组引脚之间是断开的,当按键按下后,这两组引脚之间就“导通了”。

proteus仿真51单片机原理图(基于proteus的51单片机开发实例)(2)

图2 独立按键实物图

我们先来做一个实验,在proteus中,先按照图1所示的电路图建立一个项目,然后输入下面一段程序,然后开始仿真,看看当我们按动、松开按键时,LED灯的变换情况。

#include <AT89X52.h> //头文件 sbit S1 = P3^0;//定义按键引脚 sbit LED0 = P1^7;//定义LED引脚 void main(void) { LED0 = 1;//程序运行后,先将LED熄灭 while(1) { if(S1 == 0)//检测按键是否按下 { LED0 = !LED0;//LED状态翻转 } } }

程序中想要实现按键每按下一次,LED的状态翻转一次,但是当我们仿真时,发现LED的状态并不如我们预期的那样,有时候按键按下LED会闪烁不止一次。仿真效果如下面视频所示。

通过上面这个延时,我们了解到一个问题,按键的检测并不是如我们想象的这么简单,那么问题出在哪里呢?

事实上,我们用到的这种按键一般是由机械触点构成的,当触点闭合、断开时都会有抖动,这种抖动可以从图3中看出来。从图中可以看出,当按键抖动时,会在极短的时间内反复出现电平的高低变化,这个时间很短,一般是在毫秒级别,这种抖动对于我们直观是很难觉察到的,但是单片机不一样,例如51单片机,假如其时钟是12MHz,那么它的指令周期就是12/12MHz=1us,也就是说,51单片机每执行一条指令只需要1微秒,微秒对毫秒,这个差别就很明显了,所以单片机在按键抖动期间,是会检测到多次按键状态变化的。

既然存在这个问题,那么该怎么解决呢?

有两种解决办法,一是硬件消抖,二是软件消抖。

1、硬件防抖

硬件消抖电路如图4、图5所示。

proteus仿真51单片机原理图(基于proteus的51单片机开发实例)(3)

图4 硬件消抖电路1

在图4中,当按键断开时,电源电压经典组对电容充电,电容上电压与电源电压相等,当按键按下,由于按键内阻很小,电容通过按键迅速放电,按键两端电压迅速降到接近0V,单片机输入端为低电平,在按键按下时,由于抖动导致按键会短时断开,电源电压经电阻对电容充电,由于电阻的阻值较大,短时间内电容充电量很少,所以电容两端电压基本不变,单片机输入端的电平也基本保持不变,从而保证了按键抖动时仍可以使单片机输入端保持稳定的低电平信号。图5所示电路的接法与图4刚好相反,在此不再赘述。

proteus仿真51单片机原理图(基于proteus的51单片机开发实例)(4)

图5 硬件消抖电路2

选择硬件防抖电路时,电阻值和电容值的选取是很关键的。具体怎么选取电阻和电容的值呢,可以参考以下公式。

t<0.357*RC

这个公式中,t是按键抖动的时间,一般按键抖动时间是10~20ms,如果选取电阻阻值为10k,那么电容的值可以在2.5~5.6微法之间选取。通常选择3.3微法。

需要说明的是,考虑到按键按下时的功耗,一般电阻值选择要大一些。

2、软件防抖

用硬件防抖电路稳定性好、可靠性高,但是有一个缺点:增加电路中元器件,造成成本的提高。而软件防抖只是在程序中进行处理,不会增加元器件,所以相对来说,不会增加成本(毕竟软件成本相对很低)。

软件防抖的基本原理是:在单片机第一次检测到按键按下时,立即运行一短延时程序,在延时程序运行期间,不检测端口的电平状态,延时时间过后,按键的状态已经稳定了,这时单片机再检测按键的状态,这样可以避开按键的抖动期,从而从单片机端口得到稳定的按键状态。

软件防抖的延时时间一般选择10~20ms。这样也会有一个缺点:影响程序的执行效率。

1.1. 电路设计

本实例中电路有两部分:按键检测电路、LED控制电路。

按键检测电路中,按键的一端接到单片机的一个端口P3.0,另一端接地,按键端口接一个上拉电阻,按键未按下时,单片机端口处于高电平,按键按下后,单片机端口变为低电平。

LED控制电路中,LED通过单片机的P1.7控制,采用灌电流的驱动方式。

1.2. 程序设计

如下是本实例的程序代码。

#include <AT89X52.h> //头文件 sbit S1 = P3^0;//定义按键引脚 sbit LED0 = P1^7;//定义LED引脚 void main(void) { unsigned char i,j; LED0 = 1;//程序运行后,先将LED熄灭 while(1) { if(S1 == 0)//检测到按键按下 { for(i = 0;i < 200;i ) //延时一段时间 for(j = 0;j < 200;j ); if(S1 == 0)//再次检测到按键按下 { LED0 = !LED0;//LED状态翻转 } } } }

本实例中按键检测电路采用的是软件消抖方式,具体实现方法是,当程序中检测到按键端口P3.0按下时,立即延时一段时间,再次判断按键的状态,如果P3.0仍处于低电平,则认为按键确实被按下了,此时将LED控制端口P1.7的输出电平翻转。

1.3. 实例仿真

程序编写完毕后,编译生成HEX文件,将HEX文件载入proteus电路中的单片机,然后开始仿真,就可以看到每次按键按下,LED的状态会稳定的翻转一次。

1.4. 总结

通过本实例,我们掌握了单片机按键检测电路,了解了按键的抖动以及如何从电路和程序两种途径消除这种抖动。

至此,我们已经掌握了单片机学习过程中最简单、最经典的两种元器件:输出控制指示元件LED,输入检测元件按键。这对我们接下来的学习有极大的帮助。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页