如何使用C ++

时间:2016-02-24 15:38:54

标签: c++ mbed

您好我正试图在mbe​​d应用程序屏蔽上使用不同的声音频率来创建一首歌曲。虽然我已经获得了所有的频率,但我似乎无法减慢速度,因为它只是非常快地遍历所有频率。我试过使用wait();功能,但似乎没有正常工作。关于如何纠正这个或替代解决方案,我将不胜感激。

这是我的代码

#include "mbed.h"
#include "C12832.h"   // for the LCD
#include "LM75B.h"   //for the temperature sensor
#include "MMA7660.h" //For the accelerometer

/***************************************************************************
Global Variables
***************************************************************************/

C12832 shld_lcd (D11, D13, D12, D7, D10);   // LCD on the application shield
PwmOut spkr(D6); //speaker

float c = 262.0; //These are the different frequencies
float d = 294.0;
float e = 330.0;
float f = 349.0;
float g = 392.0;
float a = 440.0;
float b = 494.0;
float C = 523.0;


void hotLineBling() {

    //Here I am trying to use the frequencies to play the tone

    spkr.period(1/e);
    spkr.period(1/e);
    spkr.period(1/e);
    wait(0.5f);
    spkr.period(1/C);
    spkr.period(1/a);
    spkr.period(1/e);
    wait(0.5f);
    spkr.period(1/d);
    spkr.period(1/a);
    spkr.period(1/d);
    wait(1.0);
    spkr.period(1/C);
    spkr.period(1/a);
    spkr.period(1/e);
    wait(0.5f);
    spkr.period(1/d);
    spkr.period(1/a);
    spkr.period(1/d);
    spkr.period(1/c);
    wait(1.0);
    spkr.period(1/C);
    spkr.period(1/a);
    spkr.period(1/e);
    wait(0.5f);
    spkr.period(1/d);
    spkr.period(1/a);
    spkr.period(1/d);
    wait(5.0);

}

int main()
{

    hotLineBling();

    while (1) {

        spkr = 0.5;
        wait(0.2f); //wait a little
    }
}

2 个答案:

答案 0 :(得分:2)

您需要将PWM引脚的值设置为可播放的值,也可以通过该方式控制音量。第二件事是你需要在设置period之间等待,否则笔记没有时间在该频率上实际做任何事情。试试这个:

#include "mbed.h"

PwmOut spkr(D3);

float c = 262.0; //These are the different frequencies
float d = 294.0;
float e = 330.0;
float f = 349.0;
float g = 392.0;
float a = 440.0;
float b = 494.0;
float C = 523.0;
float _ = 0.0;

void hotLineBling() {
    float notes[] = { e, e, e, _, C, a, e, _, d, a, d, _, _,
                      C, a, e, _, d, a, d, c, _, _, C, a, e,
                      _, d, a, d };

    for (int i = 0; i < sizeof(notes) / sizeof(float); i++) {
        if (notes[i] == _) {
            spkr = 0.0f;
        }
        else {
            spkr = 0.3f;
            spkr.period(1 / notes[i]);
        }
        wait(0.5f);
    }

    spkr = 0.0f;
}

int main() {
    hotLineBling();
}

虽然我不知道这听起来是否像你想要的那样: - )

答案 1 :(得分:0)

我既不熟悉mbed也不熟悉你正在使用的环境 - 但有些事情似乎显而易见:

  • 您正在与PWM发生器通话并设置频率
  • 你似乎在等待(暂停)笔记组之间 - 至少你想要。你并没有告诉PWM在这些时期内是静音的(频率= 0)。
  • 您似乎也设置了PWM占空比(我假设“spkr = 0.5”行就是这样)

所有O.K,但是:   - 您似乎没有等待PWM实际播放音符,具体取决于您希望音调存在多长时间(在为每个音符设置PWM频率后应该有延迟 - 这就像把手指放在锡口哨的孔上,而不是吹......)

你应该在spkr.period()行之间传播一些wait(),具体取决于你想要每个音符播放多长时间。

如果您想要一段时间的静音,还应将PWM频率设置为0.

我不知道的是mbed是否要求您实际“启动”PWM或是否是自由运行。