原理
蜂鸣器
蜂鸣器分为有(震动)源的和无源的,有源的无法控制频率,所以用无源的才能播放音乐。无源蜂鸣器需要自己控制输入变化的信号才能发声,最简单的就是输入方波信号了,通过单片机控制方波的频率就能发出不同音调的声音
这是发出50%占空比方波的代码:
int i;
while (1) {
for (i = 0; i < 10; ++i); // 改变循环次数可以改变方波频率
P1_0 = 1;
for (i = 0; i < 10; ++i);
P1_0 = 0;
}
乐谱转成循环次数
首先要有蜂鸣器乐谱,就是用频率和持续时间表示一个音符的乐谱,至于如何获取蜂鸣器乐谱可以看我上一篇文章。由于单片机的运行速度很慢,如果在单片机里计算循环次数会浪费很多时间,导致输出的音乐断断续续的,所以我尽量在电脑上完成计算,单片机直接读取循环次数就行了
已知单片机使用的晶振频率(我用的11059200Hz),机器主频是晶振频率的12分频,所以一个机器周期是 1 / ( 晶 振 频 率 / 12 ) 1 / (晶振频率 / 12) 1/(晶振频率/12) 秒。还要知道for循环一次需要多少个机器周期,我是在keil仿真调试时开启定时器测出来的,是38个周期。一次循环时间就是 机 器 周 期 ∗ 1000 ∗ 每 次 循 环 机 器 周 期 数 机器周期 * 1000 * 每次循环机器周期数