江协科技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.mzph.cn/web/42162.shtml

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

相关文章

环信IM实现小米、oppo推送详细步骤

本文教大家集成环信IM后如何实现小米、oppo推送。 一、小米推送 步骤一、在小米开放平台创建应用。 在 小米开放平台 创建应用&#xff0c;开启推送服务。详见小米官方网站的 推送服务接入指南。 步骤二、上传推送证书。 注册完成后&#xff0c;需要在环信即时通讯云控制台…

LeetCode-刷题记录-前缀和合集(本篇blog会持续更新哦~)

一、前缀和&#xff08;Prefix Sum&#xff09;算法概述 前缀和算法通过预先计算数组的累加和&#xff0c;可以在常数时间内回答多个区间和相关的查询问题&#xff0c;是解决子数组和问题中的重要工具。 它的基本思想是通过预先计算和存储数组的前缀和&#xff0c;可以在 O(1)…

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包中…

【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;会根据周围的颜色信息进行颜色调整&…

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; 接…

10、DDD分层架构

微服务架构模型有很多种&#xff0c;例如洋葱架构、CQRS和六边形架构等。虽然这些架构模式提出的时代和背景不同&#xff0c;但其核心理念都是为了设计出“高内聚&#xff0c;低耦合”的微服务&#xff0c;轻松实现微服务的架构演进。DDD分层架构的出现&#xff0c;使微服务的架…

【uniapp-ios】App端与webview端相互通信的方法以及注意事项

前言 在开发中&#xff0c;使用uniapp开发的项目开发效率是极高的&#xff0c;使用一套代码就能够同时在多端上线&#xff0c;像笔者之前写过的使用Flutter端和webview端之间的相互通信方法和问题&#xff0c;这种方式本质上实际上是h5和h5之间的通信&#xff0c;网上有非常多…

物联网实训室建设可行性报告

一、建设物联网实训室的目的和意义 随着信息技术的快速发展&#xff0c;物联网&#xff08;IoT&#xff09;已成为推动社会进步和经济发展的关键技术之一。物联网技术的集成应用&#xff0c;不仅能够提高生产效率&#xff0c;还能促进智慧城市、智能家居、智能农业等多个领域的…

python04——类(基础new)

类其实也是一种封装的思想&#xff0c;类就是把变量、方法等封装在一起&#xff0c;然后可以通过不同的实例化对其进行调用操作。 1.类的定义 class 类名&#xff1a; 变量a def __init__ (self,参数2&#xff0c;参数2...)&#xff1a;初始化函数&#xff01;&#xff01;&…

简单实现联系表单Contact Form自动发送邮件

如何实现简单Contact Form自动邮件功能&#xff1f;怎样简单设置&#xff1f; 联系表单不仅是访客与网站所有者沟通的桥梁&#xff0c;还可以收集潜在客户的信息&#xff0c;从而推动业务的发展。AokSend将介绍如何简单实现一个联系表单&#xff0c;自动发送邮件的过程&#x…

【游戏客户端】大话slg玩法架构(一)滚动基类

【游戏客户端】大话slg玩法架构&#xff08;一&#xff09;滚动基类 大家好&#xff0c;我是Lampard家杰~~ 今天我们兑现诺言&#xff0c;给大家分享SLG玩法的实现j架构&#xff0c;关于SLG玩法的介绍可以参考这篇上一篇文章&#xff1a;【游戏客户端】制作率土之滨Like玩法 PS…