嵌入式--音乐演奏程序思路总结

本文介绍了如何使用单片机通过蜂鸣器播放歌曲,核心在于解析歌曲数组并控制发音时间。文章详细阐述了BeepSong()函数的实现,包括歌曲的基调、时间基解析,以及音符的发音和休止符处理。每个音符会提前10ms结束,以确保准确。此外,还提到了一个总开关B来控制歌曲播放的启停。

在开发板中里面,歌曲演奏是靠蜂鸣器来完成的,所以就需要知道歌曲的每个音符的周期,然后编写程序,让单片机循环读取音符的周期,从而完成歌曲的演奏。
我们采用的方法是按照一定的规律和设定,把每个音符的值都设定好之后,放到数组当中,然后写好程序去读这个数组。

数组说明:数组的第一个数是歌曲的基调+时间基+时间基的倍数,后面开始就是音符的周期和发音时长数据

要求:正常发音的前提下,每个音符提前10ms结束。
——
写 BeepSong() 函数;
BeepSong(),主体是一个switch函数:用递进的变量A来case的引用
步骤0:
判断是否执行唱歌程序。
加一个总开关B,B=1则进行唱歌程序,否则结束。
如果执行则进入步骤1,则需要A+1

步骤1:
首先A++
获取歌曲数组的第一个数
解析歌曲数组的第一个数,解析大调,解析时间基,解析时间基的倍数。
解析完之后进入步骤2

步骤2:
首先A++
获取歌曲数组的下一个数:解析,要发的音符,发音周期,发音时长,然后区分:发音的普通音符,休止符(不发音,只等待),结束符。
发普通音:上一个音符的时间发完之后再发下一个音符,让A=3;
发休止符:如果发现音符的周期是0,则是休止符或则结束符,然后再判断音符的延长数据是否是0,如果不是0则是休止符,反之就是结束符
如果是休止符则把休止符的时间基的延长数据读取,执行。让A=3;
如果是结束符则让A=3;B=0;
如果B=0,则不会进入到case的循环当中。相当于停止了歌曲发声。

步骤3:
因为每个音符提前10ms结束。所以程序不能设定发完一整个音符再来进入一次循环。我们每个音符的时长分成,时间基*倍数,当程序执行到时间基的倍数为1的时候,然后判断被赋时间基的变量的值是否小于10。如果小于10。则提前将占空比设置为0.这样就完成了提前10ms关闭蜂鸣器的想法。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值