10天學會嵌入式技術之51單片機-day-3

第九章? 獨立按鍵

按鍵的作用相當于一個開關,按下時接通(或斷開),松開后斷開(或接通)。實物圖、原理圖、封裝

9.2 需求描述

通過 SW1、SW2、SW3、SW4 四個獨立按鍵分別控制 LED1、LED2、LED3、LED4
的亮滅,具體要求是,按一下(按下并松開)SW,LED 點亮,再按一下 SW,LED 熄滅。

9.3 硬件設計


9.3.1 實現思路

為實現上述需求,需要設法令單片機感知到按鍵被按下,也就是說在按鍵被按下時,
需要向單片機發送一個信號,當單片機收到該信號后,再執行控制 LED 的邏輯即可。
由于 51 單片機的 GPIO 引腳的默認均為高電平,因此只需將按鍵的一側接入單片機的
某個 GPIO 引腳,另一側接地。這樣一來,當按鍵按下時,引腳直接接地,就相當于向單
片機發送了一個低電平信號。

9.3.2 硬件原理圖

9.4 軟件設計

9.4.1 初步實現

按照原理圖,SW1 按下時,P4.2 引腳會被拉低;SW2 按下時,P4.3 引腳會被拉低;
SW3 被按下時,P3.2 引腳會被拉低;SW4 按下時,P3.3 引腳會被拉低。
因此只需檢測上述引腳是否變為低電平即可,若檢測到變為低電平,就執行控制 LED
的邏輯。需要注意的是,按鍵的檢測需要持續進行,所以需要不停的檢查上述引腳是否變
為低電平。

9.4.2 按鍵單次觸發

當前代碼的邏輯是,只要按鍵處在按下的狀態,就觸發控制 LED 的邏輯。為實現單次
觸發,可以在按鍵按下后,等待按鍵抬起,并在抬起的一刻,執行控制 LED 的邏輯。

9.4.3 按鍵消抖

由于按鍵的抖動,單片機引腳的信號切換并不像我們想象的那樣干脆,實際情況如下
圖所示

9.4.4 規范代碼

按照前文的編碼規范,我們將檢測按鍵的代碼單獨抽取到 Int 層,具體代碼如下。

(1)Int_Key.h
?

#ifndef __INT_KEY_H__
#define __INT_KEY_H__
#include <STC89C5xRC.H>
#include "Util.h"
/**
* @brief 檢測 SW1 按鍵是否按下
*
* @return bit 是或否
*/
bit Int_Key_IsSW1Pressed();
/**
* @brief 檢測 SW2 按鍵是否按下
*
* @return bit 是或否
*/
bit Int_Key_IsSW2Pressed();
/**
* @brief 檢測 SW3 按鍵是否按下
*
* @return bit 是或否
*/
bit Int_Key_IsSW3Pressed();
/**
* @brief 檢測 SW4 按鍵是否按下
*
* @return bit 是或否
*/
bit Int_Key_IsSW4Pressed();
#endif /* __INT_KEY_H__ */

(2)Int_Key.c

#include "Int_Key.h"
#include <STC89C5xRC.H>
#include "Com_Util.h"
#define SW1 P42
#define SW2 P43
#define SW3 P32
#define SW4 P33bit Int_Key_IsSW1Pressed()
{if (SW1 == 0) {Com_Util_Delay1ms(10);if (SW1 == 0) {while (SW1 == 0);return 1;}}return 0;
}bit Int_Key_IsSW2Pressed()
{if (SW2 == 0) {Com_Util_Delay1ms(10);if (SW2 == 0) {while (SW2 == 0);return 1;}}return 0;
}bit Int_Key_IsSW3Pressed()
{if (SW3 == 0) {Com_Util_Delay1ms(10);if (SW3 == 0) {while (SW3 == 0);return 1;}}return 0;
}bit Int_Key_IsSW4Pressed()
{if (SW4 == 0) {Com_Util_Delay1ms(10);if (SW4 == 0) {while (SW4 == 0);return 1;}}return 0;
}

(3)Main.c

#include <STC89C5xRC.H>
#include "Int_Key.h"
#define LED1 P00
#define LED2 P01
#define LED3 P02
#define LED4 P03
void main()
{while (1) {if (Int_Key_IsSW1Pressed()) {LED1 = ~LED1;}if (Int_Key_IsSW2Pressed()) {LED2 = ~LED2;}if (Int_Key_IsSW3Pressed()) {LED3 = ~LED3;}if (Int_Key_IsSW4Pressed()) {LED4 = ~LED4;}}
}

?第 10 章 矩陣按鍵

按下按鍵矩陣中的 SW5 到 SW20 按鍵后,數碼管顯示對應的按鍵編號。

10.2 硬件設計

10.2.1 實現思路

