江協科技51單片機學習- p25 無源蜂鳴器

?🚀write in front🚀 ?
🔎大家好,我是黃桃罐頭,希望你看完之后,能對你有所幫助,不足請指正!共同學習交流
🎁歡迎各位→點贊👍 + 收藏?? + 留言📝??

💬本系列嗶哩嗶哩江科大51單片機的視頻為主以及自己的總結梳理📚?

前言:

本文是根據嗶哩嗶哩網站上“江協科技51單片機”視頻的學習筆記,在這里會記錄下江協科技51單片機開發板的配套視頻教程所作的實驗和學習筆記內容。本文大量引用了江協科技51單片機教學視頻和鏈接中的內容。

引用:

51單片機入門教程-2020版 程序全程純手打 從零開始入門_嗶哩嗶哩_bilibili

??????c51語言變量語句意思,C51中循環語句-CSDN博客

音樂簡譜樂理:

【51單片機實驗筆記】聲學篇(一) 蜂鳴器與揚聲器的基本控制_交流蜂鳴器需要給蜂鳴器一個脈沖才會響。我們用單片機的p1.5口實現一種這樣高低電-CSDN博客

正文:

0. 🌿概述

在淘寶上購買了江協科技51單片機開發板套件(普中科技STC51單片機A2型號),就上在上一篇博文里說的自己計劃學習下江協科技51單片機開發教程,通過STC51單片機這種MCU這種貼近于裸機的開發來增加對于系統硬件層面知識的了解和掌握。

術語和縮略語:

縮寫全稱說明
RTCReal Time Clock實時時鐘

1. 🚀蜂鳴器介紹

蜂鳴器分為有源蜂鳴器和無源蜂鳴器

🧃有源蜂鳴器:自帶震蕩電路,只要給蜂鳴器同上電,蜂鳴器就會按照固定的頻率發出鳴叫聲音。

🧃無源蜂鳴器:沒有震蕩電路,需要外部輸入震蕩信號才能發出輸入信號頻率的聲音,如果一直輸入信號則就在剛通電的時候線圈到達頂位置然后保持在頂部位置不能發出聲音。

主要區別就是有源蜂鳴器自帶震蕩電路只要輸入高電平或者低電平有源蜂鳴器就會按照固定的頻率鳴叫,而無源蜂鳴器需要外部輸入震蕩信號才會發出和輸入震蕩信號相同的頻率,如果無源蜂鳴器輸入直流信號無源蜂鳴器的線圈就一直卡在頂部位置不能發出聲音。

一般開發板上帶的都是有源蜂鳴器,有源蜂鳴器只能發出固定頻率的聲音。無源蜂鳴器的頻率和外部輸入信號的頻率相同,無源蜂鳴器才能作為演奏音樂的器件,因為無源蜂鳴器發出的聲音的頻率可以通過輸入信號的頻率調整。

蜂鳴器驅動電路:

單片機IO引腳輸出高電平或者輸入低電平時驅動能力有限,單片機IO引腳可以通過的電流有限,通過單片機IO引腳直接驅動蜂鳴器因為單片機IO引腳能夠通過電流比較小將無法驅動蜂鳴器發出聲音。所以需要將單片機的IO引腳輸出作為控制信號來控制驅動電路的開關來控制蜂鳴器的電路通斷,一般使用 三極管 作為驅動電路。

本實驗中因為開發板上又一個 ULN2003 驅動芯片的引腳沒有使用,所以本開發板使用了?LN2003的一個引腳作為了驅動蜂鳴器的驅動電路。

一般不會使用?ULN2003 驅動芯片單獨作為驅動蜂鳴器的驅動芯片,因為成本比較高,比使用三極管高,本開發板是使用了??ULN2003 驅動芯片 步進電機驅動芯片的一個剩余IO口,剛好利用起來作為蜂鳴器的驅動IO口。


UL2003 是達林頓兩級晶體管陣列電路,通過電流能力較強,單個引腳輸出可以達到 500mA電流,

🧃 當ULN2003 1B引腳輸入為1時,1C輸出為0,

