51单片机入门_江协科技_25~26_OB记录的笔记_蜂鸣器教程

25. 蜂鸣器

  • 25.1. 蜂鸣器介绍
    •蜂鸣器是一种将电信号转换为声音信号的器件,常用来产生设备的按键音、报警音等提示信号
    •蜂鸣器按驱动方式可分为有源蜂鸣器和无源蜂鸣器(开发板上用的无源蜂鸣器)
    •有源蜂鸣器:内部自带振荡源,将正负极接上直流电压即可持续发声,频率固定
    •无源蜂鸣器:内部不带振荡源,需要控制器提供振荡脉冲才可发声,调整提供振荡脉冲的频率,可发出不同频率的声音
    在这里插入图片描述

  • 25.2. 驱动电路

    • 三极管驱动
      在这里插入图片描述

    • 集成电路驱动,开发板ULN2003D,Proteus有器件,开发板BZ接P2^5引脚。
      在这里插入图片描述

  • 25.3. ULN2003
    在这里插入图片描述

  • 25.4. 键盘与音符对照

    • 图片中所示为钢琴键盘一部分
    • 中央c1b1为一组(低1音阶),7个白键,5个黑键,此图显示4组,c2b2为一组(低2音阶),cb为一组(正常音阶),CB为一组(高一音阶)
    • c1右侧黑键为c1#,高半,也可表示为b d1,低半
      在这里插入图片描述
  • 25.5. 简谱-小星星,简单识谱
    在这里插入图片描述

    • 左上角1=C4/4,表示C调,每节4拍,每1/4拍为一个音符;
    • 6 6 5 -,5右侧-表示5音占2个1/4拍,以下同理;
  • 25.6. 简谱-天空之城
    在这里插入图片描述

    • 左上角1=D4/4表示D调,每节4拍,每1/4拍为一个音符;
    • 假定一拍500ms,6 7带下划线代表6 7为一拍,一个音符就是250mm;
    • 1上有一点表示高音阶,右侧有一点表示1.5拍为750ms;
    • 77带上圆括号的表示这2个音符连音,即250ms+250ms=500ms;
  • 25.7. 音符与频率对照
    在这里插入图片描述

    PPT中的图片整理为如下表格:

音符频率计算频率/2频率/2的取整备注
低音1261.6255653130.8127827131
低音1#277.182631138.5913155139
低音2293.6647679146.832384147
低音2#311.1269837155.5634919156
低音3329.6275569164.8137785165
低音4349.2282314174.6141157175
低音4#369.9944227184.9972114185
低音5391.995436195.997718196440/2^(2/12)
低音5#415.3046976207.6523488208440/2^(1/12)
低音6440220220基准频率
低音6#466.1637615233.0818808233440*2^(1/12)
低音7493.8833013246.9416506247440*2^(2/12)
中音1523.2511306261.6255653262
中音1#554.365262277.182631277
中音2587.3295358293.6647679294
中音2#622.2539674311.1269837311
中音3659.2551138329.6275569330
中音4698.4564629349.2282314349
中音4#739.9888454369.9944227370
中音5783.990872391.995436392
中音5#830.6093952415.3046976415
中音6880440440
中音6#932.327523466.1637615466
中音7987.7666025493.8833013494
高音11046.502261523.2511306523
高音1#1108.730524554.365262554
高音21174.659072587.3295358587
高音2#1244.507935622.2539674622
高音31318.510228659.2551138659
高音41396.912926698.4564629698
高音4#1479.977691739.9888454740
高音51567.981744783.990872784
高音5#1661.21879830.6093952831
高音61760880880
高音6#1864.655046932.327523932
高音71975.533205987.7666025988

