单片机之蜂鸣器

目录

蜂鸣器介绍

蜂鸣器的分类

发声原理分类

按有源无源分类

三极管驱动

蜂鸣器原理

音符与频率对照表

蜂鸣器播放130.8Hz的声音

仿真案例

蜂鸣器发声

电路图

keil文件

蜂鸣器播放音乐

歌曲数据获得

使用的频率

keil文件

蜂鸣器介绍

前言:蜂鸣器是一种常见的发声元器件,广泛应用于各种电子产品,用于警报或报警处理,家里的洗衣机、微波炉、闹钟、遥控车、计算器等都会用到蜂鸣器。

蜂鸣器的分类

发声原理分类

按有源无源分类

  • 有源蜂鸣器:内部自带震荡源,将正负极接上直流电压即可持续发声,频率固定。
  • 无源蜂鸣器:内部不带震荡源,需要控制器提供震荡脉冲才可发声,调整提供震荡脉冲的频率,可发出不同频率的声音(单片机使用的就是无源蜂鸣器)

注意:无源蜂鸣器不能一直给他通电,你必须给他交流电让他震荡他才能发声。

三极管驱动

前言:单片机的IO接口也是不足以驱动蜂鸣器,也需要外接一些驱动电路(蜂鸣器的功率稍微大些)。

注意:

  • 对于上面的电路中,该蜂鸣器使用的是电磁式蜂鸣器,采用5V供电。
  • 三极管驱动原理:利用了三极管的放大特性(类似外包)。
  • 蜂鸣器左边的为续流管,因为该蜂鸣器是一个电感型蜂鸣器,电感元件在电流发生变化时都会产生反向电动势来尽力的维持电流不变(该反向电动势不会立即消失),当电源断开时也会产生反向电动势,该续流管的作用就是构成反向电动势的回路来消耗掉这个反向电动势以保护三极管电路不被击穿(理解:上面电源推三家管,下面电感拉三极管会导致穿透)

蜂鸣器原理

前言:通过交流电使蜂鸣器震荡进而发出声音,不同频率波形使蜂鸣器的震荡频率不同,然而物体的震动形成声音,声音的音调取决于震荡的频率,因此我们只需要给出不同频率的波形(通过定时器形成)让蜂鸣器按照不同频率震荡,那么蜂鸣器就可发出不同调子的声音。

音符与频率对照表

注意:

  • 中音1就相当于钢琴的中央C。
  • 钢琴键盘上的每个声音频率满足12均分律(隔12个声音,频率变成2倍)

蜂鸣器播放130.8Hz的声音

30.8Hz表示每秒钟会震动130.8次,那么震动一次需要1/130.8=0.0076452s;因为单片机的单位为微秒,所以为7645微秒;因为7645us为整个周期的值,所以还需除以2得到3822.6us(3823us为正电平或负电平持续的时间,整个周期时长7645us);因此我们只需要通过定时器输出频率为7645微秒的方波即可。

仿真案例

蜂鸣器发声

需求:我们想要蜂鸣器发出C(频率130.8Hz)的调子

电路图

keil文件

#include "reg51.h"
sbit sound=P2^0;
void inittimer(){
	TMOD=0x01; //0000 0001——工作方式2
	TH0=(65536-3823)/256;
	TL0=(65536-3823)%256;
	ET0=1;
	EA=1;
	TR0=1;
	sound=0;
}
void main()
{
	inittimer();
	while(1);
}
void timer_isr() interrupt 1
{
	TH0=(65536-3823)/256;
	TL0=(65536-3823)%256;
	sound=~sound;
}

注意:也可以用延时函数,每隔一段时间电平值取反,那么周期就是两倍的延时时间。

蜂鸣器播放音乐

需求:使用蜂鸣器播放歌曲孤勇者。

歌曲数据获得

  • 音调:通过绘制不同频率的方波来实现。
  • 节拍:通过延时函数来实现。

注意:该图片为下面数组三位数的表现形式

使用的频率

电路图:和上面的电路图一样。

keil文件

#include "reg51.h"
sbit sound=P2^0;
unsigned int timer,index=0; //定时器初值,数据表索引
unsigned char beat,num; //节拍数,21音的计数
//每个数的3个位数代表了不同的意义(音高,音长,音符)
code unsigned char gequ[]={
	120,116,117,211,212,117,211,221,
	211,117,211,212,117,211,221,211,212,213,212,213,212,223,
	213,212,223,225,223,116,117,211,212,117,211,221,211,117,
	211,212,117,211,221,211,212,213,212,213,212,223,213,212,
	223,225,223,225,233,215,233,215,213,215,216,213,225,225,
	233,215,233,215,213,215,216,213,225,215,215,213,212,222,
	222,211,213,213,212,222,222,211,211,146,110,215,215,213,
	212,222,222,211,213,213,212,222,222,211,211,146,140,0};