🧃 當 ULN2003 1B引腳輸入為0時,1C輸出為高阻態

2. 樂譜樂理介紹

樂譜的樂理介紹,以鋼琴的按鍵區為例介紹鋼琴安檢區的不同按鍵的對應的音符頻率。

  • ?🧃大字組
  • 🧃小字組
  • 🧃小字1組
  • 🧃小字2組

從左往右是: 大字組、小字組、小字1組、小字2組

按照一組音調依次分成4組:大字組、小字組、小字1組、小字2組。組與組之間相差“8度”;相鄰的兩個鍵之間(包括白鍵與黑鍵)相差半音; 數字簡譜左上標“#”表示升高半音,“b”表示降低半音,升降號在本小節有效。 下圖8-6給出了“小字組、小字1組、小字2組”音符與頻率的對應關系。也就是說,每一個音符都對應了一個特定的頻率。

  • 🧃數字簡譜左上標“#”表示升高半音,“b”表示降低半音,升降號在本小節有效

而為了按照正常的節奏演奏出整首音樂,還需要調整每個音符所占用的時間。下圖8-7給出了不同的音符的時值比,可以看出在音符的右側和下面加橫線可以實現2的冪次的調整,而在右側加點則表示乘以1.5倍。 一般設置四分音符的持續時間為500ms。
于是根據下面兩張圖,整體思路如下:鋼琴五線譜→數字簡譜→蜂鳴器頻率。 通過不斷改變定時器的復位值,進而控制蜂鳴器的頻率變化。

其中,以中央A鍵a1為基準,其標準頻率為440Hz,根據十二平均律,各音階之間以等比數列分配頻率,每12個音階頻率擴大一倍。

簡譜的音符是相對音高,它與絕對音高存在映射關系,一共有12個大調音階:C大調、bD大調、D大調、 bE大調、E大調、F大調、bG大調、 G大調、bA大調、 A大調、bB大調、 B大調。

? ? ? ? ? ? ? ? ? ? ? ??

全音符,2分音符,4分音符,

