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.pswp.cn/news/160241.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/160241.shtml
英文地址,請注明出處:http://en.pswp.cn/news/160241.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2023全球數字貿易創新大賽9-12

目錄 回答評委提問:先說痛點-再說怎樣解決 食品安全溯源是否全流程 星火? 鏈網

Sleuth

Sleuth 一 引言 隨著服務的越來越多&#xff0c;對調?鏈的分析會越來越復雜。它們之間的調?關系也許如下圖&#xff1a; 問題&#xff1a; 1&#xff1a;微服務之間的調?錯綜復雜&#xff0c;?戶發送的請求經歷那些服務&#xff0c;調?鏈不清楚&#xff0c;沒有? 個?…

【SpringCloud微服務全家桶學習筆記-Hystrix(服務降級,熔斷,接近實時的監控,服務限流等)】

服務雪崩 &#xff08;微服務面臨的問題&#xff09; 多個微服務之間調用的時候&#xff0c;假設微服務A調用微服務B和微服務C&#xff0c;微服務B和微服務C又調用其它的微服務&#xff0c;這就是所謂的“扇出”。如果扇出的鏈路上某個微服務的調用響應時間過長或者不可用&…

HarmonyOS開發(五):常用基礎組件

1、組件介紹 組件&#xff08;Component&#xff09;,是界面搭建及顯示的最小單元。 組件根據功能可以分為五大類&#xff1a;基礎組件、容器組件、媒體組件、繪制組件、畫布組件 2、基礎組件 基礎組件是視圖層的基本組成單元&#xff0c;它包含&#xff1a;Text、Image、T…

OpenCV C++ 張正友相機標定【相機標定原理、相機標定流程、圖像畸變矯正】

文章目錄 3.1 標定原理3.2 相機標定流程步驟1:采集棋盤格圖像,批處理(調整尺寸、重命名)步驟2:提取棋盤格內角點坐標步驟3:進一步提取亞像素角點信息在棋盤標定圖上繪制找到的內角點(非必須,僅為了顯示)步驟4:相機標定--計算出相機內參數矩陣和畸變系數步驟5:畸變圖像…

Spring (二)@Order, Ordered 失效

Spring &#xff08;二&#xff09;Order, Ordered 失效 先上例子 public class OrderAnnotationExample {Order(2)static class MyBeanFactoryPostProcessor1 implements BeanFactoryPostProcessor {Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFa…

如何加速JavaScript 代碼運行速度

如何加速JavaScript 代碼運行速度 前言減少DOM訪問避免不必要的變量延遲script加載異步和同步使用異步編程避免使用With關鍵詞 前言 本文主要通過五個方面來講解如何使Js代碼得到性能優化&#xff0c;從而實現加快Js代碼運行速度的作用。那么好&#xff0c;本文正式開始。 減…

感染了后綴為.[bkpsvr@firemail.cc].EKING勒索病毒如何應對?數據能夠恢復嗎?

導言&#xff1a; 在當前數字時代&#xff0c;勒索病毒成為網絡威脅的一大隱患。本文將深入介紹一種名為[bkpsvrfiremail.cc].EKING的勒索病毒&#xff0c;以及如何應對遭受其攻擊后&#xff0c;有效地恢復被加密的數據文件&#xff0c;并提供一些預防措施以減少感染的風險。數…

sqlserver==索引解析,執行計劃,索引大小

1創建測試表 -- 創建大型表 CREATE TABLE LargeTableWithIndex (ID int IDENTITY(1,1) PRIMARY KEY,IndexedColumn int,NonIndexedColumn nvarchar(255),OtherData nvarchar(255) );2插入測試數據 -- 使用 T-SQL 插入大量數據 DECLARE @i int = 1; WHILE @i <= 100000 -- …

Mac中LaTex無法編譯的問題

最近在使用TexStudio時&#xff0c;遇到一個棘手的問題&#xff1a; 無法編譯&#xff0c;提示如下&#xff1a; kpathsea: Running mktexfmt xelatex.fmt /Library/TeX/texbin/mktexfmt: kpsewhich -var-valueTEXMFROOT failed, aborting early. BEGIN failed–compilation a…

[Linux] Network: IPv6 link-local 地址是否可用不自動生成

原來有一段時間在做擴充產品的VLAN個數&#xff0c;然后就遇到過一個問題&#xff1a;說這個Linux的默認配置里&#xff0c;會為每一個網絡接口添加一個link-local的地址&#xff0c;就是FE80::開頭的地址&#xff0c;在RFC-4291里有如下的定義&#xff1a; Link-Local unicas…

redis運維(十二) 位圖

一 位圖 ① 概念 1、說明&#xff1a;位圖還是在操作字符串2、位圖玩字符串在內存中存儲的二進制3、ASCII字符通過映射轉化為二進制4、操作的是字符串value ② ASCII字符鋪墊 1、控制ASCII字符 2、ASCII可顯示字符 ③ SETBIT 細節&#xff1a; setbit 命令的返回值是之…

git常用命令(git github ssh)

目錄 1、語法說明2、本地倉庫相關操作建立一個git文件(git init)把工作區的文件添加到暫存區(git add)把暫存區的文件添加到本地倉庫(git commit)查看暫存區和本地倉庫中的文件(git ls-files)查看文件夾下所有文件的狀態(git status)查看版本庫中的提交記錄(git log)恢復的文件…

如何解決msvcp110.dll丟失問題,分享5個有效的解決方法

最近&#xff0c;我在使用電腦時遇到了一個令人頭疼的問題——msvcp110.dll丟失。這個錯誤通常會導致某些應用程序無法正常運行。為了解決這個問題&#xff0c;我們需要采取一些有效的方法來修復丟失的msvcp110.dll文件。那么&#xff0c;msvcp110.dll到底是什么呢&#xff1f;…

代碼隨想錄 10.14 || 二叉樹 LeetCode 669.修剪二叉搜索樹、108.將有序數組轉換為二叉搜索樹、538.將二叉搜索樹轉為累加樹

669.修剪二叉搜索樹 根據給定的最小邊界 left 和最大邊界 right 修剪二叉搜索樹&#xff0c;保留值在 left ~ right 的節點&#xff0c;刪除不滿足此條件的節點。修剪樹不應該改變保留在樹中的元素的相對結構&#xff0c;即父子關系。 設 cur 為當前訪問的二叉樹節點&#xff0…

LeetCode(32)串聯所有單詞的子串【滑動窗口】【困難】(含圖解)

目錄 1.題目2.答案3.提交結果截圖4.圖解 鏈接&#xff1a; 串聯所有單詞的子串 1.題目 給定一個字符串 s 和一個字符串數組 words。 words 中所有字符串 長度相同。 s 中的 串聯子串 是指一個包含 words 中所有字符串以任意順序排列連接起來的子串。 例如&#xff0c;如果 w…

Flutter的Event Loop

Flutter 的事件循環機制是其框架的核心部分&#xff0c;它負責管理事件的處理和UI的渲染。了解這個機制對于開發高效且響應迅速的Flutter應用非常重要。以下是Flutter事件循環的主要組成部分和工作原理&#xff1a; 1. 主事件循環&#xff08;Main Event Loop&#xff09; 當…

利用ros實現單片機通訊(轉載)

我覺得如果使用這個人的micro_ros通信協議&#xff0c;就不用再去Ubuntu或者Windows上面自己寫驅動程序了&#xff0c; 利用micro_ros實現esp32與ros2的通訊 Tianci ? 天津大學 工學博士 參考&#xff1a;https://github.com/micro-ROS/micro_ros_arduino https://blog.cs…