系列文章【完善中】: 【POCKET 51】用 pocket 51学51单片机 之一:pocket 51诞生记 【POCKET 51】用 pocket 51学51单片机 之二:pocket 51的加工及焊接 【POCKET 51】用 pocket 51学51单片机 之三:pocket 51上电测试 【POCKET 51】用 pocket 51学51单片机 之四:pocket 51功能模块测试 【本设计已在立创开源平台开源】
五、使用pocket 51播放音乐
蜂鸣器分为有源和无源两种: 有源蜂鸣器内部带有一个振荡器,只能发出特定频率的声音,使用时较为简单,直接供电即可发生。 无源蜂鸣器内部无振荡器,必须给一个震荡脉冲才能够发生,所以我们可以通过给不同频率的声音来进行音乐播放。
频率和音高对应表: 例如我们可以通过设定定时器来控制蜂鸣器引脚的高低电平变化,从而得到一定频率的方波,例如440Hz方波就能够使蜂鸣器发出1(do)的声音。时间长度可以通过延时进行控制。
在程序中,tone_h和tone_l用来存储音调对应的计数初始值的高8位和低8位。
在使用蜂鸣器进行音乐播放时,驱动蜂鸣器的PWM信号按照简谱的唱名改变为相应的频率,并持续相应的时长,就可以达到播放音乐的目的。
代码参考网址:http://www.51hei.com/bbs/dpj-217113-1.html
对代码做了稍许修改,能够适配STC15A60S2。 代码如下:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sfr AUXR = 0x8E;
sbit SPK = P3^7;
uchar tone_h;
uchar tone_l;
uint note = 1;
uchar beat;
uchar code chuzhi[3][16]=
{
0xff,0xff,
0xf8,0x8c,
0xf9,0x5b,
0xfa,0x15,
0xfa,0x67,
0xfb,0x04,
0xfb,0x90,
0xfc,0x0c,
0xff,0xff,
0xfc,0x44,
0xfc,0xac,
0xfd,0x09,
0xfd,0x34,
0xfd,0x82,
0xfd,0xc8,
0xfe,0x06,
0xff,0xff,
0xfe,0x22,
0xfe,0x56,
0xfe,0x85,
0xfe,0x9a,
0xfe,0xc1,
0xfe,0xe4,
0xff,0x03
};
uint code test2[] = { 120,
401,402,403,404,405,406,407,
611,612,613,614,615,616,617,
821,822,823,824,825,826,827,
0xffff
};
uint code test[] = { 120,
413,213,213,414,415,813,812,
411,211,211,412,413,313,107,807,
406,413,812,406,413,812,406,413,312,811,410,
213,412,815,214,413,812,
215,414,213,412,315,113,812,
406,413,812,
406,413,812,
214,213,214,213,811,
214,213,214,213,811,612,211,411,410,
0xffff
};
void delayms(uint ms)
{
uchar a,b,c;
while(ms--)
{
for(c=1; c>0; c--)
for(b=142; b>0; b--)
for(a=2; a>0; a--);
}
}
void delay125ms(uint pai)
{
uchar a,b,c;
while(pai--)
{
for(c=239; c>0; c--)
for(b=104; b>0; b--)
for(a=1; a>0; a--);
}
}
void timer0() interrupt 1
{
TH0 = tone_h;
TL0 = tone_l;
SPK = ~SPK;
}
void timer_init()
{
AUXR &= 0x7F;
EA = 1;
ET0 = 1;
PT0 = 1;
TMOD = 0x11;
TH0 = 255;
TL0 = 255;
}
void main()
{
timer_init();
note = 1;
while(1)
{
if(test[note] == 0xffff)
{
note = 1;
}
if(test[note]%10 != 0)
{
tone_h = TH0 = chuzhi[test[note]%100/10][(test[note]%10)*2 ];
tone_l = TL0 = chuzhi[test[note]%100/10][(test[note]%10)*2 + 1];
TR0 = 1;
}
delay125ms(test[note]/25);
TR0 = 0;
delayms(30);
note++;
}
}
运行效果
运行后,播放虫儿飞音乐。
|