(十)51单片机——利用蜂鸣器播放《孤勇者》(附成果展示)

2023-11-02

目录

硬件部分

蜂鸣器介绍

驱动电路 

ULN2003

乐理部分

音符

音符与频率对照

代码部分

运行结果


        随着最近孤勇者成为小朋友们的接头暗号之后,于是产生了利用单片机去播放孤勇者的想法,接下来我们来看看具体的实现以及效果展示吧!

硬件部分

蜂鸣器介绍

        首先我们使用的是51单片机的蜂鸣器来实现的,所以先来介绍一下蜂鸣器吧,如下图所示!

  • 蜂鸣器是一种将电信号转换为声音信号的器件,常用来产生设备的按键音、报警音等提示信号
  • 蜂鸣器按驱动方式可分为有源蜂鸣器和无源蜂鸣器
  • 有源蜂鸣器:内部自带振荡源,将正负极接上直流电压即可持续发声,频率固定
  • 无源蜂鸣器:内部不带振荡源,需要控制器提供振荡脉冲才可发声,调整提供振荡脉冲的频率,可发出不同频率的声音

 

        之前在STM32上的那个蜂鸣器是有源蜂鸣器,频率固定,就只能发声,而在我们的51单片机上的这个蜂鸣器是属于无源蜂鸣器,所以需要我们来调整频率,从而来实现发出不同频率的声音。

驱动电路 

        之前的32是使用三极管进行驱动的,起到放大信号的作用(不清楚的可以去32的笔记看看)。而51单片机使用的是集成电路进行驱动的(ULN2003),接下来我们来简单介绍一下吧!

ULN2003

        确实可以简单理解为一个放大电路,因为内部有一个非门,导致给1就有驱动能力(输出0,蜂鸣器才导通,所以才会响),但给0却无驱动能力(高阻态)。

