//*****************************************************
//
// 实 验 名 称: 蜂鸣器播音乐
//
// 实 现 功 能: 用蜂鸣器播一段自己喜欢的音乐
//
// 实验硬件环境: 所有程序均在"亿唯电子"公司 MINI51实验板上测试成功,
// 主控芯片: STC公司的 STC12C5A16S2 单片机
// 晶振频率: 11.0592MHz
//
// 更多程序下载>>亿唯电子:www.evmcu.net
//
//*****************************************************
#include <stc12c5a16s2.h>
#include<intrins.h>
#define u8 unsigned char
#define u16 unsigned int
#define u32 unsigned long
sbit beep=P2^0;
bit stop=0;//stop=0时发声,stop=1时不发声
u16 music_f=1734;//初始为dou
#define music_l 0x0001
#define music_m 0x0002
#define music_h 0x0003
u16 code music_f_l[8]={3500,3100,2800,2600,2300,2050,1840}; //低音
u16 code music_f_m[8]={1734,1548,1375,1295,1150,1021,915}; //中音
u16 code music_f_h[8]={450,500,570,630,670,760,850}; //高音
//三度音阶
void time_init()
{
TMOD=0x01; //定时器,方式1
TH0=(65536-music_f)>>8; //写入初值高8位
TL0=(65536-music_f)&0x00ff; //写入初值低8位
EA=1;
ET0=1;
TR0=1;
}
u8 code music_d[512]= {5,5,6,5,1,7,5,5,6,5,2,1,5,5,5,3,1,7,6,4,4,3,1,2,1,0,5,6,5,3,2,1,2,1,6,5,6,6,5,6,6,5,5,3,2,5,6,5,3,2,1,2,6,1,2,2,2,2,3,5,5,6,1,6,1,2,2,3,5,6,5,6,6,5,3,6,5,8,1,2,1,6,1,0,0xff}; // 音乐音节
u8 code music_lv[512]= {1,1,1,1,2,1,1,1,1,1,2,2,1,1,2,2,2,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,1,2,2,0xff}; // 音乐度数
u8 code music_time[512]= {1,1,2,2,2,4,1,1,2,2,2,4,1,1,2,2,2,2,2,1,1,2,2,2,4,2,1,1,1,1,1,1,1,1,1,4,1,2,1,1,2,1,3,1,4,1,1,1,1,4,1,1,1,1,4,1,1,1,1,2,1,1,3,1,2,1,2,1,1,1,2,1,2,1,2,2,6,1,1,1,1,1,1,2,0xff}; // 音乐节拍
u8 code music_s[512]= {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xff}; // 音乐节拍
void delay_ms(unsigned int x) // 延时毫秒级
{
unsigned int a=0,b=0,c=0;
for(a=x;a>0;a--)
for(b=5;b>0;b--)
for(c=128;c>0;c--);
}
void play(u8 l,u8 f,u8 len,bit s)
{
u16 *add;
stop=0;//播放音乐
switch(l)
{
case music_l:add=music_f_l;break;
case music_m:add=music_f_m;break;
case music_h:add=music_f_h;break;
}
switch(f)
{
case 0:{stop=1;delay_ms(1800);};break;//长停顿
case 1:music_f=*add;break;
case 2:music_f=*(add+1);break;
case 3:music_f=*(add+2);break;
case 4:music_f=*(add+3);break;
case 5:music_f=*(add+4);break;
case 6:music_f=*(add+5);break;
case 7:music_f=*(add+6);break;
case 8:stop=1;break;//空音
}
delay_ms(len*180);
stop=1;//停止播放音乐
if(s)delay_ms(len*90);
}
void main()
{
u16 n=0;
time_init();//定时中断初始化子程序
P1=0x55;
while(1)
{
while(1)
{
if(music_lv[n]==0xff){n=0;break;}
play(music_lv[n],music_d[n],music_time[n],music_s[n]);
n++;
}
}
}
void timer0() interrupt 1 //中断
{
TH0=(65536-music_f)>>8; //重新写入初值
TL0=(65536-music_f)&0x00ff;
if(stop)beep=1;
else beep=~beep;
} |