51单片机STC89C52RC——2.2 独立按键控制LED亮灭Plus

目的

当独立K1按键按一下(立即松开),LED D1点亮。再按一下K1(立即松开)LED D1熄灭

与前一节《51单片机STC89C52RC------2.1 独立按键控制LED亮灭》当独立K1按键按下时LED D1 点亮,松开D1熄灭 效果不一样。

一,STC单片机模块

二,独立按键

2.1 独立按键位置

2.2 独立按键电路图

这里要注意一个设计的bug

P3_1 引脚对应是K1

P3_0 引脚对应是K2

要实现按一下点亮、再按一下熄灭,我们就需要分析按键上的电压变化。

对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会立即断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动 。如上图。

具体在程序上我们就需要按照这个图做相应的处理。

cpp 复制代码
		if(P3_1==0)			//如果K1按键按下
		{
			Delay(15);		//延时消抖
			while(P3_1==0);	//松手检测
			Delay(15);		//延时消抖			
			P2_0=~P2_0;		//LED1取反
		}

三,创建Keil项目

详细参考:51单片机STC89C52RC------创建Keil项目-CSDN博客

四,代码

cpp 复制代码
#include <REGX52.H>

/**
 * 函    数:延时函数 毫秒
 * 参    数:ms 延时多少毫秒
 * 返 回 值:无
 */
void Delay_ms(int ms)	//@12.000MHz
{
	unsigned char data i, j;
	while(ms--)
	{ 
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}
/**
 * 函    数:主函数
 * 参    数:无
 * 返 回 值:无
 */
void main()
{
	while(1)
	{
		if(P3_1==0)			//如果K1按键按下
		{
			Delay_ms(15);		//延时消抖
			while(P3_1==0);	//松手检测 一直按着没松手
			Delay_ms(15);		//延时消抖			
			P2_0=~P2_0;		//LED1取反
		}
	}
}

五,代码编译、下载到51单片机

代码编译请参考

51单片机STC89C52RC------代码编译-CSDN博客

代码下载请参考

《51单片机STC89C52RC------STCAI-ISP代码下载-CSDN博客

六,效果

相关推荐
mftang1 小时前
Zephyr 中的 bt_le_per_adv_set_data 函数的介绍和应用方法
嵌入式硬件·nordic·zephyr
滴啦嘟啦哒1 小时前
【项目复盘】【四轴飞行器设计】驱动开发部分
单片机·面试准备
狂奔的sherry1 小时前
一会儿能ping通一会ping不通解决方案
运维·网络·单片机·嵌入式硬件
qq_401700412 小时前
单片机驱动继电器接口
单片机·嵌入式硬件
anghost15021 小时前
基于 STM32 的多传感器健康监测系统设计
stm32·单片机·嵌入式硬件
玉~你还好吗21 小时前
【嵌入式电机控制#34】FOC:意法电控驱动层源码解析——HALL传感器中断(不在两大中断内,但重要)
单片机·嵌入式系统·电机控制
STC_USB_CAN_80511 天前
所有普通I/O口都支持中断的51单片机@Ai8051U, AiCube 图形化配置
单片机·嵌入式硬件·51单片机
正点原子1 天前
《ESP32-S3使用指南—IDF版 V1.6》第三十四章 RGB触摸实验
单片机·物联网·嵌入式
码小文1 天前
Altium Designer 22使用笔记(8)---PCB电气约束设置
笔记·嵌入式硬件·硬件工程·ad22
dumpling01201 天前
新手向:使用STM32通过RS485通信接口控制步进电机
stm32·单片机·嵌入式硬件