【51单片机】03 蜂鸣器-播放音乐

蜂鸣器-播放音乐

  • 一、原理介绍
    • 1.硬件电路
  • 二、练习
    • 1.让蜂鸣器发声
    • 2.尝试演奏小星星

一、原理介绍

在这里插入图片描述
蜂鸣器分为有源蜂鸣器、无源蜂鸣器两种。
有源蜂鸣器:施加合适的电压之后就会发出特定频率的声音
无源蜂鸣器:需要提供特定频率的声音信号,才能发出声音

1.硬件电路

在这里插入图片描述
这里的ULN2003芯片是提高单片机驱动蜂鸣器能力的,可以暂时不用关注
通过原理图可以知道,让P25(P15)管脚交替的输出高低电平就可以让蜂鸣器发出声音

二、练习

1.让蜂鸣器发声

无源蜂鸣器需要输入一个频率才能发生,这里通过改变P1^5引脚的高低电平来使蜂鸣器发声
(有些板子好像是P2^5,这个可以实际测试下)

#include "reg52.h"sbit BEEP = P1^5;	 void delay_10us(int time_us) {while(time_us--);
}void start_beep(int fre) {int delay = 90;while(delay){BEEP = 0;delay_10us(fre);	  BEEP = 1;delay_10us(fre);delay--;}
}void main() {while(1) {start_beep(300);start_beep(600);}
}

2.尝试演奏小星星

参考了两篇博客将音高和频率对应的数据先生成
简书:音高、频率速查
CSDN:音符频率算法
先用C写了计算音高的实例

