龙芯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.学习链接
三、代码
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:有源蜂鸣器播放音乐例程
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/73680.html