【Arduino实验07 模拟简易电子琴】

2023-11-11 18:10

本文主要是介绍【Arduino实验07 模拟简易电子琴】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、实验目的

二、实验设备与环境

三、实验重点

四、实验难点

五、实验内容

5.1实验任务

5.2实验原理

5.3实验内容

5.4实验结果

5.5思考题


一、实验目的

        1掌握tone()发声函数的功能;

        2熟悉数组、自动函数的使用;

        3编写乐曲演奏程序;

        4编写简易电子琴演奏程序。

二、实验设备与环境

        Arduino UNO套件、Arduino IDE、计算机、按键、LED灯、蜂鸣器、杜邦线等

三、实验重点

        1实验电路连接;2控制程序代码编写;3程序功能调试

四、实验难点

        (1)程序代码编写、调试

五、实验内容

5.1实验任务

        任务描述:蜂鸣器驱动;调用调声函数演奏乐曲片段;模拟电子琴演奏

5.2实验原理

        1.数组

        语法:type arrayName[n];

        参数:n,数组元素个数;数组元素编号从0开始至n-1

        功能:声明一个type类型、n个元素的数组。数组名称与变量命名规则一致,类型为数据类型。数组元素通过再数组名称后永等号与一个大括号包含的初始化值列表进行初始化。

int C[10]; // 声明一个类型为整数、10个元素的数组。

charF[5][4]; // 声明一个类型为char、5×4个元素的二维数组

int M[10] = {12,34,22,54,65,77,81,90,0,28}; //数组的声明与初始化

        2.调声函数tone()

        语法:tone(pin,frenquency,duration);

        参数:pin,引脚号;frenquency,发声频率;duration,声音持续时间。

        功能:产生指定频率的方波,若未指定持续时间,则持续到noTone()时止。在同一时间只能产生一个频率的方波, 如果tone正执行在一个pin上, 在其他pin上调用tone()将不起作用. 如果在同一个pin上再次调用tone, 则使用新指定的频率。注意,使用tone()会与pin 3 和pin 11 脚的PWM输出冲突。

        noTone(pin):停止引脚pin上tone()函数产生的方波信号。

        基本音调的频率:Do,523;Re,587;Mi,659;Fa,698;So,784;La,880;Xi,988

        3.自定义函数

        将一个重复使用的功能定义为函数,只需要在LOOP主程序里调用就可以实现该功能,使程序结构清晰,将程序中重复语句功能定义为函数,可以使程序简化、编程效率提高。

