蜂鸣器(十)

目录

一、蜂鸣器

1、介绍

2、驱动电路

(1)三极管驱动

(2)开发板驱动

3、键盘与音符对照

4、音符与频率对照

5、音乐简谱

二、蜂鸣器播放按键提示音

1、编写程序

2、实物展示

三、蜂鸣器播放音乐

1、重装载值的计算方法

2、编写程序

3、实物展示


一、蜂鸣器

1、介绍

蜂鸣器是一种将电信号转换为声音信号的器件,常用来产生设备的按键音、报警音等提示信号。

蜂鸣器按驱动方式可分为有源蜂鸣器和无源蜂鸣器。

有源蜂鸣器:内部自带振荡源,将正负极接上直流电压即可持续发声,频率固定;

无源蜂鸣器:内部不带振荡源,需要控制器提供振荡脉冲才可发声,调整提供振荡脉冲的频率,可发出不同频率的声音。

2、驱动电路

(1)三极管驱动

 NPN型三极管: 当基极有高电平通过时,集电极就会有电流通过到发射极,右边电路就会导通;当基极有低电平通过时,电路就会断开。

PNP型三极管:当基极有低电平通过时,集电极就会有电流通过到发射极,右边电路就会导通;当基极有高电平通过时,电路就会断开。

(2)开发板驱动

 ULN2003是一个单片高电压、高电流的达林顿晶体管阵列集成电路。主要应用于继电器驱动器、字锤驱动器、灯驱动器、显示驱动器、线路驱动器和逻辑缓冲器。

在89C52单片机中,就是用ULN2003中的P1_5串行口来驱动蜂鸣器,而在89C52RC单片机中,是使用P2_5串行口来驱动蜂鸣器

3、键盘与音符对照

 钢琴键盘从左到右分别分为

红圈:大字组

黄圈:小字组

篮圈:小字1组

绿圈:小字2组 

 不同组之间的c是相差8度的关系,向右升高8度,向左降低8度。

从小字1组钢琴键有黑色琴键的上半部分看,分成:白黑白黑白白黑白黑白黑白,等黑白区域,相邻区域之间是半音的关系,相邻两个半音就是全音的关系。

因此c1和d1之间有黑色音键的就是全音关系,e1和f1之间无黑色音键的就是半音关系,b1和c2之间也是半音关系。

4、音符与频率对照

中音1对应中央c1,1#表示中央c1右边黑键,以此类推,高音1对c2,低音1对应c。

以低音6的440Hz为基准,中音6就是440×2=880Hz,高音6就是440×4=1760Hz。

低音6到中音6之间有12个音符,下个频率等于上个频率乘以2的12分之一次方,

如低音6#=440×2^(1/12)=466.1638,以此类推,因此又称为十二均分律。

5、音乐简谱

左上角1=C,表示为C调音符,在钢琴上只弹白键,

4/4,下面4表示以四分音符为一拍,上面4表示每小节有四拍。

以四分音符为基准,一般四分音符为0.5s,二分音符就是1s,全音符就是2s,8分音符就是0.25s

简谱中,按一个音键代表一个拍,一个拍就是一个四分音符,也就是0.5s,“-” 表示前面音符占两个拍,也就是1s。

一个数字为四分音符,“2 - ”表示二分音符,“2 - - - ”表示全音符, “ 2 ”表示八分音符,2下面有两条线则表示十六分音符,三条线表示三十二分音符。

0代表休止符,没有声音;

一个数字为四分音符,“2 - ”表示二分音符,“2 - - - ”表示全音符, “ 2 ”表示八分音符,2下面有两条线则表示十六分音符,三条线表示三十二分音符。

第一行左边小节,6与7之间下划线连接,表示6与7都为8分音符,合一起为一个4分音符。

第一行中间小节,“1 · ”  后面点为附点,表示1本身的四分音符+八分音符。

第五行中间小节,7和7之间曲线相连,这种为延音线,持续按下音键不放两个八分音符。

#字符为升高半音,b字符为降低半音,在简谱中,#1,就是按下c1右上角黑色按键,b1就是按下c1左边白色按键b。

二、蜂鸣器播放按键提示音

1、编写程序

主函数

#include <REGX52.H>
#include "Delay.h"
#include "Key.h"
#include "shumaguan.h"
#include "Buzzer.h"

unsigned char KeyNum; 
unsigned int i; 


void main()
{
	shumaguan(1,0);					//上电时,数码管第1位显示0
	while(1)
	{
		KeyNum=Key();				//键码送到KeyNum
		if(KeyNum)
		{
			Buzzer_Time(1000);		//蜂鸣器提示音时长1000ms
			shumaguan(1,KeyNum);	//按键键码为多少,数码管第1位就显示多少
		}
	}
}

Buzzer蜂鸣器模块

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

//蜂鸣器端口
sbit Buzzer=P2^5;			//将P1_5串行口位定义为蜂鸣器(Buzzer)

/**
  * @brief  蜂鸣器私有延时函数,延时500us
  * @param  无
  * @retval 无
  */
void Buzzer_Delay500us()	//89C52RC单片机为@11.0592MHz,延时500微秒
{
	unsigned char i;

	_nop_();				//延时1us,也就是一个机器周期
	i = 227;
	while (--i);
}

/**
  * @brief  蜂鸣器发声
  * @param  ms	发声时长
  * @retval 无
  */

