51单片机控制蜂鸣器播放音乐详解
创作时间:
作者:
@小白创作中心
51单片机控制蜂鸣器播放音乐详解
引用
CSDN
1.
https://m.blog.csdn.net/iFinder00159/article/details/145095984
本文将介绍如何使用51单片机控制蜂鸣器播放音乐。从蜂鸣器的原理开始讲解,详细介绍了有源蜂鸣器和无源蜂鸣器的区别,以及如何通过单片机控制蜂鸣器发出声音。文章还提供了具体的硬件电路图和代码示例,帮助读者理解和实现蜂鸣器发声的功能。
一、原理介绍
蜂鸣器分为有源蜂鸣器、无源蜂鸣器两种。
- 有源蜂鸣器:施加合适的电压之后就会发出特定频率的声音
- 无源蜂鸣器:需要提供特定频率的声音信号,才能发出声音
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 11
const 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 ms
void 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); // 停一段时间
}
}
热门推荐
笔记本应该达到什么配置能轻松跑大数据
只吃草的大猩猩战力有多强?狮子不吃大猩猩,是因为打不过吗?
生辰八字取名改名 八字起名改名
“Feed”一词在生活和科技中的多重含义与应用
四种主流床垫类型大对比:如何选择最适合你的床垫?
美洛昔康对狗狗有哪些作用和功效?有副作用吗?
揭秘噩梦之源:原因、缓解与预防全攻略
硅胶:日常生活中不可或缺的多功能材料及其广泛应用解析
如何准确确定材料价格?这种确定方法的可靠性如何?
个人征信查询结果包含哪些详细信息
俄罗斯发迹史:从莫斯科公国到沙俄帝国的崛起之路
红烧鳗鱼正确做法
无舌苔是怎么回事
世界观与方法论:理论框架与实践应用
起诉后还款怎么处理最好
简历学历顺序的排列
OceanBase学习1:分布式数据库与集中式数据库的差异
NBA公布现役五个位置最佳球员,不得不说,当之无愧
妊娠期血糖难控制?这份专家建议请收好
氢氧化钠使用安全注意事项
小米(Mi) 红米(Redmi)K40 手机Fastboot线刷详细教程
国米全攻全守,战平强大曼城!鼓舞士气,小因轮换策略再升级!
老年人胸闷,就离冠心病不远了?告诫:这几种不适,是心脏在呼救
哔哩哔哩如何匿名观看?全方位保护隐私的技巧指南
碳水是什么?一文读懂碳水化合物的分类、功能与摄入指南
虎式坦克详细数据解析:二战德军重型坦克的巅峰之作
无资质运输危化品?汉中高速交警严查严处
慢性疲劳综合症要做什么检查确诊
人类社会是熵增系统吗?熵增理论为什么让好多人一下子就领悟了?
做到这四点,轻松实现清淡饮食