项目地址:https://gitee.com/daycen/c51-music-box

通过Keil uVision3打开即可使用

以前做的一些小硬件,现补档至博客

1 功能及总体方案

1.1 功能描述

​ 一个可通过无源蜂鸣器播放任意预先编码好的歌曲的基于51单片机设计的音乐盒。

​ 最小系统部分:由STC89S52单片机X接口连接晶振电路,RESET连接复位电路所构成的满足最简单应用的单片机系统。

​ 无源蜂鸣器驱动电路:由一个1K的分压电阻与无源蜂鸣器串联组成,作为系统的发声源。

​ 软件模块:由计算得出的每个声调的频率数据数组、歌曲编码数组、延时函数、定时器中断函数以及主循环函数构成,用于改变无源蜂鸣器的发声声调。

1.2 系统组成及工作过程

系统组成框图如下:

2 硬件设计

2.1 硬件电路总体设计

​ 单片机最小系统包括单片机、时钟电路、复位电路与5V电源构成,时钟电路提供的时钟信号给单片机提供了一个时间基准。复位电路则是让单片机回到原始状态重新执行程序。

实物图如下:

2.2 模块电路设计

​ 播放一段音乐需要的是两个元素,一个是音调,另一个是音符。首先要了解对应的音调,音调主要由声音的频率决定,同时也与声音强度有关。对一定强度的纯音,音调随频率的升降而升降;对一定频率的纯音、低频纯音的音调随声强增加而下降,高频纯音的音调却随强度增加而上升。另外,音符的频率有所不同。音符的发音主要靠不同的音频脉冲。利用单片机的内部定时器/计数器0,使其工作在模式1,定时中断,然后控制P2.0引脚的输出音乐。只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间,利用定时器计时这个半周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O反相,就可在I/O脚上得到此频率的脉冲。

​ 音乐盒的设计采用STC89C52作为主控芯片,利用单片机内部定时器产生特定的音符频率,控制节拍。

​ 音频模块选用无源蜂鸣器作为发声源,因为它制作成本低,声音频率范围宽,可高分贝的发出某些频率的超声波以及可以做出音符的效果。

PCB图:

3 软件设计

3.1 软件总体设计

软件的总流程图如下

3.2 主程序设计

​ 主程序的设计思路就是将一首乐曲分成三个变量来控制,分别是曲调、所在音区、时长。而控制曲调的因素即频率又分成高八位和第八位两个表,每演奏一个曲调,就根据该曲调的三个变量来取值。此外,x变量用于定义休止符,控制歌曲的不演奏(间断)延时

3.3 各模块程序设计

①音调频率换算

​ 要想产生音频脉冲信号,需要算出某音频的周期(1/频率),然后将此周期除以2,即为半周期的时间。利用单片机定时器计时这个半周期的时间,每当计时到后就输出脉冲的I/O口反相,这样就在此I/O口上得到此脉冲的频率。

​ 例如,若要产生C大调中的Re(频率为587Hzs)的音频脉冲,其音频信号的脉冲周期T=1/587=1703.5775us,半周期时间为852us,因此总要令计时器计数=852us/1us=852,在每计数852时将I/O口反相,就可以得到Re这个音。按照这种方式可得到一张音符频率对应的半周期数值表,如下图

②歌曲编码

​ 为了能够让程序按照乐谱调用相应的音调数据发声,于是这里我定义了一种编码方式对乐谱进行转换,每个音符的对应的编码包含四个数字:第一个数代表第几个音符(对应简谱中的1234567);第二个数代表第几个八度(音高);第三个数代表时长(以半拍为单位,在钢琴简谱中,音符的右边有一个点代表1.5倍时长);第四个数仅定义为1或0,1表示休止符,间断延时一个节拍而0则不进行任何操作(统一以1121编码代表休止符);

​ 在本程序中,我一共写入了两首歌,分别是《打上花火》和《aLIEz》,在第一首歌播放完毕后会间隔3个节拍的时间播放下一首。特别说明的是,由于编码参考的是钢琴简谱,故编码表中部分时长为3的音符调整为了2目的是让歌曲节奏快一些,且对我对双手谱的复弹做了一定删减以保证听感。

③休止符间断延时函数

​ 该函数由一组双重循环构成,当数组遍历到编码为1121的休止符时,程序会延时a个半拍,模拟出乐谱上休止符的功能。

④主延时函数

与休止符函数类似,主延时函数也由一组双重循环构成,共延时t/2个节拍以控制蜂鸣器发声的时长。此处仅延时t/2个节拍是为了加快歌曲节奏。

⑤定时器中断函数

该函数为T0中断函数。根据图3数值表找到的定时器的初始值被送入这里,无源蜂鸣器被驱动而发声

⑥音乐播放函数

该函数启动T0, 由T0输出方波去发音,并传递参数给图5中的主延时函数,对节拍时长进行控制。

⑦主函数

主程序流程图如下

