09蜂鸣器

蜂鸣器

蜂鸣器介绍

蜂鸣器将电信号转换为声音信号,是一种一体化结构器件,采用直流电压供电,广泛应用于电子产品中作为发声器件。51单片机上使用的是无源蜂鸣器。

  • 两种类型:
    无源蜂鸣器(压电式):不带振荡源,需要提供一定频率的脉冲信号
    有源蜂鸣器(电磁式):自带振荡源,只需提供电源,正负极接上直流电压即可持续发声,频率固定
    “源”是指蜂鸣器内部是否自带"振荡源"

  • 改变音调——脉冲信号频率一定时,周期一定,改变高电平输出所占的周期时间——改变“占空比”(增加高电平时长,音调高;缩短高电平时长,音调低)

  • 改变音色——改变周期

  • 无源蜂鸣器发出声音的频率(可变约1.5~5KHz)
    有源蜂鸣器通常频率固定,周期、占空比不变
    占空比是指在一个脉冲循环内,通电时间相对于总时间所占的比例

驱动电路

51单片机I/O口驱动能力较弱,不能够直接驱动蜂鸣器,所以不直接使用对应引脚直接控制,而需要利用一些放大电路。所以单片机起到控制作用,控制“驱动电路”来运行设备

  • 三极管驱动:
    在这里插入图片描述
    利用三极管饱和和截止的两个状态,从而构成三极管开关
    NPN:高电平导通
    PNP:低电平导通

  • 集成电路驱动:
    在这里插入图片描述
    利用ULN2003D驱动芯片,可以实现驱动蜂鸣器的操作
    芯片内部有“非门”结构(在达林顿管中,具有很强的驱动能力),输入高电平,则输出低电平,蜂鸣器另一端接VCC,从而实现驱动

乐理知识

  • C调音符与频率对照表
    在这里插入图片描述

  • 频率与周期
    在这里插入图片描述

  • 正推
    根据一设定好的定时器函数,直接引用头文件到此工程主函数中
    定时器每1ms执行中断程序一次,即反转1次;反转两次为1个周期,为2ms。T=2ms,频率=1/0.002=500Hz
    已知周期
    即当定时器为1ms(1000us)时,补码为64535,TH=0xFC,TL=0x18,蜂鸣器以500Hz响

  • 反推
    已知各音符的频率时,周期=1/频率
    还要计算半周期:一个周期高电平反转两次,所以半个周期改变一次(周期取整/2)
    由于定时器计数溢出后才能进入中断使蜂鸣器响应,提前赋值好中断服务程序中的TH、TL即可实现演奏音乐

TH=补码/256;
TL=补码%256;
十六位二进制数,用2^8取整为高8位,取余为低8位。类似于两位十进制数,用10取整为高位,取余为低位

代码实现

#include <REGX52.H>
#include "Delay.h"
#include "time0_init.h"
#include "LCD1602.h"
//注意头文件引用,因为用了LCD显示字符串,所以外加了LCD1602的头文件
sbit Buzzer=P2^5;
//sbit P0_0=P0^0;//即定义P0_0为P0口的第1位
//根据蜂鸣器、ULN2003D原理图定义 sbit Buzzer=P2^5;

#define SPEED 60
//定义了反转的时间变量(改变播放音乐速度)

//宏定义(各个音符的频率放在数组中,定义音符的数组索引号)
#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
//LOW低音
#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
//MIDDLE中音
#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
//HIGH高音

unsigned int FreqTable[]={
	0,
	63628,63731,63835,63928,64021,64103,64185,64260,64331,64400,64463,64524,
	64580,64633,64684,64732,64777,64820,64860,64898,64934,64968,65000,65030,
	65058,65085,65110,65134,65157,65178,65198,65216,65235,65252,65268,65283
};
//音符频率数组,为改变TH、TL

