STM32学习过程记录8——蜂鸣器

2023-05-16

零之前言

最近想用无源蜂鸣器来播放曲子,但是看了好多博客讲的都是马马虎虎,没有讲的太清楚,所以我只好自己重新学习了一下,音乐发声的原理(因为硬件基础够啦QAQ)和简谱。

一.发声原理

原理就是这个:人之所以能听见声音,是因为声音在震动。那么不同的震动频率带给我们的就是不同的声调。所以我们只需要知道每个音调的发声频率就可以用单片机模拟出它的音调。

二.频率与简谱

1.频率

这是一张标准的音高与频率的关系对照表:
在这里插入图片描述
我们只需要记住这一点,其中的就是八度音阶,也就是我们的XX调,比如你熟悉的G大调就是我们的音级,也就是我们熟悉的do re mi
我们可以简单的理解为:有很多很多台阶,我们认为规定8个台阶为一层。
我们在演奏的时候会规定基准调,就类似于零重力势能点、零电位、零电势点的选择。假设我们规定了某个调是基准调,那么这个简谱里的1就是这个调,然后234依次提高。比如我们规定了440Hz是基准调,那么这个谱子里的2就是466Hz、3就是493Hz……

2.简谱

如何认识简谱才是最难的。建议大家百度仔细了解,如果来不及仔细了解就看这个20多分钟的视频:【零基础学乐理】第一课:什么是简谱。如果更来不及就看我简单说说吧。
放出一张我要用来讲解的简谱:在这里插入图片描述

①音调


音调如同上图,假设我们的1上面有一个点,那它就比没有点的1高八阶(一度)。如果下面有一个点,那它就低一度。比如假设我们的的C调do 1 是261.6Hz 那么 它头上有个点就是523.2Hz,它下面一个点就是130.8Hz。两个点就再高(低)一度。

②调号

我们简谱左上角会有一个类似于1=D1=C这样的东西是用来确定基准调的。
假设我们的1=C,那么我们的基准调就是261Hz 。1=D 就是294Hz。所以我们不懂乐理的外行人需要根据左上角的标号百度一下我们的基准调。而且有些特殊的基准调对于某些音符需要升降音,所以建议百度。

③节拍+音符

节拍数就是我们左上角"分数",比如2/4我们读作"以一个4分音符为1拍,每个小节两拍"。
每一节结束后因该是有一段小竖线作为我们的小节线。
音符就是每一个数字,但是数字的标记不同,就代表他发的音的长短不同。例如:1 这是一个4分音符,假设它发1秒的音;1就是8分音符,它发0.5秒的音;1-就是2分音符,它发2秒的音。根据一个音符下的-或者 的数量不同,依次加倍减半。
例如小红帽:它是2/4拍的。我们每一个小节算出来应该是2个4分音符。所以我们来算算?
1 2 3 4 | 5 3 1 | 你看满不满足这个规则?

三.写代码

1.代码思路:

一秒钟震动很多次,那么一次我们需要的时间就是1/频率。那么我们就算出了其周期。那么我们让一半周期高电平,一半周期低电平,我们就得到了其一次震动。我们再用周期x频率=1s就可以控制每个调的时间。

for(i = 0; i < hz; i++) //这是一秒一个音 此时整乘除hz可以扩大缩小一拍的时间 
{
	u32 time = 1000000 / 2 / hz;

	buzzer(); //use the buzzer
	delay_us(time);	
	not_buzzer(); // not use the buzzer
	delay_us(time);	
}

2.扒谱

我们需要:一个音符的音调,的一个音符的时间,这个音调的频率。
还是以小红帽的前五小节为例:
在这里插入图片描述
它是 1 = D 那么我们按1 2 3 4 5 6 7 i来记录频率:494 523 587 659 698 784 880 988
时间:==尤其是时间,我们虽然是4分音符为1拍,但是我们里面有8分音符,所以我们因该找全曲最快的音符。==此小段那就是8分音符为1,4分音符就为2了呗。
三要素找齐了:
包括音调的所有频率:293 330 350 392 440 494 523 587(1-8)
乐谱音调:1 2 3 4 5 3 1 8 6 4 5 5 3 1 2 3 4
音调对应时间(与上面一一对应)1 1 1 1 2 1 1 1 1 1 1 1 2 1 1 1 1

3.真代码

