#include "reg52.h" //reg52.h在安装目录下D:\Keil_v5\C51\INC\Atmel中
sbit BEEP=P1^5; //蜂鸣器管脚定义
#define FLICKER 500 //定时值
/*变量命名规则:驼峰法(Camel-Case),小驼峰法用于变量和方法,
uc 小写表示unsigned char ,KEY中K大写,Long中L大写。 */
unsigned char ucKeyLong=0; //按键切换
unsigned int uiTimeStart=0;//定时器初值决定蜂鸣器的音调
unsigned int uiTimeCount=0;//定时器计数器
//循环中的语句是尾和首相连接的,特别是延时要求比较高的程序要特别注意
//右移指令需要注意i=i>>1;不能写成i>>1
//必须在中断服务程序中重装初值TMR0必须重装初值
#define ZERO 0x00 //休止符
//C调低音的音频宏定义do 1 频率HZ
#define DAOL 130
#define REL 146
#define MIL 164
#define FAL 174
#define SOL 196
#define LAL 220
#define XIL 247
//C调中音的音频宏定义do 1 频率523HZ
#define DAO 262
#define RE 294
#define MI 330
#define FA 349
#define SO 392
#define LA 440
#define XI 494
//c调高音的音频宏定义
#define DAOH 523
#define REH 587
#define MIH 659
#define FAH 689
#define SOH 784
#define LAH 880
#define XIH 988
//c调试音
unsigned int TONE[]={DAOL,REL,MIL,FAL,SOL,LAL,XIL,DAO,0xff};
unsigned int DELAY[]={4,4,4,4,4,4,4,4};
//两只老虎
unsigned int code TWO_TIGER_TONE[]={DAO,RE,MI,DAO,//简谱记号1=C 4/4拍
DAO,RE,MI,DAO,
MI,FA,SO,
MI,FA,SO,
SO,LA,SO,FA,MI,DAO,
SO,LA,SO,FA,MI,DAO,
DAO,SOL,DAO,
DAO,SOL,DAO,
0xff};//以0xff作为音乐的结束标志
unsigned int code TWO_TIGER_DELAY[]={8,8,8,8,//节拍时长记号
8,8,8,8,
8,8,16,
8,8,16,
6,2,6,2,8,8,
6,2,6,2,8,8,
8,8,16,
8,8,16,
};
//黑蝙蝠中队
unsigned int code HEI_TONE[]={MI,MI,RE,MI,LA,//简谱记号1=C 4/4拍
DAOH,XI,LA,SO,MI,
RE,MI,RE,MI,LA,
XI,LA,SO,SO,LA,MI,
SO,MI,RE,DAO,RE,LA,
XI,DAOH,REH,
XI,XI,XI,
SO,SO,
LA,MI,RE,DAO,
RE,FA,
MI,XIL,RE,DAO,
LAL,0xff};//以0xff作为音乐的结束标志
unsigned int code HEI_DELAY[]={8,6,2,12,4,//节拍时长记号
6,2,4,4,16,
8,6,2,12,4,
6,2,2,4,2,16,
8,2,2,2,12,4,
6,2,8,
2,2,4,
4,8,
8,2,2,2,
8,8,
6,2,4,4,
16,
};
//爱的故事上集
unsigned int code LOVE_TONE[]={MI,MI,MI,RE,RE,RE,MI,//简谱记号1=F 4/4拍
DAO,LAL,LAL,LAL,LAL,
LA,LA,LA,LA,SO,SO,SO,RE,
MI,ZERO,ZERO,
MI,MI,MI,MI,RE,RE,RE,MI,
DAO,LAL,LAL,LAL,LAL,
XIL,XIL,DAO,RE,DAO,XIL,XIL,LAL,LAL,LAL,ZERO,
MI,MI,MI,RE,RE,MI,
DAO,LAL,LAL,LAL,LAL,
LA,LA,LA,LA,SO,SO,SO,RE,
MI,ZERO,ZERO,
MI,MI,MI,MI,RE,RE,RE,MI,
DAO,LAL,LAL,LAL,LAL,
XIL,XIL,XIL,DAO,RE,DAO,XIL,XIL,LAL,ZERO,
0xff};//以0xff作为音乐的结束标志
unsigned int code LOVE_DELAY[]={8,4,4,4,4,4,4,//节拍时长记号
4,4,16,4,4,
4,4,4,4,4,4,4,4,
16,8,8,
4,4,4,4,4,4,4,4,
4,4,16,4,4,
8,4,4,4,4,4,4,4,4,16,8,
8,4,4,4,8,4,
4,4,16,4,4,
4,4,4,4,4,4,4,4,
16,8,8,
4,4,4,4,4,4,4,4,
4,4,16,4,4,
4,4,4,4,4,4,4,4,24,8,
};
//七里香
unsigned int code SEVEN_TONE[]={ZERO,LA,
DAOH,XI,DAOH,DAOH,DAOH,DAOH,
DAOH,XI,LA,XI,LA,LA,SO,SO,SO,
SO,FA,MI,SO,SO,SO,
SO,SO,RE,RE,FA,FA,MI,MI,MI,SO,
DAOH,XI,DAOH,DAOH,DAOH,DAOH,
DAOH,XI,DAOH,REH,REH,DAOH,REH,DAOH,XI,
DAOH,DAOH,DAOH,DAOH,XI,XI,LA,LA,LA,XI,LA,
LA,SO,SO,SO,DAOH,
DAOH,MI,LA,LA,SO,REH,
REH,RE,MI,FA,MI,MI,MI,SO,
SO,FA,MI,MI,MI,RE,RE,RE,DAO,DAO,MI,
RE,RE,RE,FA,MI,SO,DAOH,
DAOH,MI,LA,LA,SO,SO,REH,
REH,RE,RE,FA,MI,SO,SO,MIH,
MIH,REH,REH,DAOH,DAOH,REH,DAOH,MIH,
MIH,REH,REH,SO,DAOH,DAOH,DAOH,
DAOH,DAOH,DAOH,XI,SO,SO,
XI,DAOH,REH,DAOH,DAOH,SO,DAOH,DAOH,DAOH,
DAOH,DAOH,DAOH,XI,SO,SO,
REH,MIH,FAH,MIH,MIH,SO,DAOH,DAOH,DAOH,0xff,
};
code unsigned int SEVEN_DELAY[]={4,4,
8,4,2,2,12,4,
4,4,4,2,2,2,6,4,4,
8,4,2,2,12,4,
4,2,2,4,2,2,2,6,4,4,
8,2,2,2,16,2,
4,4,4,2,2,2,6,4,4,
4,2,2,4,2,2,2,6,4,2,2,
2,6,16,4,4,
8,4,4,8,4,4,
8,4,2,2,2,6,4,4,
4,4,4,2,2,2,4,2,2,4,2,
2,6,4,4,8,4,4,
8,4,4,4,4,4,4,
4,4,4,4,4,4,4,4,
4,4,4,4,4,4,4,4,
4,2,16,2,4,2,2,
14,2,4,4,4,4,
4,4,6,2,4,4,4,2,2,
14,2,4,4,4,4,
4,4,6,2,4,4,4,2,2,
};
//My heart will go on
unsigned int code HEART_TONE[]={DAO,DAOL,DAO,DAO,XIL,DAO,ZERO,DAO,XIL,DAO,ZERO,RE,
MI,RE,RE,DAO,DAOL,DAO,DAO,XIL,DAO,ZERO,DAO,SOL,SOL,
DAO,DAO,DAO,DAO,XIL,DAO,ZERO,DAO,XIL,DAO,ZERO,RE,MI,RE,RE,
DAO,DAO,DAO,DAO,XIL,DAO,ZERO,DAO,SOL,SOL,ZERO,DAO,
RE,SOL,SOL,SO,FA,FA,MI,MI,RE,RE,MI,FA,MI,RE,DAO,DAO,XIL,DAO,ZERO,DAO,
LAL,LAL,XIL,LAL,SOL,ZERO,DAO,0xff};
unsigned int code HEART_DELAY[]={12,4,8,8,8,16,4,4,8,16,4,4,
4,12,16,12,4,8,8,8,16,4,4,32,32,
12,4,12,4,8,16,4,4,8,16,4,4,8,8,16,
12,4,8,8,8,16,4,4,32,24,8,32,
24,4,4,12,4,4,4,4,4,16,8,8,16,4,4,8,8,16,4,4,
24,4,2,2,24,8,32,};
/************************************
延时函数: Delay
功能: i=1时,延时 10us
************************************/
void DelayUs(unsigned char i)
{
while(i--);
}
/***********************************************************
函数名称:DelayXms
函数功能:毫秒级非精准延时
入口参数:x - 延时时间
出口参数:
备 注:
***********************************************************/
void DelayXms(unsigned char x)
{
unsigned char i,j;
for(i=x;i>0;i--)
for(j=153;j>0;j--);
}
void Init_System()
{
EA=1; //开总中断
ET0=1;//允许定时器中断
TR0=1;//启动定时器中断
TMOD=0x01;//设置定时器0为工作方式1
TH0=(65535-2000)/256;
TL0=(65535-2000)%256;
;
}
void Timer0_ISR (void) interrupt 1
{
TF0=0;//清除中断标志
TR0=0;// 关闭定时器中断
if(uiTimeCount<65535)
uiTimeCount++; //累加定时中断的次数,
if(uiTimeCount>FLICKER)
{
//P2=~P2;
uiTimeCount=0;
}
TH0=uiTimeStart/256;
TL0=uiTimeStart%256;
TR0=1; //启动定时器
BEEP=~BEEP;
}
void SoundPlay( unsigned int PLAY[], unsigned int DELAY_BEEP[],unsigned char speed)
{
unsigned int i,j;
j=0;
while(PLAY[j]!=0xff)
{
if(PLAY[j]==0x00)
{
TR0=0;
BEEP=0;
}
else
{
uiTimeStart=65535-12000000/(PLAY[j]*speed)/2/16;
TR0=1;
TH0=uiTimeStart/256;
TL0=uiTimeStart%256;
}
for(i=0;i<DELAY_BEEP[j];i++)
DelayXms(150);
TR0=0;
BEEP=0;
DelayXms(255);
j++;
}
DelayXms(255);
DelayXms(255);
DelayXms(255);
DelayXms(255);
}
/**********************************
main主函数入口
***************************************/
void main(void)
{
DelayUs(10);
Init_System();
DelayXms(10);
while(1)
{
switch (ucKeyLong)
{
case 0:
ucKeyLong=1;
SoundPlay(TWO_TIGER_TONE,TWO_TIGER_DELAY,2);
DelayXms(255);
DelayXms(255);
DelayXms(255);
DelayXms(255);
SoundPlay(LOVE_TONE,LOVE_DELAY,1);
DelayXms(255);
DelayXms(255);
DelayXms(255);
DelayXms(255);
SoundPlay(HEI_TONE,HEI_DELAY,1);
DelayXms(255);
DelayXms(255);
DelayXms(255);
DelayXms(255);
SoundPlay(SEVEN_TONE,SEVEN_DELAY,1);
DelayXms(255);
DelayXms(255);
DelayXms(255);
DelayXms(255);
SoundPlay(HEART_TONE,HEART_DELAY,1);
DelayXms(255);
DelayXms(255);
DelayXms(255);
DelayXms(255);
break;
case 1:
ucKeyLong=0;
SoundPlay(TONE,DELAY,1);
DelayXms(255);
DelayXms(255);
DelayXms(255);
DelayXms(255);
break;
}
}
}
文章来源地址https://www.toymoban.com/news/detail-777082.html
文章来源:https://www.toymoban.com/news/detail-777082.html
到了这里,关于单片机蜂鸣器播放音乐C语言Protues 仿真实验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!