由于按鍵矩陣中共有 4x4=16 個按鍵,如果每個按鍵都接入一個 GPIO 引腳,勢必會造
成引腳的浪費,為了節省引腳,我們同樣可以借用動態掃描的思想,具體邏輯如下。

10.2.2 51 單片機引腳內部結構

在上面的演示中,我們應注意的一個問題是:當高電平引腳和低電平引腳短接時,結
果是高電平引腳被拉低,而不是低電平引腳被拉高。這實際上是由 51 單片機引腳的內部結
構決定的,其簡化結構如下圖所示。

上圖的工作原理是:當端口鎖存器為 0 時,mos 管導通,此時引腳直接接地,輸出低
電平;當端口鎖存器為 1 時,mos 管關閉,引腳靠內部的弱上拉電阻(弱的意思是電流很
微弱,可進一步理解為上拉電阻的阻值很大)拉置高電平。
根據上圖,可以得出結論,當引腳輸出高電平時,很容易被被外部裝置拉低(因為上
拉電阻分壓多),而當引腳輸出低電平時,卻很難被拉高(因為引腳接地)。這就是常說的
弱上拉+強下拉模式。
所以在本節矩陣按鍵的例子中,當我們按下按鍵短接高低引腳,最終結果是高電平引
腳被拉低。

10.2.3 硬件原理圖

10.3 軟件設計

(1)Int_DigitalTube.h 和 Int_DigitalTube.c

數碼管項目中的 Int_DigitalTube.h 和 Int_DigitalTube.c 復制到當前項目的 Int 目錄。

(2)Int_MatrixKey.h

在項目的 Int 目錄下創建 Int_MatrixKey.h,寫入以下內容。

#ifndef __INT_KEYMATRIX_H__
#define __INT_KEYMATRIX_H__
#include"Com_Util.h"u8 Int_KetMatrix_CheckSW();#endif /* __INT_KEYMATRIX_H__ */

(3)Int_MatrixKey.c

在項目的 Int?目錄下創建 Int_MatrixKey.c,寫入以下內容。

#include "Int_KeyMatrix.h"
#include<STC89C5xRC.H>u8 Int_KetMatrix_CheckSW()
{u8 i,j;u8 lines[4]={0xFE,0xFD,0xFB,0xF7};u8 columns[4]={0x10,0x20,0x40,0x80};for (i = 0; i < 4; i++){  P2=lines[i];for ( j = 0; j< 4; j++){if((P2 & columns[j])==0){Com_Util_Delay1ms(10);if((P2 & columns[j])==0){while((P2 & columns[j])==0);return j+5+i*4;}}}}return 0;
}  

(4)main.c