//加"code"是因为51单片机中RAM:512字节(内存太小);ROM:8K(Flash)
unsigned char code Music[]={
//曲目:春节序曲
	H3,2, 
	H3,1, 
	H2,1,
	
	H1,4,
	H3,2,
	H3,1,
	H2,1,
	
	H1,4,
	H3,2,
	H3,1,
	H2,1,
	
	H1,2,
	M5,2,
	M3,2,
	M6,2,
	
	M5,3,
	M6,1,
	M5,2,
	M6,2,
	
	M5,3,
	M6,1,
	M5,2,
	M6,2,
	
	M5,2,
	M7,1,
	M6,1,
	M5,2,
	M7,1,
	M6,1,
	
	M5,2,
	M7,1,
	M6,1,
	M5,2,
	M7,1,
	M6,1,
	
	M5,1,
	M6,1,
	M5,1,
	M6,1,
	M5,1,
	M6,1,
	M7,1,
	M6,1,
	
	M5,4,
	M5,4,
	M5,8,

	M5,2,
	M5,1,
	M6,1,
	M5,2,
	M5,1,
	M6,1,
	
	H1,2,
	H1,1,
	M6,1,
	H1,2,
	H1,1,
	H2,1,
	
	H3,2,
	H3,1,
	H2,1,
	H3,2,
	H3,1,
	H2,1,
	
	H3,2,
	H3,1,
	H2,1,
	H1,2,
	H1,1,
	M6,1,
	
	M5,2,
	M5,1,
	M6,1,
	M5,2,
	M5,1,
	M6,1,
	
	H1,2,
	H1,1,
	M6,1,
	H1,2,
	H1,1,
	H2,1,
	
	H3,2,
	H3,1,
	H2,1,
	H3,2,
	H3,1,
	H2,1,
	
	H3,2,
	H3,1,
	H2,1,
	H1,2,
	H1,1,
	M6,1,
	
	M5,2,
	M5,1,
	M6,1,
	H1,2,
	H1,1,
	H2,1,
	
	H3,2,
	H3,1,
	H2,1,
	H1,2,
	P,2,
	
	
	H1,3,
	M6,1,
	H1,2,
	M6,2,
	
	M5,2,
	H1,2,
	M6,2,
	M5,2,
	
	M3,2,
	M5,2,
	M2,2,
	M3,2,
	
	M5,2,
	M6,2,
	M3,2,
	M3,1,
	M2,1,
	
	M1,2,
	H3,2,
	H3,1,
	H2,1,
	H1,8,
	
	0xFF 
};

void main()
{
	LCD_Init();
	LCD_ShowString(1,3,"2  0  2  3");
	LCD_ShowString(2,2,"HAPPY NEW YEAR");

	time0_init();
	while(1)
	{
		//判断是否终止,如果终止就关闭定时器
		if(Music[MusicSelect]!=0xFF)
		{
			FreqSelect=Music[MusicSelect];
			MusicSelect++;
			//曲子中,4为4分音符即一拍,2为8分音符即半拍,1为16分音符
			//SPEED变量使速度可控
			Delay(SPEED/4*Music[MusicSelect]); 
			MusicSelect++;
			//为了使两个音有断开的效果:定时器一开一关
			TR0=0;
			Delay(5);
			TR0=1;
		}
		else
		{
			TR0=0;
			while(1);
		}
	}
}

void time() interrupt 1 //中断服务函数
{
	if(FreqTable[FreqSelect]!=0)
	{
		TH0=FreqTable[FreqSelect]/256;  
		TL0=FreqTable[FreqSelect]%256;
		Buzzer=!Buzzer; //蜂鸣器发声
	}
}

成果展示(doge

饥饿的半导体-51单片机-蜂鸣器实验结果

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
无源蜂鸣器和有源蜂鸣器是两种不同类型的蜂鸣器。有源蜂鸣器内含振荡源,只要通电就能发声,但发声频率固定,音色单一。而无源蜂鸣器内部没有振荡源,需要外加振荡源(方波信号)才能发声,通过给它输出一定频率的信号来控制发声。人耳能听到的频率范围在20Hz-20kHz之间,通过控制STM32的GPIO引脚快速切换高低电平输出,可以实现无源蜂鸣器的发声,切换的频率不同,发出的音调就不一样。\[1\] 在程序中,通过循环产生方波(即振荡源)来控制蜂鸣器的发声。循环里的延时函数可以控制输出方波的频率,程序中使用了两种不同的延时函数,一个是标准HAL库提供的延时函数,另一个是自定义的延时函数。宏定义还可以控制声音的时间长度。\[2\] 关于无源蜂鸣器的驱动,可以使用Cubemx来配置STM32的GPIO引脚,将引脚设置为输出模式,并通过控制引脚的高低电平来控制蜂鸣器的发声。具体的配置和代码实现可以参考相关的文档和教程。\[3\] #### 引用[.reference_title] - *1* [STM32 使用STM32F103控制无源蜂鸣器发声播放音乐](https://blog.csdn.net/qq_28056277/article/details/85165731)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [05_STM32Cubeide开发_无源蜂鸣器和继电器驱动](https://blog.csdn.net/DDGGG1/article/details/123473031)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值