常用變音記號

  • 降記號(b)表示將基本音級的音高降低半音,根據該記號所在的線或間而降音。
  • 還原記號(#)表示把已經升高或降低的音還原。
  • 升記號(#)表示將基本音級的音高升高半音,根據該記號所在的線或間而降音。

使用Excel計算處樂譜簡譜的不同音符對應的頻率:

以中央C作為基準頻率 440Hz,每往右12個音符升高1倍變為880Hz。

往右每個音符頻率 = 440 * 2^(1/12 *n)?

使用Excel表格計算出音符的頻率,周期時長(微秒),周期時長的一半,定時器裝載值。

C調

3. 單片機演奏音樂實驗

小星星簡譜

天空之城簡譜

實現音樂簡譜《小星星》演奏的代碼如下:

main.c?

#include <REGX52.H>
#include <INTRINS.H>
#include "Delay.h"
#include "Nixie.h"
#include "Key.h"
#include "Beep.h"
#include "Timer0.h"sbit Beeper = P2^5;unsigned char KeyNum = 0;
unsigned char FreqSelect = 0;unsigned int code FreqTabble[] = {63776, 63877, 63967, 64058, 64139, 64218, 64293, 64362, 64427, 64490, 64548, 64604,64656, 64705, 64751, 64795, 64836, 64875, 64913, 64948, 64981, 65012, 65041, 65069,65095, 65119, 65143, 65165, 65186, 65205, 65223, 65241, 65258, 65273, 65288, 65302,0
};//C調//低音組
#define L1		0
#define L1_		1
#define L2		2
#define L2_		3
#define L3		4
#define L4		5
#define L4_		6
#define L5		7
#define L5_		8
#define L6		9
#define L6_		10
#define L7		11中音組
#define M1		12
#define M1_		13
#define M2		14
#define M2_		15
#define M3		16
#define M4		17
#define M4_		18
#define M5		19
#define M5_		20
#define M6		21
#define M6_		22
#define M7		23//高音組
#define H1		24
#define H1_		25
#define H2		26
#define H2_		27
#define H3		28
#define H4		29
#define H4_		30
#define H5		31
#define H5_		32
#define H6		33
#define H6_		34
#define H7		35#define  PERID 125unsigned char code Music[] = {//第1小節,4拍M1, 4,M1, 4,M5, 4,M5, 4,//第2小節,4拍M6, 4,M6, 4,M5, 4+4,//M5,//第3小節,4拍M4, 4,M4, 4,M3, 4,M3, 4,//第4小節,4拍M2, 4,M2, 4,M1, 4+4,//M1,//第5小節,4拍M5, 4,M5, 4,M4, 4,M4, 4,//第6小節,4拍M3, 4,M3, 4,M2, 4+4,//M2,//第7小節,4拍M5, 4,M5, 4,M4, 4,M4, 4,//第8小節,4拍M3, 4,M3, 4,M2, 4+4,//第9小節,4拍M1, 4,M1, 4,M5, 4,M5, 4,//第10小節,4拍M6, 4,M6, 4,M5, 4+4,//第11小節,4拍M6, 4,M6, 4,M3, 4,M3, 4,M2, 4,M2, 4,M1, 4+4,//結束0
};void main()
{P0 = 0x0;Beeper = 0;Timer0_Init();while(1){if(Music[FreqSelect]){TR0 = 1;Delay(PERID*Music[FreqSelect+1]);FreqSelect++;TR0 = 0;Delay(2);FreqSelect++;}else if(Music[FreqSelect] == 0){while(1);}}
}/*** @brief  定時器0中斷處理函數模版* @param  無* @retval 無*/
void Timer_Routine(void) interrupt 1
{Beeper = !Beeper;//定時器溢出之后需要重新裝載TH0 = FreqTabble[Music[FreqSelect]] / 256;				//12MHz晶振,12分頻TL0 = FreqTabble[Music[FreqSelect]] % 256; 			//
}

Timer0.c

#include <REGX52.H>
#include "timer0.h"/*** @brief  定時器0初始化函數, 1ms 12MHz* @param  無* @retval 無*/
void Timer0_Init()
{//AUXR &= 0x7F;		//定時器時鐘12T模式TMOD &= 0xF0;		//設置定時器模式TMOD |= 0x01;		//設置定時器模式TL0 = 0x66;			//設置定時初值TH0 = 0xFC;			//設置定時初值TF0 = 0;			//清除TF0標志TR0 = 1;			//定時器0開始計時//中斷部分寄存器ET0 = 1;			//允許定時器T0中斷EA = 1;				//允許中斷PT0 = 0;			//定時器T0中斷優先級
}/*** @brief  定時器0中斷處理函數模版* @param  無* @retval 無*/
//void Timer_Routine(void) interrupt 1
//{
//	static unsigned int count = 0;
//	
//	count++;
//	//P2_0 = 0;
//	if(count >= 500)		//定時器T0每1ms中斷一次,進入1000次經過了1s
//	{
//		P2_0 = ~P2_0;
//		count = 0;
//	}
//	
//	//定時器溢出之后需要重新裝載
//	TH0 = (65535 - 1000) / 256;					//12MHz晶振,12分頻
//	TL0 = (65535 - 1000) % 256 + 1; 			//
//}

Delay.c

#include <INTRINS.H>
#include "delay.h"void Delay(unsigned int xms)		//@11.0592MHz
{unsigned char i, j;_nop_();if(xms == 0)return;while(xms--){i = 2;j = 199;do{while (--j);} while (--i);}
}

4. 音樂簡譜《小星星》通過蜂鳴器演奏

控制蜂鳴器按照音樂簡譜,通過在指定的節拍里讓無源蜂鳴器發出指定頻率的聲音發發出了《小星星》的音樂聲,控制蜂鳴器聲音頻率是通過C51單片機的定時器/計時器Timer0來控制的,通過在定時器中斷處理函數中控制定時器裝載值來控制定時器中斷進入的頻率,在定時中斷里翻蜂鳴器從而控制了蜂鳴器發出聲音的頻率。

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

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

相關文章

環信IM實現小米、oppo推送詳細步驟

本文教大家集成環信IM后如何實現小米、oppo推送。 一、小米推送 步驟一、在小米開放平臺創建應用。 在 小米開放平臺 創建應用&#xff0c;開啟推送服務。詳見小米官方網站的 推送服務接入指南。 步驟二、上傳推送證書。 注冊完成后&#xff0c;需要在環信即時通訊云控制臺…

WebSocket 雙向通信

WebSocket 是一種在前端開發中用于實現雙向通信的網絡技術。它與傳統的 HTTP 請求-響應模式不同&#xff0c;允許客戶端和服務器之間實時、雙向的數據傳輸。 1. 實時性 能夠實現數據的即時推送和接收&#xff0c;無需輪詢服務器&#xff0c;大大降低了延遲。 2. 雙向通信 客…

LeetCode-刷題記錄-前綴和合集(本篇blog會持續更新哦~)

一、前綴和&#xff08;Prefix Sum&#xff09;算法概述 前綴和算法通過預先計算數組的累加和&#xff0c;可以在常數時間內回答多個區間和相關的查詢問題&#xff0c;是解決子數組和問題中的重要工具。 它的基本思想是通過預先計算和存儲數組的前綴和&#xff0c;可以在 O(1)…

初步理解六__《面向互聯網大數據的威脅情報 并行挖掘技術研究 》

初步理解 六 STIX 提出了一種標準化的網絡威脅情報格式(Structured Threat Information eXpression, STIX) gtp STIX&#xff08;Structured Threat Information eXpression&#xff09;是一種用于標準化描述和共享網絡威脅情報的格式和語言。它的設計目標是提供一個通用的…

7.8作業

一、思維導圖 二、 1】按值修改 2】按值查找&#xff0c;返回當前節點的地址 &#xff08;先不考慮重復&#xff0c;如果有重復&#xff0c;返回第一個&#xff09; 3】反轉 4】銷毀鏈表 //按值修改 int value_change(linklistptr H,datatype e,int value) {if(HNULL||empty(H…

Greenplum(二)【SQL】

前言 Greenplum 的剩余部分主要其實主要就是 DDL 和之前學的 MySQL 不大一樣&#xff0c;畢竟 Greenplum 是基于 PostgreSQL 數據庫的&#xff0c;不過那些 DML 和 MySQL、Hive 基本上大差不差&#xff0c;所以就沒有必要浪費時間了。 1、DDL 1.1、庫操作 1.1.1、創建數據庫…

python爬蟲加入進度條

安裝tqdm和requests庫 pip install tqdm -i https://pypi.tuna.tsinghua.edu.cn/simplepip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple帶進度條下載 import time # 引入time模塊&#xff0c;用于處理時間相關的功能 from tqdm import * # 從tqdm包中…

算法力扣刷題 三十六【二叉樹迭代遍歷】

前言 記錄三十五 介紹了二叉樹基礎&#xff0c;和遞歸法模版及遍歷方式&#xff1b; 遞歸&#xff1a;代碼簡單&#xff0c;但要想清楚三步&#xff1a; 確定參數和返回值&#xff1b;確定終止條件&#xff0c;并return什么&#xff1f;&#xff1b;終止條件外的邏輯&#xf…

【AI大模型】賦能兒童安全:樓層與室內定位實踐與未來發展

文章目錄 引言第一章&#xff1a;AI與室內定位技術1.1 AI技術概述1.2 室內定位技術概述1.3 樓層定位的挑戰與解決方案 第二章&#xff1a;兒童定位與安全監控的需求2.1 兒童安全問題的現狀2.2 智能穿戴設備的興起 第三章&#xff1a;技術實現細節3.1 硬件設計與選擇傳感器選擇與…

SpringSecurity中文文檔(Servlet Authorization Architecture )

Authorization 在確定了用戶將如何進行身份驗證之后&#xff0c;還需要配置應用程序的授權規則。 Spring Security 中的高級授權功能是其受歡迎的最有說服力的原因之一。無論您選擇如何進行身份驗證(無論是使用 Spring Security 提供的機制和提供者&#xff0c;還是與容器或其…

兩張圖片合并(右上角添加水印,兼容矢量圖)保留原來的顏色

無縫合并兩張圖片&#xff08;封面右上角添加logo&#xff09;-- opencv &#xff1a; 進行添加logo(水印)由于使用了cv2.seamlessClone&#xff0c;cv2.seamlessClone使用了泊松克隆&#xff08;Poisson Cloning&#xff09;&#xff0c;會根據周圍的顏色信息進行顏色調整&…

tcp并發設計

4注意&#xff1a;原始代碼&#xff0c;如果先關閉服務器端&#xff0c;再次開啟服務器的時候會報"connect: Connection refused "錯誤&#xff0c;這是因為先關服務器端&#xff0c;導致系統認為客戶端仍然在與服務器端連接造成。 可以使用setsockopt setsockopt函…

three-tile 一個開源的輕量級三維瓦片庫

three-tile 介紹 three-tile 是一個開源的輕量級三維瓦片庫&#xff0c;它基于threejs使用typescript開發&#xff0c;提供一個三維地形模型&#xff0c;能輕松給你的應用增加三維瓦片地圖。 源碼&#xff1a;https://github.com/sxguojf/three-tile 示例&#xff1a;https:/…

【TB作品】51單片機 Proteus仿真 00013紅外proteus仿真循跡避障小車

實驗報告&#xff1a;智能小車系統設計與實現 一、背景介紹 本實驗旨在設計并實現一個基于STC89C52單片機控制的智能小車系統。該系統通過超聲波傳感器進行避障&#xff0c;通過紅外接收器實現遠程控制&#xff0c;同時具備循跡功能。整個系統的核心是單片機&#xff0c;它通…

YOLOv10改進 | 損失函數篇 | InnerIoU、InnerSIoU、InnerWIoU、FocusIoU等損失函數

一、本文介紹 本文給大家帶來的是YOLOv10最新改進&#xff0c;為大家帶來最近新提出的InnerIoU的內容同時用Inner的思想結合SIoU、WIoU、GIoU、DIoU、EIOU、CIoU等損失函數&#xff0c;形成 InnerIoU、InnerSIoU、InnerWIoU、等新版本損失函數&#xff0c;同時還結合了Focus和…

LeetCode42(接雨水)[三種解法:理解動態規劃,雙指針,單調棧]

接雨水 給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖&#xff0c;計算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 這是一道困難題,難度確實有點層次.我們先來樸素思想走一波. 要求能接多少雨水,我們可以具化到每個硅谷,每個硅谷能存多少雨水,那么答案就是每個…

PDA:Prompt-based Distribution Alignment for Unsupervised Domain Adaptation

文章匯總 式中&#xff0c; y s y^s ys表示源域數據的one-hot ground-truth&#xff0c; K K K為類數&#xff0c; w i w_i wi?和 z ~ s \tilde{z}_s z~s?分別表示源域經過提示調優的最終文本表示和最終圖像表示的第 i i i類。 同理&#xff0c;為了進一步利用目標領域的數據…

防火墻詳解(USG6000V)

0、防火墻組網模式 防火墻能夠工作在三種模式下分別是路由模式、透明模式、旁路檢測模式、混合模式 0.1、路由模式 路由模式&#xff1a;防火墻全部以第三層對外連接&#xff0c;即接口具有IP 地址。一般都用在防火墻是邊界的場景下 防火墻需要的部署/配置&#xff1a; 接…

【入門篇】STM32尋址范圍(更新中)

寫在前面 STM32的尋址范圍涉及存儲器映射和32位地址線的使用。并且STM32的內存地址訪問是按字節編址的,即每個存儲單元是1字節(8位)。 一、尋址大小與范圍 地址線根數 地址編號(二進制) 地址編號數(即內存大小) <

實現基于Elasticsearch的搜索服務

實現基于Elasticsearch的搜索服務 大家好&#xff0c;我是微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 1. Elasticsearch簡介 Elasticsearch是一個開源的分布式搜索引擎&#xff0c;提供強大的全文搜索和分析功能。本文…