it编程 > 硬件开发 > 单片机

单片机之蜂鸣器

64人参与 2024-08-06 单片机

目录

蜂鸣器介绍

蜂鸣器的分类

发声原理分类

按有源无源分类

三极管驱动

蜂鸣器原理

音符与频率对照表

蜂鸣器播放130.8hz的声音

仿真案例

蜂鸣器发声

电路图

keil文件

蜂鸣器播放音乐

歌曲数据获得

使用的频率

keil文件

蜂鸣器介绍

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

蜂鸣器的分类

发声原理分类

按有源无源分类

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

三极管驱动

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

注意:

蜂鸣器原理

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

音符与频率对照表

注意:

蜂鸣器播放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;
}

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

【ESP32最全学习笔记(基础篇)——4.ESP32 引脚介绍】

08-06

MPU6050六轴陀螺仪外围电路分析

08-06

STC8增强型单片机进阶开发--LED呼吸灯(PWM)

08-06

51单片机-60秒计时

08-06

(一)、为什么要学习FreeRTOS和单片机的选型?

08-06

TFT驱动ST7789使用总结

08-02

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论