文章目录

  • 1.什么是蜂鸣器
  • 2.蜂鸣器的应用
  • 两只老虎

1.什么是蜂鸣器

蜂鸣器从结构区分分别为压电式蜂鸣器电磁式蜂鸣器。压电式为压电陶瓷片发音,电流比较小一些,电磁式蜂鸣器为线圈通电震动发音,体积比较小。

按照驱动方式分为有源蜂鸣器无源蜂鸣器。这里的有源和无源不是指电源,而是振荡源。如下图,给了BUZZ引脚一个低电平,蜂鸣器就会直接响。而无源蜂鸣器内部是不带振荡源的,要让他响必须给 500Hz~4.5KHz 之间的脉冲频率信号来驱动它才会响。有源蜂鸣器往往比无源蜂鸣器贵一些,因为里边多了振荡电路,驱动发音也简单,靠电平就可以驱动,而无源蜂鸣器价格比较便宜,此外无源蜂鸣器声音频率可以控制,而音阶与频率又有确定的对应关系,因此就可以做出来 “do re mi fa sol la si” 的效果,可以用它制作出简单的音乐曲目,比如生日歌、两只老虎等等。

如上图,驱动蜂鸣器的电流相对于单片机输出的电流较大,因此需要一个三极管来驱动,并加了一个100欧的限流电阻。在图中我们还可以看到一个二极管 D4 ,这个二级管在这里叫续流二极管。我们的蜂鸣器是一个感性器件,当三极管导通给蜂鸣器供电时,就会有导通电流流过蜂鸣器。而我们知道,电感的一个重要的特性就是电流不能突变,导通时电流是逐渐增大的,这点没有问题,但是当三极管截止时。经过“电源—三极管—蜂鸣器—地”这条回路就截断了,过不了任何电流了,那么蜂鸣器储存的电流哪儿去呢,就是经过 D4 和蜂鸣器自身的环路来消耗掉了,从而就可以避免了三极管截止的时候由于电感电流造成的反向冲击。接续三极管截止时的电流,这就是续流二极管名称的由来。

2.蜂鸣器的应用

蜂鸣器经常用于电脑、打印机、万用表这些设备做提示音,提示音一般也简单,就简单的发个声就行了,我们用程序简单的做了个 4KHZ 频率下的发声和 1KHZ 频率下的发声程序。

