【发布时间】:2014-08-05 15:03:05
【问题描述】:
我正在使用 C 编程为微控制器 P18F4520 编程音频。 我正在使用 for 循环和延迟来执行此操作。我还没有学到任何其他方法,而且我必须使用 for 循环和延迟来为目标板生成音频。扬声器的端口位于 RA4。这是我到目前为止所做的。
#include <p18f4520.h>
#include <delays.h>
void tone (float, int);
void main()
{
ADCON1 = 0x0F;
TRISA = 0b11101111;
/*tone(38.17, 262); //C (1)
tone(34.01, 294); //D (2)
tone(30.3, 330); //E (3)
tone(28.57, 350); //F (4)
tone(25.51, 392); //G (5)
tone(24.04, 416); //G^(6)
tone(20.41, 490); //B (7)
tone(11.36, 880); //A (8)*/
tone(11.36, 880); //A (8)
}
void tone(float n, int cycles)
{
unsigned int i;
for(i=0; i<cycles; i++)
{
PORTAbits.RA4 = 0;
Delay10TCYx(n);
PORTAbits.RA4 = 1;
Delay10TCYx(n);
}
}
所以你可以看到我所做的是我创建了一个音调函数,其中 n 代表延迟,周期代表 for 循环中的周期数。我不确定我的计算是否正确,但到目前为止,这是我所做的,并且确实产生了音调。我只是不确定它是否真的是 A 音或 G 音等。我如何计算是首先我会找出频率音例如 A 音的频率为 440Hz。然后我会找到它的周期,它将是 1/440Hz。然后对于占空比,我希望音调只发出一半的蜂鸣声,即 50%,所以我将周期除以 2,即 (1/440Hz)/2 = 0.001136s 或 1.136ms。然后我将为微控制器 4*(1/2MHz) 计算 1 个周期的延迟,即 2µs。所以这意味着对于 1 个周期,它将延迟 2µs,比率将为 2µs:1cyc。因此,为了获得 1.136ms 的周期数,它将是 1.136ms:1.136ms/2µs,即 568 个周期。目前在这部分我已经询问了 n 中应该是什么,其中 n 在 Delay10TCYx(n) 中。我得到的是,只需将 10 乘以 11.36,对于音调 A,它将是 Delay10TCYx(11.36)。至于周期,我想延迟 1 秒,所以 1/1.136ms 即 880。这就是为什么在我的音调 A 方法中它是音调(11.36、880)。它会产生一个音调,我已经找到了音调的范围,但我不确定它们是否真的是音调 C D E F G G^ B A。
所以我的问题是 1. 我如何真正计算音 A 的延迟和频率? 2. 对于“循环”的 for 循环的状态是循环数,但从我从问题 1 中得到的答案来看,我应该使用多少个循环来改变音调 A 的时间段?循环次数越多,音A的周期就越长?如果是这样,我怎么知道多长时间? 3.当我使用函数播放音调时,与我在main方法中直接使用for循环时相比,它会以某种方式产生不同的音调。为什么会这样? 4. 最后,如果我想停止代码,我该怎么做?我尝试过使用 for 循环,但它不起作用。
一个简单的解释会很好,因为我只是一个学生,正在从事一个使用 for 循环和延迟来产生音调的项目。我在其他地方搜索过人们使用不同的东西,如 WAV 或类似的东西,但我只是想知道如何使用 for 循环和音频延迟。
非常感谢您的帮助。
【问题讨论】:
标签: c audio for-loop delay microcontroller