51单片机(二十七)—— 蜂鸣器播放音乐

原文地址::https://blog.csdn.net/bhniunan/article/details/104689789?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight

 

相关文章

1、51单片机播放音乐(一):蜂鸣器----https://blog.csdn.net/xfgryujk/article/details/84309970

2、单片机音乐播放C语言程序----http://www.51hei.com/mcu/1354.html

3、单片机的播放音乐----https://jingyan.baidu.com/article/fea4511a7f3d2df7bb912535.html

4、51单片机播放音乐(三):PWM播放任意波形----https://blog.csdn.net/xfgryujk/article/details/84479505

5、怎么用单片机播放有人唱的音乐----https://zhidao.baidu.com/question/483733954.html

6、基于单片机的简易音乐播放器的设计----https://wenku.baidu.com/view/edc8e7100b4e767f5acfce89.html

7、51单片机音乐播放程序设计----http://www.elecfans.com/emb/danpianji/20181217832892.html

8、求单片机 音乐播放的c代码----https://zhidao.baidu.com/question/121173921.html

9、单片机播放音乐的基本知识----http://news.eeworld.com.cn/mcu/article_2016092729854.html

10、51单片机简单乐曲演奏(青花瓷)----https://blog.csdn.net/qq_43020885/article/details/88718494?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight

 

1、实验原理介绍

        蜂鸣器是电路中经常使用的发声器件,我们一般使用蜂鸣器发出“嘀嘀”的声音,用它作为提示音。有没有想过用蜂鸣器还可以播放音乐呢?这显然是件很有意思的事情。

        本文使用蜂鸣器来播放音乐。为了深入了解此实验的原理,先介绍一下音乐的基础知识,音乐中的每个音调都有其固定的音高,简谱记谱法由7个基本唱名组成,它们分别用1、2、3、4、5、6、7表示。每个唱名对应固定的音高。由声学角度看,音高不同,发声物体振动的频率就不一样。

        下图为钢琴键盘的一部分,图中的C4键对应的就是简谱唱名的中音1,左侧为这个唱名对应的声波的振动频率。由此可以向上和向下推出其它唱名的频率。

        要想使蜂鸣器发出不同的声音就必须通过PWM波来驱动蜂鸣器,调节PWM波的频率就可以发出不同声调的声音。PWM是脉冲宽度调制的简称,PWM在控制中应用广泛,可以用于电机调速,舵机控制,步进电机控制等。在这个实验中我们用PWM波来驱动蜂鸣器发出不同声调的声音。

        这个实验通过在T0中断中改变BUZZ接口的电平状态,来产生频率一定的方波,来驱动蜂鸣器。改变定时器的计数初始值,就可以产生不同声调的声音。例如:唱名为1的音的频率为262Hz,则它对应的周期约为3816us,周期的一半为1908us。也就是说当单片机采用12MHz晶振时,它的周期是1908个机器周期。则定时器的计数初始值为65536-1908=63628,对应的16进制值为0xF88C。以此类推,可以起算出其它唱名的计数初始值。

        在程序中,toneH[10]和toneL[10]用来存储音调对应的计数初始值的高8位和低8位。soundtone[42]存储的是需要发声的音调,其中1~7代表唱名1~7。soundlong[42]用来存储与soundtone[42]相对应的唱名的发声时长。

        在本文中,我们用蜂鸣器来播放《小星星亮晶晶》这首简单的儿歌,它的简谱如下所示。

在使用蜂鸣器进行音乐播放时,驱动蜂鸣器的PWM信号按照简谱的唱名改变为相应的频率,并持续相应的时长,就可以达到播放音乐的目的。

2、例程验证

        在这个例程的代码中,首先定义了几个数组,如下所示。

 
  1. code unsigned int toneH[10]={ //音调对应的定时器计数值的高8位 第一个音为低音7

  2. 0XF8,0XF8,0XF9,0XFA,0XFA,0XFB,0XFB,0XFC,0XFC,0XFC

  3. };

  4. code unsigned int toneL[10]={ //音调对应的定时器计数值的低8位

  5. 0X18,0X8C,0X6B,0X15,0X67,0X04,0X90,0X0C,0X44,0XAC

  6. };

  7.  
  8. code unsigned int soundtone[42]={

  9. 1,1,5,5,6,6,5,4,4,3,3,2,2,1,

  10. 5,5,4,4,3,3,2,5,5,4,4,3,3,2,

  11. 1,1,5,5,6,6,5,4,4,3,3,2,2,1

  12. };

  13.  
  14. code unsigned int soundlong[42]={

  15. 1,1,1,1,1,1,2,1,1,1,1,1,1,2,

  16. 1,1,1,1,1,1,2,1,1,1,1,1,1,2,

  17. 1,1,1,1,1,1,2,1,1,1,1,1,1,2

  18. };

在上面我们已经有了介绍,toneH[10]和toneL[10]用来存储音调对应的计数初始值的高8位和低8位。soundtone[42]存储的是需要发声的音调,其中1~7代表唱名1~7,我们可以看到,这些唱名与简谱中是一一对应的。soundlong[42]用来存储与soundtone[42]相对应的唱名的发声时长。

        这个例程的主函数如下所示

 
  1. void main(void)

  2. {

  3. init_T0();

  4. for(;;)

  5. {

  6. for(t=0;t<42;t++)

  7. {

  8. t_H=toneH[soundtone[t]]; //提取音调对应的定时器初始值

  9. t_L=toneL[soundtone[t]];

  10. TH0=t_H; //给TH0和TL0赋值

  11. TL0=t_L;

  12. TR0=1; //打开定时器,蜂鸣器发声

  13. delay1ms(soundlong[t]*500); //延时soundlong[t]指定的时间长度

  14. BUZZ=0; //蜂鸣器不发声,停顿片刻

  15. TR0=0;

  16. delay1ms(50);

  17. }

  18. delay1ms(2000);

  19. }

  20. }

        在主函数中,首先初始化T0,这个初始化函数中,将T0设置为16位定时器,在中断处理函数中,改变蜂鸣器控制IO口的电平状态。然后代码进入for循环,在for循环中,又进入另一个for循环,这个for循环,对这段音乐的每个唱名进行遍历,将T0的计时寄存器按照唱名进行赋值,并延时soundlong[42]要求的时间长度。遍历完soundtone[42]中所有的唱名,则完成音乐的播放,再进入下一个大的for循环,进行再次播放。

        将代码烧写到51单片机中,可以听到悦耳的音乐。

源码链接

https://download.csdn.net/download/bhniunan/12231046

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值