数据类型函数名(类型参数名称列表); {

        语句块;

        return <返回值>; //返回值为可选项}

// return 语句是将函数的值返回给被调用的函数

// return的另一个作用是终止执行被调用函数,并返回

// return语句可以加入条件控制

        4.模拟电子琴演奏电路

 

5.3实验内容

        1.蜂鸣器驱动发声

        步骤1:电路连接

        步骤2:画流程图

        步骤3:编写源程序

        Arduino IDE程序1:

const buzzerPin = 5; // 蜂鸣器引脚接 D5 接口
const tonebase = 294;
void setup() {pinMode(buzzerPin,OUTPUT);
}
Void loop() {int i = 0;do {tone(buzzerPin,tonebase+i*5,200); // 蜂鸣器发声noTone(buzzerPin);i++;} while (i<=125);delay(2000);
}

        Arduino IDE 程序 2:

// 自定义函数驱动蜂鸣器发声
const buzzerPin = 5; // 蜂鸣器引脚接 D5 接口
const tonebase = 294;
void setup() {pinMode(buzzerPin,OUTPUT);
}
Void loop() {buzzerTone(); // 调用 buzzerTone()函数delay(2000);
}
void buzzerTone() { // 自定义函数int i = 0;do {tone(buzzerPin,tonebase+i*5,200); // 蜂鸣器发声noTone(buzzerPin);i++;} while (i<=125)
}

        步骤 4:程序编译与功能调试

        2.乐曲片段演奏

        步骤 1:电路连接

        步骤 2:画流程图

        步骤 3:编写源程序

void setup() {int buzzerPin = 10;int Do = 523;int Re = 587;int Mi = 659;int Fa = 698;int So = 784;int La = 880;int Xi = 988;int musicTone[] ={ Do,Do,So,So,La,La,So,Fa,Fa,Mi,Mi,Re,Re,Do,So,So,Fa,Fa,Mi,Mi,Re,So,So,Fa,Fa,Mi,Mi,Re};int musicduration[] = {4,4,4,4,4,4,2,4,4,4,4,4,4,2,4,4,4,4,4,4,2,4,4,4,4,4,4,2};
}
void loop() {for(int i = 0;i<=27;i++) {tone(buzzer,musicTone[i]);// 音符时长,如 4 分音符,时长 1000/4 毫秒delay(1000/musicduration[i]);noTone(buzzer);}delay(2000);
}

        步骤 4:程序编译与功能调试

        3.模拟电子琴演奏

        步骤 1:电路连接

        步骤 2:画流程图

        步骤 3:编写源程序

void setup() {int doPin =2;int rePin =3;int miPin =4;int faPin =5;int soPin =6;int laPin =7;int xiPin =8;int musicPin[] = {doPin,rePin,miPin,faPin,soPin,laPin,xiPin};for (int i=0;i<=6,i++){pinMode(musicPin[i],INPUT);}int buzzerPin = 10;pinMode(buzzer,OUTPUT);int Do = 523;int Re = 587;int Mi = 659;int Fa = 698;int So = 784;int La = 880;int Xi = 988;int musicTone[] ={Do,Re,Mi,Fa,So,La,Xi};
}
void loop() {// 按下按键,发出按键对应音调的声音if (digitalRead(musicPin[0])) {tone(buzzer,musicTone[0],10);}if (digitalRead(musicPin[1])) {tone(buzzer,musicTone[1],10);}if (digitalRead(musicPin[2])) {tone(buzzer,musicTone[2],10);}if (digitalRead(musicPin[3])) {tone(buzzer,musicTone[3],10);}if (digitalRead(musicPin[4])) {tone(buzzer,musicTone[4],10);}if (digitalRead(musicPin[5])) {tone(buzzer,musicTone[5],10);}if (digitalRead(musicPin[6])) {tone(buzzer,musicTone[6],10);}
}

        步骤 4:程序编译与功能调试

5.4实验结果

        结论: 试验的结果为蜂鸣器响出的声音是一闪一闪亮晶晶的音乐;模拟电子琴演奏,可以根据按键来控制蜂鸣器发出的声音,使其发出哆唻咪砝唆啦西的声音。

        反思:首先通过本次实验,我学到了一些知识,掌握 tone()发声函数的功能;熟悉数组、自动函数的使用;编写乐曲演奏程序;编写简易电子琴演奏程序。其次,试验的结果为蜂鸣器响出的声音是一闪一闪亮晶晶的音乐;模拟电子琴演奏,可以根据按键来控制蜂鸣器发出的声音,使其发出哆唻咪砝唆啦西的声音。最后,希望我们继续努力再接再厉。

        作品:

5.5思考题

1.乐器演奏时,按下琴键时琴声响起,松开时停止,你是怎样实现的?

这篇关于【Arduino实验07 模拟简易电子琴】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/391913

相关文章

python实现简易SSL的项目实践

《python实现简易SSL的项目实践》本文主要介绍了python实现简易SSL的项目实践,包括CA.py、server.py和client.py三个模块,文中通过示例代码介绍的非常详细,对大家的学习... 目录运行环境运行前准备程序实现与流程说明运行截图代码CA.pyclient.pyserver.py参

使用PyQt实现简易文本编辑器

《使用PyQt实现简易文本编辑器》这篇文章主要为大家详细介绍了如何使用PyQt5框架构建一个简单的文本编辑器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录分析主窗口类 (MyWindow)菜单操作语法高亮 (SyntaxHighlighter)运行程序主要组件代码图示分析实现

5分钟获取deepseek api并搭建简易问答应用

《5分钟获取deepseekapi并搭建简易问答应用》本文主要介绍了5分钟获取deepseekapi并搭建简易问答应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需... 目录1、获取api2、获取base_url和chat_model3、配置模型参数方法一:终端中临时将加

用Java打造简易计算器的实现步骤

《用Java打造简易计算器的实现步骤》:本文主要介绍如何设计和实现一个简单的Java命令行计算器程序,该程序能够执行基本的数学运算(加、减、乘、除),文中通过代码介绍的非常详细,需要的朋友可以参考... 目录目标:一、项目概述与功能规划二、代码实现步骤三、测试与优化四、总结与收获总结目标:简单计算器,设计

如何用Python绘制简易动态圣诞树

《如何用Python绘制简易动态圣诞树》这篇文章主要给大家介绍了关于如何用Python绘制简易动态圣诞树,文中讲解了如何通过编写代码来实现特定的效果,包括代码的编写技巧和效果的展示,需要的朋友可以参考... 目录代码:效果:总结 代码:import randomimport timefrom math

通过C#和RTSPClient实现简易音视频解码功能

《通过C#和RTSPClient实现简易音视频解码功能》在多媒体应用中,实时传输协议(RTSP)用于流媒体服务,特别是音视频监控系统,通过C#和RTSPClient库,可以轻松实现简易的音视... 目录前言正文关键特性解决方案实现步骤示例代码总结最后前言在多媒体应用中,实时传输协议(RTSP)用于流媒体服

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<

hdu4431麻将模拟

给13张牌。问增加哪些牌可以胡牌。 胡牌有以下几种情况: 1、一个对子 + 4组 3个相同的牌或者顺子。 2、7个不同的对子。 3、13幺 贪心的思想: 对于某张牌>=3个,先减去3个相同,再组合顺子。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOExcepti

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点