举个栗子,单片机通过蜂鸣器来播放生日快乐歌。
#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
sbit Beep=P1^5;
/*要产生音频脉冲,只要算出某一音频的脉冲(1/频率),然后将此周期除以2,即为半周
期的时间,利用定时器计时这个半周期的时间,每当计时到后就将输出脉冲的I/O 反相,然
后重复计时此半周期的时间再对I/O 反相,就可以在I/O 脚上得到此频率的脉冲。
2)利用8051 的内部定时器使其工作在计数器模式MODE1 下,改变计数值TH0 及TL0 以
产生不同频率的方法如下:
例如,频率为523Hz,其周期天/523 S=1912uS,因此只要令计数器计时956uS/1us=956,
在每计数956 次时就将I/O 反接,就可得到中音DO(532Hz)。
计数脉冲值与频率的关系公式如下:
N=Fi/2/Fr
(N:计数值,Fi:内部计时一次为1uS,故其频率为1MHz,Fr:要产生的频率)
三、其计数值的求法如下:
T=65536-N=65536-Fi/2/Fr
计算举例:
设K=65536,F=1000000=Fi=1MHz,求低音DO(261Hz)、中音DO(523Hz)、高音DO(1046Hz)
的计数值。
T=65536-N=65536-Fi/2/Fr=65536-1000000/2/Fr=65536-500000/Fr
低音DO 的T=65536-500000/262=63627
中音DO 的T=65536-500000/523=64580
高音DO 的T=65536-500000/1047=65059*/
//生日快乐歌闹钟音谱
uchar code SONG_TONE[]={212,212,190,212,159,169,212,212,190,212,142,159,212,212,106,126,159,169,190,119,119,126,159,142,159,0};
uchar code SONG_LONG[]={9,3,12,12,12,24,9,3,12,12,12,24,9,3,12,12,12,12,12,9,3,12,12,12,24,0};
//uchar code SONG_TONE[]={6,2,3,5,2,1,3,2,2,5,2,2,1,3,2,6,2,1,5,2,1,6,2,4,3,2,2,5,2,1,6,2,1,5,2,2,3,2,2,1,2,1,6,1,1,5,2,1,3,2,1,2,2,4,2,2,3,3,2,1,5,2,2,5,2,1,6,2,1,3,2,2,2,2,2,1,2,4,5,2,3,3,2,1,2,2,1,1,2,1,6,1,1,1,2,1,5,1,6,0,0,0};
//uchar code SONG_LONG[]={};
void DelayMS(uint x)
{
uchar t;
while(x--)for(t=0;t<120;t++);
}
void MusicPlay()
{
uint i=0,j,k;
while(SONG_LONG[i]!=0||SONG_TONE[i]!=0)
{
for(j=0;j<SONG_LONG[i]*20;j++)
{
Beep=~Beep;
for(k=0;k<SONG_TONE[i]/3;k++);
}
DelayMS(10);
i++;
}
}
void main()
{
Beep=0;
while(1)
{
MusicPlay();
DelayMS(500);
}
}
其他简单的音乐大家也可以尝试用这种简单粗暴的方法。
但是话说回来,其实买个音乐播放器,用SD卡存储音乐播放更好。