26. 蜂鸣器播放提示音&音乐

  • 26.1. 第一个测试程序功能是实现4个独立按键在按下并松开后,8位数码管显示相应的按键的数值1~4,没有按下的时候显示0,需要用到之前的模块程序Four_Key(针对独立按键操作)以及nixietube(针对8位数码管显示)
  • 26.2. 程序定义蜂鸣器的引脚P25,貌似按照开发板原理图P15不正确,实物开发板蜂鸣器不响,因为蜂鸣器有声音需要500Hz左右的频率,周期2ms,因此定义Buzzer每隔1ms切换一次高低电平并持续1ms即可模拟周期2ms(500Hz)的蜂鸣器声音频率;
  • 26.3. Proteus中暂时还么有找到仿真无源蜂鸣器的方法,暂时只能放上程序,用实物开发板进行测试;
#include <REGX52.h>
#include "delay_xms.h"
#include "Four_Key.h"
#include "nixietube.h"sbit Buzzer=P2^5; 
unsigned char KeyNum;
unsigned int i;void main()
{NixieTube(1,0);while(1){KeyNum=Four_Key();if(KeyNum){for(i=0;i<500;i++){Buzzer=!Buzzer;delay_xms(1);}NixieTube(1,KeyNum);}}}

nixietube数码管显示程序的后2句需要注释掉,因为目前测试程序数码管为静态显示,无需刷新;

#include <REGX52.H>			//因为该程序调用<REGX52.H>所以要添加
#include "delay_xms.h"		//因为该程序调用<delay_xms.h>所以要添加unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};void NixieTube(unsigned char Location,Number)
{switch(Location){case 1:P2_4=1;P2_3=1;P2_2=1;break;case 2:P2_4=1;P2_3=1;P2_2=0;break;case 3:P2_4=1;P2_3=0;P2_2=1;break;case 4:P2_4=1;P2_3=0;P2_2=0;break;case 5:P2_4=0;P2_3=1;P2_2=1;break;case 6:P2_4=0;P2_3=1;P2_2=0;break;case 7:P2_4=0;P2_3=0;P2_2=1;break;case 8:P2_4=0;P2_3=0;P2_2=0;break;}P0=NixieTable[Number];//数码管消影,因为位选-段选-位选-段选,段选数据与位选穿位导致//delay_xms(1); //数码管稳定显示1ms;蜂鸣器提示音实验无需延时//P0=0x00;//清零;蜂鸣器提示音实验无需清零,静态显示
}
  • 26.4. 在上述程序基础上对程序进行模块化处理,生成一个Buzzer.c与Buzzer.h的模块化程序;
#include <REGX52.H>
#include <INTRINS.H>sbit Buzzer=P2^5;	//蜂鸣器端口
/*** @brief 蜂鸣器延时函数,延时500us* @param 无* @retval 无*/void Buzzer_Delay500us(void)	//@12.000MHz
{unsigned char data i;_nop_();i = 247;while (--i);
}/*** @brief 蜂鸣器鸣响函数* @param ms发声的时长毫秒* @retval 无*/void Buzzer_Time(unsigned int ms)	
{unsigned int i;for(i=0;i<ms*2;i++){Buzzer=!Buzzer;Buzzer_Delay500us();}}

Buzzer.h的文件如下

#ifndef _BUZZER_H_  
#define _BUZZER_H_  void Buzzer_Time(unsigned int ms); //调用函数使蜂鸣器响ms毫秒#endif

main.c程序修改如下:

#include <REGX52.h>
#include "Four_Key.h"
#include "nixietube.h"
#include "Buzzer.h"unsigned char KeyNum;void main()
{NixieTube(1,0);while(1){KeyNum=Four_Key();if(KeyNum){Buzzer_Time(100);NixieTube(1,KeyNum);}}}
  • 26.5. 因为不同的声音频率对应不同的音符,以440Hz基础频率举例,对应的频率周期为2272us,如采用中断溢出切换Buzzer的高低电平输出声音频率,需要以1/2频率周期进行高低电位翻转,中断溢出值65536-1/2周期1136计算出中断溢出值64400
