Arduino从入门基础到实践书中 第十二个项目 蜂鸣器旋律发声

2017-05-161.4万
AI 快速预览详细 收起
本文解析了《Arduino从入门基础到实践》书中第十二个项目中的蜂鸣器旋律播放代码。通过定义音符频率和持续时间的数组,使用tone()和delay()函数实现音乐播放。文章详细解释了为什么length = sizeof(tune) / sizeof(tune[0])计算的是数组元素个数,而不是字节长度。这对于初学者理解数组操作非常有帮助。


在《Arduino入基础到实践》书中第十二个项目中我有一点不明白就是为什么取得长度要为数组个数的一半

length = sizeof(tune)/ sizeof(tune [0]);


然后书中给出的解释是:
Arduino从入门基础到实践书中 第十二个项目 蜂鸣器旋律发声图1


在播放的时,数组有26个元素只调取了一半13个元素,不太明为什么要这样处理

        for (int x = 0; x < length; x++)
        {
                tone (8, tune[x]);
                delay(1500 * duration[x]);
                noTone(8);
        }
        delay(5000);


[mw_shl_code=c,true]#include "Arduino.h"

//项目12蜂鸣器发声旋律演奏
#define NOTE_C3                131
#define NOTE_CS3        139
#define NOTE_D3                147
#define NOTE_DS3        156
#define NOTE_E3                165
#define NOTE_F3                175
#define NOTE_FS3        185
#define NOTE_G3                196
#define NOTE_GS3        208
#define NOTE_A3                220
#define NOTE_AS3        233
#define NOTE_B3                247
#define NOTE_C4                262
#define NOTE_CS4        277
#define NOTE_D4                294
#define NOTE_DS4        311
#define NOTE_E4                330
#define NOTE_F4                349
#define NOTE_FS4         370
#define NOTE_G4                392
#define NOTE_GS4        415
#define NOTE_A4                440
#define NOTE_AS4        466
#define NOTE_B4                494

#define WHOLE                1
#define HALF                0.5
#define QUARTER                0.25
#define EIGHTH                0.125
#define SIXTEENTH        0.0625

int tune[] = { NOTE_C4, NOTE_C4, NOTE_C4, NOTE_C4, NOTE_B3, NOTE_G3,
                                   NOTE_A3, NOTE_C4, NOTE_C4, NOTE_G3, NOTE_G3, NOTE_G3, NOTE_F3, NOTE_F3, NOTE_G3, NOTE_F3,
                                   NOTE_E3, NOTE_G3, NOTE_C4, NOTE_C4, NOTE_C4, NOTE_C4, NOTE_A3, NOTE_B3, NOTE_B3, NOTE_C4, NOTE_D4

                                   };
float duration[] = { EIGHTH, QUARTER+EIGHTH, SIXTEENTH, QUARTER, QUARTER, HALF,
                                         HALF, HALF, QUARTER, QUARTER, HALF+QUARTER, QUARTER, QUARTER, QUARTER,
                                         QUARTER, QUARTER, QUARTER, HALF+QUARTER
                                        };

int length;

//The setup function is called once at startup of the sketch
void setup()
{
// Add your initialization code here
        pinMode(8, OUTPUT);
        length = sizeof(tune) / sizeof(tune[0]);
//        length = sizeof(tune);
}

// The loop function is called in an endless loop
void loop()
{
//Add your repeated code here
        for (int x = 0; x < length; x++)
        {
                tone (8, tune[x]);
                delay(1500 * duration[x]);
                noTone(8);
        }
        delay(5000);
}
[/mw_shl_code]






































































创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(2)
dafenqi5219
dafenqi5219
作者
还有就是我在写的时候多写了一个本来应该是26个元素,然后我这里变成27个了

dafenqi5219
dafenqi5219
作者
问题找到了sizeof(tune)也是测量的数组大小,而不是数组元素个数, 一般int类型的变量根据编译器的不通会出现不同的大小,我是用的是的c-free5.0 显示是占用四个字节

所以求出的length是得出数组的元素个数
length = sizeof(tune) / sizeof(tune[0]);
应该为 54/2 或者 108/4 (不同的编译环境int类型变量会有所不同) 但是肯定不是26/2

这本书写错了大家有没有发现。
- 没有更多了 -