IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 51独立按键基础实验(失败) -> 正文阅读

[嵌入式]51独立按键基础实验(失败)

实验原理:

按键包含四个管脚,初始13、24导通,而12、34不导通,当按键按下时12、34导通,类似于开关的结构。按键未按下时电压信号为高电平,当按键按下时电压信号为低电平。

由于机械开关的的按动会出现“抖动”(一般5-10ms),导致电压信号和理想信号不一致(如下图)。“抖动”可能导致电压信号被多次触发,可以设计硬件消除(会增加成本,如接入电容),或者软件消除(延时函数避开抖动区间)。

实验电路:

当按键按下时,管脚得到低电平(输入0),将K1-8分别关联LED1-8,当该按键所接的IO口收到低电平信号时,对应LED灯输出值取反(点亮/熄灭)。

完整代码:

#include "reg52.h"
typedef unsigned char u8;
typedef unsigned  int u16;
void delay_10us(u16 ten_us);  //延时函数
u8 key_scan(u8 mode);         //读取函数

sbit KEY1=P0^0;
sbit KEY2=P0^1;
sbit KEY3=P0^2;
sbit KEY4=P0^3;
sbit KEY5=P0^4;
sbit KEY6=P0^5;
sbit KEY7=P0^6;
sbit KEY8=P0^7;

sbit LED1=P1^0;
sbit LED2=P1^1;
sbit LED3=P1^2;
sbit LED4=P1^3;
sbit LED5=P1^4;
sbit LED6=P1^5;
sbit LED7=P1^6;
sbit LED8=P1^7;

#define KEY1_PRESS 1
#define KEY2_PRESS 2
#define KEY3_PRESS 3
#define KEY4_PRESS 4
#define KEY5_PRESS 5
#define KEY6_PRESS 6
#define KEY7_PRESS 7
#define KEY8_PRESS 8
#define KEY_UNPRESS 0



void main()
{
	 u8 key=0;  
	 while(1){
	   	key=key_scan(1);
		if(key==KEY1_PRESS)
			LED1=!LED1;
		else if(key==KEY2_PRESS)
			LED2=!LED2;
	 	else if(key==KEY3_PRESS)
			LED3=!LED3;
		else if(key==KEY4_PRESS)
			LED4=!LED4;
		else if(key==KEY5_PRESS)
			LED5=!LED5;
		else if(key==KEY6_PRESS)
			LED6=!LED6;
		else if(key==KEY7_PRESS)
			LED7=!LED7;
		else if(key==KEY8_PRESS)
			LED8=!LED8;	   
	 }
	 
}

u8 key_scan(u8 mode)     //加入形参mode调整单次扫描/连续扫描模式
{
	static u8 key=1;
	if(mode)
		key=1;
	if(key=1&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0||KEY5==0||KEY6==0||KEY7==0||KEY8==0))
	{
		delay_10us(1000);  //消抖
		key=0;
		if(KEY1==0)
			return KEY1_PRESS;
		else if(KEY2==0)
			return KEY2_PRESS;
		else if(KEY3==0)
			return KEY3_PRESS;
		else if(KEY4==0)
			return KEY4_PRESS;
	    else if(KEY5==0)
			return KEY5_PRESS;
		else if(KEY6==0)
			return KEY6_PRESS;
		else if(KEY7==0)
			return KEY7_PRESS;
		else if(KEY8==0)   
			return KEY8_PRESS;	
	}else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1&&KEY5==1&&KEY6==1&&KEY7==1&&KEY8==1)
	{
			key=1;	 		
	}
	return KEY_UNPRESS;
}

void delay_10us(u16 ten_us)	 
{
	 while(ten_us--);
}

实验结果:

按下独立按键后,对应LED灯亮起,但有时亮起后松按键即熄灭,有时亮起时按下按键LED灯亮度降低,松按键后恢复原亮度,多次调试后未查明原因。

使用教程提供的代码(仅控制2个LED灯)实验结果如预期,按下后对应灯亮起,松开后保持亮度,再次按键对应灯熄灭。。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-02-04 11:11:54  更:2022-02-04 11:12:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:23:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码