龙芯1B:有源蜂鸣器播放音乐例程

本文介绍如何使用龙芯1B的有源蜂鸣器播放音乐,包括理解乐谱、控制蜂鸣器发声的技术细节及实现代码。通过调整延时时间和输出频率实现了简单的音乐播放功能。

龙芯1B:有源蜂鸣器播放音乐例程

前言

之前也写了两种有源蜂鸣器的鸣叫了,这里咱们就研究一下有源蜂鸣器如何唱歌,其实最好的是无源蜂鸣器,因为无源蜂鸣器准确控制蜂鸣器的频率,故而音调可以准确的控制住。
在此谢谢各位的关注了,大家的关注是我更新的持久动力!


一、蜂鸣器唱歌的关键?

关键在于首先能看得懂乐谱!我表示我刚开始学的时候是真的看不懂!!!
在这里插入图片描述
大家有兴趣的也可以自学一下。

二、开发步骤

1.步骤

首先做一个可变时间的延时开控制发声,关于延时可以使用定时器来做,但是这里为了简便,就是用了一个延时来完成。延时的时间长短可以改变声音的频率。但是如果要播放频率变化特别快的音乐,比如下面的《红尘情歌》,必须控制输出电流大小,直接连接单片机IO口是不行的,加一个100K欧姆的电阻可以听出来,但是声音特别小,不适合做提示。所以,定义了一个简单的提示音数组music完成功能。

此处的想法来源于百度,各个博主之间取长补短而来!!!不过自己的想法也是如此的。但是龙芯是没有定时器的,所以我们要另觅蹊径。

2.乐理知识

音符和频率的对应关系:
*音符频率(Hz)低1 DO262#1 DO#277低2 RE294#2 RE#311低3 MI330低4 FA349#4 FA#370低5 SO392#5 SO#415低6 LA440#6466低7 SI494中1 DO523#1 DO#554
节拍有了音符,也就是知道了这个音怎么发音,那么要想写出一个乐谱,还要知道,这个音发多长时间,这就引出了节拍的概念。

3.学习链接

stm32有源蜂鸣器学习链接

三、代码

buzzer.c 代码如下:

#include "src/buzzer.h"
#include <stdio.h>
#include "string.h"
#include "math.h"

#include "ls1b.h"
#include "mips.h"
#include "ns16550.h"
#include "ls1b_gpio.h"
#include "ls1x_pwm.h"



#define buzzer_gpio 46

void Buzzer_Init(void)
{
    gpio_enable(buzzer_gpio,DIR_OUT);
    gpio_write(buzzer_gpio,0);
}

void Sound(u16 frq)
{
	u32 time;
	if(frq != 1000)
	{
		time = 500000/((u32)frq);
		gpio_write(buzzer_gpio,1);
		delay_us(time);
		gpio_write(buzzer_gpio,0);
		delay_us(time);
	}else{
	    gpio_write(buzzer_gpio,0);
	    delay_us(1000);
    }
		
}

void play_music(void)
{
	//              低7  1   2   3   4   5   6   7  高1 高2 高3 高4 高5 不发音
	u16 tone[] = {247,262,294,330,349,392,440,294,523,587,659,698,784,1000,1047,1175,1319,1397,1568,1760,1976};//音频数据表
	//红尘情歌
	u8 music[]=
            {5,5,6,8,7,6,5,6,13,13,//音调
                5,5,6,8,7,6,5,3,13,13,
                2,2,3,5,3,5,6,3,2,1,
                6,6,5,6,5,3,6,5,13,13,

                5,5,6,8,7,6,5,6,13,13,
                5,5,6,8,7,6,5,3,13,13,
                2,2,3,5,3,5,6,3,2,1,
                6,6,5,6,5,3,6,1,

                13,8,9,10,10,9,8,10,9,8,6,
                13,6,8,9,9,8,6,9,8,6,5,
                13,2,3,5,5,3,5,5,6,8,7,6,
                6,10,9,9,8,6,5,6,8};
	u8 time[] =
                {2,4,2,2,2,2,2,8,4, 4, //时间
                2,4,2,2,2,2,2,8,4, 4,
                2,4,2,4,2,2,4,2,2,8,
                2,4,2,2,2,2,2,8,4 ,4,

                2,4,2,2,2,2,2,8,4, 4,
                2,4,2,2,2,2,2,8,4, 4,
                2,4,2,4,2,2,4,2,2,8,
                2,4,2,2,2,2,2,8,

                4, 2,2,2, 4, 2,2,2, 2,2,8,
                4, 2,2,2,4,2,2,2,2,2,8,
                4, 2,2,2,4,2,2,5,2,6,2,4,
                2,2 ,2,4,2,4,2,2,12};
	u32 yanshi;
	u16 i,e;
	yanshi = 10;
	for(i=0;i<sizeof(music)/sizeof(music[0]);i++){
		for(e=0;e<((u16)time[i])*tone[music[i]]/yanshi;e++){
			Sound((u32)tone[music[i]]);
		}
	}
}

总结

源码链接:龙芯1b:有源蜂鸣器播放音乐例程

### 有源蜂鸣器与无源蜂鸣器的区别及工作原理 #### 1. **定义** - **有源蜂鸣器**是指内部集成了振荡电路的蜂鸣器,只需提供直流电源即可发出固定频率的声音[^1]。 - **无源蜂鸣器**则不包含内置振荡电路,需要外部信号发生器来驱动才能发声[^2]。 #### 2. **工作原理** - **有源蜂鸣器**: 内部已经设计好固定的震荡频率,因此只需要接入合适的电压(通常是5V),就能按照预设频率振动膜片从而发声。这种类型的蜂鸣器通常用于简单的报警提示场景[^3]。 - **无源蜂鸣器**: 需要由外部微控制器或其他设备生成特定波形(如方波)并通过改变占空比或者周期调整输出音频频率[^4]。它能够产生更丰富的音调变化,适合复杂音乐播放或多种不同警示音需求的应用场合。 #### 3. **主要区别** | 特性 | 有源蜂鸣器 | 无源蜂鸣器 | |----------------|------------------------------------|-----------------------------------| | **驱动方式** | 只需供电即可 | 需要PWM信号输入 | | **控制难度** | 简单 | 较复杂 | | **灵活性** | 发声单一 | 支持多频段调节 | | **功耗情况** | 相对较高 | 更节能 | #### 示例代码对比 对于两种不同类型蜂鸣器的操作方法如下: ##### (一)有源蜂鸣器操作示例 ```cpp const int buzzerPin = 8; void setup(){ pinMode(buzzerPin,OUTPUT); } void loop(){ digitalWrite(buzzerPin,HIGH); // 开启蜂鸣器 delay(1000); digitalWrite(buzzerPin,LOW); // 关闭蜂鸣器 delay(1000); } ``` ##### (二)无源蜂鸣器操作示例 ```cpp const int buzzerPin = 8; int frequency = 1000; void setup(){ pinMode(buzzerPin,OUTPUT); } void loop(){ tone(buzzerPin,frequency); // 设定频率为1kHz delay(1000); noTone(buzzerPin); // 停止发声 delay(1000); } ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式up

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值