51单片机学习笔记(五) -独立按键&&外部中断

2023-11-05


一、按键的工作原理

1、原理图

在这里插入图片描述

2、按键的工作原理

1、按键按下去的时候,I/O引脚接地,CPU检测到低电平,否则检测到高电平;
2、CPU通过监测按键连接的I/O引脚的电平输入是1还是0就知道外部有没有人按下这个按键。相当于人通过按按键给CPU输入了一个信号,这个信号可以被CPU监测到从而指导CPU去做一定的工作。

按键有没有按下的本质是I/O是否接地的问题。
按键引出端子JP1与单片机P1端口相接;

二、使用轮询法处理按键

1、通过按键来点亮LED

按下按键LED灯亮,松开按键LED灯灭,代码如下:

#include <reg51.h>

sbit Key1 = P1^0;
sbit LED1 = P0^0;


void main(void)
{
	while(1)
	{
		if(1 == Key1)
		{
			LED1 = 1;
		}
		else
		{
			LED1 = 0;
		}
	}
}

如果要监测的按键数量少,可以用位监测。如果多则可以直接用端口字节变量来监测。


2、键值检测与显示

一般的产品中按键都有很多,对于整个程序来说一般都是把按键进行编码,给每个按键一个对应的编码值,就叫做按键的键值;

#include <reg51.h>

sbit Key = P1^0;
void Display(unsigned char num);

unsigned char value[16] = {0xC0, 0xf9, 0xA4, 0xb0,
						   0x99, 0x92, 0x82, 0xf8,
						   0x80, 0x90, 0x88, 0x83,
                           0xc6, 0xA1, 0x86, 0x8e
						   };

void main(void)
{
	unsigned char KeyNum = 0;
	unsigned char i;
	while(1)
	{
		for(i = 0; i < 8; i++)
		{
			if((P1 & (0x01 << i)) == 0)
				KeyNum = i + 1;
		}
		
		Display(KeyNum);
	}
}

void Display(unsigned char num)
{
	if(num < 16)
		P0 = value[num];
}

3、按键消抖

1、什么是抖动:按键在按下时,活动触点击打固定触点会有机械振动,因而造成输出波形抖动,在抖动时间范围内引脚的电平变化是不稳定的。
2、抖动的危害:如果程序在这抖动的这一段范围内去判断引脚的电平从而来判断有无按键,则有很大可能性会误判。
3、如何消抖?
(1)硬件消抖,在硬件设计上想办法降低抖动,这是一种主动消抖(加一个小电容)。
(2)软件消抖,既然在硬件上不可能完全消除抖动,软件设计上就要想办法绕开抖动造成的影响,这是一种被动(逃避式)的消抖,也就是在抖动期间不去检测按键。

消抖代码如下:

if(Key == 0)
{
	Delay_mS(10);
	if(Key == 0)
	{
		AddDisplay();
	}			
}	

4、完整的按键检测

一次完整的按键事件:
1、按键事件就是按键操作过程中的不同状态切换;
2、一个完整的按键事件包括:按下事件(由高变低)、弹起事件(由低到高);
3、一般都认为发生了一次完整的按键事件才算是用户操作了一次按键,程序才会去处理按键,所以在一次完整的按键事件中程序只会去处理一次按键。

弹起时处理任务,代码如下:

if(Key == 0)          //检测按键,按下
{
	Delay_mS(10);       //消抖
	if(Key == 0)        //再次检测按键
	{
		flag = 1;         //标志位置一
	}			
}
else
{
	Delay_mS(10);        
	if(Key == 1 && flag == 1)   //检测弹起
	{
		AddDisplay();             //弹起后处理任务
		flag = 0;
	}			
}	

按下时处理任务,代码如下:

if(Key == 0)                       //检测按键,按下
{
	Delay_mS(10);                    //消抖
	if(Key == 0 && flag == 0)        //再次检测按键
	{
		flag = 1;                      //标志位置一
		AddDisplay(); 
	}			
}
else
{
	Delay_mS(10);        
	if(Key == 1)                   //检测弹起
	{
		flag = 0;                 //标志位清零
	}			
}

四、使用中断检测按键

1、功能要求

任务:独立数码管循环显示0-F,同时按键控制LED亮灭;

实现代码如下:

#include <reg51.h>

sbit LED1 = P2^0;
sbit Key1 = P1^0;

void Delay_mS(unsigned int Time);
unsigned char value[16] = {0xC0, 0xf9, 0xA4, 0xb0,
						   0x99, 0x92, 0x82, 0xf8,
						   0x80, 0x90, 0x88, 0x83,
						   0xc6, 0xA1, 0x86, 0x8e
						   };
void main()
{
	unsigned char i = 0;
	while(1)
	{
		for(i = 0; i < 16; i++)
		{
			P0 = value[i];
			Delay_mS(1000);
		}
		if(Key1 == 0)
			LED1 = 0;
		else
			LED1 = 1;
	}
}

void Delay_mS(unsigned int Time)
{
	unsigned char a, b;
	if(Time > 0)
	{
		while(Time--)
		{
			for(a = 2; a > 0; a--)
				for(b = 248; b > 0; b--);
		}
	}	
}

