首页 > 其他分享 >【51单片机】蜂鸣器演奏音乐《海阔天空》

【51单片机】蜂鸣器演奏音乐《海阔天空》

时间:2024-07-22 10:53:45浏览次数:9  
标签:蜂鸣器 H2 H1 51 M5 单片机 M6 define

一.  蜂鸣器的介绍 

1.蜂鸣器介绍 
  蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计 算机、 打印机、 复印机、 报警器、 电子玩具、 汽车电子设备、 电话机、 定 时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。 

2.压电式蜂鸣器 (无源蜂鸣器)
  压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳 等组成。多谐振荡器由晶体管或集成电路构成,当接通电源后(1.5~15V 直流工 作电压),多谐振荡器起振,输出 1.5~5kHZ 的音频信号,阻抗匹配器推动压电 蜂鸣片发声。 

3.电磁式蜂鸣器 (有源蜂鸣器)
  电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。接通电 源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场,振动膜 片在电磁线圈和磁铁的相互作用下,周期性地振动发声。

4.区别 
  对于无源蜂鸣器,如果改变频率就可以调节蜂鸣器音调,产生各种不同音色、 音调的声音。如果改变输出电平的高低电平占空比,则可以改变蜂鸣器的声音大小。

  对于有源蜂鸣器,通常内部已经固定了频率,对于调节频率或占空比可能改 变不了蜂鸣器的音调和音量,当然也有的有源蜂鸣器可以实现和无源蜂鸣器一样的效果。

  其实一句话就可概括它们之间的区别,想要压电式蜂鸣器发声,需提供一定 频率的脉冲信号;想要电磁式蜂鸣器发声,只需提供电源即可。

注意:有源与无源指的是内部有无LCD振荡电路。

5. 51单片机所使用的蜂鸣器 
  我们开发板上使用的蜂鸣器是无源蜂鸣器,属于压电式蜂鸣器类型。这里说 的有源和无源,并不是指电源的意思,而是指蜂鸣器内部是否含有振荡电路,有源蜂鸣器内部自带振荡电路,只需提供电源即可发声,而无源蜂鸣器则需提供一 定频率的脉冲信号才能发声,频率大小通常在 1.5-5KHz 之间。

二.  蜂鸣器放大电路原理  


  由于单片机内直接产生的电流过小无法使蜂鸣器正常工作,因此我们需要运用放大电路进行电流放大,下面是两种不同的放大方式:

1. 三极管放大电路

(1)三极管介绍 
 1.半导体三极管也称为晶体三极管,可以说它是电子电路中最重要的器件。三极管顾名思义具有三个电极。二极管是由一个PN结构成的,而三极管由两个PN结构成,共用的一个电极成为三极管的基极(用字母b表示)。其他的两个电极成为集电极(用字母c表示)和发射极(用字母e表示)。由于不同的组合方式,形成了一种是NPN型的三极管,另一种是PNP型的三极管。

2. 晶体三极管

是半导体基本元器件之一,具有电流放大作用,是电子电路的核心元件。它最主要的功能是电流放大和开关作用。三极管是在一块半导体基片上制作两个相距很近的PN结,两个PN结把正块半导体分成三部分,中间部分是基区,两侧部分是发射区和集电区,排列方式有PNP和NPN两种。 

两种不同的三极管内部电流:

2)三极管放大电路 

左图为共阳极,右图为共阴极,且图中Buzzer指蜂鸣器。

3.蜂鸣器模块图

 三、基本乐理知识

一、乐理知识

1、键盘与音符对照

 2、音符时值

3、索引与频率对照表

 二、乐谱

四.  程序设计 

代码部分:

Delay.c

void Delay(unsigned int xms)
{
	unsigned char i, j;
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}

Delay.h

#ifndef __DELAY_H__
#define __DELAY_H__

void Delay(unsigned int xms);

#endif

Timer0.c

#include <REGX52.H>

/**
  * @brief  定时器0初始化,1毫秒@12.000MHz
  * @param  无
  * @retval 无
  */
void Timer0Init(void)
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x18;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0=1;
	EA=1;
	PT0=0;
}

/*定时器中断函数模板
void Timer0_Routine() interrupt 1
{
	static unsigned int T0Count;
	TL0 = 0x18;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	T0Count++;
	if(T0Count>=1000)
	{
		T0Count=0;
		
	}
}
*/

Timer0.h

#ifndef __TIMER0_H__
#define __TIMER0_H__