#include <stdio.h>
#include <math.h>#define FRE_COL 8
#define FRE_ROW 11const float STABDARD_FRE = 440.0;
// C C# D D# E F# G G# A A# B
float freMap[FRE_COL][FRE_ROW];  //  11个为一组算出音高-频率对应关系
float timeMap[FRE_COL][FRE_ROW];  //  11个为一组算出音高-周期对应关系  t=1000/fre  msvoid initFre() {for(int i = 0;i < FRE_COL;i++) {for(int j = 0;j < FRE_ROW;j++) {int index = (i * FRE_ROW) + j + 60;float fre = (STABDARD_FRE / 32.0) * pow(2, (index - 9.0) / 12.0);freMap[i][j] = fre;timeMap[i][j] = 1000 / fre;}}
}void printFre() {for(int i = 0;i < FRE_COL;i++) {for(int j = 0;j < FRE_ROW;j++) {// printf("%lf  ", freMap[i][j]);printf("%lf  ", timeMap[i][j]);}printf("\n");}
}int main() {initFre();printFre();return 0;
}

但是由于单片机内存限制,放不下这么大的数组,只能改成int数组,来存储声音数据
最终的实现代码如下

#include <reg52.h>
#include <intrins.h>sbit BEEP = P1^5;// 三组音高 1-7
int usTimeArr[3][7] = {{382, 340, 303, 286, 255, 227, 214},{202, 180, 160, 151, 135, 120, 113},{56,  50,  45,  42,  37,  33,  31}
};void delay_100us() {unsigned char i;_nop_();i = 26;while (--i);
}void delay_me(int time) {while(--time) {delay_100us();}
}void start_beep(int time, float delay) {while(--delay){BEEP = 0;delay_me(time/2);BEEP = 1;delay_me(time/2);	}
}void main() {int note[14] = {1, 1, 5, 5, 6, 6, 5, 4, 4, 3, 3, 2, 2, 1};	  //  小星星简谱int time[14] = {1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2};	  //  每个音的时while(1) {int i = 0;while(i < 14) {							   start_beep(usTimeArr[2][note[i] - 1], time[i] * 121);i++;}start_beep(5000, 5);	  //  停一段时间}
}

源码+实验程序
学习视频来源:B站-普中官方视频

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/68035.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode热题100——NO.206反转链表——JAVA

一、题目描述 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 二、题目分析 双指针操作&#xff1a;prev指针&#xff0c;curr指针&#xff1b; 对单链表的理解&#xff1a;包含属性&#xff08;成员变量&#xff09;和方法&#xff1…

30_Redis哨兵模式

在Redis主从复制模式中,因为系统不具备自动恢复的功能,所以当主服务器(master)宕机后,需要手动把一台从服务器(slave)切换为主服务器。在这个过程中,不仅需要人为干预,而且还会造成一段时间内服务器处于不可用状态,同时数据安全性也得不到保障,因此主从模式的可用性…

汽车基础软件AutoSAR自学攻略(四)-AutoSAR CP分层架构(3) (万字长文-配21张彩图)

汽车基础软件AutoSAR自学攻略(四)-AutoSAR CP分层架构(3) (万字长文-配21张彩图) 前面的两篇博文简述了AutoSAR CP分层架构的概念&#xff0c;下面我们来具体到每一层的具体内容进行讲解&#xff0c;每一层的每一个功能块力求用一个总览图&#xff0c;外加一个例子的图给大家进…

51单片机——定时器中断(重点)

STC89C5X含有3个定时器&#xff1a;定时器0、定时器1、定时器2 注意&#xff1a;51系列单片机一定有基本的2个定时器&#xff08;定时器0和定时器1&#xff09;&#xff0c;但不全有3个中断&#xff0c;需要查看芯片手册&#xff0c;通常我们使用的是基本的2个定时器&#xff…

【STM32-学习笔记-1-】GPIO

文章目录 GPIOⅠ、GPIO函数Ⅱ、GPIO_InitTypeDef结构体参数①、GPIO_Mode②、GPIO_Pin③、GPIO_Speed GPIO Ⅰ、GPIO函数 // 将指定的GPIO端口寄存器重置为默认值 void GPIO_DeInit(GPIO_TypeDef* GPIOx);// 将GPIO的备用功能寄存器重置为默认值 void GPIO_AFIODeInit(void);…

LeetCode热题100-合并两个有序链表【JavaScript讲解】

题目&#xff1a; 题解&#xff1a; 我们目前已经知道两条链表都是有序链表&#xff0c;我们就可以通过迭代的方法实现上述问题。当list1和list2都不是空链表时&#xff0c;判断list1和list2哪个头节点的值更小&#xff0c;将较小的值添加到结果里&#xff0c;被添加到结果里的…

关于2025年信息技术行业的几点思考

2024年对每一位信息技术从业者而言&#xff0c;无疑是一个充满挑战的年份&#xff0c;尤其在公司层面&#xff0c;需求的减少尤为显著。外包企业几乎面临倒闭的边缘。面对经济周期的调整&#xff0c;无论是公司还是个人&#xff0c;都难以完全避免受到其影响。以下是我对企业和…

Artec Leo 3D扫描仪与Ray助力野生水生动物法医鉴定【沪敖3D】

挑战&#xff1a;捕获大型水生哺乳动物&#xff08;如鲸鱼&#xff09;的数据&#xff0c;搭建全彩3D模型&#xff0c;用于水生野生动物的法医鉴定、研究和保护工作。 解决方案&#xff1a;Artec Eva、Artec Space Spider、Artec Leo、Artec Ray、Artec Studio、CT scans 效果&…

HBuilderX打包ios保姆式教程

1、登录苹果开发者后台并登录已认证开发者账号ID Sign In - Apple 2、创建标识符&#xff08;App ID&#xff09;、证书&#xff0c;描述文件 3、首先创建标识符&#xff0c;用于新建App应用 3-1、App的话直接选择第一个App IDs&#xff0c;点击右上角继续 3-2、选择App&#x…

Android DataBinding 结合 ViewModel的使用

Android DataBinding 结合 ViewModel的使用 一、build.gradle引入对应的依赖 在build.gradle&#xff08;app模块&#xff09;里引入依赖&#xff0c;然后Sync Now一下&#xff1a; android {​viewBinding {enabled true}dataBinding {enabled true}} 完整的build.gradle代…

动植物基因表达调控

1&#xff0c; on and off状态 以及表达的量 2&#xff0c; 基因调控的生物学影响&#xff1f; 超过400多种细胞类型&#xff0c;数目上37万亿 不是所有的基因都表达 为什么多核真核细胞需要基因调控&#xff1f; 单个细胞往多个细胞逐渐进化的过程&#xff0c;形成复杂的…

2024年度漏洞态势分析报告,需要访问自取即可!(PDF版本)

2024年度漏洞态势分析报告&#xff0c;需要访问自取即可!(PDF版本),大家有什么好的也可以发一下看看

acwing-3194 最大的矩形

acwing-3194 最大的矩形 这个题程序设计课上有讲过&#xff0c; 平民算法&#xff0c;时间复杂度在 O ( n 2 ) O(n^2) O(n2) // // Created by HUAWEI on 2024/10/28. // #include<iostream>using namespace std;const int Max_size 1e4 20;int N; int h[Max_size];…

【数据结构】树的定义

在计算机科学中&#xff0c;树&#xff08;Tree&#xff09;是一种重要的基础数据结构&#xff0c;广泛应用于许多领域&#xff0c;如文件系统的目录结构、数据库的索引、编译器的语法树、人工智能的决策树等。理解树的基本概念和术语&#xff0c;对于学习计算机科学及其相关技…

三个shell脚本

1、shell 脚本写出检测 /tmp/size.log 文件如果存在显示它的内容&#xff0c;不存在则创建一个文件将创建时间写入。 测试结果&#xff1a; 2、写一个 shel1 脚本,实现批量添加 20个用户,用户名为user01-20,密码为user 后面跟5个随机字符。 3、编写个shell脚本将/usr/local 日录…

读书笔记--共享服务中心建设原则

最近阅读了《企业IT架构转型之道》记录和思考如下&#xff0c;供大家学习参考。随着企业的数字化转型推进&#xff0c;很多企业开始从原来的SPA模式应用转变为平台技术应用&#xff0c;比如阿里巴巴的共享服务中心&#xff0c;传统企业的统一认证的share服务等等。可以说&#…

【Ubuntu与Linux操作系统:五、文件与目录管理】

第5章 磁盘存储管理 5.1 Linux磁盘存储概述 磁盘存储是Linux系统存储数据的重要组件&#xff0c;它通过分区和文件系统组织和管理数据。Linux支持多种文件系统&#xff0c;如ext4、xfs和btrfs&#xff0c;并以块的形式管理存储设备。 1. 分区与文件系统&#xff1a; 分区&am…

DDD - 微服务设计与领域驱动设计实战(上)_统一建模语言及事件风暴会议

文章目录 Pre概述业务流程需求分析的困境统一语言建模事件风暴会议什么是事件风暴&#xff08;Event Storming&#xff09;事件风暴会议 总结 Pre DDD - 软件退化原因及案例分析 DDD - 如何运用 DDD 进行软件设计 DDD - 如何运用 DDD 进行数据库设计 DDD - 服务、实体与值对…

【C语言系列】函数递归

函数递归 一、递归是什么&#xff1f;1.1尾递归 二、递归的限制条件三、递归举例3.1举例一&#xff1a;求n的阶乘3.2举例二&#xff1a;顺序打印一个整数的每一位 四、递归与迭代4.1举例三&#xff1a;求第n个斐波那契数 五、拓展学习青蛙跳台问题 一、递归是什么&#xff1f; …

css盒子水平垂直居中

目录 1采用flex弹性布局&#xff1a; 2子绝父相margin&#xff1a;负值&#xff1a; 3.子绝父相margin:auto&#xff1a; 4子绝父相transform&#xff1a; 5通过伪元素 6table布局 7grid弹性布局 文字 水平垂直居中链接&#xff1a;文字水平垂直居中-CSDN博客 以下为盒子…