#include"Int_KeyMatrix.h"
#include"Int_DigitalTube.h"void main()
{u8 key;Int_DigitalTube_Init();while(1){key=Int_KetMatrix_CheckSW();  //檢測按鍵if(key){Int_DigitalTube_DisplayNum(key);  }Int_DigitalTube_Refresh();}
}

?第 11 章 蜂鳴器

11.1 蜂鳴器簡介

蜂鳴器是一種能夠發出聲音的電子元器件,常用于報警、提示和音頻信號輸出等場景。
其內部結構如下圖所示。
當電流通過線圈時會產生電磁場,電磁場與永磁體相互作用,從而使金屬膜產生震動
而發聲。為使金屬膜持續震動,蜂鳴器需要使用震蕩電路進行驅動。有些蜂鳴器元件內部
自帶震蕩驅動電路,這種蜂鳴器叫做有源蜂鳴器(Active Buzzer,自激式蜂鳴器);而有些
則不帶震蕩驅動電路,這種蜂鳴器叫做無源蜂鳴器(Passive Buzzer,它激式蜂鳴器)。
更多信息可參考如下內容。

(1)有源蜂鳴器

(2)無源蜂鳴器

11.2 需求描述

為按鍵矩陣增加按鍵提示音,要求按鍵按下后,蜂鳴器響 0.1s。

11.3 硬件設計

11.3.1 硬件原理圖

本課程使用的是無源蜂鳴器,所以需要從外部輸入一定頻率的方波,方波的頻率就是
蜂鳴器發聲的頻率,這里我們使用 500Hz 的方波即可。

11.4 軟件設計

(1)Int_DigitalTube.h 和 Int_DigitalTube.c

將數碼管項目中的 Int_DigitalTube.h 和 Int_DigitalTube.c 復制到當前項目的 Int 目錄。

(2)Int_MatrixKey.h 和 Int_MatrixKey.c

將按鍵矩陣項目中的 Int_MatrixKey.h 和 Int_MatrixKey.c 復制到當前項目的 Int 目錄。

(3)Int_Buzzer.h

在 Int 目錄下創建 Int_Buzzer.h,寫入以下內容。

#ifndef __INT_BUZZER_H__
#define __INT_BUZZER_H__
#include <STC89C5xRC.H>
#define BUZZ P46
/**
* @brief 蜂鳴器響 0.1s
*
*/
void Int_Buzzer_Buzz();
#endif /* __INT_BUZZER_H__ */

(4)Int_Buzzer.c

在 Int 目錄下創建 Int_Buzzer.c,寫入以下內容。

#include "Int_Buzzer.h"
#include "Util.h"
void Int_Buzzer_Buzz()
{unsigned char counter = 100;while (counter) {BUZZ = ~BUZZ;Delay1ms(1);--counter;}
}

(5)Main.c

#include "Int_DigitalTube.h"
#include "Int_MatrixKey.h"
#include "Int_Buzzer.h"
int main()
{u8 key_pressed = 0;Int_DigitalTube_Init();Int_DigitalTube_DisplayNum(key_pressed);while (1) {key_pressed = Int_MatrixKey_CheckKey();if (key_pressed) {Int_DigitalTube_DisplayNum(key_pressed);Int_Buzzer_Buzz(); //按鍵提示音}Int_DigitalTube_Refresh();}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/77180.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/77180.shtml
英文地址,請注明出處:http://en.pswp.cn/web/77180.shtml

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

相關文章

vite+vue2+elementui構建之 package.json

webpack版本太低&#xff0c;構建依賴太多&#xff0c;頭大。 各種查閱資料&#xff0c;弄了一份直通構建vite構建elementUi核心文件&#xff0c; 構建基于開源若依vue2vue3版本改造&#xff0c;感謝開源&#xff0c;感謝若依。 vitevue2elementui構建之 vite.config.js-CSD…

提升變電站運維效率:安科瑞無線測溫系統創新應用

一、引言 變電站作為電力系統的關鍵樞紐&#xff0c;承擔著變換電壓、分配電能以及控制電力流向等重要任務。在變電站的運行過程中&#xff0c;電氣設備的接點溫度監測至關重要。過熱問題可能由多種因素引發&#xff0c;如電阻過大、接頭質量欠佳、銜接不緊密、物理老化等&…

DMA的三種傳輸功能

①內存到內存 #include "dma.h" #include "stdio.h"#define BUF_SIZE 16uint32_t src_buf[BUF_SIZE] {0x00000000,0x11111111,0x22222222,0x33333333,0x44444444,0x55555555,0x66666666,0x77777777,0x88888888,0x99999999,0xAAAAAAAA,0xBBBBBBBB,0xCCCCCCC…

【MySQL】MySQL 表的增刪改查(CRUD)—— 下篇(內含聚合查詢、group by和having子句、聯合查詢、插入查詢結果)

目錄 1. 插入查詢結果 2 聚合查詢 &#xff08;行與行之間運算&#xff09; count 計算查詢結果的行數 sum 求和 avg 求平均值 max 最大值 min 最小值 【小結】 3. group by 子句 分組 where 條件 having 條件 4. 聯合查詢&#xff08;多表查詢&#xff09; 內連接…

“思考更長時間”而非“模型更大”是提升模型在復雜軟件工程任務中表現的有效途徑 | 學術研究系列

作者&#xff1a;明巍/臨城/水德 還在為部署動輒數百 GB 顯存的龐大模型而煩惱嗎&#xff1f;還在擔心私有代碼庫的安全和成本問題嗎&#xff1f;通義靈碼團隊最新研究《Thinking Longer, Not Larger: Enhancing Software Engineering Agents via Scaling Test-Time Compute》…

電腦屏幕錄制軟件Captura源碼編譯(Win10,VS2022)

屏幕錄像的意義&#xff1a; 教育教學方面 制作教學資源&#xff1a;教師可以通過錄制屏幕來制作教學視頻&#xff0c;演示軟件操作、講解復雜的知識點等。學生可以隨時觀看這些視頻&#xff0c;便于復習和鞏固知識&#xff0c;尤其對于一些抽象的概念或難以在課堂上一次性掌握…

記一次調用大華抓拍SDK并發優化

目錄 一、問題分析 二、解決思路 三、貼代碼 四、總結 一、問題分析 按慣例上問題&#xff1a; 設備告警采用高電平持續模式&#xff1a;一次開&#xff0c;不主動關就一直處于告警狀態。 并發時多個請求下發 setDVRAlarmOutConfig&#xff0c;導致狀態混亂。 “開 -&g…

Python圖像變清晰與銳化,調整對比度,高斯濾波除躁,卷積銳化,中值濾波鈍化,神經網絡變清晰

本次使用圖片來源于百度 import cv2 import time import numpy as np import pywtfrom PIL import Image, ImageEnhance#-i https://pypi.mirrors.ustc.edu.cn/simpledef super_resolution(input_path, output_path, model_path, scale4):# 初始化超分辨率模型sr cv2.dnn_su…

12個HPC教程匯總!從入門到實戰,覆蓋分子模擬/材料計算/生物信息分析等多個領域

在科學研究、工程仿真、人工智能和大數據分析等領域&#xff0c;高性能計算 (High Performance Computing, HPC) 正扮演著越來越重要的角色。它通過并行處理、大規模計算資源的整合&#xff0c;極大提升了計算效率&#xff0c;使原本耗時數日的任務能夠在數小時內完成。 隨著計…

使用Autocannon.js進行HTTP壓測

目錄 一、為什么選擇Autocannon&#xff1f; 二、五分鐘快速上手 1. 環境準備 2. 發起首個壓測 3. 解讀測試報告 三、高階場景實戰 場景1&#xff1a;POST請求壓測 場景2&#xff1a;階梯式壓力測試 場景3&#xff1a;編程式集成測試 四、結果深度分析指南 1. 延遲分…

pnpm install報錯:此系統上禁止運行腳本

依賴安裝 報錯信息&#xff1a; pnpm : 無法加載文件 C:\Users\XXX\AppData\Roaming\npm\pnpm.ps1&#xff0c;因為在此系統上禁止運行腳本。有關詳細信息&#xff0c;請參閱 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_Execution_Policies。 所在位置 行:1 …

第9章 多模態大語言模型

??????第1章 對大型語言模型的介紹第2章 分詞和嵌入第3章 解析大型語言模型的內部機制第4章 文本分類第5章 文本聚類與主題建模第6章 提示工程第7章 高級文本生成技術與工具第8章 語義搜索與檢索增強生成第10章 構建文本嵌入模型第11章 面向分類任務的表示模型微調第12章…

Python 繪圖代碼解析:用 Turtle 和 Colorsys 打造絢麗圖案

注:本文為作者原創文章,未經許可禁止轉載。 Python 繪圖代碼解析:用 Turtle 和 Colorsys 打造絢麗圖案 在 Python 的世界里,有許多有趣的庫可以用來創造精美的圖形。今天,我們就來詳細剖析一段使用turtle庫和colorsys庫的代碼,看看它是如何繪制出獨特圖案的。 一、庫的導…

RTMP 入門指南

1. RTMP 基礎概念?? ??核心角色??&#xff1a; ??推流端&#xff08;Publisher&#xff09;??&#xff1a;將音視頻數據推送到服務器的設備&#xff08;如OBS、手機APP&#xff09;。??服務器&#xff08;RTMP Server&#xff09;??&#xff1a;接收推流并分發給…

Java Stream流 常用方法

Map 修改 用于修改集合里的值 public void findData(){ArrayList<String> list new ArrayList<>();list.add("張三");list.add("李四");List<String> collect list.stream().map(s -> s "a").collect(Collectors.toLi…

巧記英語四級單詞 Unit5-上【曉艷老師版】

count 數&#xff0c; counter n.計算器&#xff0c;柜臺 a.相反的 數數的東西就是計算器&#xff0c;在哪數&#xff0c;在柜臺里面數&#xff1b;你和售貨員的關系就是相反的(一個買貨&#xff0c;一個賣貨account n.賬戶&#xff0c;賬號 一再的數accountant n.會計 一再的…

Git多人協作與企業級開發模型

目錄 1.多人協作一 2.多人協作二 3.遠程分?刪除后&#xff0c;本地gitbranch-a依然能看到的解決辦法 4.企業級開發模型 4.1.Git的重要性 4.2.系統開發環境 4.3.Git 分?設計規范 1.多人協作一 ?前&#xff0c;我們所完成的?作如下&#xff1a; 基本完成Git的所有本…

大眾點評 mtgsig1.2 分析 mtgsig

聲明 本文章中所有內容僅供學習交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包內容、敏感網址、數據接口等均已做脫敏處理&#xff0c;嚴禁用于商業用途和非法用途&#xff0c;否則由此產生的一切后果均與作者無關&#xff01; 逆向過程 部分代碼 params[yodaRead…

(三) Trae 調試C++ 基本概念

調試C基本概念 一、調試基礎概念1.1 調試信息格式1.2 DWARF格式和PDB格式生成(圖解)1.3.典型工具鏈和調試信息 二、各工具鏈深度解析1. Clang 與 G 的 DWARF 差異 三 調試工具3.1 調試工具3.2 調試插件(Trae) 一、調試基礎概念 1.1 調試信息格式 格式類型適用系統存在形式DWA…

Flink部署與應用——部署方式介紹

引入 我們通過Flink相關論文的介紹&#xff0c;對于Flink已經有了初步理解&#xff0c;這里簡單的梳理一下Flink常見的部署方式。 Flink 的部署方式 StandAlone模式 介紹 StandAlone模式是Flink框架自帶的分布式部署模式&#xff0c;不依賴其他的資源調度框架&#xff0c…