void Timer0Init(void);

#endif

main.c

#include <REGX52.H>
#include "Delay.h"
#include "Timer0.h"

//蜂鸣器端口定义
sbit Buzzer=P2^5;

//播放速度,值为四分音符的时长(ms)
#define SPEED	700

//音符与索引对应表,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,
	63776,63871,63968,64053,64139,64215,64290,64359,64425,64488,64546,64602,
	64654,64703,64750,64794,64836,64875,64912,64947,64980,65011,65041,65069,
	65095,65119,65143,65165,65186,65205,65224,65241,65258,65273,65288,65302,
};

//乐谱
unsigned char code Music[]={
	//音符,时值,
	M7,4,
	H4,4,
	H3,8,
	
	H2,2,
	H1,2,
	M7,2,
	M6,4,
	M4,2,
	M5,2,
	H1,2,
	M4,2,
	P,2,
	M3,4,
	
	
	P,2,
	M4,2,
	M5,2,
	H1,2,
	M4,2,
	P,2,
	M3,4,
	//
	P,2,
	M4,2,
	M5,2,
	H2,2,
	
	H1,6,
	M4,6,
	M7,4,
	M6,6,
	
	P,3,
	//今天我
	M3,2,
	M2,2,
	M1,8,
	P,4,
	M2,1,
	M3,1,
	
	M5,2,
	M5,1,
	M5,1+2,
	M6,2,
	M5,4,
	P,2,
	M6,1,
	M7,1,
	
	H1,2,
	H1,1,
	H1,1+2,
	H1,2,
	H1,2,
	M7,2,
	M6,1,
	M5,2,
	M6,9,
	
	P,4,
	
	M6,2,
	M5,2,
	
	M5,6,
	M5,2,
	M3,1,
	M2,1,
	M1,2,
	M3,2,
	M4,2,
	
	
	M3,2,
	M2,2,
	M2,2,
	M3,1,
	M2,1+4,
	M3,2,
	M2,1,
	M2,3,
	
	
	M1,2,
	M1,2,
	M1,1,
	M1,5,
	M2,2,
	M1,2,
	
	M1,6,
	
	P,6,
	M6,1,
	M7,1,
	
	H1,2,
	H1,1,
	H1,3,
	H1,2,
	M7,2,
	M6,2,
	M5,1,
	M5,3,
	
	M5,4,
	M3,2,
	M2,2,
	M1,4,
	
	//也会怕有一天会跌倒
	P,2,
	H1,1,
	H1,1,
	H1,2,
	H1,1,
	H2,1,
	H2,2,
	H2,2,
	H1,1,
	H2,2,
	H3,6,
	P,2,
	H3,3,
	H2,2,
	H1,1,

	
	P,6,
	H1,1,
	H1,1,
	H1,2,
	H1,1,
	H2,3,
	P,2,
	M5,1,
	M5,1,
	
	
	
	H3,4,
	H2,4,
	H1,8,
	
	P,2,
	H1,1,
	H1,1,
	H1,2,
	H1,1,
	H2,3,
	H2,1,
	H2,1,
	H1,1,
	M7,2,
	H1,9,
	
	
	//仍然自由自我
	P,4,
	M6,2,
	M6,2,
	M7,2,
	M6,2,
	M7,2,
	H1,8,
	
	//永远高唱我歌
	H1,1,
	H1,1,
	H2,2,
	H1,2,
	H2,2,
	H3,8,
	
	//走遍千里
	H3,2,
	H2,6,
	H3,2,
	H1,8,
	
	
	//原谅我
	P,2,
	M6,1,
	M7,1,
	
	H1,2,
	H1,1,
	H1,3,
	H1,2,
	M7,2,
	M6,2,
	M5,1,
	M5,3,
	
	M5,4,
	M3,2,
	M2,2,
	M1,4,
	
	P,4,
	H1,1,
	H1,1,
	H1,2,
	H1,1,
	H2,1,
	H2,2,
	H2,2,
	H1,1,
	H2,2,
	H3,9,
	
	
	H3,3,
	H2,2,
	H1,1,
	
	P,2,
	H1,1,
	H1,1,
	H1,2,
	H1,1,
	H2,3,
	P,2,
	M5,1,
	M5,1,
	
	H3,4,
	H2,4,
	H1,8,
	
	P,2,
	H1,1,
	H1,1,
	H1,2,
	H1,1,
	H2,3,
	H2,1,
	H2,1,
	H1,1,
	M7,2,
	H1,9,
	
	0xFF	//终止标志
};

