关于单片机中的beep(新手问题)

关于单片机中的beep(新手问题),第1张

因为你去掉的“while(j--)”在编译成汇编后会生成好几条语句,去掉后执行BEEP=!BEEP的间隔时间变短了,也就是说这时蜂鸣器是在发出声音,只不过已经变成超声波了^O^!你听不到了而已,你可以在for下面再加一句“_nop_();“,改成

for(;i>0;i--)

_nop_();

_nop_();

试试。

sound 控制音调, delay 控制时间长短,不能控制音量。

( 50 到 1000) %40000 等于 ( 50 到 1000)

======

没声音,

可以用Beep函数试试,#include<windowsh>

Beep( 频率, 延时毫秒 ); 例如 Beep(700, 1000);

只要你有乐谱。根据乐理,就可以走在调上。比如:

你可以写一个文件,存储你自己的声音格式:

struct tagSound

{

int frequency; //频率

int soundDelay; //发音时间(单位ms)

int nosoundDelay; //发完音之后暂停的时间(单位ms)

};

1。音符与频率的关系

========低音部分

低1DO:262

#1DO#:277

低2RE:294

#2RE#:311

低3MI:330

低4FA:349

#4FA#:370

低5SO:392

#5SO#:415

低6LA:440

#6LA#:466

低7SI:494

========中音部分=低音X2

中1DO:523 956us FC44;

#1DO#:554 902us

中2RE:578 865us FC9F;

#2RE#:622 803us

中3MI:659 759us FD09;

中4FA:698 716us FD34

#4FA#:740

中5SO:784 638us FD82

#5SO#:831

中6LA:880 568us FDC8

#6LA#:932

中7SI:988 506us FE06

========高音部分=中音X2

高1DO:1046

#1DO#:1109

高2RE:1175

#2RE#:1245

高3MI:1318

高4FA:1480

#4FA#:1480

高5SO:1568

#5SO#:1661

高6LA:1760

#6LA#:1865

高7SI:1976

“#”表示半音,用于上升或下降半个音

2。频率的产生

利用定时器来控制IO口的高低变化实现

周期=1/频率

半周期中断产生IO口电平

定时时间常数按照单片机的方式计算

3。音乐节拍的产生

每个音符用1个字节,字节的高4位代表音符的高低,低4位代表

音符的节拍,如果 1节拍是04秒,则1/4拍就是01秒。

其他节拍为1/4拍的整数倍。

4。节拍与节拍码对照表

节拍 节拍数 节拍数

1 1/4 1/8

2 2/4 2/8

3 3/4 3/8

4 1 1/2

5 5/4 5/8

6 6/4 6/8

8 2 1

A 10/4 5/4

C 3 12/8

F 15/4

曲调 1/4拍的延迟时间 1/8拍的延迟时间

4/4 125ms 62ms

3/4 187ms 94ms

2/4 250ms 125ms

不过,真的好不准。

这样就可以编辑文件了。

送你一个函数:

void MyDelay(long tt) /暂停tt个百分之一秒/

{

struct time now,last;

gettime(&last);

gettime(&now);

while((((nowti_sec-lastti_sec)100+nowti_hund-lastti_hund))<tt)

{

gettime(&now);

}

}

这个函数可以暂停 001tt 秒。

循环使用下面的句子:

Beep(frequency,soundDelay);

MyDelay(nosoundDelay/10);

就可以模拟那个音乐了。

在C语言里可以循环使用:

sound(frequency);

MyDelay(soundDelay/10);

nosound();

MyDelay(nosoundDelay/10);

就可以了

你说 beep 可以使主机发声,主机发声指的是不是 声卡+音箱 发声 如果这样,增加音量好办,软件(如音量滑块)硬件(音箱音量旋钮)都可。

使喇叭像主机一样发声,你指的是不是计算机箱内的小喇叭?那个声音无法大,主板提供的信号很小,喇叭本身也很小,总不能加硬件电路放大吧?

起发声作用的是MessageBeep(0)函数,它和Beep()的区别主要是是否是阻塞调用的。

MessageBeep()是异步(非阻塞)的,就是说程序执行到此函数后,不等发声完毕就继续执行它后面的程序,所以一般需要在循环中加入Sleep()函数来等待发声完毕再进入下次循环,所以按你的代码,应该不到一秒就结束循环,发声也是很短促。

After queuing the sound, the MessageBeep function returns control to the calling function and plays the sound asynchronously

参考:http://baikebaiducom/view/1887476htm

而Beep()是同步(阻塞)的,就是说必须等待函数里发声完毕才会继续执行它后面的程序,所以你的代码把MessageBeep()换成Beep()的话,会发一百次Beep声音,执行完毕所花时间将是单次Beep参数所设时间的100倍。

The Beep function generates simple tones on the speaker The

function is synchronous; it does not return control to its caller until the

sound finishes

Beep函数本身就是为了使用主板声音而设计的。不然以前的游戏怎么会有声音?

现在Beep函数已经不用。而直接使用Windows系统提供的API。还有一些专业的音效开发者,他们会使用一些专业的库函数。例如DirectSound等

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/12176785.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存