(1)实践证明可以实现功能,但是按键监测控制LED这边非常不灵敏,当所有数字显示完毕后才会响应按键;
(2)逐步认识到单片机只有一个“主线任务”的特点,也就是串行工作的;
(3)多任务时如何及时响应?-----引入中断

2、外部中断INT0和INT1

1、外部中断:中断源来自于单片机外部就叫外部中断,51单片机支持4个外部中断。分别对应4个引脚。每一个外部中断都对应一个特定的单片机IO引脚(譬如INT0对应P3.2,这个是单片机在设计时候定好的,是无法改变的)。我们软件只需要对P3.2做一些相关配置,P3.2就可以响应外部的中断事件。当硬件产生了一个外部中断时CPU就会收到一个中断信号,从而转去执行外部中断对应的处理程序(中断处理程序)。

2、中断寄存器:

3、INT0主要寄存器
IT0:中断触发模式配置(1:下降沿触发,0:低电平触发);
EX0:外部中断使能位(1:使能外部中断,0:禁止外部中断);
EA:全局中断使能位(1:使能全局中断,0:禁止全局中断)。

3、代码实现

外部中断初始化代码如下:

void INT0_Init(void)
{
	IT0 = 1;            //设置下降沿触发中断
	EX0 = 1;            //使能外部中断0
	EA = 1;             //使能全局中断
}

在中断中检测按键,中断函数如下:

void ExInt0() interrupt 0
{
	static unsigned char flag = 0;
	flag = !flag;
	if(Key1 == 0)
	{
		Delay_mS(5);
		if(Key1 == 0)
		{
			LED1 = flag;
		}
	}
}

延时函数:

void Delay_mS(unsigned int Time)
{
	unsigned char a, b;
	if(Time > 0)
	{
		while(Time--)
		{
			for(a = 2; a > 0; a--)
				for(b = 248; b > 0; b--);
		}
	}	
}

主函数:

#include <reg51.h>

sbit LED1 = P2^0;
sbit Key1 = P3^2;

void Delay_mS(unsigned int Time);
void INT0_Init(void);
unsigned char value[16] = {0xC0, 0xf9, 0xA4, 0xb0,
						   0x99, 0x92, 0x82, 0xf8,
						   0x80, 0x90, 0x88, 0x83,
						   0xc6, 0xA1, 0x86, 0x8e
						   };
void main()
{
	unsigned char i = 0;
	INT0_Init();
	while(1)
	{
		for(i = 0; i < 16; i++)
		{
			P0 = value[i];
			Delay_mS(1000);
		}
	}
}

程序最终功能就是,在静态数码管循环计数的同时,按键可以控制LED灯亮灭。

总结

1、本节介绍了按键的检测方式,以及消抖的原理和方法;
2、本节介绍了中断的使用和原理,并使用中断进行按键的检测;
3、中断函数时不需要声明的,但是得有关键字interrupt关键字。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

51单片机学习笔记(五) -独立按键&&外部中断 的相关文章

  • 聚焦小游戏技术生态,腾讯游戏云GAME-TECH落地厦门

    欢迎大家前往腾讯云 社区 获取更多腾讯海量技术实践干货哦 本文由腾讯游戏云 发表于云 社区专栏 2018迎来了小游戏元年 据 2018年小游戏行业白皮书 显示 2018年小游戏市场规模预计将达到300亿元 国内小游戏用户将超5亿人 未来或有
  • 187_零线和火线

    火线 英文简写L LIVE 一般为红色或黄色或绿色 零线 英文简写N NEUTRAL 一般为蓝色 零线火线 专指 民用电的供电线路 市电的交流供电电压为220伏特 V 不同的国家不一样 中国是220V 它包括一根零线 N 和一根火线 L 零
  • 钉钉企业内部H5微应用、免登流程与真机调试

    官方文档 https ding doc dingtalk com 项目作为企业内部应用 H5微应用接入 免登 官方免登流程文档 https ding doc dingtalk com doc dev ep7bpq 简单来说 前端通过钉钉提供
  • Spring Cloud Alibaba 项目搭建流程

    Spring Cloud Alibaba 项目搭建 1 项目结构搭建 springcloudalibaba xmn pom xml gateway server 1030 网关 user common 公共类 order server 10
  • ElasticSearch条件查询,高亮查询,聚合查询,以及映射关系

    1 在上一篇文章中我们已经做过了创建索引和简单的文档数据的增删改查 今天我们的核心是文档数据的查询 当然在后期我们也会用java数据来操作数据 上一期 我们的索引库是shopping 今天我们再来回忆一下 这就是查询索引库中 所有的信息 接

