基于STC89C52的音乐播放器设计

1_基于STC89C52的音乐播放器设计

博客初衷

最近在学51单片机,在把商家给的教程撸完一遍之后萌生了自己做一个音乐播放器的念头。前前后后折腾了好几天,想接着写博客的机会一来记录技术细节,二来熟悉一下markdown语法。

已实现功能

  1. 储存多首音乐。并根据蜂鸣器原理自编函数使其“发声”。
  2. 利用中断系统实现音乐的暂停/继续播放和播放下一首/上一首功能。
  3. 以PC机为上位机,编写GUI界面用于PC机和51单片机之间的通信。

蜂鸣器原理

对有源/无源蜂鸣器施加一个1.5-5KHZ的脉冲信号,可以使蜂鸣器发声。改变这个脉冲信号的频率,就可以调节蜂鸣器的音调,使其发出不同的声音。改变脉冲信号的高低电平占空比,则可以改变蜂鸣器的声音大小

代码实现

如何发声

要让蜂鸣器发声,我们需要获得音乐的简谱并能够读懂它。其实最关键的就是要知道音符的音调拍子(也就是单个音符的持续时间)。音乐小白请戳这里。相信看完这篇文章再加上自己额外搜索的资料,你能明白如何从简谱上获取音乐的音调以及节拍。以下给出一张音符频率表以供参考。

音调 说明 51频率
C 低(C3) 中(C4) 高(C5) 262 523 1046
D 低(D3) 中(D4) 高(D5) 294 587 1175
E 低(E3) 中(E4) 高(E5) 330 659 1318
F 低(F3) 中(F4) 高(F5) 349 698 1397
G 低(G3) 中(G4) 高(G5) 392 784 1568
A 低(A3) 中(A4) 高(A5) 440 880 1760
B 低(B3) 中(B4) 高(B5) 494 988 1976

下面给出51单片机的具体实现方式

//变量说明
unsigned int music_tab[]:	存放经C++代码处理过的频率值
unsigned int duration[]:	存储对应music_tab[]的每个音调的拍

这里说明一下我的思路。设定方波占空比为50%。在keil上测出以下代码段的执行时间

//Tone(frequency)函数模块
unsigned int j=0;
 for (j=0;j<frequency;j++)
  beep=1;		//beep为蜂鸣器上对应管脚
 for (j=0;j<frequency;j++)
  beep=0;

两个for循环总共100(即frequency=50)次执行完所需时间为1959.64 μ \mu μs(晶振为11.058MHZ)。这段代码其实就是在模拟方波的产生。我们可以根据以上所得进行换算求得不同音调对应的for循环次数。设
n u m b e r = 音 调 频 率 为 f r e 所 对 应 的 音 符 的 循 环 次 数 number=音调频率为fre所对应的音符的循环次数 number=fre
注意到number为整数,因此 n u m b e r = [ 1 f r e ⋅ 1 0 6 ⋅ 100 1959.6 ] = [ 1 0 8 f r e ∗ 1959.6 ] number=\left [ \frac{\frac{1}{fre}\cdot10^6\cdot100}{1959.6}\right ]=\left [\frac{10^8}{fre*1959.6}\right ] number=[1959.

  • 5
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值