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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

龙芯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:有源蜂鸣器播放音乐例程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

嵌入式up

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

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

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

打赏作者

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

抵扣说明:

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

余额充值