51单片机(二十七) 您所在的位置:网站首页 播放牛角唱的歌 51单片机(二十七)

51单片机(二十七)

2024-03-21 05:34| 来源: 网络整理| 查看: 265

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、例程验证

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

code unsigned int toneH[10]={ //音调对应的定时器计数值的高8位 第一个音为低音7 0XF8,0XF8,0XF9,0XFA,0XFA,0XFB,0XFB,0XFC,0XFC,0XFC }; code unsigned int toneL[10]={ //音调对应的定时器计数值的低8位 0X18,0X8C,0X6B,0X15,0X67,0X04,0X90,0X0C,0X44,0XAC }; code unsigned int soundtone[42]={ 1,1,5,5,6,6,5,4,4,3,3,2,2,1, 5,5,4,4,3,3,2,5,5,4,4,3,3,2, 1,1,5,5,6,6,5,4,4,3,3,2,2,1 }; code unsigned int soundlong[42]={ 1,1,1,1,1,1,2,1,1,1,1,1,1,2, 1,1,1,1,1,1,2,1,1,1,1,1,1,2, 1,1,1,1,1,1,2,1,1,1,1,1,1,2 };

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

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

void main(void) { init_T0(); for(;;) { for(t=0;t


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有