随机推荐

  • 使用electron 将网页打包成应用程序

    需求 将一个已经上线的后台管理系统 只兼容Chrome 打包成一个不需要谷歌浏览器就可以运行的软件 需要安装 npm install electron g npm install electron packager g WinRAR解压工具
  • 最高分数的学生姓名

    include
  • JDBC第三讲

    目录 三 Dao模式 1 Dao模式概念 2 Dao模式的组成 3 具体代码 3 1 BaseDao 3 2 Dao接口 3 3 Dao接口的实现 3 4 实体类 3 5 测试类 三 Dao模式 1 Dao模式概念 前面我们在使用JDBC时
  • Jetpack学习之MVVM实战

    MVVM架构与Jetpack MVVM即Model View ViewModel的缩写 它的出现是为了将图形界面与业务逻辑 数据模型进行解耦 MVVM也是Google推崇的一种Android项目架构模型 而Jetpack组件 大部分是为了能
  • 小干货:Linux 系统的备份恢复

    作者 LeoLan s Blog https reurl cc gm5ZkQ tar 命令 副本 本机备份整个系统 以后还原还是还原到本机 注意根目录下要有充足的可用空间用于备份 cd tar gz格式 tar cvpzf system b
  • visual studio 2019账号登陆不上去问题解决

    网上多数解决方案是选择账户选项 然后把嵌入式web改为系统式web 但我用打开登陆选项 发现我就是系统式web 所以此方法行不通 但我观察到登陆选项中有设备代码选项 于是我就选了此选项 然后选择了登陆 此时它跳出来一个选项 根据提示只要在另
  • 单片机——独立按键控制

    1 基本定义与初始化 include
  • 2021秋招复习——计算机网络

    文章目录 总流程 浏览器缓存 资源缓存的位置 三级缓存原理 浏览器缓存的分类 强缓存 协商缓存 Last Modify If Modify Since ETag If None Match 浏览器缓存的优点 DNS 什么是DNS DNS解析
  • 边缘检测Sobel、laplacian、canny算子

    1 图像边缘检测 图像边缘检测对于分析图像中的内容 实现图像中物体的分割 定位等具有重要的作用 边缘检测大大减少了源图像的数据量 剔除了与目标不相干的信息 保留了图像重要的结构属性 常用的图像边缘检测方法分为以下两种 一阶导数的边缘算子 通
  • Linux PWM 驱动实验

    一 PWM 驱动简析 1 设备树下的 PWM 控制器节点 I MX6ULL 有 8 路 PWM 输出 因此对应 8 个 PWM 控制器 所有在设备树下就有 8 个PWM 控制器节点 这 8 路 PWM 都属于 I MX6ULL 的 AIPS
  • [Codeforces] combinatorics (R1600) Part.7

    Codeforces combinatorics R1600 Part 7 题单 https codeforces com problemset tags combinatorics 1201 1600 1534C Little Alawn
  • 用Python爬虫技术怎么挣点小钱,这四种方法可行

    提醒 抓取的数据如果要商业化 要小心知识产权问题噢 还要提醒一点 抓取和处理这些数据的代价要小于人工处理的代价 使用爬虫代替人工才有价值 我利用Python爬虫技术赚点小钱方式 在正式聊Python爬虫技术之前 先来说说挣钱的事 说说作为一
  • react组件的render方法

    一个组件类必须要实现一个 render 方法 这个 render 方法必须要返回一个 JSX 元素 必须要用一个外层的 JSX 元素把所有内容包裹起来 返回并列多个 JSX 元素是不合法的 错误的写法 render return div 第
  • 计算机显示丢失d3dcompiler,无法启动此程序提示缺少d3dcompiler文件怎么解决

    有用户说他在打开某个程序时 系统却提示说无法启动此程序提示缺少d3dcompiler文件的情况 这可能是在系统更新时出现错误导致的 那么无法启动此程序提示缺少d3dcompiler文件怎么解决呢 很简单安装一个更新包即可解决 下面小编给大家
  • [培训-无线通信基础-7]:信道均衡器(信道估计、信道均衡)

    作者主页 文火冰糖的硅基工坊 https blog csdn net HiWangWenBing 本文网址 https blog csdn net HiWangWenBing article details 118832368 目录 引言
  • FFT算法(Java实现)

    FFT导论 转载自FFT导论 FFT是离散傅立叶变换的快速算法 可以将一个信号变换到频域 有些信号在时域上是很难看出什么特征的 但是如果变换到频域之后 就很容易看出特征了 这就是很多信号分析采用FFT变换的原因 另外 FFT可以将一个信号的
  • 通过Java操作Kafka

    通过Java操作Kafka 前置知识 https editor csdn net md articleId 125883056 创建maven项目 导入kafka客户端依赖
  • C#生成二进制文件

    文章目录 用C 将文本MAC地址生成二进制文件 使用C 将字符串生成二进制文件 为什么用C 来开发这个简单的上位机 用C 将文本MAC地址生成二进制文件 using System using System Collections Gener
  • wangEdit大致使用

    1 先导入 两种方式任选其一 yarn add wangeditor editor for vue next npm install wangeditor editor for vue next save 2 创建富文本框组件 以下是vue
  • 51单片机学习笔记(五) -独立按键&&外部中断

    文章目录 一 按键的工作原理 1 原理图 2 按键的工作原理 二 使用轮询法处理按键 1 通过按键来点亮LED 2 键值检测与显示 3 按键消抖 4 完整的按键检测 四 使用中断检测按键 1 功能要求 2 外部中断INT0和INT1 3 代