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

news2024/12/23 18:31:11

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.coloradmin.cn/o/1581123.html

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

相关文章

报文 消息

报文消息域 MsgField name 域名称 length 长度 fillChar 填充字符 fillSide 填充位置 报文消息片 MsgPiece 由多个消息域按一定的顺序组成 private List<MsgField> itemList new LinkedList<~>();组装消息 报文消息包 MsgPackage 由多个消息片组成 String[]…

FreeRTOS启动任务调度器

FreeRTOS启动任务调度器 这部分内容就要去深入了解源码以及熟悉汇编语言的操作。依旧正点原子的视频。下面首先看开启任务调度器这部分源码&#xff1a; 1开启任务调度器 任务调度器用于启动任务调度器&#xff0c;任务调度器启动后&#xff0c; FreeRTOS 便会开始进行任务调…

MyBatis 应用的组成

王有志&#xff0c;一个分享硬核Java技术的互金摸鱼侠 加入Java人的提桶跑路群&#xff1a;共同富裕的Java人 大家好&#xff0c;我是王有志。在上一篇文章的最后&#xff0c;我们写了一个简单的例子&#xff0c;今天我们就通过这个例子来看一看一个标准的 MyBatis 应用程序由哪…

PS入门|如何使用“主体”功能进行抠图?

前言 前段时间讲到给各种图标和LOGO抠图的办法&#xff0c;分别使用的是 钢笔工具蒙版 PS入门&#xff5c;规规矩矩的图形怎么抠出来&#xff1f; 魔棒工具蒙版 PS入门&#xff5c;黑白色的图标怎么抠成透明背景 色阶蒙版 PS入门&#xff5c;目标比较复杂&#xff0c;但背景…

HTML+CSS+JS复习回顾

环境搭建 下载VScode&#xff0c;依次下载插件&#xff1a;HTML CSS support、Live Server、Auto Rename Tag 一、HTML篇 HTML通过一系列的标签&#xff08;元素&#xff09;来定义文本、图像、链接等。HTML标签是由尖括号包围的关键字。标签通常成对出现&#xff0c;包括开…

在Spring中使用Redis

端口怎么设置&#xff0c;看我前一篇文章 前面使用jedis&#xff0c;通过Jedis对象中各种方法来操作redis的。 此处Spring中则是通过StringRedisTemplate来操作redis。 最原始提供的类是RedisTemplate StringRedisTemplate是RedisTemplate的子类&#xff0c;专门处理文本数据的…

2014最新AIGC创作系统ChatGPT网站源码+AI绘画网站源码+GPT4-All联网搜索模型

一、文章前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧。已支持…

无重复的最长字串

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 问题 给定一个字符串&#xff0c;我们需要找到该字符串中的最长无重复子串的长度。 示例 让我们以一个具体的示例来说明这个问题&#…

四、书城开发--3、书城图书部分的开发

书城图书部分 首先我们做书城首页搜索栏下面的图片展示 我们在书城首页组件中通过home请求方法中获取回来的数据中&#xff0c;打印出来可以看到那个banner就是我们现在要的图片 我们在data中定义一个变量banner用来存放获取回来的数据中的banner 然后把它展示出来就可以了&a…

B. Burning Midnight Oil Codeforces Round 112 (Div. 2)

题目链接&#xff1a; Problem - 165B - Codeforceshttps://codeforces.com/problemset/problem/165/B 题目大意&#xff1a; 最后写了至少n个&#xff0c;每次衰减k倍&#xff08;/k&#xff09;&#xff0c;问最初的v最小为多少。 思路&方法&#xff1a; 二分答案。 AC代…

想要品牌传播有效,先清楚这三个本质问题

在互联网时代&#xff0c;企业想要提高市场竞争力就需要做好品牌传播。然而有许多企业在做品牌传播时都会踩坑&#xff0c;原因是因为忽视了这三点&#xff0c;接下来就让媒介盒子和大家分享&#xff1a; 一、 文案本质是“购买理由” 在文案技巧中经常会出现一些词&#xff…

重学Java,JDK安装,Java环境配置,Could not find Java SE Runtime Environment问题解决

文章目录 前言JDK下载什么是JDK下载JDK官网下载历史版本下载 JDK安装生成JRE配置环境变量进入环境变量配置界面新建系统变量JAVA_HOME编辑系统变量PATHPath编辑界面1Path编辑界面2 配置CLASSPATH 验证安装情况问题反馈Error: opening registry key Software\JavaSoft\Java Runt…

WordPress网站备份和迁移教程

我们之前遇到购买了hostease的客户需要进行wordpress的网站备份的迁移操作。 以下是一份完整的指南&#xff0c;介绍了备份和迁移WordPress网站的步骤&#xff1a; 步骤一&#xff1a;备份WordPress网站 使用插件进行备份&#xff1a; 安装并激活备份插件&#xff0c;例如Up…

SSH远程登陆系统(RedHat9)

ssh的基本用法 ssh hostname/IP # 如果没有指定用什么用户进行连接&#xff0c;默认使用当前用户登录 ssh –l username hostname/IP ssh usernamehostname ssh usernameIP在第一次连接到服务器时&#xff0c;会自动记录服务器的公钥指纹信息 如果出现密钥变更导致错误可以…

Spring Cloud 集成 Redis 发布订阅

目录 前言步骤引入相关maven依赖添加相关配置 使用方法发布订阅发布一个消息 注意总结 前言 在当今的软件开发领域&#xff0c;分布式系统已经成为一种主流的架构模式&#xff0c;尤其是在处理大规模、高并发、高可用的业务场景时。然而&#xff0c;随着系统复杂性的增加&…

Training - Kubeflow 的 PyTorchJob 配置 DDP 分布式训练 (ncclInternalError)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/137569332 Kubeflow 的 PyTorchJob 是 Kubernetes 自定义资源&#xff0c;用于在 Kubernetes 上运行 PyTorch 训练任务&#xff0c;是 K…

【学习】软件测试中为什么要进行接口测试?

接口测试是软件开发过程中不可或缺的一环&#xff0c;它主要是对软件系统中各个模块之间的接口进行测试&#xff0c;以验证它们是否能够正确地交互和协作。接口测试的目的是确保软件系统的各个部分能够无缝地协同工作&#xff0c;从而提高整个系统的质量和稳定性。 一、什么是接…

【DM8】分区表维护

查询分区 数据字典&#xff1a;dba_tab_pattitions SELECT * FROM SYS.DBA_TAB_PARTITIONS WHERE TABLE_OWNERTEST;添加分区 ALTER TABLE TEST.T1 ADD PARTITION Pn VALUES LESS THAN(MAXVALUE);删除分区 ALTER TABLE TEST.T1 DROP PARTITION Pn;合并分区 ALTER TABLE TES…

PostgreSQL入门到实战-第六弹

PostgreSQL入门到实战 PostgreSQL查询语句(三)官网地址PostgreSQL概述PostgreSQL中ORDER BY理论PostgreSQL中ORDER BY实操更新计划 PostgreSQL查询语句(三) 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://www.post…

网络安全:重要性与应对措施

1. 网络安全的重要性 随着互联网的普及和信息技术的快速发展&#xff0c;网络安全问题已经变得日益突出。网络攻击者可以通过各种手段窃取个人信息、破坏系统、传播病毒等&#xff0c;给个人和社会带来巨大的损失。因此&#xff0c;网络安全已经成为信息化时代的重要问题之一。…