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

2023-05-16

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<42;t++) 
        {
            t_H=toneH[soundtone[t]];     //提取音调对应的定时器初始值
            t_L=toneL[soundtone[t]];
        	TH0=t_H;		  //给TH0和TL0赋值
        	TL0=t_L;
            TR0=1;              //打开定时器,蜂鸣器发声
            delay1ms(soundlong[t]*500);    //延时soundlong[t]指定的时间长度
            BUZZ=0;             //蜂鸣器不发声,停顿片刻
            TR0=0;
            delay1ms(50);
        }
        delay1ms(2000);
     } 
}

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

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

源码链接

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

51单片机(二十七)—— 蜂鸣器播放音乐 的相关文章

随机推荐

  • C++可变参数使用总结

    可变参数是指函数可以接受不定数量的参数 比如在printf函数 xff0c 如果做日志等功能也会用到 这里总结下可变参数的使用 c语言中的可变参数 先介绍下在c语言中的使用 xff0c c语言也支持可变参数 xff0c 只是需要借助下va
  • 替代notepad++,notepad--介绍及插件cmake编译

    Notepad 43 43 是一个文本编辑器小软件 xff0c 用来替代windows自带的记事本 然而Notepad 43 43 软件的作者太霸道 xff0c 如果你不赞同他的观点 xff0c Notepad 43 43 将会在你的源码里
  • [环境搭建] onlyoffice环境搭建(docker-compose)

    只介绍环境搭建 不介绍集成 一 环境要求 内核 xff1a Linux 操作系统 xff1a centos 或者 ubuntu 容器环境 xff1a docker 容器镜像 xff1a onlyoffice documentserver 二
  • WSL:系统迁移【WSL默认安装在C盘,可以将虚拟机移到任意位置】

    因为虚拟机 xff08 Ubuntu22 04 xff09 默认安装在C盘 xff0c 大量占用系统盘的空间 xff0c 所以迁移到其他盘中 查看安装的虚拟机 wsl l v 关闭所有正在运行的虚拟机 wsl shutdown 对需要迁移的
  • Microsoft 365 Copilot怎么安装,如何下载?

    Microsoft 365 Copilot是一款基于人工智能的数字助手 xff0c 旨在帮助Microsoft 365商业版的用户更轻松地管理其工作流程 它可以提供实时反馈 自动生成报告 优化时间表以及自动化办公任务等功能 xff0c 这些
  • 关于Sublime Text4 _4126

    目录 前言 一 下载安装 下载安装 二 汉化 Install PackageChineseLocalzations 三 激活 进入hexed网站编辑编辑改码另存为 四 运行 successfully 总结 前言 怕以后忘了 xff0c 上操
  • CSDN编写技巧--CSDN中高亮显示代码

    介绍一种好的格式如下 xff1a 实现的方法就是以原代码的形式显示页面 xff0c 然后复制以下代码 xff1a lt div style 61 34 BORDER BOTTOM cccccc 1px dashed BORDER LEFT
  • 去掉jOSN中的转义符

    json返回全都是带 39 39 的 于是要去掉这个反斜杠 但是OC里面的 39 39 是转义符 不能直接用 64 34 34 之类的表示 一顿搜索之后 找到了OC对转义字符的表示方法 如下 a Sound alert b 退格 f For
  • 微软 Win11 一个命令安装 Windows Linux 子系统(WSL)

    在最新的 Windows 11操作系统中 xff0c 你只需运行 wsl exe install 就可以安装运行 WSL 所需的一切 使用 wsl install 微软表示 xff0c 以前设置 WSL 的过程过于复杂 xff0c 涉及到开
  • linux服务器xrdp远程链接密码对了却password failed解决方法

    linux服务器xrdp远程链接密码对了却password failed解决方法 遇到问题问题定位解决参考链接 遇到问题 在win10下用自带的远程连接登陆服务器 xff0c 明明密码对了 xff0c 却无法登陆 xff0c 显示 pass
  • 滤波算法(四)—— 卡尔曼滤波算法

    一 算法介绍 卡尔曼滤波是一个神奇的滤波算法 xff0c 应用非常广泛 xff0c 它是一种结合先验经验 测量更新的状态估计算法 1 状态估计 首先 xff0c 对于一个我们关心的物理量 xff0c 我们假设它符合下面的规律 其中 xff0
  • selenium-Firefox浏览器驱动geckodriver的下载配置

    首先下载Firefox的驱动 xff0c 地址 xff1a geckodriver Mirror 选择最新的版本 xff0c 进入后选择对应的系统下载 xff1a 将下载下来的文件放入到自己python的安装目录中的Scripts文件夹中即
  • 行人检测之HOG——方向梯度直方图(Histogram of Oriented Gradient)

    写在前面的话 HOG 绝对说的是行人检测领域的一个标志性的里程碑 xff0c 虽然 2008 年出现的 DPM DeformablePart Model 方法取得了更好的检测效果 xff0c 但是实时性实在堪忧 xff0c 就算用多线程实现
  • Feedback Network for Image Super-Resolution(SRFBN)---翻译

    attention xff1a 只详细翻译了重点部分 摘要 图像超分辨率 xff08 SR xff09 的最新进展展现了深度学习的力量 xff0c 可以实现更好的重建性能 然而 xff0c 现有的基于深度学习的图像SR方法尚未充分利用人类视
  • UIControlEvents的几种类型值

    在实现响应事件的方法时 xff0c 需要传递响应类型 比如为button添加selector方法 首先 xff0c UIControlEvents有这个几种 xff1a UIControlEventTouchDown 61 1 lt lt
  • 【Rust】Iced GUI库初使用及踩坑——写一个计数器

    该文写于去年8月份 xff0c 目前iced更新到0 7已有些许API改动 xff0c 本文内容已有部分错误 xff0c 但仍有借鉴价值 写在前面 从5月份起 xff0c 我一直在寻找一个可用的 xff0c 稳定的 xff0c 开发者友好的
  • 低成本二进制部署K8S1.26版本集群

    本文以华为云为例 xff0c 低成本二进制方式测试部署K8S集群 xff08 V1 26 1 xff09 温馨提示 xff1a 首次使用公有云一定要注意新用户优惠 xff0c 最好用于购买云服务器 xff0c 长期持有的服务器资源可支持域名
  • kolla-ansible部署Train版openstack(all-in-one)

    本文最后更新于 207 天前 xff0c 其中的信息可能已经有所发展或是发生改变 kolla ansible简介 kolla 的使命是为 openstack 云平台提供生产级别的 开箱即用的交付能力 kolla 的基本思想是一切皆容器 xf
  • Ubuntu20.04云服务器安装配置Jupyter Lab

    前言 Jupyter Lab 是 Jupyter 主打的最新数据科学生产工具 xff0c 是基于Web的交互式开发环境 某种意义上 xff0c 它的出现是为了取代 Jupyter Notebook xff0c 但它也包含了 Jupyter
  • 51单片机(二十七)—— 蜂鸣器播放音乐

    1 实验原理介绍 蜂鸣器是电路中经常使用的发声器件 xff0c 我们一般使用蜂鸣器发出 嘀嘀 的声音 xff0c 用它作为提示音 有没有想过用蜂鸣器还可以播放音乐呢 xff1f 这显然是件很有意思的事情 本文使用蜂鸣器来播放音乐 为了深入了