#include "stm32f10x.h"
#include "sys.h"

u32 play_hz[] = {0, 293, 330, 350, 392, 440, 494, 523, 587};
u32 play_tone[] = {1, 2, 3, 4, 5, 3, 1, 8, 6, 4, 5, 5, 3, 1, 2, 3, 4};
u32 play_time[] = {1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1}; 

void play(u32 sta)  // 这是播放函数
{
	u32 hz, tone;
	u32 i, j;
	tone = play_tone[sta]; 		//由当前播放的位置获取声调
	hz = play_hz[tone]; 		//由声调获取频率
	for(j = 0; j < play_time[sta]; j++)
	{
		//通过控制下面的i < hz 右侧的值来控制单个音节的播放时间
		for(i = 0; i < hz / 3; i++) // 循环体内运行一次的周期=1s÷频率,所以整个循环体就是1s,就是一个音节1s
		{
			GPIO_ResetBits(GPIOA, GPIO_Pin_4);
			delay_us(500000 / hz);
			GPIO_SetBits(GPIOA, GPIO_Pin_4);
			delay_us(500000 / hz);	
		}
	}
}

int main(void)
{ 
	u32 a = 0;
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); 
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;	         
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    
	GPIO_Init(GPIOA, &GPIO_InitStructure);				  	 
	
	delay_init();//这个函数自备
	
	while(1)
	{
		for(a = 0; a < sizeof(play_tone) / sizeof(play_tone[0]); a++)
		{
			play(a);
		} 

	}
}

四.就酱

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