unsigned int 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;	//翻转蜂鸣器IO口
	}
}

最终项目结构是这样的

实验结果

<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="osVvL2cb-1721616537815" src="https://live.csdn.net/v/embed/411403"></iframe>

《海阔天空》Beyond

标签:蜂鸣器,H2,H1,51,M5,单片机,M6,define
From: https://blog.csdn.net/m0_74194018/article/details/140601913

相关文章

  • Oracle——navicat连接Oracle数据库报错(12514)
    2024/07/221.问题描述2.解决办法3.参考材料1.问题描述与其他厂商做数据对接时,对方提供相关视图,我navicat连接Oracle数据库时报错,其报错代码如下:ORA-12514:TNS:listenerdoesnotcurrentlyknowofservicerequestedinconnectdescriptor2.解决办法对方提供实例为hisd......
  • 没有名为“pqcrypto._kem.kyber512”的模块
    我目前正在为我的硕士论文开发X3DH信号协议的简化Python实现。我的主要目标是比较三个版本的性能:经典实现、使用Kyber的后量子安全变体以及使用PSWOOSH的基于格的方法。但是,我在pqcrypto库中遇到了一些错误,特别是pqcrypto._kem.kyber512的导入错误。鉴于该库在过......
  • 基于51单片机的zigbee餐桌呼叫系统设计
    基于51单片机的zigbee餐桌呼叫系统设计0、毕业设计选题原则说明(重点)1、项目简介1.1系统构成1.2系统功能1.3演示视频2、部分电路设计2.1STM32单片机核心板电路设计2.2按键电路设计2.3LCD1602液晶显示电路设计3.4、ZigBee通信模块电路设计3、部分代码展示3.1LCD16......
  • 蓝桥杯单片机学习(Day14 实现操作外部开启中断)
    外部中断相关寄存器的配置方法和触发方式:        实验配置:    [email protected],J3跳线配置为IO方式,J5配置为BTN、J2配置为1-3和2-4。配置方法:        EX0、IT0负责外部中断0服务函数的开启其中断服务函数优先级为interrupt0,EX1、IT1负责......
  • 蓝桥杯单片机学习(Day13 矩阵键盘 )
    现象:            按键S7、S11、S15、S19数码管显示00-03      按键S6、S10、S14、S18数码管显示04-07      按键S5、S9、S13、S17数码管显示08-11      按键S4、S8、S12、S16数码管显示12-15矩阵键盘介绍:    注......
  • 【前端】JavaScript入门及实战51-55
    文章目录51函数52函数的参数53返回值54练习55return51函数<!DOCTYPEhtml><html><head><title></title><metacharset="utf-8"><scripttype="text/javascript"> /* 函数: 1.函数也是一个对象 2.函数中可以封装一些功能......
  • 1029、基于单片机的闹钟(存储)
    毕设帮助、开题指导、技术解答(有偿)见文末。目录一、设计功能二、proteus仿真三、原理图四、程序源码五、资料包括一、设计功能单片机期末考试任务书设计一个程序,实现以下功能:具有4个以上按键,具有确定键,返回键,上移键,下移键,可以通过按键设定时间的时钟,分钟设......
  • 1028、基于单片机的流水灯(5个按键)
    毕设帮助、开题指导、技术解答(有偿)见文末。目录一、设计功能二、proteus仿真三、原理图四、程序源码五、资料包括一、设计功能花样流水灯1、扩展32个LED灯,低电平驱动2、使用5个按键切换5种花样二、proteus仿真三、原理图四、程序源码五、......
  • 嵌入式单片机STM32中堆栈使用方法
       学习STM32单片机的时候,总是能遇到“堆栈”这个概念。分享本文,希望对你理解堆栈有帮助。    对于了解一点汇编编程的人,就可以知道,堆栈是内存中一段连续的存储区域,用来保存一些临时数据。堆栈操作由PUSH、POP两条指令来完成。而程序内存可以分为几个区:栈区(stack......
  • 【I²C协议】STC89C51单片机IIC通信(代码+原理)
    STC89C51单片机IIC通信什么是I²C协议特点构成通信协议开始信号、结束信号、应答信号数据传输代码示例什么是I²C协议IIC,即I²C,全称Inter-IntegratedCircuit,字面上的意思是集成电路之间,它其实是I²CBus简称,所以中文应该叫集成电路总线,是由PHILIPS公司在80年......