音符频率Hz频率取整周期us1/2周期us1/2周期取整中断溢出值中断溢出计算
1261.62556532623816.7938931908.39694719086553663628
1#277.1826312773610.1083031805.05415218056553663731
2293.66476792943401.3605441700.68027217016553663835
2#311.12698373113215.4340841607.71704216086553663928
3329.62755693303030.303031515.15151515156553664021
4349.22823143492865.3295131432.66475614336553664103
4#369.99442273702702.7027031351.35135113516553664185
5391.9954363922551.0204081275.51020412766553664260
5#415.30469764152409.6385541204.81927712056553664331
64404402272.7272731136.36363611366553664400
6#466.16376154662145.9227471072.96137310736553664463
7493.88330134942024.2914981012.14574910126553664524
1523.25113065231912.045889956.02294469566553664580
1#554.3652625541805.054152902.52707589036553664633
2587.32953585871703.577513851.78875648526553664684
2#622.25396746221607.717042803.85852098046553664732
3659.25511386591517.450683758.72534147596553664777
4698.45646296981432.664756716.33237827166553664820
4#739.98884547401351.351351675.67567576766553664860
5783.9908727841275.510204637.7551026386553664898
5#830.60939528311203.369434601.68471726026553664934
68808801136.363636568.18181825686553664968
6#932.3275239321072.961373536.48068675366553665000
7987.76660259881012.145749506.07287455066553665030
11046.5022611047955.1098376477.55491884786553665058
1#1108.7305241109901.7132552450.85662764516553665085
21174.6590721175851.0638298425.53191494266553665110
2#1244.5079351245803.2128514401.60642574026553665134
31318.5102281319758.1501137379.07505693796553665157
41396.9129261397715.8196135357.90980673586553665178
4#1479.9776911480675.6756757337.83783783386553665198
51567.9817441568637.755102318.8775513196553665217
5#1661.218791661602.0469597301.02347983016553665235
617601760568.1818182284.09090912846553665252
6#1864.6550461865536.1930295268.09651472686553665268
71975.5332051976506.0728745253.03643722536553665283
  • 26.6. 中断定时器模块程序里面的如下两句只是设置定时器的第一次初始化的初始值,后续不调用
	TL0 = 0x18;				//设置定时初始值TH0 = 0xFC;				//设置定时初始值
  • 26.7. 测试将音符做成数组并测试
#include <REGX52.h>
#include "delay_xms.h"
#include "TimeR0.h"sbit Buzzer=P2^5;
unsigned int FreqTable[]={63628,63731,63835,63928,64021,64103,64185,64260,64331,64400,64463,64528,64580,64633,64684,64732,64777,64820,64860,64898,64934,64968,65000,65030,65058,65085,65110,65134,65157,65178,65198,65217,65235,65252,65268,65283,};void main()
{TimeR0_Init();while(1){}}void TimeR0_Routine() interrupt 1 //中断子函数
{TL0=FreqTable[0]%256;				//设置定时初始值TH0=FreqTable[0]/256;				//设置定时初始值Buzzer=!Buzzer;
}
  • 26.8. 在上述程序基础上,结合简谱的小星星,SPEED定义500为正常速度,250速度加快;