STM32学习过程记录8——蜂鸣器 的相关文章

  • Kylin接入外部Jdbc Mysql数据源

    前言 Kylin目前不仅仅支持Hive作为数据源构建cube xff0c 也可以支持使用外部jdbc作为数据源进行构建 xff0c 比如使用MySQL数据源的时候会让我们下载sqoop安装包 xff0c 本质上是使用sqoop全量同步我们要
  • SpringBoot有关数组对象转JSON

    文章目录 前言一 数据的插入二 查询数据1 插入数据2 查询数据 总结 前言 比如 xff0c 有个List lt AlarmInfo gt 对象需要存储到mysql中 xff0c 我们可以存储为varchar类型 xff0c 也可以存储为
  • 分页中遇到的一个传值问题

    文章目录 前言一 传入Integer值参数二 传入String值参数 前言 目的 xff1a 在前端传入一个参数对所选的结果进行分页过滤 xff0c 这应该是非常常见的一个需求吧 xff0c 但是如何传Integer值使用mybatis p
  • Python2.7升级版本记录

    文章目录 前言一 环境二 升级步骤1 安装各类依赖库2 编译3 编译安装4 添加软连接5 修改yum安装6 升级pip7 验证 参考 前言 python2 x版本已经废弃了 xff0c 有些软件安装的是会遇到如下提示 xff0c Sorry
  • MySQL笔记

    MySQL Version 5 7 25 一 常见面试问题汇总 1 select for update会锁表还是锁行 如果是纯select是不会加锁的 xff0c 但是这里会加锁 xff0c 而且还是悲观锁 xff0c 但是具体锁表还是锁行
  • mybatis-plus最好用的逻辑删除

    文章目录 前言一 逻辑删除1 添加全局配置2 设置实体中的字段 总结 前言 为了防止人为的因素导致误删除无法恢复的情况所以我们需要逻辑意义上的删除 xff0c 而通常最简便的方式就是打标记 xff0c 这个步骤可以由mybatis plus
  • IDEA Git常用操作

    前言 Git的操作可以使用命令行 xff0c 当然为了偷懒熟练使用IDEA的git未尝不是一个好办法 xff01 一 当前修改的分支想要暂存怎么办 xff1f 这个需要是因为当前修改的分支还没有修改完 xff0c 突然有另外的需求需要去处理
  • Ubuntu14.04安装build-essential失败,包依赖问题如何解决?

    正在读取软件包列表 完成 正在分析软件包的依赖关系树 正在读取状态信息 完成 有一些软件包无法被安装 如果您用的是 unstable 发行版 xff0c 这也许是 因为系统无法达到您要求的状态造成的 该版本中可能会有一些您需要的软件 包尚未
  • 关于需求沟通的一点思考

    作为一名程序员 xff0c 可能会来自各方的需求沟通问题 xff0c 而且更多的时候是横插进来的任务 xff0c 每个人都说这个任务优先级高 xff0c 尽快做 xff0c 是不是有点焦头烂额了 xff0c 马上就开始啪啪敲代码了吗 xff
  • Go同目录下多个main声明会导致编译失败的问题

    问题 xff1a Go同目录下多个main声明会导致编译失败的问题 main redeclared in this block 表示在同级目录下main重复声明 xff0c 在学习中可以依照不同的文件夹进行分割 xff0c 也可以按照如下方
  • 嵌入式debian没有lsusb命令解决

    问题 bash lsusb command not found 解决
  • Python学习笔记-PyQt6状态栏

    QMainWindow有自带的状态栏 xff0c 可以通过statusBar 方法获取自身的状态栏 xff0c 或者通过实例化QStatusBar类 xff0c 然后使用QMainWindow setStatusBar 方法将状态栏添加到主
  • 未完成的IT路停在回车键---2014年末总结篇

    时间都去哪儿了 xff1f 一晃而过 xff0c 越来越能体会到这个词的真实感 特别是过了二十岁 xff0c 这种感觉越来越深刻 xff0c 越来越强烈 xff0c 犹如小编做公交车的时候一直向后排排倒的香樟树 xff0c 还记得有首歌叫时
  • 这一次,VR离我们真的很近

    从高考作文开始 今年号称是VR元年 xff0c 虽然目前VR还没能像手机一样走进千家万户 xff0c 但关于VR设备的关讨论是层出不穷 而今年高考 xff0c 浙江省的作文题就与VR相关 网上购物 视频聊天等在我们生活中越来越普及 有人预言
  • 补.从零开始学习C语言--scanf的%c前为什么加空格

    include lt stdio h gt int main void int i char ch scanf 34 d 34 amp i scanf 34 c 34 amp ch 这行的 C前有个空格 printf 34 i 61 d n
  • svn status 返回值详解

    转http blog linuxphp org archives 652 svn 是在提交前查看本地文本和版本库里面的文件的区别 返回值有许多种具体含义如下 xff1a url 61 L abc c svn已经在 svn目录锁定了abc c
  • ubuntu杀毒软件clamAV运维笔记

    1 安装 xff1a apt get install clamav 2 守护进程安装 xff1a apt get install clamav daemon 3 更新病毒库 xff1a freshclam 或手动下载安装 cvd文件 备注
  • shell 教程一:变量,字符串,传参

    一 xff0c hello shell strong span class pln style color rgb 72 72 76 vi hello span span class pun style color rgb 147 161
  • 树莓派Ubuntu20.04创建虚拟内存文件并设置开机自动启用

    目录 一 检查有没有虚拟内存 二 创建虚拟内存文件并设置权限 三 设置并激活虚拟内存文件 四 设置开机自动启用虚拟内存 五 重启后检测虚拟内存是否正常启用 一 检查有没有虚拟内存 树莓派Ubuntu20 04默认没有虚拟内存 xff0c 可
  • 随着稻香河流继续奔跑 ——致2016

    写在前面 xff0c 2016于我而言 xff0c 是丰收的一年 这一年 xff0c 我收获了能力与本领 xff0c 收获了美丽与自信 xff0c 收获了欣赏和肯定 2017 xff0c 我会不忘来时路 xff0c 继续前行 2016的驿站

