1、按键简介

按键相关知识。

1.1、按键工作原理

(1)按键内部是机械结构,也就是内部是没有电路的。按键对外表现位四个引脚,但本质上只是两个,引脚是两两连在一起的。按键按下内部引脚导通,松开内部断开。

(2)电路连接与原理图中图标。

按键一端接地,一端接单片机IO口。

(3)按键作为一个输入设备,单片机如何知道按键被按下?

单片机IO接上拉电阻。上拉是为了让引脚默认是高电平,但是上拉的力量抗不住接地,所以按键没有诞下时单片机IO口为高电平,而按下后为绝对0(GND)。

1.2、CPU如何处理按键

(1)轮询式。所谓轮询就是CPU不停的间隔很小时间去查看有没有按键按下,如果按下就处理按键,如果没有按下就下一时间间隔再来查看。(按键什么时候被按下CPU是无法预知的)

(2)中断式

1.3、按键电路接法分类

(1)独立按键

(2)矩阵按键

2、独立按键原理图

(1)按键接法是一段接地,一端接IO口。

3、独立按键代码

以K1按键为例,接P0.0  IO口。

3.1、轮询方式处理按键

检测到按键,LED灯状态取反

#include <reg52.h>
#include <intrins.h>/*实现功能*按键每按下一次,LED灯状态取反*//*位定义*/
sbit K1 = P0^0;
sbit LED = P0^1;/*函数声明*/
void Delay15ms();       //@12.000MHzvoid main(void)
{while(1){if(K1 == 0)    /*按键有被按下*/{Delay15ms();   if(K1 == 0){if(LED == 1){LED = 0;}else{LED = 1;        /*点亮LED灯*/}while(K1 == 0)           /*等待按键弹起,这里也可以加消抖*/{Delay15ms();while(K1 == 0);};   }}}
}void Delay15ms()       //@12.000MHz
{unsigned char i, j;i = 30;j = 43;do{while (--j);} while (--i);
}

3.2、按键消抖

(1)按键按下和弹起会发生电平抖动。如下图所示。

(2)抖动的危害:在抖动时间范围内引脚的电平变化是不稳定的,如果程序在这一段范围内取判断引脚的电平从而判断有无按键,则有很大可能性会误判。

(3)如何消抖

硬件消抖:在硬件设计上想办法降低抖动的幅度及时间,这是一种主动消抖。如按键并联电容。

软件消抖:硬件上不可能完全消除抖动,软件上可以绕开抖动的那一段,这是一种逃避式的消抖。

也就是通过延时消抖,延时时间一般为10-15毫秒。

3.3、完整的按键检测

(1)一个完整的按键事件检测包括:按键按下、按键保持、按键弹起。

(2)一般都认为一次完整的按键事件后才算用户操作了一次按键,程序也只处理一次按键。

4、中断检测独立按键

中断是指单片机主程序运行过程中,出现某些意外情况需要单片机处理,单片机能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。

4.1、为什么需要中断

在实际应用开发中,单片机不可能一直轮询查看按键是否按下,单片机还需要去执行其他任务,因此引出中断。

(1)单片机在mai()函数中的while中执行的程序称为主线任务,中断程序中的程序称为中断任务。

(2)中断发生后CPU暂停主线任务转去处理中断任务,完成后再回来接着执行主线任务。

(3)中断式比轮询式更适合处理异步事件,效率更高。

(4)中断处理的事件特点是:无法预料、处理时间短、响应要求急。

4.2、使用单片机外部中断来处理按键

(1)何为外部中断。中断源来自单片机外部就叫外部中断,每个外部中断对应一个特定的单片机IO引脚(譬如在STC89C52单片机中,INT0对应P3^2。在51单片机中,是单片机设计时就定好的,是无法改变的)。

(2)当硬件产生了一个外部中断时CPU就会收到一个中断信号,从而转去执行外部中断对应的处理程序(这个程序是需要自己去编写的)。

(3)外部中断对应哪个引脚,可参考电路原理图和数据手册。

4.3、程序示例

中断处理按键使LED灯状态取反。

#include <reg52.h>
#include <intrins.h>/*实现功能*按键每按下一次,LED灯状态取反(采用外部中断处理按键)*//*位定义*/
sbit K1 = P3^2;    /*外部中断0对应引脚*/
sbit LED = P0^1;/*函数声明*/
void Delay15ms();       //@12.000MHzvoid main(void)
{/*外部中断0初始化*/IT0 = 1;   //设置外部中断0出发方式(1:下降沿触发 0:低电平触发)EX0 = 1;   //使能外部中断0EA = 1;    //打开全局中断开关while(1){/*编写主线任务*/}
}/*按键消抖延时函数*/
void Delay15ms()        //@12.000MHz
{unsigned char i, j;i = 30;j = 43;do{while (--j);} while (--i);
}/**功能:外部中断0中断处理程序*注意:* exint0:中断函数名,可以任意取*   下降延触发中断*  该函数不用声明*/
void exint0() interrupt 0
{Delay15ms();     /*按键消抖*/if(K1 == 0){if(LED == 1){LED = 0;}else{LED = 1;            /*点亮LED灯*/}while(K1 == 0)          /*等待按键弹起,这里也可以加消抖*/{Delay15ms();while(K1 == 0);};   }
}

4.4、程序解释

