江协科技51单片机学习- p25 无源蜂鸣器

news2024/9/28 15:21:21

 🚀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 125


unsigned 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.coloradmin.cn/o/1909218.html

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

相关文章

SpringAOP的坑

AOP中几种常见的通知类型及其基本作用&#xff1a; Before&#xff1a;前置通知&#xff0c;在目标方法执行之前执行。After&#xff1a;后置通知&#xff0c;无论方法执行结果如何&#xff08;包括异常&#xff09;&#xff0c;都会在目标方法执行之后执行。AfterReturning&a…

暑期旅游怎么玩?开发旅游小程序让出行变简单

暑假正值旅游旺季&#xff0c;旅游小程序的出现为旅行带来了许多便利。随着移动互联网的发展&#xff0c;旅游行业也在不断寻求创新与变革。旅游小程序为游客提供了更加便捷的旅行体验&#xff0c;通过旅游小程序&#xff0c;用户可以了解旅游信息、旅游服务、在线咨询等&#…

谷粒商城学习笔记-19-快速开发-逆向生成所有微服务基本CRUD代码

文章目录 一&#xff0c;使用逆向工程步骤梳理1&#xff0c;修改逆向工程的application.yml配置2&#xff0c;修改逆向工程的generator.properties配置3&#xff0c;以Debug模式启动逆向工程4&#xff0c;使用逆向工程生成代码5&#xff0c;整合生成的代码到对应的模块中 二&am…

前端面试题25(css常用的预处理器)

在前端开发领域&#xff0c;CSS预处理器在面试中经常被提及&#xff0c;其中最流行的三种预处理器是Sass、LESS和Stylus。下面分别介绍它们的特点和优势&#xff1a; 1. Sass&#xff08;Syntactically Awesome Style Sheets&#xff09; 优势&#xff1a; 变量&#xff1a;允…

[工具类]Java 合并、拆分PPT幻灯片

本文将介绍在Java程序中如何来合并及拆分PPT文档的方法。示例大纲&#xff1a; 1. 合并 1.1 将指定幻灯片合并到文档 1.2 合并多个幻灯片文档为一个文档 2. 拆分 2.1 按幻灯片每一页单独拆分为一个文档 2.2 按指定幻灯片页数范围来拆分为多个文档 使用工具&#xff1a;F…

vite+vue3拍照上传到nodejs服务器

一:效果展示: 拍照效果 二:Nodejs后端接口代码: 三:前端完整代码:

风险评估:Tomcat的安全配置,Tomcat安全基线检查加固

「作者简介」&#xff1a;冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础著作 《网络安全自学教程》&#xff0c;适合基础薄弱的同学系统化的学习网络安全&#xff0c;用最短的时间掌握最核心的技术。 这一章节我们需…

VUE+ELEMENTUI表格的表尾合计

<el-table :data"XXXX" :summary-method"getSummaries" show-summary "true" > getSummaries(param) { const { columns, data } param; const sums []; columns.forEach((column, index) > { if (index 0) { sums[index] 合计; }…

高考后的IT专业启航:暑期预习指南与学习路线图

文章目录 每日一句正能量前言&#xff1a;启航IT世界&#xff0c;高考后的暑期学习之旅基础课程预习指南基础课程预习指南&#xff1a;构建你的IT知识大厦引言一、计算机科学导论二、编程语言入门三、操作系统基础四、数据结构与算法五、网络基础六、数据库原理结语 技术学习路…

ollama教程——如何在Ollama中导入和管理GGUF与Safetensors模型

ollama教程——如何在Ollama中导入和管理GGUF与Safetensors模型 引言Ollama模型导入概述Ollama支持的模型格式Ollama的版本要求和安装安装OllamaGGUF模型导入什么是GGUF模型通过Modelfile导入GGUF模型代码示例常见问题和解决方案1. 模型文件路径错误2. 模型文件格式不正确3. Ol…

【JS逆向补环境】最新mtgsig参数分析与算法还原

文章目录 1. 写在前面2. 接口分析3. 加密调试分析4. 补环境还原算法 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长…

集控中心操作台材质选择如何选择

作为集控中心的核心组成部分&#xff0c;操作台不仅承载着各种设备和工具&#xff0c;更是工作人员进行监控、操作和管理的重要平台。因此&#xff0c;选择适合的集控中心操作台材质显得尤为重要。 一、材质选择的考量因素 在选择集控中心操作台材质时&#xff0c;我们需要综合…

竞赛选题 图像识别-人脸识别与疲劳检测 - python opencv

文章目录 0 前言1 课题背景2 Dlib人脸识别2.1 简介2.2 Dlib优点2.3 相关代码2.4 人脸数据库2.5 人脸录入加识别效果 3 疲劳检测算法3.1 眼睛检测算法3.3 点头检测算法 4 PyQt54.1 简介4.2相关界面代码 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是…

JVM - 辅助小工具

文章目录 前言JVM - 辅助小工具1. 实现2. 效果3. demo 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话&#xff0c;那欢迎…

迭代器模式(大话设计模式)C/C++版本

迭代器模式 C #include <iostream> #include <string> #include <vector>using namespace std;// 迭代抽象类,用于定义得到开始对象、得到下一个对象、判断是否到结尾、当前对象等抽象方法&#xff0c;统一接口 class Iterator { public:Iterator(){};virtu…

全网最适合入门的面向对象编程教程:11 类和对象的Python实现-子类调用父类方法-模拟串口传感器和主机

全网最适合入门的面向对象编程教程&#xff1a;11 类和对象的 Python 实现-子类调用父类方法-模拟串口传感器和主机 摘要&#xff1a; 本节课&#xff0c;我们主要讲解了在 Python 类的继承中子类如何进行初始化、调用父类的属性和方法&#xff0c;同时讲解了模拟串口传感器和…

Go语言---文本文件处理

字符串操作 Contains func Contains(s,substr string) bool功能&#xff1a;字符串s中是否包含 substr&#xff0c;返回bool值 Join func Join(a []string,sep string) string功能&#xff1a;字符串链接&#xff0c;把slice a通过sep链接起来 Index func Index(a ,sep s…

Pytest单元测试系列[v1.0.0][Pytest基础]

Pytest安装与配置 和Unittest一样&#xff0c;Pytest是另一个Python语言的单元测试框架&#xff0c;与Unittest相比它的测试用例更加容易编写、运行方式更加灵活、报错信息更加清晰、断言写法更简洁并且它可以运行有unittest和nose编写的测试用例。 Pytest 安装 启动命令行&…

VMware安装部署Android手机操作系统

VMware安装部署Android手机操作系统 原创 wangyangsheng 计算机科学与技术研究员 2024年07月09日 08:30 广东 本文主要描述在VMware中安装部署Android-x86版本手机操作系统。 www.android-x86.org 如上所示&#xff0c;从开源网站下载Android-x86最新版本操作系统安装文件 …

小阿轩yx-Haproxy搭建Web群集

小阿轩yx-Haproxy搭建Web群集 Haproxy 简介 提供高可用性 能做出标准的负载均衡 支持虚拟主机 具备健康检查能力 能用于各式各样的代理 轻量级代理环境 解决方案优势 免费 快速 可靠 特性 特别适用于那些负载特大的web站点&#xff0c;这些站点通常又需要会话保持或…