//频率表
code unsigned int pinlv[]={
	466,523,587,659,698,784,880, //低音
	923,1047,1175,1319,1568,1760, //中音
	1865,2094,2351,2633,2792,3134,3517 //高音
};
//延时节拍数
void delay(unsigned char t){
	unsigned int i=0,j=0;
	for(i=t;i>0;i--){
		for(j=23000;j>0;j--);
	}
}
void play(){
	while(gequ[index]){ //声音索引为0就停止播放
		if(gequ[index]%10==0){ //若根据数据分离出来的音符是0表示不发声比如120
			TR0=0;
		}else{
			num=gequ[index]%10+(gequ[index]/100-1)*7-1; //根据数据索引计算频率索引
			timer=65535-(12000000/12)/(pinlv[num]*2); //根据频率计算初值
			TH0=timer/256;
			TL0=timer%256;
			TR0=1;
		}
		beat=gequ[index]/10%10;
		delay(beat); //延时的程序让你有足够的空间在特定的频率不断震荡,同时也起节拍的作用
		index++; //声音索引自动+1
	}
	TR0=0; //播放结束停止定时器
	index=0;	//播放结束声音数据索引清零
}
void main()
{
	sound=0;
	TMOD=0x01;
	EA=1;
	ET0=1;
	while(1){
		//不断播放音乐,单曲循环
		play();
	}
}
void timer0() interrupt 1
{
	TH0=timer/256;
	TL0=timer%256;
	sound=~sound;
}

  • 24
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 51单片机可以通过控制蜂鸣器和LED灯来实现流水灯的效果。具体实现方法如下: 1. 首先,需要定义蜂鸣器和LED灯的引脚,可以使用P口或P2口。 2. 然后,需要设置蜂鸣器和LED灯的输出模式,可以使用P口或P2口的寄存器来设置。 3. 接下来,可以使用循环语句来控制LED灯的流水效果,例如使用for循环来循环输出LED灯的不同状态。 4. 同时,在循环中可以通过控制蜂鸣器的开关来实现蜂鸣器的声音效果,例如使用if语句来判断是否需要开启蜂鸣器。 5. 最后,需要在程序结束时关闭蜂鸣器和LED灯的输出,以免影响下一次使用。 通过以上步骤,就可以实现51单片机蜂鸣器与LED流水灯的简单结合。 ### 回答2: 51单片机是一种常用的微控制器,常用于嵌入式系统和物联网等领域。蜂鸣器和LED灯则是51单片机常用的外设之一,用于输出音频和可视化提示。在本文中,我们将简单介绍51单片机中如何结合蜂鸣器和LED灯实现流水灯的功能。 首先,我们需要连接一个蜂鸣器和几个LED灯到51单片机的IO口上。蜂鸣器连接到单片机的一个数字IO口,而LED灯则连接到多个数字IO口。接下来,我们需要编写程序实现所需的功能。 程序的主要逻辑是通过循环输出一个特定的二进制数,在该二进制数的对应位上输出高电平,其余位上输出低电平。同时,利用蜂鸣器的输出声音来控制LED灯的状态,实现流水灯的效果。需要注意的是,在每次LED灯循环时,需要休眠一段时间,以便人眼能够捕捉到灯的变化。 以下是一个简单的程序示例,用于实现一个8个LED灯的流水灯,同时通过蜂鸣器实现另一种灯光效果: #include <reg51.h> void delay(unsigned int n) // 延时函数 { unsigned int i, j; for(i = 0; i < n; i++) for(j = 0; j < 125; j++); } void main() { unsigned char led = 0x01; unsigned char beep = 0; while(1) { P1 = ~led; // 输出LED灯状态 if(beep % 2 == 0) // 控制蜂鸣器 P3 = 0xff; else P3 = 0x00; delay(500); // 延时 led <<= 1; if(led == 0) // 流水灯循环 led = 0x01; beep++; } } 在程序的main函数中,将led和beep分别初始化为二进制数1和0。在主循环中,先输出LED的状态,然后控制蜂鸣器输出不同的声音,最后延迟一段时间后将led向左移动一位,循环实现流水灯效果。在beep的计数中,每隔一个循环就控制一次蜂鸣器的状态,实现了蜂鸣器和LED灯交替变化的效果。 以上就是关于51单片机中如何结合蜂鸣器和LED灯实现流水灯的简单介绍。这种结合技巧是51单片机中常用的应用,也是初学者熟悉51单片机开发的不错选择。 ### 回答3: 51单片机蜂鸣器和LED流水灯是单片机初学者经常接触和学习的基本知识点,其中蜂鸣器和LED都是最基础的外设之一。学会如何控制蜂鸣器和LED可以为后续学习单片机的更高级操作打下扎实的基础。 蜂鸣器和LED流水灯的简单结合可以让单片机的控制更加有趣。在使用51单片机时,蜂鸣器和LED流水灯一般都是通过连接PIO口实现控制的。 第一步,我们需要了解怎样控制单个LED灯。单个LED的控制需要连接正极到51单片机的输出IO口,负极需要连接到地。将51单片机的IO口设置为高电平,LED灯就会亮起来。将51单片机的IO口设置为低电平,LED灯就会熄灭。 接着,我们来了解如何控制多个LED灯的流水灯效果。多个LED灯的流水灯效果控制就需要将每个LED的正极连接到51单片机不同的IO口,然后依次点亮每个LED,可以通过循环结构来实现多个LED灯的不停闪烁。闪烁速度的控制可以通过控制循环延时或者计数器实现。 最后,我们可以结合蜂鸣器来实现更有趣的效果。蜂鸣器的控制和LED类似,将其连接到51单片机的某个IO口,再通过控制IO口电平实现蜂鸣器的开关。可以通过设置不同的频率使蜂鸣器发出不同的声音。将蜂鸣器和LED灯的开关控制结合在一起,就可以实现更加动态和有趣的效果。 总之,蜂鸣器和LED灯的结合是单片机学习者的基础,掌握了这些基本的控制方法,就可以扩展出更多有趣的小项目,对单片机的学习和实践都有很大的帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值