找回密码
 立即注册

QQ登录

只需一步,快速开始

本帖最后由 lxf 于 2020-8-15 13:30 编辑

18课 七个基准音的播放


目标

1、掌握数组的使用方法
2、实现蜂鸣器每隔1秒依次响起一个基准音

实验材料

Arduino UNO开发板
蜂鸣器模块(频率可控)
配套USB数据线
配套杜邦线若干
Arduino IDE软件
微信图片_20200628091016.png

内容

七个基准音(do、re、mi、fa、sol、la、si),这七个基准音对应的频率数组为:1046.5,1174.7,1318.5,1396.9,1568,1760,1975.5。

接线图

图片1.png

接线方式

Arduino UNO    <------>    蜂鸣器模块
         5V            <------>          VCC
       GND           <------>         GND
        D8             <------>           IO

程序实现代码

  1. float Reference_Note[]={1046.5,1174.7,1318.5,1396.6,1568,1760,1975.5}; //创建一个浮点型的Reference_Note基准音数组
  2. void setup(){
  3.   pinMode(8, OUTPUT);   //定义8号数字管脚类型为输出
  4. }
  5. void loop(){
  6.   for (int i = 1; i <= 7; i++) {   //通过循环语句8号管脚蜂鸣器每隔1秒依次响起一个基准音
  7.     tone(8,Reference_Note[(int)(i - 1)]);
  8.     delay(1000);
  9.   }
  10.   noTone(8);
  11. }
复制代码

array 数组


数组是一种可通过索引号访问的同类型变量集合。

创建数组

下面的方法都可以用来创建(声明)数组。
int Ints[6];
int P[] = {2, 4, 8, 3, 6};
int SensVals[6] = {2, 4, -8, 3, 2};
char message[6] = "hello";
在以上示例中
Ints数组是一个在声明时没有初始化数据的数组。
P数组在声明时没有明确大小。Arduino编译器将会计算该数组所包含的元素数量,并将适当大小的内存空间分配给该数组。
当然,你也可以明确告知Arduino你所创建的数组大小,SensVals就是一个例子。
请注意,当初始化一个char类型的数组时,你需要多分配一个元素空间给该数组。这么做的原因是为了字符数组有足够的空间容纳末尾的终止符。如上面例子中的message数组中包含的元素为hello五个英文字母,但是我们在初始化时必须给该数组6个元素空间。额外的元素空间是为了存储字符结尾的终止符。

使用数组

我们知道,要想把数据放入内存,必须先要分配内存空间。放入4个整数,就得分配4个int类型的内存空间:
int a[4];
这样,就在内存中分配了4个int类型的内存空间,并为它们起了一个名字,叫a。
我们把这样的一组数据的集合称为数组(Array),它所包含的每一个数据叫做数组元素(Element),所包含的数据的个数称为数组长度(Length),例如int a[4];就定义了一个长度为4的整型数组,名字是a。
数组中的每个元素都有一个序号,这个序号从0开始,而不是从我们熟悉的1开始,称为下标(Index)。使用数组元素时,指明下标即可,形式为:
arrayName[index]
arrayName 为数组名称,index 为下标。例如,a[0] 表示第0个元素,a[3] 表示第3个元素

需要注意的是:

1) 数组中每个元素的数据类型必须相同,对于int a[4];,每个元素都必须为 int。
2)数组长度 length 最好是整数或者常量表达式,例如 10、20*4 等,这样在所有编译器下都能运行通过;如果 length 中包含了变量,例如 n、4*m 等,在某些编译器下就会报错。
3) 访问数组元素时,下标的取值范围为 0 ≤ index < length,过大或过小都会越界,导致数组溢出,发生不可预测的情况,请大家务必要引起注意。

数组的初始化

我们可以在定义数组的同时赋值:
int a[4] = {20, 345, 700, 22};
{ }中的值即为各元素的初值,各值之间用,间隔。
对数组赋初值需要注意以下几点:
1) 可以只给部分元素赋初值。当{ }中值的个数少于元素个数时,只给前面部分元素赋值。例如:
int a[10]={12, 19, 22 , 993, 344};
表示只给 a[0] ~ a[4] 这5个元素赋值,而后面5个元素自动赋0值。
当赋值的元素少于数组总体元素的时候,剩余的元素自动初始化为 0:对于short、int、long类型数据,就是整数0;对于char类型数据,就是字符 ‘\0’;对于float、double类型数据,就是小数0.0。
我们可以通过下面的形式将数组的所有元素初始化为 0:
int a[10] = {0};
char c[10] = {0};
float f[10] = {0};
由于剩余的元素会自动初始化为0,所以只需要给第0个元素赋0值即可。

示例:

  1. void setup() {

  2.   Serial.begin(9600);

  3.   int a[6] = {299, 34, 92, 100}; // 定义数组

  4.   for(int i=0; i<6; i++){ //串口监视器输出数组元素

  5.     Serial.print("a[");

  6.     Serial.print(i);

  7.     Serial.print("] =");

  8.     Serial.println(a[i]);

  9.     Serial.println("");

  10.   }  

  11. }

  12. void loop() {

  13. }
复制代码

运行结果:

图片2.png
分享至 : QQ空间
收藏

0 个回复

您需要登录后才可以回帖 登录 | 立即注册