#include <reg52.h>sbit BUZZ = P1^6; //蜂鸣器控制引脚unsigned char T0RH = 0; //T0 重载值的高字节
unsigned char T0RL = 0; //T0 重载值的低字节void OpenBuzz(unsigned int frequ);
void StopBuzz();void main()
{unsigned int i;TMOD = 0x01; //配置 T0 工作在模式 1,但先不启动EA = 1; //使能全局中断while (1){OpenBuzz(4000); //以 4KHz 的频率启动蜂鸣器for (i=0; i<40000; i++);StopBuzz(); //停止蜂鸣器for (i=0; i<40000; i++);OpenBuzz(1000); //以 1KHz 的频率启动蜂鸣器for (i=0; i<40000; i++);StopBuzz(); //停止蜂鸣器for (i=0; i<40000; i++);}}/* 蜂鸣器启动函数,frequ-工作频率 */
void OpenBuzz(unsigned int frequ)
{unsigned int reload; //计算所需的定时器重载值reload = 65536 - (11059200/12)/(frequ*2); //由给定频率计算定时器重载值T0RH = (unsigned char)(reload >> 8); //16 位重载值分解为高低两个字节T0RL = (unsigned char)reload;TH0 = 0xFF; //设定一个接近溢出的初值,以使定时器马上投入工作TL0 = 0xFE;ET0 = 1; //使能 T0 中断TR0 = 1; //启动 T0
}/* 蜂鸣器停止函数 */
void StopBuzz()
{ET0 = 0; //禁用 T0 中断TR0 = 0; //停止 T0
}/* T0 中断服务函数,用于控制蜂鸣器发声 */
void InterruptTimer0() interrupt 1
{TH0 = T0RH; //重新加载重载值TL0 = T0RL;BUZZ = ~BUZZ; //反转蜂鸣器控制电平
}

两只老虎

蜂鸣器也可以用来输出音乐,仅为了好玩,里面包含了音阶、乐谱的相关内容。

#include <reg52.h>sbit BUZZ = P1^5 ; //蜂鸣器控制引脚unsigned int code NoteFrequ[] = { //中音 1-7 和高音 1-7 对应频率列表523, 587, 659, 698, 784, 880, 988, //中音 1-71047, 1175, 1319, 1397, 1568, 1760, 1976 //高音 1-7
} ;unsigned int code NoteReload[] = { //中音 1-7 和高音 1-7 对应的定时器重载值65536 - (11059200/12) / (523*2), //中音 165536 - (11059200/12) / (587*2), //265536 - (11059200/12) / (659*2), //365536 - (11059200/12) / (698*2), //465536 - (11059200/12) / (784*2), //565536 - (11059200/12) / (880*2), //665536 - (11059200/12) / (988*2), //765536 - (11059200/12) / (1047*2), //高音 165536 - (11059200/12) / (1175*2), //265536 - (11059200/12) / (1319*2), //365536 - (11059200/12) / (1397*2), //465536 - (11059200/12) / (1568*2), //565536 - (11059200/12) / (1760*2), //665536 - (11059200/12) / (1976*2), //7
} ;bit enable = 1; //蜂鸣器发声使能标志
bit tmrflag = 0; //定时器中断完成标志unsigned char T0RH = 0xFF; //T0 重载值的高字节
unsigned char T0RL = 0x00; //T0 重载值的低字节void PlayTwoTiger();void main()
{unsigned int i;EA = 1; //使能全局中断TMOD = 0x01; //配置 T0 工作在模式 1TH0 = T0RH;TL0 = T0RL;ET0 = 1; //使能 T0 中断TR0 = 1; //启动 T0while (1){PlayTwoTiger(); //播放乐曲--两支老虎for (i=0; i<40000; i++); //停止一段时间}
}/* 两只老虎乐曲播放函数 */
void PlayTwoTiger()
{unsigned char beat; //当前节拍索引unsigned char note; //当前节拍对应的音符unsigned int time = 0; //当前节拍计时unsigned int beatTime = 0; //当前节拍总时间unsigned int soundTime = 0; //当前节拍需发声时间//两只老虎音符表unsigned char code TwoTigerNote[] = {1, 2, 3, 1, 1, 2, 3, 1, 3, 4, 5, 3, 4, 5,5,6, 5,4, 3, 1, 5,6, 5,4, 3, 1, 1, 5, 1, 1, 5, 1,} ;//两只老虎节拍表,4 表示一拍,1 就是 1/4 拍,8 就是 2 拍unsigned char code TwoTigerBeat[] = {4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 4, 4, 8,3,1, 3,1, 4, 4, 3,1, 3,1, 4, 4, 4, 4, 8, 4, 4, 8,} ;for (beat=0; beat<sizeof(TwoTigerNote); ) //用节拍索引作为循环变量{while (!tmrflag); //每次定时器中断完成后,检测并处理节拍tmrflag = 0;if (time == 0) //当前节拍播完则启动一个新节拍{note = TwoTigerNote[beat] - 1;T0RH = NoteReload[note] >> 8;T0RL = NoteReload[note];//计算节拍总时间,右移 2 位相当于除 4,移位代替除法可以加快执行速度beatTime = (TwoTigerBeat[beat] * NoteFrequ[note]) >> 2;//计算发声时间,为总时间的 0.75,移位原理同上soundTime = beatTime - (beatTime >> 2);enable = 1; //指示蜂鸣器开始发声time++;}else //当前节拍未播完则处理当前节拍{if (time >= beatTime) //当前持续时间到达节拍总时间时归零,{ //并递增节拍索引,以准备启动新节拍time = 0;beat++;}else //当前持续时间未达到总时间时,{time++; //累加时间计数if (time == soundTime) //到达发声时间后,指示关闭蜂鸣器,{ //插入 0.25*总时间的静音间隔,enable = 0; //用以区分连续的两个节拍}}}}
}/* T0 中断服务函数,用于控制蜂鸣器发声 */
void InterruptTimer0() interrupt 1
{TH0 = T0RH; //重新加载重载值TL0 = T0RL;tmrflag = 1;if (enable) //使能时反转蜂鸣器控制电平BUZZ = ~BUZZ;else //未使能时关闭蜂鸣器BUZZ = 1;
}
提供《世上只有妈妈好》《烟花易冷》的数据表,有兴趣的小伙伴可以自己试试哦!!!
//《世上只有妈妈好》数据表
code unsigned char sszymmh[] = {6, 2, 3, 5, 2, 1, 3, 2, 2, 5, 2, 2, 1, 3, 2, 6, 2, 1, 5, 2, 1,
//一个音符有三个数字。前为第几个音、中为第几个八度、后为时长(以半拍为单位)。
//6, 2, 3 分别代表:6, 中音, 3个半拍;
//5, 2, 1 分别代表:5, 中音, 1个半拍;
//3, 2, 2 分别代表:3, 中音, 2个半拍;
//5, 2, 2 分别代表:5, 中音, 2个半拍;
//1, 3, 2 分别代表:1, 高音, 2个半拍;
//
6, 2, 4, 3, 2, 2, 5, 2, 1, 6, 2, 1, 5, 2, 2, 3, 2, 2, 1, 2, 1,
6, 1, 1, 5, 2, 1, 3, 2, 1, 2, 2, 4, 2, 2, 3, 3, 2, 1, 5, 2, 2,
5, 2, 1, 6, 2, 1, 3, 2, 2, 2, 2, 2, 1, 2, 4, 5, 2, 3, 3, 2, 1,
2, 2, 1, 1, 2, 1, 6, 1, 1, 1, 2, 1, 5, 1, 6, 0, 0, 0};//《烟花易冷》
unsigned char code song1[]={5,2,1, 3,2,1, 2,2,2, 2,2,4, 3,2,1, 1,2,1, 2,2,1, 3,2,4, 5,2,1, 3,2,1, 2,2,2, 2,2,2, 5,1,1, 3,2,1, 4,2,1, 3,2,4, 3,2,1, 3,2,1, 7,2,1, 3,2,1, 2,2,2, 1,2,1, 7,1,1, 1,2,1, 2,2,1, 3,2,1, 6,2,3, 6,1,1, 1,2,1, 3,2,1, 2,2,1, 6,1,1, 1,2,1, 7,1,1, 5,1,1, 6,1,6, 5,2,1, 3,2,1, 2,2,2, 2,2,1, 2,2,1, 3,2,1, 1,2,1, 2,2,1, 3,2,4, 5,2,1, 3,2,1, 2,2,2, 2,2,1, 2,2,1, 5,1,1, 3,2,1, 4,2,1, 3,2,4, 3,2,1, 3,2,1, 7,2,3, 3,2,1, 2,2,2, 1,2,1, 7,1,1, 1,2,1, 2,2,1, 3,2,1, 6,2,3, 6,1,1, 1,2,1, 3,2,1, 2,2,1, 6,1,1, 1,2,1, 7,1,2, 5,1,2, 6,1,6, 0,0,0 };

