|
本帖最后由 SDC158477392 于 2015-1-16 22:44 编辑
产生简单音频提示音乐,在蜂鸣器上发出
1、音乐样本:5 i 5 4 | 3 2 1 | 1 1 2 3 | 3 1 3 4 | 5 -
2、提示:在许多简单应用中,需要利用单片机系统产生各种音乐用于报警和提示等,如手机的来电铃声,儿童玩具,时钟的音乐报时等。用单片机产生各种音乐发声的原理很简单,就是由I/O引脚输出不同频率的脉冲信号,再将信号放大,推动发声器件发声(这里是指在要求不高的情况下,用不同频率的脉冲方波替代正弦波)。
/*******************************************************
* 程序功能:用蜂鸣器播放我爱北京天安门,
* 硬件说明:使用STC15F2K61S2,P3^2接一个按键为播放键。P3^0接一个无源蜂鸣器。
* 实验现象:通过按DK0按钮开启蜂鸣器,播放我爱北京天安门
* 日 期 : 2014/7/19
* 作 者 : xxx
*******************************************************/
#include<STC15F2K60S2.h>
#define FOSC 12000000 //系统频率为12M
#define uchar unsigned char //用uchar代替unsigned char
#define uint unsigned int //用uint代替unsigned int
uint i=0,j=0;
uint S[]={784,1046,784,698,659,578,523,523,523,578,659,659,523,659,698,784,0}; //每个音符的频率
uchar T[]={157, 209,157,140,132,116,208,104,104,116,132,132,104,132,140,628}; //每个音符所持续的时间
/*******************************************************
//函数名称:Init_timer()
//函数功能:定时器0,外部中断0初始函数 12T模式
//入口参数:无
//返回参数:无
********************************************************/
void Init_timer()
{
IT0=1;
EX0=1;//外部中断初始化
TMOD=0x00; //定时器模式设置为16为自动重装
TL0=65536-FOSC/S[0]/12/2;
TH0=(65536-FOSC/S[0]/12/2)>>8;
ET0=1; //定时器0初始化
EA=1; //开总中断
}
/*******************************************************
//函数名称:Int0()()
//函数功能:外部中断0服务程序
//入口参数:无
//返回参数:无
********************************************************/
void Int0()interrupt 0
{
Init_timer();
TR0=1; //开启定时器中断0
}
/*******************************************************
//函数名称:timer0()
//函数功能:定时器中断0服务程序
//入口参数:无
//返回参数:无
********************************************************/
void timer0()interrupt 1
{
P30=!P30; //输出PWM波
i++;
if(i==T[j]*5)
{ i=0;
j++;
TL0=65536-FOSC/S[j]/12/2;
TH0=(65536-FOSC/S[j]/12/2)>>8;
} //重装初值
if(S[j]==0)
{
j=0;
TR0=0;
} //检测音乐是否播完,播完关闭定时器0 ,停止播放
}
/*******************************************************
//函数名称:main()
//函数功能:程序主函数
********************************************************/
void main()
{
P3M1 &= ~1; //P3.0 设置为推挽输出
P3M0 |= 1;
Init_timer();
while(1);
} |
|