随机推荐

  • 浅谈strtok函数的使用心得

    经常使用strtok函数进行文本操作 xff0c 其实他是一个很好用的函数 xff0c 很方便 xff0c 能够简单的实现一行文本的切分操作 xff0c 总结一下使用心得 函数原型char strtok char s const char
  • 局域网内Windows使用RealVNC远程连接CentOS6.5桌面

    1 进入root终端 xff0c 检查是否安装VNC server xff1a rpm q tigervnctigervnc server 2 如果未安装VNC server xff0c 则 xff1a yum install ytiger
  • CentOS7安装tigerVNC

    一 首先系统是已经安装了图形界面 并默认是启动到图形界面 xff0c 如果你的系统没安装图形界面 xff0c 就请给系统安装图形界面 xff1a yum y span class token function groups span spa
  • openstack主要版本亮点

    openstack主要版本亮点 1 Stein 在Stein新增的几十项功能特性中 xff0c 主要亮点有三 xff1a 容器功能的强化 用于支持5G 边缘计算和网络功能虚拟化 xff08 NFV xff09 用例的网络升级功能 资源管理和
  • OpenStack 学习之 OVN : L2网络 ( Logical switches 逻辑交换机)

    OVN Manual install amp Configuration Open vSwitch 官网 参考 OVN学习 xff08 一 xff09 OVN实战一之GNS3操作指南及OVN入门 简单理解和知识 按照 OVN Manual
  • linux vncserver设置及配置自动启动

    VNC 服务端 vncserver 启动VNC vncserver kill num num一般从1开始 因为0被x server占用了 vncpasswd 设置vnc连接密码 要使用VNC图形界面修改 vnc xstartup配置文件中末
  • 【125】Linux 中 ps -ef|grep和ps、grep详解

    一 ps ef grep详解 xff08 原文见公众号python宝 xff09 ps命令将某个进程显示出来 PS是LINUX下最常用的也是非常强大的进程查看命令 grep命令是查找 xff0c 是一种强大的文本搜索工具 xff0c 它能使
  • Pycharm Debug调试(纯干货)

    内容目录 xff08 原文见公众号python宝或www xmmup com xff09 一 打断点二 代码调试三 界面小图标介绍四 控制台介绍 数字转换为大写人民币 import sys import io sys stdout 61 i
  • 【217】#!/usr/bin/env 的意义

    题目部分 xff08 原文见公众号 xff1a python宝 xff09 python宝 https mp weixin qq com mp profile ext action 61 home amp biz 61 MzU5NjIyOT
  • 使用Scrum进行敏捷项目管理

    Scrum是一种敏捷方法 xff0c 旨在指导团队进行产品的迭代和增量交付 通常被称为 敏捷项目管理框架 xff0c 其重点是使用经验过程 xff0c 使团队能够快速 xff0c 有效 xff0c 有效地做出改变 传统的项目管理方法确定了需
  • 【246】Python -继承(父类、子类、super)

    题目部分 xff08 原文见公众号 xff1a python宝 xff09 python宝 xff1a https mp weixin qq com mp profile ext action 61 home amp biz 61 MzU5
  • 【250】Python 的基本数据类型

    题目部分 xff08 原文见公众号 xff1a python宝 xff09 python宝 xff1a https mp weixin qq com mp profile ext action 61 home amp biz 61 MzU5
  • 【252】Python3 常见异常和处理方法

    题目部分 xff08 原文见公众号 xff1a python宝 xff09 python宝 xff1a https mp weixin qq com mp profile ext action 61 home amp biz 61 MzU5
  • 500 : Internal Server Error(jupyter)

    如需转发 xff0c 请注明出处 xff1a 小婷儿的python https www cnblogs com xxtalhr p 10739036 html 一 报错 jupyter notebook能打开目录页 xff0c 但是打不开i
  • 聚类总结(二)聚类性能评估、肘部法则、轮廓系数

    文章目录 一 聚类K的选择规则1 1 肘部法则 Elbow Method1 2 轮廓系数 Silhouette Coefficient 二 聚类性能评估2 1 外部评估 xff08 external evaluation xff09 2 1
  • keil工程的文件

    打开工程前 tree span class token punctuation span project span class token punctuation span uvoptx project span class token p
  • vmware 中减少硬盘vmdk大小

    一般的话 span class token punctuation span 我用一个文件代表所有的磁盘上 span class token punctuation span xxx span class token punctuation
  • 各种 RTOS 对比

    商业解读 RTOS种类是否开源是否免费厂家官网uclinux 并入linux mainline 是是linux基金会linux orgucosII是是Micriumweston embeddeducosIII是是Micriumweston
  • 使用adb命令取出手机中已安装的apk

    1 查看手机中安装的apk列表 xff1a adb shell pm list package 2 根据包名找出apk在内部存储空间的路径 xff1a adb shell pm path com baicells voip 3 使用adb
  • STM32学习过程记录8——蜂鸣器

    零之前言 最近想用无源蜂鸣器来播放曲子 xff0c 但是看了好多博客讲的都是马马虎虎 xff0c 没有讲的太清楚 xff0c 所以我只好自己重新学习了一下 xff0c 音乐发声的原理 xff08 因为硬件基础够啦QAQ xff09 和简谱