void Buzzer_Time(unsigned int ms)
{	
	unsigned int i;
	for(i=0;i<ms*2;i++)			//这里的ms表示蜂鸣器声音的时长
	{							//for循环每隔500us,i++,乘2是为了使输入的ms正好与毫秒单位相同
		Buzzer=!Buzzer;			//逻辑非,0取1,1取0,使Buzzer变成脉冲
		Buzzer_Delay500us();	//每隔500us翻转一次高低电平,周期1ms,频率为1/(0.002s)=1000Hz
		}						//蜂鸣器提示音标准频率一般为1000Hz
}

以及还有Delay模块、独立按键Key模块、数码管模块,之前有写就不添加了。

2、实物展示

蜂鸣器播放按键提示音


三、蜂鸣器播放音乐

1、重装载值的计算方法

如果我们使蜂鸣器播放中央C的音符,由音符与频率对照表知,频率为523Hz,则给予蜂鸣器的脉冲周期为1/0.000523=1912.046us,计数溢出时间为1912.046/2=956.023us,取整为956us,因此重装初值为65536-956=64580。

2、编写程序

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


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

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

//音符与索引对应表,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,
	63628,63731,63835,63928,64021,64103,64185,64260,64331,64400,64463,64528,
	64580,64633,64684,64732,64777,64820,64860,64898,64934,64968,65000,65030,
	65058,65085,65110,65134,65157,65178,65198,65217,65235,65252,65268,65283,
};

//天空之城乐谱
unsigned char code Music[]={
	//音符,时值,
	
	//1
	P,	4,
	P,	4,
	P,	4,
	M6,	2,
	M7,	2,
	
	H1,	4+2,
	M7,	2,
	H1,	4,
	H3,	4,
	
	M7,	4+4+4,
	M3,	2,
	M3,	2,
	
	//2
	M6,	4+2,
	M5,	2,
	M6, 4,
	H1,	4,
	
	M5,	4+4+4,
	M3,	4,
	
	M4,	4+2,
	M3,	2,
	M4,	4,
	H1,	4,
	
	//3
	M3,	4+4,
	P,	2,
	H1,	2,
	H1,	2,
	H1,	2,
	
	M7,	4+2,
	M4_,2,
	M4_,4,
	M7,	4,
	
	M7,	8,
	P,	4,
	M6,	2,
	M7,	2,
	
	//4
	H1,	4+2,
	M7,	2,
	H1,	4,
	H3,	4,
	
	M7,	4+4+4,
	M3,	2,
	M3,	2,
	
	M6,	4+2,
	M5,	2,
	M6, 4,
	H1,	4,
	
	//5
	M5,	4+4+4,
	M2,	2,
	M3,	2,
	
	M4,	4,
	H1,	2,
	M7,	2+2,
	H1,	2+4,
	
	H2,	2,
	H2,	2,
	H3,	2,
	H1,	2+4+4,
	
	//6
	H1,	2,
	M7,	2,
	M6,	2,
	M6,	2,
	M7,	4,
	M5_,4,
	
	
	M6,	4+4+4,
	H1,	2,
	H2,	2,
	
	H3,	4+2,
	H2,	2,
	H3,	4,
	H5,	4,
	
	//7
	H2,	4+4+4,
	M5,	2,
	M5,	2,
	
	H1,	4+2,
	M7,	2,
	H1,	4,
	H3,	4,
	
	H3,	4+4+4+4,
	
	//8
	M6,	2,
	M7,	2,
	H1,	4,
	M7,	4,
	H2,	2,
	H2,	2,
	
	H1,	4+2,
	M5,	2+4+4,
	
	H4,	4,
	H3,	4,
	H3,	4,
	H1,	4,
	
	//9
	H3,	4+4+4,
	H3,	4,
	
	H6,	4+4,
	H5,	4,
	H5,	4,
	
	H3,	2,
	H2,	2,
	H1,	4+4,
	P,	2,
	H1,	2,
	
	//10
	H2,	4,
	H1,	2,
	H2,	2,
	H2,	4,
	H5,	4,
	
	H3,	4+4+4,
	H3,	4,
	
	H6,	4+4,
	H5,	4+4,
	
	//11
	H3,	2,
	H2,	2,
	H1,	4+4,
	P,	2,
	H1,	2,
	
	H2,	4,
	H1,	2,
	H2,	2+4,
	M7,	4,
	
	M6,	4+4+4,
	P,	4,
	
	0xFF	//终止标志
};


//左边是乐谱音符,右边是音符所占时长
//这里是乐谱用四分音符,设定一个四分音符所占时长为500ms,也就是125*4,二分音符就是125*8
//十六分之一音符所占时长为125ms


unsigned char FreqSelect,MusicSelect;	//FreqSelect频率选择,MusicSelect乐谱选择

void main()
{
	Timer0_Init();
	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	//定时器T0的中断函数
{
	if(FreqTable[FreqSelect])					//如果不是休止符0,才运行下面程序
	{
		/*取对应频率值的重装载值到定时器*/
		TL0 = FreqTable[FreqSelect]%256;		//重装初值转化成16进制,高两位给TH0,低两位给TL0
		TH0 = FreqTable[FreqSelect]/256;		
		Buzzer=!Buzzer;							//每两次反转,蜂鸣器响一次
	}
	
}

3、实物展示

蜂鸣器播放音乐

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

剑鞘的流苏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值