51单片机从零开始入门教程(蜂鸣器篇)

参考教程:[11-1] 蜂鸣器_哔哩哔哩_bilibili

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

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

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

2、驱动电路:

(1)三极管驱动:

(2)集成电路驱动:

BEEP的电平与P25相同,要操作蜂鸣器,操作P25即可

3、音符与频率对照:

4、蜂鸣器播放提示音:

(1)该项目包含的文件:其中需要重写的都会在下面给出,未给出的沿用旧例出现过的即可(本例需要延时函数,因为独立按键模块需要消抖)。

(2)根据下面的提示添加or修改代码文件,然后进行编译:

①Nixie.c文件中注释掉最后两条语句(主要是“P0=0x00;”),本例显示静态数字,不需要消影。

②Buzzer.h文件:

#ifndef __Buzzer_H__
#define __Buzzer_H__

void Buzzer_Time(unsigned int ms);

#endif

③Buzzer.c文件:

#include <REGX52.H>
#include <INTRINS.H>

sbit Buzzer = P2^5;

/**
  * @brief  蜂鸣器私有延时函数,延时500us
  * @param  无
  * @retval 无
  */
void Buzzer_Delay500us()		//@11.0592MHz
{
	unsigned char i;

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

/**
  * @brief  蜂鸣器发声
  * @param  ms:发声的时长
  * @retval 无
  */
void Buzzer_Time(unsigned int ms)
{
	unsigned int i = 0;  //注意是int类型,由于ms数值可能会很大,用char类型会发生“整形溢出”从而引发死循环
	for(i = 0; i < ms*2; i++)
			{
				Buzzer = !Buzzer;  //震荡脉冲
				Buzzer_Delay500us();  //脉冲周期为500us*2,对应1000Hz
			}
}
④main.c文件:
#include <REGX52.H>
#include "Key.h"
#include "Nixie.h"
#include "Buzzer.h"

unsigned char KeyNum;

void main()
{
	while(1)
	{
		KeyNum = Key();  //接收按下按键的键码
		if(KeyNum)
		{
			Nixie(1,KeyNum);
			Buzzer_Time(1000);  //发出持续1秒的声响
		}
		
	}
}

(3)将生成的.hex文件下载到开发板中,按下独立按键,数码管会显示对应的键码,同时蜂鸣器会发出持续1秒的声响。

5、使用蜂鸣器演奏《别看我只是一只羊》:

(1)该项目包含的文件:本例需要延时函数以及定时器0模块的代码。

(2)根据下面的提示编写main.c文件,然后进行编译:

#include <REGX52.H>
#include "Timer0.h"
#include "Delay.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

//索引与频率对照表(这个和晶振频率有关,下面这个对照表是按照12MHz写的,不过11.0952MHz的晶振貌似也可以使用)
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,  2,
	H3, 2,
	H3, 2,
	H3, 2,
	H3, 2,
	H2, 2,
	H1, 2,
	M6, 2,
	
	M4, 4,
	H2, 4+4+4,
	
	P,  2,
	M7, 2,
	M7, 2,
	M7, 2,
	M7, 2,
	H1, 2,
	H2, 4,
	
	H1, 4+4+4+4,
	
	//2
	M3, 4,
	M5, 2,
	M5, 2,
	P,  2,
	M2, 2,
	M5, 2,
	M5, 2,
	
	P,  2,
	M3, 2,
	M5, 2,
	M5, 2,
	M2, 4,
	M5, 2,
	M5, 2,
	
	P,  2,
	M3, 2,
	M5, 2,
	M5, 2,
	P,  0,
	M2, 2,
	M5, 2,
	M5, 2,
	
	P,  2,
	M3, 2,
	M5, 2,
	M5, 2,
	M2, 4,
	M5, 2,
	M5, 2,
	
	//3
	P,  4+4+4+4,
	
	P,  2,
	H1, 2,
	H1, 2,
	H1, 2,
	H1, 2,
	H1, 2,
	M7, 2,
	M5, 2,
	M3, 2,
	
	M5, 4+4+4+4,
	
	P,  2,
	M7, 2,
	M7, 2,
	M7, 2,
	M7, 2,
	M6, 2,
	M5, 2,
	M3, 2,
	
	M5, 4,
	H2, 4+4+4,
	
	//4
	P,  2,
	H3, 2,
	H3, 2,
	H3, 2,
	H3, 2,
	H2, 2,
	H1, 2,
	M6, 2,
	
	M4, 4,
	H2, 4+4+4,
	
	P,  2,
	M7, 2,
	M7, 2,
	M7, 2,
	M7, 2,
	M6, 2,
	M5, 2,
	M4, 2,
	
	M3, 4,
	M5, 4+4+4,
	
	P,  2,
	H1, 2,
	H1, 2,
	H1, 2,
	H1, 2,
	M7, 2,
	M5, 2,
	M3, 2,
	
	//5
	M5, 4+4+4+4,
	
	P,  2,
	H1, 2,
	H1, 2,
	H1, 2,
	H1, 2,
	M7, 2,
	M5, 2,
	M3, 2,
	
	M5, 4,
	H2, 4+4+4,
	
	P,  2,
	H3, 2,
	H3, 2,
	H3, 2,
	H3, 2,
	H2, 2,
	H1, 2,
	M6, 2,
	
	M4, 4,
	H2, 4+4+4,
	
	//6
	P,  2,
	M7, 2,
	M7, 2,
	M7, 2,
	M7, 2,
	H1, 2,
	H2, 4,
	
	H1, 4+4+4,
	P,  2,
	H1, 2,
	
	M6, 2,
	M6, 2,
	H1, 2,
	H1, 2,
	M6, 2,
	M6, 2,
	H1, 2,
	H1, 2,
	
	H2, 2,
	H2, 2,
	H1, 2,
	H1, 2,
	M6, 2,
	H1, 2,
	P,  2,
	H1, 2,
	
	//7
	M5, 2,
	M5, 2,
	H1, 2,
	H1, 2,
	M5, 2,
	M5, 2,
	H1, 2,
	H1, 2,
	
	H2, 2,
	H2, 2,
	H1, 2,
	H1, 2,
	H2, 2,
	H3, 2,
	P,  2,
	H1, 2,
	
	M4_,2,
	M4, 2,
	H1, 2,
	H1, 2,
	M4, 2,
	M4, 2,
	H1, 2,
	H1, 2,
	
	H3, 4,
	H3, 4,
	H2, 2,
	H3, 4,
	H5, 4+4+4,
	
	//8
	H3, 2,
	H2, 4+4+4,
	
	P,  2,
	H1, 2,
	
	M6, 2,
	M6, 2,
	H1, 2,
	H1, 2,
	M6, 2,
	M6, 2,
	H1, 2,
	H1, 2,
	
	H2, 2,
	H2, 2,
	H1, 2,
	H1, 2,
	M6, 2,
	H1, 2,
	P,  2,
	H1, 2,
	
	//9
	M5, 2,
	M5, 2,
	H1, 2,
	H1, 2,
	M5, 2,
	M5, 2,
	H1, 2,
	H1, 2,
	
	H2, 2,
	H2, 2,
	H1, 2,
	H1, 2,
	H2, 2,
	H2, 1,
	H3, 1,
	P,  2,
	H1, 2,
	
	M4_,2,
	M4, 2,
	H1, 2,
	H1, 2,
	M4, 2,
	M4, 2,
	H1, 2,
	H1, 2,
	
	H3, 4,
	H3, 4,
	H2, 2,
	H3, 4,
	H5, 4+4+4+4,
	
	//10
	P,  4,
	
	P,  4,
	H3, 2,
	H3, 2,
	H1, 2,
	M5, 2,
	H2, 2,
	H1, 2+4+4+4+4,
	
	P,  4,
	H3, 2,
	H3, 2,
	H1, 2,
	M5, 2,
	H2, 2,
	H1, 2+4+4+4+4,
	
	//11
	M3, 2,
	M5, 2,
	M5, 2,
	P,  2,
	M2, 2,
	M5, 2,
	M5, 2,
	
	P,  2,
	M3, 2,
	M5, 2,
	M5, 2,
	M2, 4,
	M5, 2,
	M5, 2,
	
	//12
	P,  2,
	M3, 2,
	M5, 2,
	M5, 2,
	P,  2,
	M2, 2,
	M5, 2,
	M5, 2,
	
	P,  2,
	M3, 2,
	M5, 2,
	M5, 2,
	M2, 4,
	M5, 2,
	M5, 2,
	
	M3, 4,
	M5, 2,
	M5, 2,
	P,  2,
	M2, 2,
	M5, 2,
	M5, 2,
	
	P,  2,
	M3, 2,
	M5, 2,
	M5, 2,
	M2, 4,
	M5, 2,
	M5, 2,
	
	//13
	P,  2,
	M3, 2,
	M5, 2,
	M5, 2,
	P,  2,
	M2, 2,
	M5, 2,
	M5, 2,
	
	P,  2,
	M3, 2,
	M5, 2,
	M5, 2,
	M2, 4,
	M5, 2,
	M5, 2,
	
	0xFF	//终止标志
};

