蜂鸣器及其实验

2023-05-16

蜂鸣器电路图

蜂鸣器按驱动方式可分为有源蜂鸣器(内含驱动线路)无源蜂鸣器(外部驱动)。这里的“源”指的是激励源。

无源蜂鸣器内部没有激励源,只有给它一定频率的方波信号,才能让蜂鸣器的振动装置起振,从而实现发声,同时,输入的方波频率不同,发出的声音也不同(所以无源蜂鸣器可以模拟曲调实现音乐效果)。

有源蜂鸣器则不需要外部的激励源,只需要接入直流电源,即可自动发出声音(声音频率相对固定)。

无源蜂鸣器工作原理

无源蜂鸣器需要1.5~2.5kHz(与蜂鸣器种类有关)的音频信号,这个音频信号即一个高低变化频率为1.5-2.5kHz的方波。实际上频率小于1.5kHz也是有声音的,只是不那么准了,可能是嘟嘟声。

蜂鸣器经常用于电脑、打印机、万用表这些设备做提示音,下面是蜂鸣器在 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-7
    1047, 1175, 1319, 1397, 1568, 1760, 1976 //高音 1-7
} ;

unsigned int code NoteReload[] = { //中音 1-7 和高音 1-7 对应的定时器重载值
    65536 - (11059200/12) / (523*2), //中音 1
    65536 - (11059200/12) / (587*2), //2
    65536 - (11059200/12) / (659*2), //3
    65536 - (11059200/12) / (698*2), //4
    65536 - (11059200/12) / (784*2), //5
    65536 - (11059200/12) / (880*2), //6
    65536 - (11059200/12) / (988*2), //7
    65536 - (11059200/12) / (1047*2), //高音 1
    65536 - (11059200/12) / (1175*2), //2
    65536 - (11059200/12) / (1319*2), //3
    65536 - (11059200/12) / (1397*2), //4
    65536 - (11059200/12) / (1568*2), //5
    65536 - (11059200/12) / (1760*2), //6
    65536 - (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 工作在模式 1
    TH0 = T0RH;
    TL0 = T0RL;
    ET0 = 1; //使能 T0 中断
    TR0 = 1; //启动 T0
 
    while (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 };

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

蜂鸣器及其实验 的相关文章

  • 数据分析----数据清洗

    文章目录 前言一 数据清洗是什么 xff1f 二 步骤1 选择列2 缺失值处理1 找到缺失值2 处理缺失值的方法 3 数据类型转化4 重复值处理 总结 前言 随着科技的不断发展 xff0c 数据在我们生活中越来越多 xff0c 面对繁杂的数
  • python装饰器

    装饰器 一 概念 1 装饰器 xff08 Decoration xff09 装饰器是一种设计模式 xff0c 经常用来实现 34 面向切面的编程 34 AOP 实现在不修改源代码的情况下 xff0c 给程序动态添加功能的一种技术 2 装饰器
  • 拒绝拖延!

  • 使用qemu-img转换镜像格式

    qemu功能强大 xff0c 详细了解其功能请到官网查看 https www qemu org docs master system images html qemu img能将RAW qcow2 VMDK VDI VHD xff08 vp
  • KEIL5MDK最新版(3.37)安装以及旧编译器(V5)安装

    最近KEIl5最新版本出来了 xff0c 但官方不在默认安装V5编译器 xff0c 导致某些代码无法兼容 xff0c 为了防止搞忘 xff0c 便把方法上传网上 旧编译器的安装思路是 在以前有V5编译器的KEILMDK安装包中复制粘贴到新的
  • mp4转ros bag包

    操作方法 python2 mp4 to bag py lane video mp4 lane camera bag 执行转化命令 rosbag play l TLout bag camera image raw 61 image raw0
  • 深度学习之卷积神经网络CNN详细

    需要PPT加Q1271370903 一 深度学习引入 1 各学习方法之间的联系 SL SSL和UL是传统ML方法 DL提供了一个更强大的预测模型 可产生良好的预测结果 RL提供了更口快的学习机制 且更适应环境的变化 TL突破了任务的限制 将
  • 基于51单片机实现红外循迹

    红外循迹外观 xff1a 红外循迹原理 xff1a 红外循迹模块原理还是很简单的 xff0c 和许多光电传感器原理一样 xff0c 当发射器发射出去的光被接收器接收到后 xff0c 模块上对应的LED灯点亮 xff0c 此时相应的输出引脚输
  • Ubuntu“从服务器获取共享列表失败:拒绝连接”问题的解决方法

    本来是可以的 xff0c 在安装nginx后 xff0c ubuntu连接不上共享文件 有过以下尝试 删除nginx和所有配置 xff0c 关闭代理 或者搜一些什么安装smbd包什么的 还有连接ip地址进行挂载的 以及开放端口 我解决的方法
  • C语言:scanf的使用

    目录 一 scanf的循环读取 1 scanf的一次读取 2 加入while循环使scanf能进行循环读取 3 由于scanf出错时会返回EOF xff0c 故代码改为 4 加入rewind清空缓冲区 xff08 只适用于vs xff09
  • 搭建mysql的主从关系

    目录 1 什么是mysql主从 2 为什么要使用MySQL主从 3 MySQL主从的实现原理 4 如何搭建mysql主从关系 4 1 搭建两台有mysql的虚拟机 可以克隆 4 2 保证自己的mysql可以远程访问 4 3 修改ip地址 因
  • 关于虚拟机装Anaconda教学

    文章目录 一 第一步装VMware Workstation Pro虚拟机的安装二 下载虚拟机镜像文件三 安装python解释器 xff0c 安装Anaconda xff1a python解释器 xff1a 直接在DOS上安装 xff0c 操
  • C#ftp服务器配置与文件上传

    个人分享 public void test ftp服务器路径 string ftpServer 61 34 ftp 192 168 0 1 34 ftp本地路径 string ftpDefaultUrl 61 34 A 34 登入到ftp的
  • 完整的前端项目开发流程

    一个项目从一开始的计划到最后的上线 大概要经过以下的流程 产品设计原型审评项目分工项目开发项目测试项目构建项目上线 1产品设计 主要负责人 产品经理 产品经理前期负责收集销售 客户 领导的零散需求 然后做需求分析 完成产品设计 需求分析 需
  • debian11 sid

    编辑 etc apt sources list xff0c 增加下面二行 xff1a deb http ftp us debian org debian sid main contrib non free deb src http ftp
  • 单片机学习——定时器/计数器

    单片机必学系列 单片机学习 中断系统 单片机学习 存储器详解 xff08 程序存储器 片内RAM 拓展RAM EEPROM xff09 单片机学习 定时器 计数器 单片机学习 A D转换 更新ing 单片机学习 定时器 计数器 单片机必学系
  • ros bag包转mp4视频

    先在 rosbag2video py 脚本中修改相关配置参数 或者在终端命令改也行 如果使用脚本里的默认参数 则可直接运行 python rosbag2video py 2022 02 02 10 41 38 bag 代码如下 span c
  • 零基础入门Jetson Nano——通过OpenCV调用CSI和USB摄像头

    Jetson Nano学习 摄像头调用 前言一 CSI摄像头的调用1 安装v4l2 utils协助工具2 查看摄像头挂载情况3 查看挂载的摄像头详细参数情况4 检测摄像头能否正常工作5 使用OpenCV调用CSI摄像头方式一 利用Gstre
  • HTML搜索框的制作过程

    1 搜索框的构成 input标签和button标签我的理解应该就类似于行内块元素 xff0c 可以设置宽高 xff0c 但同时又不独占一行placeholder 占位文本 就是输入框一开始默认显示的文本 span class token t
  • Linux

    Linux 文件管理创建目录创建文件复制剪切 重命名删除归档 xff08 解压 压缩 xff09 文件查看帮助文档查看信息文件显示当前工作目录切换目录请屏显示文件内容文件内容搜索文件搜索链接文件搜索命令所在位置 Linux系统查看进程终止进

随机推荐

  • isalpha()库函数

    C C 43 43 isalpha 库函数 isalpha 函数用来检测一个字符是否是字母 xff0c 包括大写字母和小写字母 头文件 xff1a 属于ctype h头文件 xff1b 但也包含在iostream头文件下 语法原型 xff1
  • 计算机网络(谢希仁-第八版)第四章习题全解

    4 01 网络层向上提供的服务有哪两种 xff1f 试比较其优缺点 xff1f 虚电路服务和数据报服务 虚电路 优点 xff1a 1 可以提供可靠的通信服务 2 因为数据是沿着建立的虚电路进行传输的 xff0c 因此分组的首部不需要携带完整
  • Linux下线程池(ThreadPool)

    目录 一 线程池相关概念及其优点 二 线程池的实现 一 线程池相关概念及其优点 线程池一种线程使用模式 xff0c 线程过多会带来这个调度的开销进而影响整体的性能 xff0c 而线程池是提前准备好了线程等待着管理者进行分配任务 1 线程池的
  • Golang协程常见面试题

    协程面试题 交替打印奇数和偶数N个协程打印1到maxVal交替打印字符和数字交替打印字符串三个协程打印ABCChannel练习 交替打印奇数和偶数 下面让我们一起来看看golang当中常见的算法面试题 使用两个goroutine交替打印1
  • JS 几种常见的遍历方式

    JS 几种常见的遍历方式 目录 JS 几种常见的遍历方式for循环for in 循环for of 循环forEach循环map方法参考资料 for循环 普通的写法let arr 61 1 2 3 for let i 61 0 i lt ar
  • mp4 转 jpg 图片

    先在 rosbag2video py 脚本中修改相关配置参数 然后运行脚本 python mp4 2 jpg py 代码如下 span class token keyword import span span class token mod
  • C# WinForm界面设计教程

    WinForm 是 Windows Form 的简称 xff0c 是基于 NET Framework 平台的客户端 xff08 PC软件 xff09 开发技术 xff0c 一般使用 C 编程 C WinForm 编程需要创建 Windows
  • 2021 山东大学软件学院 软件工程应用与实践--YOLOV5项目代码分析——(5)

    2021SC 64 SDUSC detection class Detections detections class for yolov5 inference results def init self imgs pred files n
  • Centos7更改ssh端口报错解决

    Centos7 ssh 端口问题解决 报错如下 xff1a failed to start openssh server daemonssh failed to start openssh server daemon 问题总结 xff1a
  • Python 列表的常见操作

    Python 列表的常见操作 从形式上看 xff0c 列表会将所有元素都放在一对中括号 里面 xff0c 相邻元素之间用逗号 分隔 xff0c 如下所示 xff1a element1 element2 element3 elementn x
  • TortoiseGit的安装教程以及用法

    TortoiseGit的安装教程以及用法 TortoiseGit 是基于 TortoiseSVN 的 Git 版本的 Windows Shell 界面 它是开源的 xff0c 可以完全使用免费软件构建 TortoiseGit 支持你执行常规
  • 在idea中向Maven项目添加插件时出现的“找不到插件”错误解决

    大家用idea在pom xml中添加插件时 xff0c 一开始可能都会遇见添加的插件全报红的时候 现在我们把鼠标移到报红的地方 xff0c 他给了我们一个not found错误 xff0c 也就是找不到插件 那么解决方法也非常简单 xff0
  • 安装Ubuntu双系统

    制作U盘启动盘 1 电脑插入U盘 xff0c 格式化U盘 2 下载解压好安装包 链接 xff1a https pan baidu com s 1my5JrSz QRPwRxIOdU4JJQ 提取码 xff1a 1234 解压完成打开文件夹
  • 纯C+纯手写+手动编译 一个windows 窗体应用(过程记录)

    xff08 纯C 43 纯手写 43 手动编译 xff09 一个Windows 窗体应用 本篇文章仅仅是作者的一个类似笔记一样的东西 xff0c 作为记录 所以请勿出现如下不友善评论 啊 xff0c 这不是某某IDE直接就可以生成的吗 搞这
  • STM32寄存器的简介、地址查找,与直接操作寄存器

    1 STM32寄存器的简介 2 STM32寄存器地址查找 3 直接操作STM32寄存器 1 STM32寄存器的简介 1 寄存器映射 在存储器 Block2 这块区域 xff0c 设计的是片上外设 xff0c 它们以四个字节为一个单元 xff
  • python对目录下所有图片重命名

    执行下列代码程序即可 创建一个python文件 file rename py 然后执行 python file rename py span class token operator span span class token operat
  • word文档的公式编号方法(笔记)

    所谓制表位 xff0c 可以简单理解为在word中插入一个无形的表格 xff0c 制表位后的文本就按照他前面的制表位对齐 比如我们可以把公式行设置成这样 xff1a 制表位1 xff0c 位置在20字符处 xff0c 格式居中对齐 公式 制
  • error: src refspec master does not match any. 错误的解决办法

    我们在使用git bash指令将项目上传到github时 xff0c 总是遇到一些错误无法解决 下面是我遇到的一个问题 error src refspec master does not match any error failed to
  • (学习笔记)机器人自主导航从零开始第四步———Rviz、Gazebo、Meshlab的安装

    前言 本文参考资料 xff1a rviz ROS 维基 http wiki ros org rviz Gazebo Tutorial Ubuntu gazebosim org http gazebosim org tutorials tut
  • 蜂鸣器及其实验

    蜂鸣器电路图 蜂鸣器按驱动方式可分为有源蜂鸣器 xff08 内含驱动线路 xff09 和无源蜂鸣器 xff08 外部驱动 xff09 这里的 源 指的是激励源 无源蜂鸣器 内部没有激励源 xff0c 只有给它一定频率的方波信号 xff0c