硬件部分
蜂鸣器介绍-toc" style="margin-left:40px;">蜂鸣器介绍
驱动电路
ULN2003
乐理部分
音符
对比音符和频率
代码部分
运行结果
随着孤独的勇敢者最近成为孩子们的接头密码,他们有了用单片机播放孤独的勇敢者的想法。接下来,让我们来看看具体的实现和效果展示!
硬件部分
蜂鸣器介绍
首先,我们51单片机的蜂鸣器来实现,先介绍一下蜂鸣器,如下图所示!
- 蜂鸣器是一种将电信号转换为声信号的装置,通常用于产生设备的按键声、报警声等提示信号
- 蜂鸣器按驱动方式分为有源蜂鸣器和无源蜂鸣器
- 有源蜂鸣器:内部有自己的振荡源,将正负极连接到直流电压频率固定
- 无源蜂鸣器:内部无振荡源,控制器需要提供振荡脉冲才能发出声音,调整振荡脉冲的频率,发出不同频率的声音
之前在STM32上的蜂鸣器是有源蜂鸣器。如果频率固定,只能发出声音。我们51单片机上的蜂鸣器属于无源蜂鸣器,需要调整频率,发出不同频率的声音。
驱动电路
之前的32是由三极管驱动的,可以放大信号(如果不清楚,可以去32笔记)。51单片机由集成电路驱动(ULN2003),让我们简单介绍一下!
ULN2003
确实可以简单理解为一个放大电路,因为内部有一个非门,导致给1就有驱动能力(输出0,蜂鸣器才导通,所以才会响),但给0却无驱动能力(高阻态)。
乐理部分
接下来是单片机最难的部分,乐理部分,这部分我不是特别清楚,如果有错误也希望指出。
首先,每8组(C~B),也就是哆啦啦西,分为四组,每组比上一组高8度。黑键和白键相差半个音调,白色和白色相差一个音调。图中对应的简谱对应的音调也有对应的关系,所以不会一一举出。但要介绍升音符号(#)和降音符号(b),例如,#1是中央C升高半音,是右上角的黑键。
音符
音符是用来记录不同长度的音符。全音符、二分音符、四分音符、八分音符、十六分音符是最常见的音符,具体内容可点击超链接到康康。四分音符一般是一个时间基准(500毫秒),后面加一条横线就是二分音符,下面加一条横线就是八分音符,等等。
对比音符和频率
计算周期以及重装载值
周期:12/11.0592/B2*1000000(因为我是11.0592HZ晶振,所以是这样)
重装载值:65536-D(65536-半周期)
如下图所示:
代码部分
下一步是根据我们计算的重装载值编码。在这个过程中,我们还需要了解音乐的简单乐谱。在这里,我给出一个简单的乐谱。感兴趣的学生可以找到相应的简单乐谱来编写代码。
// Buzzer.c #include <REGX52.H> #include <INTRINS.H> //蜂鸣器端口: sbit Buzzer=P1^5; /** * @brief 私有蜂鸣器延迟函数,延时500us * @param 无 * @retval 无 */ void Buzzer_Delay500us() //@11.0592MHz { unsigned char i; _nop_(); i = 227; while (--i); } /** * @brief 蜂鸣器发声 * @param ms 长时间发声,范围:0~32767 * @retval 无 */ void Buzzer_Time(unsigned int ms) { unsigned int i; for(i=0;i<ms*2;i ) { Buzzer=!Buzzer; Buzzer_Delay500us(); } }
// main.c #include <REGX52.H> #include "Delay.h" #include "Time0.h" #include "Buzzer.h" ///蜂鸣器端口: sbit Buzzer=P1^5; #define SPEED 460 //音符对应索引表,P:休止符,L:低音,M:中音,H:高音,下划线:上半音符号# #define P 0 #define L1 1 #define L1_ 2 #define L2 3 #define L2_ 4 #define L3 5 #define L4 6 #define L4_ 7 #define L5 8 #define L5_ 9 #define L6 10 #define L6_ 11 #define L7 12 #define M1 13 #define M1_ 14 #define M2 15 #define M2_ 16 #define M3 17 #define M4 18 #define M4_ 19 #define M5 20 #define M5_ 21 #define M6 22 #define M6_ 23 #define M7 24 #define H1 25 #define H1_ 26 #define H2 27 #define H2_ 28 #define H3 29 #define H4 30 #define H4_ 31 #define H5 32 #define H5_ 33 #define H6 34 #define H6_ 35 #define H7 36 unsigned int FreqTable[] = {0, 64303 ,63577 ,63691 ,63792 ,63892 ,63981 ,64070 ,64152 ,64229 ,64303 ,64372 ,64437 , 64499 ,64557 ,64612 ,64664 ,64713 ,64759 ,64803 ,64844 ,64883 ,64919 ,64954 ,64987 , 65018 ,65047 65074 ,65100 ,65125 ,65148 ,65169 ,65190 ,65209 ,65228 ,65245 ,65261
};
// 第一个H2意思是频率;第二个4,代表一个4分音符;code是把代码放到Flash里面。
unsigned char code Music[]={
H2,4,
M7,4,
H1,4,
M6,4,
H2,4,
M7,4,
H1,4,
M6,4,
// // 注释部分是高潮的前面部分
// M3,4+4+4+4,
// P,4+4,
// P,2,
// M1,2,
// M2,2,
// M1,2,
// M3,4+4+4+4,
// P,4+2,
// M1,2,
// M2,2,
// M1,2,
// M2,2,
// M3,2,
// //
// L6,4+2,
// M1,2,
// L6,4+2,
// M1,2,
//
// L6,4+2,
// M1,2,
// M2,4,
// M1,4,
//
// L7,4+4+4+4,
// P,4+4+4+4,
//
// //
// M3,4+4+4+4,
// P,4+4,
// P,2,
// M1,2,
// M2,2,
// M1,2,
// M3,4+4+4+4,
// P,4+2,
// M1,2,
// M2,2,
// M1,2,
// M2,2,
// M3,2,
// //
// L6,4+2,
// M1,2,
// L6,4+2,
// M1,2,
//
// L6,4+2,
// M1,2,
// M3,4,
// M1,2,
// M2,2,
//
// L7,4+4+4+4,
// P,4+4+4+4,
//
// H6,2,
// M1,2,
// M6,4+2+2+2,
// M5, 2,
//
// M6,4+2,
// M5,2,
// M6,2,
// M5,2,
// M6,2,
//
// M5,2+2,
// M3,2+2+4+4,
// P,4+4+4,
// H6,2,
// M1,2,
//
// M6,4+2+2,
// M5,2,
// M6,2,
// M5,2,
// M7,4+2+2,
// M6,2,
// M7,2+2,
// M6,4,
// M3,2+2+4,
//
// P,4+4+2,
// M3,2,
// M5,2,
// M3,2,
//
// M2,4+2,
// M3,2,
// M2,4+2,
// M3,2,
// M2,4+2,
// M3,2,
// M5,2,
// M3,2,
// M5,2,
// M3,2,
//
// M2,4+2,
// M3,2,
// M2,4+2,
// M3,2,
//
// M2,4+4+4,
// M1,2,
// M2,2,
// //
// M3,4,
// M6,4,
// M1,4,
// M3,2,
// M2,4+2,
// M3,2,
// M2,4,
// M1,4,
// M6,4+4+4+4,
// 高潮部分
P,4+4+4,
M6,2,
M7,2,
//
M1,2,
M2,2,
M7,2,
M1,2+4+2,
M7,2,
M1,2,
M2,2,
M7,2,
M1,2+4+2,
M2,2,
M3,2,
M2,2,
M3,2,
M2,2,
M3,4+2,
M2,2,
M3,4,
M5,4,
M3,4,
M6,2,
M7,2,
//
M1,2,
M2,2,
M7,2,
M1,2+4+2,
M7,2,
M1,2,
M2,2,
M7,2,
M1,2+4+2,
M2,2,
M3,2,
M2,2,
M3,2,
M2,2,
M3,4+2,
M2,2,
M3,4,
M5,4,
M3,4,
M5,4,
//
M3,2+4,
M5,2,
M3,2+4,
M5,2,
M3,2,
M5,2,
M6,2,
M3,2,
M5,4,
M5,4,
M3,2+4,
M5,2,
M3,2+4,
M5,2,
//
M3,2,
M5,2,
M6,2,
M3,2,
M5,4,
M5,2+2,
//
M3,4,
M2,4,
M2,4,
M1,2,
M3,2,
M3,4,
M2,4,
M2,4,
M1,2,
M1,2,
L6,4+4+4+4,
P,4+4+4,
M5,2+2,
//
M3,4,
M2,4,
M2,4,
M1,2,
M3,2,
M3,4,
M2,4,
M2,4,
M1,2,
M1,2,
L6,4+4+4+4,
P,4+4+4+4,
0xFF
};
unsigned char FreqSelect,MusicSelect;
void main(){
// 初始化定时器
Timer0Init();
while(1){
// 判断是否是休止符
if(Music[MusicSelect] != 0xFF){
//发声
FreqSelect = Music[MusicSelect];
MusicSelect++;
//持续时长
Delay(SPEED/4*Music[MusicSelect]);
MusicSelect++;
TR0 = 0;
Delay(5);
TR0 = 1;
}else{
TR0 = 0;
while(1);
}
}
}
void Timer0_Routine() interrupt 1
{
if(FreqTable[FreqSelect]){
TL0 = FreqTable[FreqSelect] % 256; //设置定时初始值
TH0 = FreqTable[FreqSelect] / 256;
Buzzer =! Buzzer; // 响
}
}
运行结果
蜂鸣器《孤勇者》
好了,对于蜂鸣器的知识就介绍到这了,如有错误还望及时指出。