【补档_C51单片机】基于C51的蜂鸣器音乐盒工程源码解析(可播放《打上花火》)的更多相关文章

  1. 基于Linux ALSA音频驱动的wav文件解析及播放程序 2012

    本设计思路:先打开一个普通wav音频文件,从定义的文件头前面的44个字节中,取出文件头的定义消息,置于一个文件头的结构体中.然后打开alsa音频驱动,从文件头结构体取出采样精度,声道数,采样频率三个重 ...

  2. 【补档_STM32单片机】脉搏波采集显示硬件设计

    一.脉搏波简介 ​ 脉搏一般情况下指的都是动脉脉搏.每分钟的脉搏次数称为脉率,正常情况下与心率是一致的.心脏的一次收缩和舒张成为一个心动周期.在每个心动周期内,心室的收缩和舒张会引起脉内压力的周期性波 ...

  3. 基于Spring注解的上下文初始化过程源码解析(一)

    最近工作之余有时间和精力,加上平时对源码比较感兴趣,就开始啃起了Spring源码.为加深印象写了这篇博客,如有错误,望各位大佬不吝指正. 我看的是Spring5的源码,从同性社区download下来后 ...

  4. 基于Spring注解的上下文初始化过程源码解析(二)

    上一篇看完了register方法的代码,继续跟后面代码 后面执行refresh方法,代码清单如下: public void refresh() throws BeansException, Illeg ...

  5. 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理

    服务器文档下载zip格式   刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...

  6. ARM开发(2)基于STM32的蜂鸣器

    基于STM32的蜂鸣器 一 蜂鸣器原理:  1.1 本实验实现1个蜂鸣器间隔1S鸣叫.  1.2 实验思路:根据电路图原理,给蜂鸣器相关引脚赋予高低电平,实现电路的导通,使蜂鸣器实现鸣叫或不鸣.  1 ...

  7. STL 补档

    STL 补档 1.vector 作用:它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据. vector在C++标准模板库中的部分内容,它是 ...

  8. 图论补档——KM算法+稳定婚姻问题

    突然发现考前复习图论的时候直接把 KM 和 稳定婚姻 给跳了--emmm 结果现在刷训练指南就疯狂补档.QAQ. KM算法--二分图最大带权匹配 提出问题 (不严谨定义,理解即可) 二分图 定义:将点 ...

  9. String,StringBuffer和StringBuilder源码解析[基于JDK6]

    最近指导几位新人,学习了一下String,StringBuffer和StringBuilder类,从反馈的结果来看,总体感觉学习的深度不够,没有读出东西.其实,JDK的源码是越读越有味的.下面总结一下 ...

  10. .Net Core 认证系统之基于Identity Server4 Token的JwtToken认证源码解析

    介绍JwtToken认证之前,必须要掌握.Net Core认证系统的核心原理,如果你还不了解,请参考.Net Core 认证组件源码解析,且必须对jwt有基本的了解,如果不知道,请百度.最重要的是你还 ...

随机推荐

  1. [转帖]淫技巧 | 如何查看已连接的wifi密码

    https://blog.csdn.net/DynmicResource/article/details/120134984?spm=1001.2014.3001.5502 主题使用方法:https: ...

  2. [转帖]xargs详解

    https://www.cnblogs.com/xiaofeng666/p/10800939.html xargs与find经常结合来进行文件操作,平时删日志的时候只是习惯的去删除,比如 # find ...

  3. [转贴]汉字编码:GB2312, GBK, GB18030, Big5

    汉字编码:GB2312, GBK, GB18030, Big5 https://www.cnblogs.com/malecrab/p/5300497.html 前一篇博文:ANSI是什么编码?中有这样 ...

  4. Linux上面批量更新SQLSERVER SQL文本文件的办法

    1. 今天同事让帮忙更新几个SQL文件.. 本着自己虽然low 但是不能太low的想法, 简单写一个 shell 脚本来执行. 2. 因为我的linux 里面都安装了 sqlcmd 的工具 所以办法就 ...

  5. CentOS7 和 CentOS8 安装 rusers-server 然后使用LR 实时监控Linux主机性能的办法

    LR 能够通过RPC 的工具 实时获取 被压测机器的 性能表现 但是需要安装几个组件. CentOS6 时期比较简单 可以通过网上 下载rstatd 的tar 包离线安装即可 但是发现CentOS7 ...

  6. requests模块安装

    使用python写接口,必不可少的就是requests,所以事先要在python中安装requests     ​一.使用pip install安装(项目的命令行终端使用) 1.配置下载源地址路径(清 ...

  7. 2024-01-27:用go语言,阿里巴巴走进了装满宝藏的藏宝洞。藏宝洞里面有N堆金币, 第i堆金币的总重量和总价值分别是m[i]、v[i], 阿里巴巴有一个承重量为T的背包,但并不一定有办法将全部的

    2024-01-27:用go语言,阿里巴巴走进了装满宝藏的藏宝洞.藏宝洞里面有N堆金币, 第i堆金币的总重量和总价值分别是m[i].v[i], 阿里巴巴有一个承重量为T的背包,但并不一定有办法将全部的 ...

  8. jenkins 安装与构建过程中的系列问题

    一.插件安装遇到的依赖问题 插件安装分为在线安装和离线安装 1.在线安装 搜索要安装的插件,然后进行安装即可 2.离线安装hpi文件 使用该方法安装插件每次只能安装一个插件,且如果插件之间存在依赖性则 ...

  9. RC4加密技术探究:优缺点与实战应用

    引言 在网络安全领域,加密技术一直是保障数据安全的重要手段.Rivest Cipher 4(简称RC4)作为一种对称加密算法,自20世纪80年代以来广泛应用于各种网络安全协议中.本文将详细分析RC4加 ...

  10. centos7.9离线安装MongoDB4.4.17

    前言 MongoDB 5.0开始要求CPU支持avx指令集,参考https://mp.weixin.qq.com/s/6FFXih1DEZYDFOk1hCu69w 环境 CentOS 7.9.2009 ...