51单片机按键控制LED灯亮灭的N个玩法

51单片机按键控制LED灯亮灭的N个玩法

1.概述

这篇文章介绍按键的使用,以及通过控制LED灯的小实验,发现按键中存在的问题,然后思考并解决这些问题。达到熟练使用按键控制元器件。

2.搭建硬件环境

1.硬件准备
名称型号数量
单片机STC12C20521
LED彩灯2
晶振12MHZ1
电容30pf2
电阻100欧姆2
面包板1
连接线5
2.电路图原理图

在这里插入图片描述

  • 1.LED灯正极串联一个100欧姆电阻,接到单片机20号引脚VCC。
  • 2.连接线一头连接单片机12号引脚,另一头接按键的一脚。
  • 3.按键的另一脚通过连接线接到单片机10号引脚GND
  • 4.晶振两个脚分别连接单片机的4号和5号引脚,同时晶振每个引脚串联一个30pf电容接到单片机10号引脚GND

在这里插入图片描述

3.实验课题

3.1.按键按下灯亮,松开灯关闭

1.课题描述

课题的目的使用按键来控制LED灯的亮和灭,当按下按键读取到低电平,让灯打开。当送开按键读取到高电平,让灯关闭。

2.实现程序
/*************************************************************
* 程序名: 按键控制LED灯亮灭
* 编写人: bruce
* 硬件支持:TC12C2052 外部12MHZ晶振
* 日  期: 2023-11-14
* 修改日志: 
/*************************************************************/#include<STC12C2052AD.H>sbit LED = P1^7;
sbit KEY = P1^0;void main(void){KEY = 1;LED = 1;while(1){/*使用if判断语句实现按下按键LED灯亮,松开按键LED灯灭*//*if(KEY == 0){LED = 0;}else if(KEY == 1){LED = 1;}*/// 讨巧的方式实现按键控制灯亮灭LED = KEY;}}

3.2.按键轮训控制灯开关

1.课题描述

当按键第一次按下松开后开灯,第二次按下按键松开后关灯。

2.实现程序
/*************************************************************
* 程序名: 第一次按下按键LED灯亮,第二次按下按键LED灯灭,如此循环
* 编写人: bruce
* 硬件支持:TC12C2052 外部12MHZ晶振
* 日  期: 2023-11-14
* 修改日志: 
/*************************************************************/#include<STC12C2052AD.H>sbit LED = P1^7;
sbit KEY = P1^0;/*********************************************************************************************
函数名:毫秒级CPU延时函数
调  用:DELAY_MS (?);
参  数:1~65535(参数不可为0)
返回值:无
结  果:占用CPU方式延时与参数数值相同的毫秒时间
备  注:应用于1T单片机时i<600,应用于12T单片机时i<125
/*********************************************************************************************/
void DELAY_MS (unsigned int a){unsigned int i;while( --a != 0){for(i = 0; i < 600; i++);}
}void main(void){KEY = 1;LED = 1;while(1){if(KEY == 0){/*DELAY_MS()延时函数的作用是去掉按下按键抖动造成信号不稳定,导致程序失灵。当按下按键后让程序稍等一会跳过按键抖动时刻,再读取按键状态达到去抖动效果。*/DELAY_MS(120);if(KEY == 0){//当按键为0时,判断当前灯的状态,并取反。实现轮训控制灯的开关。if(LED == 0){LED = 1;}else{LED = 0;}}}	}}

上面的程序虽然实现了按键控制灯的亮灭功能,但是它有两点不完美,需要优化。优化点如下

  • 嵌入了三层if判断语句,是程序变得复杂不易阅读。
  • 只通过延时决绝按键抖动,偶尔还会出现失灵的情况。

下面的程序对该两点内容做了优化,使程序更加晚上。

/*************************************************************
* 程序名: 第一次按下按键LED灯亮,第二次按下按键LED灯灭,如此循环
* 编写人: bruce
* 硬件支持:TC12C2052 外部12MHZ晶振
* 日  期: 2023-11-14
* 修改日志: 
/*************************************************************/#include<STC12C2052AD.H>sbit LED = P1^7;
sbit KEY = P1^0;/*********************************************************************************************
函数名:毫秒级CPU延时函数
调  用:DELAY_MS (?);
参  数:1~65535(参数不可为0)
返回值:无
结  果:占用CPU方式延时与参数数值相同的毫秒时间
备  注:应用于1T单片机时i<600,应用于12T单片机时i<125
/*********************************************************************************************/
void DELAY_MS (unsigned int a){unsigned int i;while( --a != 0){for(i = 0; i < 600; i++);}
}void main(void){KEY = 1;LED = 1;while(1){if(KEY == 0){/*DELAY_MS()延时函数的作用是去掉按下按键抖动造成信号不稳定,导致程序失灵。当按下按键后让程序稍等一会跳过按键抖动时刻,再读取按键状态达到去抖动效果。*/DELAY_MS(120);if(KEY == 0){//当按键为0时,判断当前灯的状态,并取反。实现轮训控制灯的开关。LED = ~LED;//当按键按下没有松开时则一直做空循环,直到松开,while(1)才开始新的一轮循环。增强了按键控制灯的稳定性。while(KEY == 0);	}}	}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/208018.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1992-2021年省市县经过矫正的夜间灯光数据(GNLD、VIIRS)

1992-2021年省市县经过矫正的夜间灯光数据&#xff08;GNLD、VIIRS&#xff09; 1、时间&#xff1a;1992-2021年3月&#xff0c;其中1992-2013年为年度数据&#xff0c;2013-2021年3月为月度数据 2、来源&#xff1a;DMSP、VIIRS 3、范围&#xff1a;分区域汇总&#xff1a…

最易上手的电子期刊制作工具,快来使用!

快节奏时代&#xff0c;纸质书籍逐渐淡出人们的视野&#xff0c;取而代之的就是电子刊物制作。而电子期刊开始寻求更多的互动和丰富的内容形式&#xff0c;给人以良好的阅读体验。 如何制作呢&#xff1f;便成为了当下必须要学会的新技能&#xff0c;接下来分享一个比PPT更简单…

面试题-8

1.vue路由是怎么传参的&#xff1f; params传参 this.$router.push({name:index}) this.$route.params.id 路由属性传参 this.$router.push({name:/index/${item.id}}) 配置路由{path:/index:id} query传参(可以解决页面刷新参数丢失的问题) this.$router.push({ name…

AIGC,ChatGPT AI绘画 Midjourney 注册流程详细步骤

AI 绘画,Midjourney完成高清图片绘制,轻松掌握AI工具。 前期准备: ① 一个能使用的谷歌账号 ② 可以访问外网 Midjourney注册 1.进入midjourney官网https://www.midjourney.com 点击左下角”Join the Beta”,就可以注册,第一次使用的小伙伴会弹出提示,只需要点击Acc…

调试接口速度,打印毫秒数,找出慢的地方,优化

方法的最开头写上 $start_time microtime(true); 然后代码行里 dump(All 1: time ’ . (microtime(true) - $start_time)); dump(All 1.2: time ’ . (microtime(true) - $start_time)); 类似这样的最终打印

实验7设计建模工具的使用(三)

二&#xff0c;实验内容与步骤 1. 百度搜索1-2张状态图&#xff0c;请重新绘制它们&#xff0c;并回答以下问题&#xff1a; 1&#xff09;有哪些状态&#xff1b; 2&#xff09;简要描述该图所表达的含义&#xff1b; 要求&#xff1a;所绘制的图不得与本文中其它习题一样…

sqli-labs(3)

11. 看到登录框直接or 11 在hackerabar中我们可以看到这里是post传递的数据&#xff0c;在get中用--来注释后面的内容 因为get中#是用来指导浏览器动作的&#xff0c;--代表注释是空格&#xff0c;所以这里用# 之后就和get的一样了 1 order by 2 # order by 3报错 联合注入 …

【C语法学习】26 - strcmp()函数

文章目录 1 函数原型2 参数3 返回值4 比较机制5 示例5.1 示例1 1 函数原型 strcmp()&#xff1a;比较str1指向的字符串和str2指向的字符串&#xff0c;函数原型如下&#xff1a; int strcmp(const char *str1, const char *str2);2 参数 strcmp()函数有两个参数str1和str2&a…

从Github登录的双因子验证到基于时间戳的一次性密码:2FA、OTP与TOTP

Github于2023-03-09推出一项提高软件安全标准的措施&#xff0c;所有在Github上贡献过代码的开发人员在年底前必须完成 2FA&#xff08;Two-factory authentication&#xff0c;双因子认证&#xff09;。初听此事之时&#xff0c;不以为意&#xff0c;因为自己之前就知道双因子…

Linux 是否被过誉了?

Linux 是否被过誉了&#xff1f; 有些人眼里&#xff0c;电脑这种东西就应该是华丽丽的桌面&#xff0c;手握鼠标戳戳按钮&#xff0c;键盘只为偶尔打打字&#xff0c;仿佛windows式的桌面形式才是理所应当&#xff0c;GUI才是理所应当&#xff0c;x86才是理所应当&#xff0c…

Os-hackNos-3

Os-hackNos-3 一、主机发现和端口扫描 主机发现&#xff0c;靶机地址192.168.80.145 arp-scan -l端口扫描&#xff0c;开放了22和80端口 nmap -P -sV 192.168.80.145二、信息收集 访问80端口 find the Bug You need extra WebSec翻译 找到Bug 你需要额外的网络安全路径扫描 d…

晶振有哪几种?晶振旁边的两个电容起什么作用?

晶振可以分为普通晶振、温补晶振、压控晶振、恒温晶振、差分晶振。 普通晶振通常用作微处理器的时钟器件&#xff0c;主要应用于那些稳定度要求不要的设备中&#xff0c;例如电视机、微波炉。 温补晶振&#xff0c;在晶振内部采取了对晶体频率、温度特性进行补偿&#xff0c;已…