51单片机入门——蜂鸣器
文章目录
- 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单片机入门——蜂鸣器相关推荐
- 51单片机入门基础介绍
51单片机入门基础介绍 文章目录 51单片机入门基础介绍 前言 常用元器件 发光二极管 数码管 LED数码管的显示方式 按键 定时计数器 串行口控制寄存器SCON 中断系统 中断源及中断请求 中断允许 ...
- 51单片机入门学习笔记(上)
笔记整理自B站UP主江科大自化协教程<51单片机入门教程-2020版 程序全程纯手打 从零开始入门> 所用单片机为普中51 STC89C52单片机2022新款,文中所提到的调试现象及结果也 ...
- 51单片机入门教程(6)——外部中断
51单片机入门教程(6)--外部中断 一.外部中断 1.1 中断 1.2 外部中断 二.中断优先级 一.外部中断 1.1 中断 关于中断的概念在上一篇博客中已经提到了.(传送门:51单片机入门教程(5 ...
- 51单片机入门教程(5)——定时器中断
51单片机入门教程(5)--定时器中断 一.中断的概念 二.定时器中断 2.1 软件延时的不足 2.2 中断寄存器 2.2.1 中断允许控制寄存器 IE 2.2.2 定时器工作方式寄存器 TMOD 2 ...
- 51单片机入门教程(1)——点亮一个LED灯
51单片机入门教程(1)--点亮一个LED灯 一.什么是单片机 单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU.随机存储器 ...
- 51单片机入门学习小结(流水灯与数码管)
51单片机入门学习小结(流水灯与数码管) 对原理图的分析 以下是我所用单片机的原理图 这块51单片机一共有4个I/O口(意思为input/output),也代表着如果我们后续都要用到这四个的话那么功能 ...
- 51单片机与蜂鸣器实现摩斯密码转换。
51单片机与蜂鸣器实现摩斯密码转换. #include <intrins.h> void delay(unsigned char ms); void delay2(int i); void ...
- 用51单片机驱动蜂鸣器
用51单片机驱动蜂鸣器 #include<reg51.h>//头文件 sbit BEEP=P1^5;//位定义P1的第五个端口为蜂鸣器 void delay() //延时函数 {unsig ...
- 51单片机 AT24C04+蜂鸣器+Proteus仿真
51单片机 AT24C02+蜂鸣器+Proteus仿真 Proteus仿真截图 由于是音频效果,只能以截图展示基本电路 实例代码 #include <reg52.h> #include & ...
- 51单片机入门模板(STC89C52RC)
该模板适用于51单片机入门,比较易于理解,包含定时器和串口的操作. 可以在定时器T0中断服务函数和主循环中实现主要功能,在UART中断服务函数(T1定时器)中实现简单的串口通信接收命令的功能. 注:本 ...
最新文章
- vivox50pro鸿蒙系统,vivo X50 Pro最适合用来拍风景,看看网友的作品就知道了
- pytorch torch.optim.lr_scheduler 各种使用和解释
- python发明者叫什么-python是怎么被发明的
- Spring事件机制详解
- vue-cli3 本地代理配置
- Data Augmentation
- 上海理工大学第二届“联想杯”全国程序设计邀请赛 - Dahno Dahno(SW)
- SpringMVC第一个例子
- python爬取网页有乱码怎么解决_Python爬取网页requests乱码
- java多线程编程_《java多线程编程实战指南》读书笔记 -- 基本概念
- 李航《统计学习方法》SMO算法推导中的思考
- archLinux 安装拼音输入法
- eplan mysql_EPLAN SQL Server 远程数据库的搭建
- python人狗大战游戏_day23 02 组合(继续人狗大战游戏)
- 2019314输入一个日期,输出星期几
- 项目中使用 husky 格式化代码和校验 commit 信息
- 黑得漂亮!SyScan360黑客大会展示17秒攻陷IE
- 编写跨平台Java程序注意事项
- 为什么无线AP标称的速率和实际速率不一致?(空口速率)
- 第四次网页前端学习笔记(css)