目录
一、实验目的
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.乐器演奏时,按下琴键时琴声响起,松开时停止,你是怎样实现的?