(1)IT0这一位用来设置中断的触发模式:下降沿触发(Falling)或者低电平触发(low level)

(2)EX0这一位是INT0的开关。如果EX0等于0则外部中断在单片机内部被关闭,此时CPU无法收到INT0的中断信息所以不会处理INT0;如果需要使用INT0就一定要设置为1。

(3)EA是全局的中断开关。EA如果关掉则整个CPU不能响应中断,所有中断都被关了。光EA打开也不一定能响应中断,还得具体的中断开关打开才行。

(4)IT0、EX0、EA在 <reg52.h> 头文件中定义。

四、51单片机控制独立按键相关推荐

  1. 51单片机:独立按键控制数码管计数

    //按键动作的前沿和后沿会都有大约10ms的抖动,人在按下按键到松开至少需要50ms以上(待考证).此代码实现的功能为给按键计数,并给按键消抖 //欢迎邮箱交流:bglei@foxmail.com 作 ...

  2. 蓝桥杯51单片机之独立按键控制数码管【单片机开发初学者必学会】

    文章目录 一.写在前面 二.无中断控制数码管 三.外部中断控制数码管 一.写在前面 关于数码管的控制与显示,在文章51单片机之数码管从点亮到动态时钟的实现[单片机开发初学者通俗易懂]已经有详细介绍了, ...

  3. 51单片机_7-1独立按键控制流水灯方向

    文章目录 要求 资源 效果 main函数 要求 1.使用单片机内部定时器做为延时函数 2.独立按键K1控制流水灯左移 3.独立按键K2控制流水灯右移 资源 工程文件压缩包 链接:https://pan ...

  4. 【51单片机】独立按键,每个按键不同功能,数码管数值的加减,控制流水灯模式,包含按键消抖,数码显示,流水灯

    实验内容: 利用所学的单片机知识及电路知识编程实现单片机 I/O 口检测按键输入电平. 1.选中 8 位数码管的其中 1 位数码管,当独立按键 1 每按下一次,数码管加一(按下期间加 1),范围为 0 ...

  5. 51单片机实现独立按键控制LED灯

    本节博客主要实现以下效果: 3-1独立按键控制LED亮灭 本段代码主要使用了if...else...语句实现按下按下灯亮,松开按键时灯灭 #include <REGX51.H>void m ...

  6. (三)51单片机基础——独立按键与数码管

    从小就对电器元件比较感兴趣吧,经常拿坏的电器里面的芯片拆下来玩,甚至那些没坏的电器,比如我家的电视,也会希望它能坏掉,我好去看看里面是什么样子的,为什么能播放节目--,所以我第一眼看到51单片机的时候 ...

  7. 51单片机多路独立按键开关程序

    51单片机8路独立按键开关程序 每一个按键对应一个led灯,实现独立开关灯. 源程序: ** #include <reg51.h> #define uint unsigned int #d ...

  8. 【51单片机】独立按键控制LED灯(四种形式)

  9. 51单片机控制TB6600驱动器驱动42步进电机

    51单片机控制TB6600驱动器驱动42步进电机 第一次 功能实现目标 硬件简介 硬件连接 程序代码 第一次 以前总是看别人写的博客,通过别人的博客解决了我很多问题,从中也学到了各种知识,虽然不是很系 ...

最新文章

  1. oscache.properties文件配置
  2. 【错误记录】Flutter 混合开发报错 ( Android 端与 Flutter 端 EventChannel 初始化顺序错误导致无法通信 | EventChannel 通信流程 )
  3. QLineEdit响应回车时避免Button同时响应
  4. Leecode之翻转整数
  5. Python 3.2 beta 2 发布
  6. JavaScript中的数组和字符串
  7. AAC规格(LC,HE,HEv2)及性能对比
  8. mysql客户端字符集_设置MySQL客户端连接使用的字符集
  9. 基于单片机的火灾消防系统设计(#0480)
  10. 电影海报页面设计Html5,如何设计电影海报
  11. 基于JavaEE的网吧自动计费管理系统设计与实现_信息管理__JSP网站设计_SQLServer数据库设计
  12. Foxmail设置方法
  13. html跳转到关注的微信公众号,手机浏览器一键跳转微信公众号关注的方法
  14. 智慧园区地图导航解决方案,如何实现园区内地图导航?
  15. vs2012 mvc3项目ObjectContext与DBContext
  16. FastQC 配置 及 基本使用
  17. 测距仪控制c语言程序,激光测距仪系统设计(机械图电路图c语言程序)
  18. Revit二次开发_修改快捷键
  19. 使用kprobe监控linux内核提权(cred方法)
  20. python 计算结果 nan_python中的nan是什么意思

热门文章

  1. 调试血泪经验之uart/ttl/rs232电平转换问题
  2. VS2017创建MFC ActiveX工程制作IE OCX插件
  3. ubuntu rust_如何在Ubuntu Linux上安装Rust
  4. 安装BlackBerry 10 Simulator
  5. 开源网安受邀参加2023澳门万讯论坛,引领软件安全领域国产化替代浪潮
  6. Oracle数据库巡检模版
  7. collect()案例和count()案例_大数据培训课程
  8. 访问后台数据库有多6,看看这里便知
  9. 3Dmax2017版本,如何将物体切换到点和线框模式,后面贴图仍然显示?
  10. 频偏(ppm)计算公式