分享

基于proteus的51单片机仿真实例五十二、按键的判断与消抖实例

 lixinhecom 2017-07-27
1、按键是单片机应用系统中经常用到的一种输入设备。单片机通过检测按键是否被按下来进行不同的控制。按键有很多种,常用的是独立按键和键盘
2、常用的独立按键也有很多种,最常见的是基于机械开关原理的有触点的按键。
3、我们利用proteus来实际模拟仿真一下按键的按下与松开过程。在proteus中绘制如下图所示的电路图。
4、在keil c51中新建工程ex40,输入如下程序代码,编译并生成ex40.hex文件
//实例40,按键判断实例,无按键消除抖动处理
#include <reg51.h>   // 包含头文件
sbit KEY = P1^0;   //定义按键对应的端口位
sbit LED = P3^0;  // 定义LED对应的端口位
void main(void)
{
  if(KEY == 0)  //判断按键是否按下
 {
   LED = !LED;  //如果按键按下,LED的状态翻转一次
 }
}
5、将ex40.hex载入at89c51中,启动仿真,观察运行结果,可以发现程序运行结果并不是预期的按键每按下一次,LED的亮灭状态翻转一次。
下面我们通过实例演示如何实现简单的消除按键抖动
6、在keil c51中新建工程ex40_1,输入如下程序代码,编译并生成ex40.hex_1文件
     //实例40_1,按键判断实例,用延时的方法消除按键消除抖动处理
#include <reg51.h>   // 包含头文件
sbit KEY = P1^0;   //定义按键对应的端口位
sbit LED = P3^0;  // 定义LED对应的端口位
void delay(void)
{
  unsigned char i,j;
 for(i = 0;i < 200;i++)
  for(j = 0;j < 200;j++);
}
void main(void)
{
  if(KEY == 0)  //判断按键是否按下
 {
   delay();  //延时一会,等待按键状态稳定
  if(KEY == 0)   //再次判断按键是否按下
  {
   LED = !LED;  //如果按键按下,LED的状态翻转一次
  }
 }
}
7、将ex40_1.hex载入at89c51中,启动仿真,观察运行结果,可以发现程序运行结果符合预期:按键每按下一次,LED的亮灭状态翻转一次。
想一想,这是为什么?

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多