【测评STM32L452Nucleo-64】制作一个简易的音乐播放器
<div class='showpostmsg'><p> 在上一篇的测评中成功的驱动了蜂鸣器,在这一篇中我们进一步结合OLED屏幕和蜂鸣器制作一个简易音乐盒子。</p><p > 当单片机用于演奏歌曲时,只需搞清楚两个概念即可,也就是“音符(音调)”和“节拍”。音调表示一个音符该唱的频率,节拍表示一个音符该唱多长的时间。我们创建两个数组分别控制这两个变量并且交替修改就能得到我们想要的输出音乐效果。</p>
<p > 我们可以在网上搜索到音符与频率对照表如下图:</p>
<div style="text-align: center;">
<div style="text-align: center;"></div>
<p> </p>
</div>
<p > 这里我们定义一个UC16的数组用来存放我们的频率信息:</p>
<pre>
<code>// 低71 2 3 4 5 6 7高1 高2高3 高4 高5 不发音
uc16 tone[] = {247,262,294,330,349,392,440,294,523,587,659,698,784,1000};//音频数据表
</code></pre>
<p>另外一个部分就是控制音长的部分,也是我们常说的节拍部分,节拍的修改是通过延长或缩短频率的时间所实现的。</p>
<div style="text-align: center;"></div>
<p>接着我们需要添加一个修改输出频率与就是控制音调的函数:</p>
<pre>
<code>void Sound(u16 frq)
{
u32 time;
if(frq != 1000)
{
// time = 500000/((u32)frq);
time = 100000/((u32)frq);
//BEEP (0);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9,GPIO_PIN_RESET);//打开蜂鸣器--根据自己的硬件情况调整,通常就是控制蜂鸣器的gpio引脚置1
delay_us(time);
//BEEP(1);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_9,GPIO_PIN_SET);//关闭蜂鸣器--根据自己的硬件情况调整,通常就是控制蜂鸣器的gpio引脚置0
delay_us(time);
}else
delay_us(1000);
}
</code></pre>
<p> 我们将想要编写的音乐写到另一个存放音频和节拍信息的函数中通过调用void Sound(u16 frq)函数并进行延时就可以输出音乐了</p>
<pre>
<code>void play_music(void)
{
// 低1 2 3 4 5 6 7中12 3 4 5 6 7 高12 3 4 5 6 7
// uc16 tone[] = {262,294,330,349,392,440,494,523,587,659,698,784,880,998,1046,1175,1318,1397,1568,1760,1967};//音频数据表
// //0 1 2 3 4 56 78 9 10111213 1415 16 17 1819 20
// //
// u8 music[]={9,11,14,12,11,20,//音调
// 9,11,12,14,11,20,
// 14,16,15,14,15,14,19,14,18,20,
// 9,11,12,11,12,14,8,11,12,20,
// 9,7,8,20,
// 8,8,9,11,11,14,8,9,11,20};
// u8 time[] ={2,2,2,2,6,4,//时间
// 2,2,2,2,6,4,
// 6,2,4,4,2,2,2,2,6,4,
// 6,2,4,2,2,4,2,2,6,4,
// 2,2,4,6,4,
// 4,2,2,4,4,4,2,2,6,4};
// uc16 tone[] = {247,262,294,330,349,392,440,494,523,587,659,698,784,1000};//音频数据表
uc16 tone[] = {262,294,330,349,392,440,494,523,587,659,698,784,880,998,1046,1175,1318,1397,1568,1760,1967};
//
u8 music1[]={13,1,2,3,4,5,6,7,8};
u8 time1[] = {4,4,4,4,4,4,4,4,4};
// u8 music[]={13,1,2,3,4,5,6,7,8};//测试基础音
// u8 time[] ={4,4,4,4,4,4,4,4,4};
u32 yanshi;
u16 i,e;
yanshi = 2;//10;4;2
for(i=0;i<sizeof(music1)/sizeof(music1);i++){
for(e=0;e<((u16)time1)*tone]/yanshi;e++){
Sound((u32)tone]);
}
}
</code></pre>
<p>在介绍使用蜂鸣器播放音乐的程序时所使用的频率都是理论值,根据不同电路蜂鸣器的差异可以在理论的音频数据上下修改值不断尝试使得输出音乐更好听。</p>
<p >在这里我结合蜂鸣器音乐输出和oled屏幕功能制作了一个简易播放生日歌的程序:</p>
<p >2d2a788e28218d911b636685bf281e7e<br />
</p>
</div><script> var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;" style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
if(parseInt(discuz_uid)==0){
(function($){
var postHeight = getTextHeight(400);
$(".showpostmsg").html($(".showpostmsg").html());
$(".showpostmsg").after(loginstr);
$(".showpostmsg").css({height:postHeight,overflow:"hidden"});
})(jQuery);
} </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>
页:
[1]