51单片机入门——蜂鸣器相关推荐

  1. 51单片机入门基础介绍

    51单片机入门基础介绍 文章目录 51单片机入门基础介绍 前言 常用元器件 发光二极管 数码管 LED数码管的显示方式 按键 定时计数器 串行口控制寄存器SCON 中断系统 中断源及中断请求 中断允许 ...

  2. 51单片机入门学习笔记(上)

    笔记整理自B站UP主江科大自化协教程<51单片机入门教程-2020版 程序全程纯手打 从零开始入门> 所用单片机为普中51 STC89C52单片机2022新款,文中所提到的调试现象及结果也 ...

  3. 51单片机入门教程(6)——外部中断

    51单片机入门教程(6)--外部中断 一.外部中断 1.1 中断 1.2 外部中断 二.中断优先级 一.外部中断 1.1 中断 关于中断的概念在上一篇博客中已经提到了.(传送门:51单片机入门教程(5 ...

  4. 51单片机入门教程(5)——定时器中断

    51单片机入门教程(5)--定时器中断 一.中断的概念 二.定时器中断 2.1 软件延时的不足 2.2 中断寄存器 2.2.1 中断允许控制寄存器 IE 2.2.2 定时器工作方式寄存器 TMOD 2 ...

  5. 51单片机入门教程(1)——点亮一个LED灯

    51单片机入门教程(1)--点亮一个LED灯 一.什么是单片机 单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU.随机存储器 ...

  6. 51单片机入门学习小结(流水灯与数码管)

    51单片机入门学习小结(流水灯与数码管) 对原理图的分析 以下是我所用单片机的原理图 这块51单片机一共有4个I/O口(意思为input/output),也代表着如果我们后续都要用到这四个的话那么功能 ...

  7. 51单片机与蜂鸣器实现摩斯密码转换。

    51单片机与蜂鸣器实现摩斯密码转换. #include <intrins.h> void delay(unsigned char ms); void delay2(int i); void ...

  8. 用51单片机驱动蜂鸣器

    用51单片机驱动蜂鸣器 #include<reg51.h>//头文件 sbit BEEP=P1^5;//位定义P1的第五个端口为蜂鸣器 void delay() //延时函数 {unsig ...

  9. 51单片机 AT24C04+蜂鸣器+Proteus仿真

    51单片机 AT24C02+蜂鸣器+Proteus仿真 Proteus仿真截图 由于是音频效果,只能以截图展示基本电路 实例代码 #include <reg52.h> #include & ...

  10. 51单片机入门模板(STC89C52RC)

    该模板适用于51单片机入门,比较易于理解,包含定时器和串口的操作. 可以在定时器T0中断服务函数和主循环中实现主要功能,在UART中断服务函数(T1定时器)中实现简单的串口通信接收命令的功能. 注:本 ...

最新文章

  1. vivox50pro鸿蒙系统,vivo X50 Pro最适合用来拍风景,看看网友的作品就知道了
  2. pytorch torch.optim.lr_scheduler 各种使用和解释
  3. python发明者叫什么-python是怎么被发明的
  4. Spring事件机制详解
  5. vue-cli3 本地代理配置
  6. Data Augmentation
  7. 上海理工大学第二届“联想杯”全国程序设计邀请赛 - Dahno Dahno(SW)
  8. SpringMVC第一个例子
  9. python爬取网页有乱码怎么解决_Python爬取网页requests乱码
  10. java多线程编程_《java多线程编程实战指南》读书笔记 -- 基本概念
  11. 李航《统计学习方法》SMO算法推导中的思考
  12. archLinux 安装拼音输入法
  13. eplan mysql_EPLAN SQL Server 远程数据库的搭建
  14. python人狗大战游戏_day23 02 组合(继续人狗大战游戏)
  15. 2019314输入一个日期,输出星期几
  16. 项目中使用 husky 格式化代码和校验 commit 信息
  17. 黑得漂亮!SyScan360黑客大会展示17秒攻陷IE
  18. 编写跨平台Java程序注意事项
  19. 为什么无线AP标称的速率和实际速率不一致?(空口速率)
  20. 第四次网页前端学习笔记(css)

热门文章

  1. Ubuntu、ros快速安装
  2. 【技术贴】删除空白文件夹,提示无法读源文件或磁盘的解决方法
  3. Python的Scipy库解微分方程
  4. seo需要编程技术吗?学黑帽seo需要什么技术?
  5. java BBS论坛
  6. Spark高频面试题总结
  7. [工作记录]在线表格比对系统实现思路整理
  8. mfc 使用flash控件注意事项
  9. ROS学习(9)自定义移动机器人模型Gazebo仿真
  10. 使用Excel制作证件照之替换背景色