51单片机学习记录——蜂鸣器

蜂鸣器

        蜂鸣器简介 

        蜂鸣器是一种将电信号转换为声音信号的器件,常用来产生设备的按键音、报警音等提示信号,蜂鸣器按驱动方式可分为有源蜂鸣器和无源蜂鸣器

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

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

以上图片是蜂鸣器的图片

 驱动方式

        蜂鸣器目前大概有两种驱动方式一种是三极管驱动,另一种是集成电路驱动,使用更多的是三极管驱动,用第一种三极管驱动方式距离,当中央给予高电平时,三极管开关打开,电路联通,蜂鸣器启动

ULN2003 

        因为开发板使用的是ULN2003,那就简单介绍一下吧,大概就是一个取反的器件,此电路板由P2^5控制,所以要使蜂鸣器得以演奏,P2^5得处于高电平。

任务一,初步使用蜂鸣器

        学习完蜂鸣器之后,就可以简单运用一下蜂鸣器了,此任务就是按下独立按键的时候,蜂鸣器响应半秒钟,并是LED显示。只要学会了其运行机理,代码还是蛮简单的,如下所示:

Buzzer.h

#ifndef __BUZZER_H__
#define __BUZZER_H__
void Buzzer_Time(unsigned int ms);
void Buzzer_Delay500us()	;
#endif

Buzzer.c

#include <REGX52.H>
#include "Delay.h"
#include <intrins.h>
//蜂鸣器端口
sbit Buzzer=P2^5;
//蜂鸣器私有延时500us函数
void Buzzer_Delay500us()		//@11.0592MHz
{
	unsigned char i;

	_nop_();
	i = 227;
	while (--i);
}

//蜂鸣器发声函数 参数ms为发声时间
void Buzzer_Time(unsigned int ms)
{
	unsigned int i;
	for(i=0;i<ms*2;i++)
		{
			Buzzer=!Buzzer;
			Buzzer_Delay500us();
		}
}

main函数

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



unsigned char KeyNum;

void main()
{
		Nixie(1,0);
		while(1)
		{
				KeyNum=Key();
				if(KeyNum)
				{
					Nixie(1,KeyNum);
					Buzzer_Time(1000);
				}
		}
}

任务二——通过蜂鸣器演奏简单的歌曲

        想要完成此任务,就需要一点乐理知识了。

音符与频率对照表

由于频率可以用周期显示,所以需要将评率转换为周期,此板子使用的是11.0592兆hz的晶振,所以需要一定的运算将其进行转换,我将文件传上去,需要的话自行下载,通过那个表格就可以利用数组将其存储起来,就可以演奏了

main函数:

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

sbit Buzzer=P2^5;
unsigned int FreqTable[]={
													0,
													63465,63577,63691,63792,63892,63981,64070,64152,64229,64303,64372,64438,
													64499,64557,64612,64664,64713,64759,64803,64844,64883,64919,64954,64987,
													65017,65047,65074,65100,65124,65148,65169,65190,65209,65228,65245,65261};
#define SPEED 353
#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 char code Music[]={
	//1
	P,2,
	L7,2,
	M1,2,
	M5,2,
	M5,4,
	M1,4,
	
	P,4,
	L7,2,
	M1,2,
	M1,4,
	L5,4,
	
	P,2,
	L7,2,
	M1,2,
	M5,2,
	M5,4,
	M1,4,

	P,4,
	L7,2,
	M1,2,
	M1,4,
	L5,2,
	L6,2,
	
	//2
	P,2,
	L7,2,
	M1,2,
	M5,2,
	M5,4,
	M1,4,
	
	P,0,
	L7,2,
	M1,2,
	M1,4,
	L5,4,
	
	P,2,
	L7,2,
	M1,2,
	M5,2,
	M5,4,
	M1,4,
	
	P,4,
	L7,2,
	M1,2,
	L7,2,
	L5,2,
	L6,4,
	
	//3
	P,2,
	L7,2,
	M1,2,
	M5,2,
	M5,4,
	L7,2,
	L7,2,
	
	L7,2,
	L7,2,
	L7,2,
	L7,2,
	L7,2,
	M1,2,
	M1,2,
	M1,2,
	
	L7,2,
	M1,2,
	L7,2,
	M5,2,
	M5,4,
	L7,2,
	L7,2,
	
	L7,2,
	L7,2,
	L7,2,
	L7,2,
	L7,2,
	M1,2,
	M1,2,
	M1,2,
	
	//4
	L7,2,
	M1,2,
	L7,2,
	M5,2,
	M5,4,
	L7,2,
	L7,2,
	
	L7,2,
	L7,2,
	L7,2,
	L7,2,
	L7,2,
	M1,2,
	M1,2,
	M1,2,
	
	L7,2,
	M1,2,
	L7,2,
	M5,2,
	M5,4,
	M2,2,
	M3,2,
	
	M5,2,
	H2,4,
	H7,4,
	M1,2,
	
	
	0xFF
};


unsigned char FreSelect,MusicSelect;
void main()
{
	Timer0Init();
	while(1)
	{
			if(Music[MusicSelect]!=0xFF)
			{
				FreSelect=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[FreSelect])
		{
			TL0 = FreqTable[FreSelect]%256;		//设置定时初值
			TH0 = FreqTable[FreSelect]/256;		//设置定时初值
			Buzzer=!Buzzer;
		}
}

这是演奏的是贾斯丁比伯的stay的前面部分,下面是演示视频

51单片机蜂鸣器演奏stay

总结

           今天学习了蜂鸣器的使用,还算比较简单,最复杂的算是将简谱转换到编程语言的过程,因为比较繁琐,以后可以通过简谱给喜欢的歌曲用蜂鸣器演奏出来啦!! 

 

音符与频率对照

        音符与频率对照音符与频率对照音符与频率对照yinfu

  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值