乐理部分

        接下来就到了单片机最难的部分了,乐理部分,这部分我不是特别清楚,如有错误还望指出。

        首先,每8个一组(C~B),也就是哆唻咪发嗦啦西,分为4组,每一组比上一组高8度。黑键与白键相差半个音调,白色与白色相差一个音调。简谱对应相应的音调也在图中有对应关系,就不一一举出了。但是要介绍一下升音符号(#)以及降音符号(b),比如“#1”就是中央C升高半音,就是右上角的黑键。

音符

        音符是用来记录不同长短的音的进行符号。全音符二分音符四分音符八分音符十六分音符是最常见的音符,具体的内容大家可以点击超链接去康康。其中四分音符一般是一个时间基准(500毫秒),后面加一个横线就是二分音符,下面加一个横线就是八分音符,以此类推。

音符与频率对照

计算周期以及重装载值 

周期:12/11.0592/B2*1000000(因为我是11.0592HZ的晶振,所以是这样)

重装载值:65536-D2(65536-周期一半)

如下图所示:

 

代码部分

        接下来就是按照我们计算之后的重装载值来进行编码了,在此过程中,还需要我们去了解音乐的简谱,在此我就给出一份简谱,感兴趣的同学可以自己去找相应的简谱来编写代码。


// Buzzer.c
#include <REGX52.H>
#include <INTRINS.H>

//蜂鸣器端口:
sbit Buzzer=P1^5;

/**
  * @brief  蜂鸣器私有延时函数,延时500us
  * @param  无
  * @retval 无
  */
void Buzzer_Delay500us()		//@11.0592MHz
{
	unsigned char i;

	_nop_();
	i = 227;
	while (--i);
}


/**
  * @brief  蜂鸣器发声
  * @param  ms 发声的时长,范围:0~32767
  * @retval 无
  */
void Buzzer_Time(unsigned int ms)
{
	unsigned int i;
	for(i=0;i<ms*2;i++)
	{
		Buzzer=!Buzzer;
		Buzzer_Delay500us();
	}
}
// main.c
#include <REGX52.H>
#include "Delay.h"
#include "Time0.h"
#include "Buzzer.h"

//蜂鸣器端口:
sbit Buzzer=P1^5;

#define SPEED 460
//音符与索引对应表,P:休止符,L:低音,M:中音,H:高音,下划线:升半音符号#
#define P	0
#define L1	1
#define L1_	2
#define L2	3
#define L2_	4
#define L3	5
#define L4	6
#define L4_	7
#define L5	8
#define L5_	9
#define L6	10
#define L6_	11
#define L7	12
#define M1	13
#define M1_	14
#define M2	15
#define M2_	16
#define M3	17
#define M4	18
#define M4_	19
#define M5	20
#define M5_	21
#define M6	22
#define M6_	23
#define M7	24
#define H1	25
#define H1_	26
#define H2	27
#define H2_	28
#define H3	29
#define H4	30
#define H4_	31
#define H5	32
#define H5_	33
#define H6	34
#define H6_	35
#define H7	36
unsigned int FreqTable[] = {0,
	64303 ,63577 ,63691 ,63792 ,63892 ,63981 ,64070 ,64152 ,64229 ,64303 ,64372 ,64437 ,
	64499 ,64557 ,64612 ,64664 ,64713 ,64759 ,64803 ,64844 ,64883 ,64919 ,64954 ,64987 ,
	65018 ,65047 ,65074 ,65100 ,65125 ,65148 ,65169 ,65190 ,65209 ,65228 ,65245 ,65261
};


// 第一个H2意思是频率;第二个4,代表一个4分音符;code是把代码放到Flash里面。
unsigned char code Music[]={
	H2,4,
	M7,4,
	H1,4,
	M6,4,
	
	H2,4,
	M7,4,
	H1,4,
	M6,4,
//	// 注释部分是高潮的前面部分
//	M3,4+4+4+4,
//	P,4+4,	
//	P,2,	
//	M1,2,
//	M2,2,
//	M1,2,
//	M3,4+4+4+4,
//	P,4+2,
//	M1,2,
//	M2,2,
//	M1,2,
//	M2,2,
//	M3,2,
//	//
//	L6,4+2,
//	M1,2,
//	L6,4+2,
//	M1,2,
//	
//	L6,4+2,
//	M1,2,
//	M2,4,
//	M1,4,
//	
//	L7,4+4+4+4,
//	P,4+4+4+4,
//	
//	//
//	M3,4+4+4+4,
//	P,4+4,	
//	P,2,	
//	M1,2,
//	M2,2,
//	M1,2,
//	M3,4+4+4+4,
//	P,4+2,
//	M1,2,
//	M2,2,
//	M1,2,
//	M2,2,
//	M3,2,
//	//
//	L6,4+2,
//	M1,2,
//	L6,4+2,
//	M1,2,
//	
//	L6,4+2,
//	M1,2,
//	M3,4,
//	M1,2,
//	M2,2,
//	
//	L7,4+4+4+4,
//	P,4+4+4+4,
	//
//	H6,2,
//	M1,2,
//	M6,4+2+2+2,
//	M5, 2,
//	
//	M6,4+2,
//	M5,2,
//	M6,2,
//	M5,2,
//	M6,2,
//	
//	M5,2+2,
//	M3,2+2+4+4,
//	P,4+4+4,
//	H6,2,
//	M1,2,
	//
//	M6,4+2+2,
//	M5,2,
//	M6,2,
//	M5,2,

//	M7,4+2+2,
//	M6,2,
//	M7,2+2,
//	M6,4,
//	M3,2+2+4,
//	
//	P,4+4+2,
//	M3,2,
//	M5,2,
//	M3,2,
	//
//	M2,4+2,
//	M3,2,
//	M2,4+2,
//	M3,2,

//	M2,4+2,
//	M3,2,
//	M5,2,
//	M3,2,
//	M5,2,
//	M3,2,
//	
//	M2,4+2,
//	M3,2,
//	M2,4+2,
//	M3,2,
//	
//	M2,4+4+4,
//	M1,2,
//	M2,2,
//	//
//	M3,4,
//	M6,4,
//	M1,4,
//	M3,2,

//	M2,4+2,
//	M3,2,
//	M2,4,
//	M1,4,
	
//	M6,4+4+4+4,





// 高潮部分
	P,4+4+4,
	M6,2,
	M7,2,
	//
	M1,2,
	M2,2,
	M7,2,
	M1,2+4+2,
	M7,2,
	
	M1,2,
	M2,2,
	M7,2,
	M1,2+4+2,
	M2,2,
	
	M3,2,
	M2,2,
	M3,2,
	M2,2,
	M3,4+2,
	M2,2,
	
	M3,4,
	M5,4,
	M3,4,
	M6,2,
	M7,2,
	//
	M1,2,
	M2,2,
	M7,2,
	M1,2+4+2,
	M7,2,
	
	M1,2,
	M2,2,
	M7,2,
	M1,2+4+2,
	M2,2,
	
	M3,2,
	M2,2,
	M3,2,
	M2,2,
	M3,4+2,
	M2,2,
	
	M3,4,
	M5,4,
	M3,4,
	M5,4,
	//
	M3,2+4,
	M5,2,
	M3,2+4,
	M5,2,
	
	M3,2,
	M5,2,
	M6,2,
	M3,2,
	M5,4,
	M5,4,
	
	M3,2+4,
	M5,2,
	M3,2+4,
	M5,2,
//	
	M3,2,
	M5,2,
	M6,2,
	M3,2,
	M5,4,
	M5,2+2,
//
	M3,4,
	M2,4,
	M2,4,
	M1,2,
	M3,2,
	
	M3,4,
	M2,4,
	M2,4,
	M1,2,
	M1,2,
	
	L6,4+4+4+4,
	P,4+4+4,
	M5,2+2,

	//
	M3,4,
	M2,4,
	M2,4,
	M1,2,
	M3,2,
	
	M3,4,
	M2,4,
	M2,4,
	M1,2,
	M1,2,
	
	L6,4+4+4+4,
	P,4+4+4+4,
	
	0xFF
};
	



unsigned char FreqSelect,MusicSelect;
void main(){
	// 初始化定时器
	Timer0Init();
	while(1){
		// 判断是否是休止符
		if(Music[MusicSelect] != 0xFF){
			//发声
		FreqSelect = Music[MusicSelect];
		MusicSelect++;
			//持续时长
		Delay(SPEED/4*Music[MusicSelect]);
		MusicSelect++;
		TR0 = 0;
		Delay(5);
		TR0 = 1;
		}else{
			TR0 = 0;
		while(1);
	}
	}
		
	}


void Timer0_Routine() interrupt 1
{
if(FreqTable[FreqSelect]){
	TL0 = FreqTable[FreqSelect] % 256;		//设置定时初始值
	TH0 = FreqTable[FreqSelect] / 256;	
	Buzzer =! Buzzer; // 响
}
		
	}

运行结果

蜂鸣器《孤勇者》

        好了,对于蜂鸣器的知识就介绍到这了,如有错误还望及时指出。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(十)51单片机——利用蜂鸣器播放《孤勇者》(附成果展示) 的相关文章

  • Python智力问答小游戏

    Python智力问答小游戏 在这个Python智力问答小游戏中 我们将提供一系列问题 并编写代码来实现一个简单的问答游戏 玩家将被要求回答一些与Python编程相关的问题 并根据他们的回答来获得得分 让我们一起来创建这个有趣的游戏吧 首先
  • python: Call SQL Server Stored Procedure in Python

    sql script DROP TABLE InsuranceMoney GO create table InsuranceMoney ID INT IDENTITY 1 1 PRIMARY KEY InsuranceName nvarch
  • PCB中常用快捷键

    网络搜集 备份一份方便查看 PCB快速挖孔 T V B 绘制闭合区域后 直接选中所有线条 然后T V B 挖孔 AD布线 选定器件 框定到指定区域的快捷键 原理图框定指定模块后 按T S后跳到PCB自动回选中相关器件 然后按T O L划定一
  • 什么是面向对象编程?

    所有编程语言都提供抽象机制 汇编是语言是对底层机器的轻微抽象 命令式语言 FORTRAN BASIC C 是对底层机器的轻微抽象 他们所做的主要抽象仍然要求在解决问题基于计算机的结构 而不是所要解决问题的结构 程序员必须建立起机器模型和待解

随机推荐

  • 第三周 Python基本数据类型

    1 数字类型及操作 1 1整数类型 与数学中整数的概念一致 可正可负 没有取值范围限制 pow x y 函数 计算xy 想算多大算多大 gt gt gt 1267650600228229401496703205376 4种进制表示形式 十进
  • npm ERR network Invalid response body while trying to fetch

    问题描述 安装 vue cli 的时候持续报错 npm notice npm notice New minor version of npm available 8 5 0 gt 8 7 0 npm notice Changelog htt
  • 出现undefined reference to `forkpty' 错误解决方法

    出现undefined reference to forkpty 错误解决方法 2009 02 04 09 14 23 分类 C 举报 字号 订阅 下载LOFTER客户端 出错提示如下 usr lib lib libpython2 5 so
  • C语言是一种非结构化的程序设计语言,C语言程序设计——姜恒远 第一章 C程序设计概述.ppt...

    C语言程序设计 姜恒远 第一章 C程序设计概述 姜 恒 远 第1章 C程序设计概述 1 1 程序设计语言 程序与程序设计 1 1 1 程序设计语言 CPU能理解且能直接执行的指令集合 用机器语言编写的程序形式 用机器语言编写的程序优点 质量
  • 三、mock与umi-plugin-react插件

    一 Mock 数据 umi 里约定 mock 文件夹下的文件或者 page s 文件夹下的 mock 文件即 mock 文件 这个mock数据 默认导出的结果 前面为请求方式和请求的url 后面的为返回前端的结果 结果可以是函数 也可以是对
  • 在centos7上部署ZeroTier实现内网穿透

    https my zerotier com 登录账户后在ttps my zerotier com network创建网络 配置centos yum源 vi etc yum repos d zerotier repo zerotier nam
  • c++tuple和bitset

    tuple tuple是类似pair的模板 一个tuple可以有任意数量的成员 类型也可以不相同 make tuple 返回一个用给定初始值初始化的tuple 返回的tuple类型从初始值推断 可以使用 初始化但不能使用 tuple
  • Visual Studo Code & Anaconda环境配置

    在使用VScode的过程中 遇到如下问题 通过Anaconda安装的库文件在VScode中无法import 提示找不到该module 但在window的cmd中是可以import该库文件的 原因 环境配置问题 1 选择了错误的python解
  • 谈谈对于XSS跨站脚本攻击的学习(1)

    前言 最近学完XXE之后 对于这种恶意代码注入的漏洞提起来兴趣 想着现在正好趁热打铁 学习一下XSS 之前做题的时候看大师傅的wp一愣一愣的 不明白个所以然 这次系统的学习一下 在本文中将介绍有关XSS的知识点以及原理 也会介绍XSS的绕过
  • web前端期末大作业实例 (1500套) 集合

    文章目录 web前端期末大作业 1500套 集合 一 网页介绍 二 网页集合 表白网页 125套 集合 Echarts大屏数据展示 150套 集合 一 基于HTML Echarts技术制作 二 基于VUE Echarts技术制作 更多源码
  • 微信小程序腾讯位置服务添加不上去

    今天发现怎么添加都添加不上去 然后我搜索了大半天 emm最后都没有找到我的解决方法 然后终于我想起来他的报错提示 去搜了一下类目 然后去小程序添加了个交通类目 然后就好了
  • SOLO训练代码解析

    之前写过对SOLO demo的代码解析 今天来梳理一下training过程 首先是tools train py 这个文件是训练的开始 命令行运行的就是该文件 from mmdet apis import set random seed tr
  • Python使用国内镜像安装

    命令 pip install i 国内镜像地址 numpy 国内常用源镜像地址 清华 https pypi tuna tsinghua edu cn simple 阿里云 http mirrors aliyun com pypi simpl
  • JSON Web令牌(JWT)详解

    前言 今天要分享的知识是JWT 码字不易 转载请说明 目录 一 JWT出现的原因及工作原理 JWT是什么 为什么使用JWT JWT的工作原理 JWT组成 传统开发对资源的访问限制利用session完成图解 JWT所解决的问题及机制 JWT解
  • ReentrantLock 锁详解

    ReentrantLock 支持公平锁和非公平锁 可重入锁 ReentrantLock的底层是通过 AQS 链接 实现 一 BAT 大厂的面试题 1 什么是可重入 什么是可重入锁 它用来解决什么问题 2 ReentrantLock 的核心是
  • reduce和map的区别

    1 reduce 上代码 from functools import reduce sum1 reduce lambda x y x y range 1 5 print sum1 10 输出结果 10 结论 reduce返回的是函数经过执行
  • c语言05之从键盘输入一个整数加法表达式:操作数1+操作数2, 然后计算并输出表达式的计算结果, 形式如下:操作数1+操作数2=计算结果。

    题目 从键盘输入一个整数加法表达式 操作数1 操作数2 然后计算并输出表达式的计算结果 形式如下 操作数1 操作数2 计算结果 源代码 include
  • drool 7.x 语法和属性

    文章目录 1 语法 1 1 dialect 1 2 mvel 1 4 Eval 2 属性 2 1 salience 2 2 no loop 2 3 date effective 2 4 date expires 2 5 enabled 2
  • 在平时编程中感觉遇到的比较常见的问题

    文章目录 Linux Conda python tmux 如何debug Linux 查看当前文件夹中文件大小 ls lh Conda 在指定目录安装conda环境 conda create prefix mnt usrs xinrun c
  • (十)51单片机——利用蜂鸣器播放《孤勇者》(附成果展示)

    目录 硬件部分 蜂鸣器介绍 驱动电路 ULN2003 乐理部分 音符 音符与频率对照 代码部分 运行结果 随着最近孤勇者成为小朋友们的接头暗号之后 于是产生了利用单片机去播放孤勇者的想法 接下来我们来看看具体的实现以及效果展示吧 硬件部分