unsigned int FreqSelect, MusicSelect;

void main()
{
	Timer0_Init();
	while(1)
	{
		if(Music[MusicSelect]!=0xFF)	//如果不是停止标志位
		{
			FreqSelect=Music[MusicSelect];	//选择音符对应的频率
			MusicSelect++;
			Delay(SPEED/4*Music[MusicSelect]);	//选择音符对应的时值
			MusicSelect++;
			TR0=0;  //定时器0停止计数
			Delay(5);	//音符间短暂停顿
			TR0=1;  //定时器0开始计数
		}
		else	//如果是停止标志位
		{
			TR0=0;  //定时器0停止计数
			while(1);
		}
	}
}

void Timer0_Routine()  interrupt 1  //CPU响应中断后执行的函数
{
	if(FreqTable[FreqSelect])	//如果不是休止符
	{
		//TH0和TL0决定震荡脉冲的周期,通过重装载不同的计数单元初值可以改变音响的频率
		TL0 = FreqTable[FreqSelect]%256;		//设置定时初值
		TH0 = FreqTable[FreqSelect]/256;		//设置定时初值
		Buzzer=!Buzzer;	//翻转蜂鸣器IO口,产生震荡脉冲(发声关键)
	}
}

(3)将生成的.hex文件下载到开发板中,就可以听到美妙的音乐了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Zevalin爱灰灰

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

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

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

打赏作者

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

抵扣说明:

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

余额充值