
小小简谱转换音乐
简介
本项目使用STC8H单片机,采用硬件PWM输出频率和占空比可调的PWM,控制蜂鸣器奏响音乐,并通过片上ADC实现电压采集,通过电位器旋转分压实现输出声音大小调整,实物小巧可作为钥匙挂件随身携带。
简介:本项目使用STC8H单片机,采用硬件PWM输出频率和占空比可调的PWM,控制蜂鸣器奏响音乐,并通过片上ADC实现电压采集,通过电位器旋转分压实现输出声音大小调整,实物小巧可作为钥匙挂件随身携带。开源协议
:GPL 3.0
描述
本项目已通过验证,实物图为封面和下文配图。
项目原理:无源蜂鸣器可发出不同频率的声音,主要看驱动设备,驱动设备发出的驱动信号可受程序控制,基本上可以实现随心所欲。
我们学过谱子,知道每一拍有不同的音色,每一拍不同的音色持续的时间不同,所以将简谱编为程序,将最重要的音色和持续时间记录下来,放到程序中,再由程序定时执行和演奏,故可以将简单的谱子演奏出来。这里粘贴一些个人学习笔记仅供参考:CSDN简谱笔记

我们先将不同音符对应的频率用数组存起来备用,从低音256Hz-中音523Hz到高音1046都存起来。注意这是C调,D调F调等其他调另有不同频率。

我们将简谱的音符用1-7表示出来,升音降音用+7和-7表示,谱子默认4分音符,设定为500ms持续时间,设其代表时间为1,其他时间成比例,2分音符用2倍表示持续500x2=1000ms,8分音符用0.5表示500/2=250ms,16分音符用0.25表示500/4=125ms,依照这个规律,中音5,4分音符可以这样表示{5,1}同理,高音3,8分音符可以表示为:{3+7,0.5}。将简谱的音符放在二维数组中就形成了如下的数组,其中{0,0.1}代表每个节拍演奏完之后的停顿。


将简谱存起来之后,我们编写一个PWM代码,可以传入频率并输出即可。在主程序中,每演奏一拍给变量计数就可以知道当前演奏到哪里了,然后根据数组调用规律将数组嵌套,把不同拍的频率取出来放进PWM输出函数里,然后设置延时时间,延时比例也从数组里取出来并x500ms基准时长就是延时时间。这样一拍就轻松演奏了出来,每拍结束记得要跟个停顿哦,你可以将停顿写在数组里,就像我上面那样,你也可以写死在主函数里,但是遇到复杂简谱,3个甚至4个音符连贯起来表示一个音的时候就不好弄了。就像“敢问路在何方”这个谱子一样

至于调音量,就可以用PWM占空比调节,本项目是用ADC读取电位器分压,然后将电压值映射到0-100%,这样就可以作为占空比传给PWM生成函数啦。当然由于我的蜂鸣器太响了,我就映射到了0-15%,不然太响了。本项目写入了几首歌曲,像同桌的你、美丽的神话、敢问路在何方等,下面我将代码奉上。程序下载就是那几个排针口,应该不用说。

当然歌曲切换可能就要动动脑子了,怎么随意切换演奏不同数组,这个方法应该有很多,只要能实现就是最好。
设计图
未生成预览图,请在编辑器重新保存一次BOM
暂无BOM
克隆工程

评论