此帖出自stm32/stm8论坛
最新回复
如下图所示,是蜂鸣器与STM32连接的电路图,程序中的“PBeep”就是图中的“BEEP”IO口的宏定义,一般在头文件中进行定义:
#define PBeep PBout(8)
[attach]860506[/attach]
先上网找个谱子,仔细看看,搞定两个数组,一个音调,一个音长。
查看乐谱,如下:
[attach]860505[/attach]
真到了转换简谱到数组的时候,这时就能发现选择儿歌的好处了,所有的音调都在tone[]数组中,也就是说,在低音7到高音5之间。让我们再看一遍这个数组:
// 低7 1 2 3 4 5 6 7 高1 高2 高3 高4 高5 不发音
uc16 tone[] = {247,262,294,330,349,392,440,494,523,587,659,698,784,1000};//音频数据表
#include "beep.h"
int melody[] = {50, 50, 50, 50, 200, 200, 200, 400, 400, 500, 500, 500};
void BEEP_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能A端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIOD3,6
GPIO_SetBits(GPIOB,GPIO_Pin_5);
}
void Sound(u16 frq)
{
u32 time;
if(frq != 1000)
{
time = 500000/((u32)frq);
PBeep = 1;
delay_us(time);
PBeep = 0;
delay_us(time);
}else
delay_us(1000);
}
void Sound2(u16 time)
{
PBeep = 1;
delay_ms(time);
PBeep = 0;
delay_ms(time);
}
void play_successful(void)
{
int id=0;
for(id = 0 ;id < 12 ;id++)
{
Sound2(melody[id]);
}
}
void play_failed(void)
{
int id=0;
for(id = 11 ;id >=0 ;id--)
{
Sound2(melody[id]);
}
}
void play_music(void)
{
// 低7 1 2 3 4 5 6 7 高1 高2 高3 高4 高5 不发音
uc16 tone[] = {247,262,294,330,349,392,440,294,523,587,659,698,784,1000};//音频数据表
//红尘情歌
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)*tone[music]/yanshi;e++){
Sound((u32)tone[music]);
}
}
}
#ifndef __BEEP__H
#define __BEEP__H
#include "sys.h"
#include "stdlib.h"
#include "delay.h"
//定义GPIOB的位地址变量宏,位输入宏,输出宏
#define PBeep PBout(5)
void BEEP_Init(void);
void Sound(u16 frq);
void Sound2(u16 time);
void play_music(void);
void play_successful(void);
void play_failed(void);
#endif
详情
回复
发表于 2024-11-10 00:53
| ||
|
||
此帖出自stm32/stm8论坛
| ||
|
||
此帖出自stm32/stm8论坛
| ||
|
||
| |
|
|
| |
|
|
此帖出自stm32/stm8论坛
点评 | ||
|
||
| |
|
|
| |
|
|
| |
个人签名
在爱好的道路上不断前进,在生活的迷雾中播撒光引 |
|
此帖出自stm32/stm8论坛
| ||
|
||
| |
|
|
| |
|
|
| |
|
|
此帖出自stm32/stm8论坛
| ||
|
||
| |
个人签名
默认摸鱼,再摸鱼。2022、9、28 |
|
| |
|
|
此帖出自stm32/stm8论坛
| ||
|
||
论坛测评队员
EEWorld Datasheet 技术支持
考试大纲1. 考试目的认证HORIZEN MACRO1800和900基站安装调测资格,测试评估基站工程师理论和实践水平。2. 考试分为笔试和现场考 ...
芯片封装 一、DIP双列直插式封装 DIP(DualIn-line Package)是指采用双列直插形式封装的集成电路芯片,绝大多数中小规模 ...
记得《佟林传》里,佟林练的基本功是“绕大树、解皮绳”,然后才练成了什么“鬼影随行、柳叶绵丝掌”。 在 ...
有幸拿到了EEWORLD论坛的LPC1343评估板,实在是一件意外而激励人心的事情。为感谢EEWORLD和NXP,特将学习过程与大家共同分享。也 ...
本帖最后由 alan000345 于 2020-6-20 09:12 编辑 老式的 FM 收音机,从一个频道拨到另一个频道时会听到中间噼里啪啦的噪声。 ...
CC2640 是具有宽电压输入范围(1.8-3.8V)的低功耗蓝牙芯片,通过内部 DCDC 或 LDO 降压 后再供给内部数字内核和电路。因为其宽 ...
521600
系留、空中/水下无人机 这类无人机由地面电源通过系线供电并控制。500V 到 800V 的高压系线传输支持更长、更细的线缆,有助于 ...
以前喇叭的按钮在太阳能板上,按下时不太方便,因此就想修改一下,把按键移动到龙头扶手上。考虑到龙头位置小,也不易固定,最后 ...
首先感谢网友参与 《智能驾驶之激光雷达算法详解》,以下是审核结果。 (1)获得积分奖励的网友,今日发送完毕,注意查收 ...