#include <REGX52.h>
#include "delay_xms.h"
#include "TimeR0.h"sbit Buzzer=P2^5;#define SPEED 250  //定义speed便于调速unsigned int FreqTable[]={0,63628,63731,63835,63928,64021,64103,64185,64260,64331,64400,64463,64528,64580,64633,64684,64732,64777,64820,64860,64898,64934,64968,65000,65030,65058,65085,65110,65134,65157,65178,65198,65217,65235,65252,65268,65283,};//定义0位数据为休止符unsigned char Music[]={13,4,13,4,20,4,20,4,22,4,22,4,20,8,0,4, //0为休止符18,4,18,4,17,4,17,4,15,4,15,4,13,8,0xff, //终止判断}; //定义1/16音符时长为基准时长定义为1,后续以此为基准unsigned char FreqSelect,MusicSelect;
void main()
{TimeR0_Init();while(1){if(Music[MusicSelect]!=0xff){FreqSelect=Music[MusicSelect];MusicSelect++;delay_xms(SPEED/4*Music[MusicSelect]);MusicSelect++;TR0=0;delay_xms(5);TR0=1;}else{MusicSelect=0;}}}void TimeR0_Routine() interrupt 1 //中断子函数
{if(FreqTable[FreqSelect]){TL0=FreqTable[FreqSelect]%256;				//设置定时初始值TH0=FreqTable[FreqSelect]/256;				//设置定时初始值Buzzer=!Buzzer;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/804172.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二:什么是RocketMQ

RocketMQ是阿里开源的消息中间件产品&#xff0c;纯Java开发&#xff0c;具有高吞吐量、高可用性、适合大规模分布式系统应用的特点,性能强劲(零拷贝技术)&#xff0c;支持海量堆积,在阿里内部进行大规模使用&#xff0c;适合在互联网与高并发系统中应用。 官方文档&#xff1a…

【Linux】虚拟化技术docker搭建SuitoCRM系统及汉化

CRM系统 CRM&#xff08;Customer Relationship Management&#xff0c;客户关系管理&#xff09;系统是一种用于管理和优化企业与客户关系的软件工具。在商业竞争激烈的现代社会中&#xff0c;CRM系统已成为许多企业提高销售、增强客户满意度和实现持续增长的重要工具。本文将…

计算器(C语言)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 介绍关键代码运行代码&#xff08;3种&#xff09; 介绍 标准计数器&#xff1a;执行加减乘除等等科学计算器&#xff1a;执行分数、统计学、指数函数、对数、三角…

BoostCompass(数据准备预处理模块)

阅读导航 一、网页数据下载二、编写数据去标签与数据清洗的模块 Parser✅boost 开发库的安装1. 基本思路2. 详细讲解&#xff08;1&#xff09;程序递归遍历目录&#xff0c;收集所有HTML文件的路径&#xff08;2&#xff09;对每个HTML文件进行解析&#xff0c;提取出文档标题…

【资源分享】书籍:现代统计学:使用Python的计算方法

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验&#xff0c;帮助大家尽早适应研究生生活&#xff0c;尽快了解科研的本质。祝一切顺利&#xff01;—…

【微服务】------微服务架构技术栈

目前微服务早已火遍大江南北&#xff0c;对于开发来说&#xff0c;我们时刻关注着技术的迭代更新&#xff0c;而项目采用什么技术栈选型落地是开发、产品都需要关注的事情&#xff0c;该篇博客主要分享一些目前普遍公司都在用的技术栈&#xff0c;快来分享一下你当前所在用的技…

Java每日一题(三道同一类型的题)

前言 本文一共有三道题:1.两数之和 2.三数之和 3. 四数之和 为什么把这三道题放一起呢&#xff0c;因为三数之和是可以根据两数之和进行推导&#xff0c;四数之和可以根据三数之和进行推导。 两数之和 思路分析: 我的思路: 1.排序 2.使用左右指针 3.处理细节问题 先让数组…

生活中的数学 --- 等额本息贷款和等额本金贷款的月供应该怎么算?

等额本息贷款和等额本金贷款的月供应该怎么算&#xff1f; 从一个例子开始&#xff0c;假设我要从银行贷款36万(即&#xff0c;本金)&#xff0c;银行给出的贷款年利率是12%(月利率为年利率除以12)&#xff0c;贷款半年(6个月)&#xff0c;按月还款&#xff0c;分6期还完。 问分…

电池二次利用走向可持续大循环周期的潜力和挑战(第二篇)

一、二次利用风险 电动汽车的当前电池信息&#xff0c;如年份、容量和制造商&#xff0c;通常是相互关联和不完整的。再加上电池内部的电化学变化&#xff0c;SLB在包括安全和环境在内的一些领域存在很大的风险&#xff0c;这表明短期内梯次利用仍然是一个不成熟的方案。 1.1 安…

在mysql中如何更新数据呢?

如何更新一条数据&#xff1f; 在 MySQL 中&#xff0c;更新一条数据可以使用 UPDATE 语句。以下是更新一条数据的基本语法&#xff1a; UPDATE table_name SET column1 value1, column2 value2,... WHERE condition;其中&#xff1a; table_name&#xff1a;要更新的表的…

Linux 系统下对于 MySQL 的初级操作

由于公司老板想把早已封存的服务器陈年老码捣鼓一下&#xff0c;所以找了一个外援&#xff0c;我则是配合提供支持。但是过程并不顺利。至少 5 年以上的间隔&#xff0c;导致外援查看的时候发现很多代码和配置是缺失的&#xff0c;目前卡在数据库部分&#xff0c;而我这边就帮忙…

libVLC 提取视频帧使用QGraphicsView渲染

在前面章节中&#xff0c;我们讲解了如何使用QWidget渲染每一帧视频数据&#xff0c;这种方法对 CPU 负荷较高。 libVLC 提取视频帧使用QWidget渲染-CSDN博客 后面又讲解了使用OpenGL渲染每一帧视频数据&#xff0c;使用 OpenGL去绘制&#xff0c;利用 GPU 减轻 CPU 计算负荷…

亚马逊AWS永久免费数据库

Amazon DynamoDB 是一项无服务器的 NoSQL 数据库服务&#xff0c;您可以通过它来开发任何规模的现代应用程序。作为无服务器数据库&#xff0c;您只需按使用量为其付费&#xff0c;DynamoDB 可以扩展到零&#xff0c;没有冷启动&#xff0c;没有版本升级&#xff0c;没有维护窗…

交换机与队列的介绍

1.流程 首先先介绍一个简单的一个消息推送到接收的流程&#xff0c;提供一个简单的图 黄色的圈圈就是我们的消息推送服务&#xff0c;将消息推送到 中间方框里面也就是 rabbitMq的服务器&#xff0c;然后经过服务器里面的交换机、队列等各种关系&#xff08;后面会详细讲&…

RabbitMQ如何保证消息的幂等性???

在RabbitMQ中&#xff0c;保证消费者的幂等性主要依赖于业务设计和实现&#xff0c;而非RabbitMQ本身提供的一种直接功能。 在基于Spring Boot整合RabbitMQ的场景下&#xff0c;要保证消费者的幂等性&#xff0c;通常需要结合业务逻辑设计以及额外的技术手段来实现。以下是一个…

Elasticsearch 悬挂索引分析和自己的一点见解

在 Elasticsearch 的实战中&#xff0c;悬挂索引是一个既常见又容易引起困扰的概念。 今天&#xff0c;我将分享一次处理集群状态为RED&#xff0c;原因为DANGLING_INDEX_IMPORTED 的实战经验&#xff0c;深入探讨悬挂索引的定义、产生原因、管理方法&#xff0c;以及如何有效…

[Linux - C语言] 自主Shell

[Linux - C语言] 自主Shell [Linux - C语言] 自主Shell逻辑策划 main()打印命令行 void MakeCommandLineAndPrint()用户名 USER主机名 HOSTNAME当前目录 PWDSkipPath 切割目录打印命令行 获取用户字符串 int GetUserCommand()检查重定向 void CheckRedir()切割字符 void SplitC…

JVM字节码与类的加载——类的加载过程详解

文章目录 1、概述2、加载(Loading)阶段2.1、加载完成的操作2.2、二进制流的获取方式2.3、类模型与Class实例的位置2.4、数组类的加载 3、链接(Linking)阶段3.1、链接阶段之验证(Verification)3.1.1、格式检查3.1.2、字节码的语义检查3.1.3、字节码验证3.1.4、符号引用验证 3.2、…

Harmony鸿蒙南向驱动开发-I3C

I3C&#xff08;Improved Inter Integrated Circuit&#xff09;总线是由MIPI Alliance开发的一种简单、低成本的双向二线制同步串行总线。 I3C是两线双向串行总线&#xff0c;针对多个传感器从设备进行了优化&#xff0c;并且一次只能由一个I3C主设备控制。相比于I2C&#xf…

langchain LCEL,prompt模块,outputparse输出模块

目录 基本代码 prompt模块 prompt模版控制长度 outputparse格式化输出 LangChain表达式语言&#xff0c;或者LCEL&#xff0c;是一种声明式的方式&#xff0c;可以轻松地将链条组合在一起 langchian 可以使用 通义千问&#xff0c;我们用通义千问&#xff0c;用法也要申请…