资讯详情

(十)51单片机——利用蜂鸣器播放《孤勇者》(附成果展示)

硬件部分

蜂鸣器介绍-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; // 响
}
		
	}

运行结果

蜂鸣器《孤勇者》

        好了,对于蜂鸣器的知识就介绍到这了,如有错误还望及时指出。

标签: 4m7光颉电阻if202集成电路

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台