新闻中心

EEPW首页>嵌入式系统>设计应用> STC89C52单片机蜂鸣器唱歌实验

STC89C52单片机蜂鸣器唱歌实验

作者: 时间:2016-11-21 来源:网络 收藏
////////////////////////////////////////////////////////////////////////

实现功能:通过对单片机定时器的配置,让其产生不同频率的方波,蜂鸣器根据频
率的不同而发出不同的声音,来达到唱歌的目的
实验板型号:KBL-XYD-C52
实验名称:蜂鸣器唱歌实验
编写人:谢应东
编写日期:2012-4-26
////////////////////////////////////////////////////////////////////////
#include

本文引用地址://m.amcfsurvey.com/article/201611/319236.htm

#define uchar unsigned char
#define uintunsigned int

uchar cCount;

sbit FMQ =P2^4;//定义实验板上蜂鸣器器控制脚


unsigned char code SONG[] ={//祝你平安
0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0x20,0x10,0x20,0x80,0x26,0x20,0x30,0x20,
0x30,0x20,0x39,0x10,0x30,0x10,0x30,0x80,0x26,0x20,0x20,0x20,0x20,0x20,0x1c,0x20,
0x20,0x80,0x2b,0x20,0x26,0x20,0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x80,0x26,0x20,
0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x60,0x40,0x10,0x39,0x10,0x26,0x20,
0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x80,0x26,0x20,0x2b,0x10,0x2b,0x10,
0x2b,0x20,0x30,0x10,0x39,0x10,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x20,
0x20,0x10,0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x18,0x20,0x18,0x20,0x26,0x20,
0x20,0x20,0x20,0x40,0x26,0x20,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,0x20,0x20,
0x20,0x80,0x1c,0x20,0x1c,0x20,0x1c,0x20,0x30,0x20,0x30,0x60,0x39,0x10,0x30,0x10,
0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x10,0x26,0x10,0x26,0x10,0x2b,0x10,0x2b,0x80,
0x18,0x20,0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x60,0x26,0x10,0x2b,0x20,0x30,0x20,
0x30,0x20,0x1c,0x20,0x20,0x20,0x20,0x80,0x26,0x20,0x30,0x10,0x30,0x10,0x30,0x20,
0x39,0x20,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x10,0x40,0x10,0x20,0x10,
0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x00,
//路边的野华不要采
0x30,0x1C,0x10,0x20,0x40,0x1C,0x10,0x18,0x10,0x20,0x10,0x1C,0x10,0x18,0x40,0x1C,
0x20,0x20,0x20,0x1C,0x20,0x18,0x20,0x20,0x80,0xFF,0x20,0x30,0x1C,0x10,0x18,0x20,
0x15,0x20,0x1C,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x20,
0x30,0x80,0xFF,0x20,0x20,0x1C,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,
0x20,0x2B,0x40,0x20,0x20,0x1C,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,
0x20,0x2B,0x40,0x20,0x30,0x1C,0x10,0x18,0x20,0x15,0x20,0x1C,0x20,0x20,0x20,0x26,
0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x20,0x30,0x80,0x20,0x30,0x1C,0x10,0x20,
0x10,0x1C,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,0x15,0x1F,
0x05,0x20,0x10,0x1C,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,
0x30,0x1C,0x10,0x18,0x20,0x15,0x20,0x1C,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2B,
0x20,0x26,0x20,0x20,0x20,0x30,0x30,0x20,0x30,0x1C,0x10,0x18,0x40,0x1C,0x20,0x20,
0x20,0x26,0x40,0x13,0x60,0x18,0x20,0x15,0x40,0x13,0x40,0x18,0x80,0x00,

};
////////////////////////////////////////////////////////////////////////
函数名称:Time0_Init
函数功能:定时器的初始化配置,使其能中断,中断的时间间隔为10ms
参数介绍:无
返回值:
注意事项:注意此时实验板上用到的晶振为11.0592M的,要选用其他的,得重新配置
////////////////////////////////////////////////////////////////////////
void Init_Time0()
{
TMOD = 0x01; //设置定时器0为模式1(16bit)

TH0= 0xDC; //给定时器0高八位赋初值
TL0= 0x00; //给定时器0第八位赋初值

ET0= 1;//允许定时器0中断
EA= 1;//打开全局中断
}
////////////////////////////////////////////////////////////////////////
函数名称:Time0_Routine
函数功能:定时器0中断服务函数,重新给定时器0赋值,同时把全局变量cCount加1
参数介绍:无
返回值:
注意事项:无
////////////////////////////////////////////////////////////////////////
void Time0_Routine()interrupt1 using 1
{
TH0 = 0xDC;//重新给高八位赋新值
TL0 = 0x00;//重新给第八位赋新值
cCount++;//计数变量加1
}
////////////////////////////////////////////////////////////////////////
函数名称:DelayUs
函数功能:延时函数,通过示波器测试,此函数每执行一次大概能延时55us
参数介绍:iDelay_Us:执行此延时函数的次数
iNumber1:第一个for语句所用的记录循环的变量
iNumber2:第二个for语句所用的记录循环的变量
返回值:
注意事项:无
////////////////////////////////////////////////////////////////////////
void DelayUs(unsigned int iDelay_Us)
{
uint iNumber1,iNumber2;
for(iNumber1=0;iNumber1 {
for(iNumber2=0;iNumber2<3;iNumber2++);
}
}
////////////////////////////////////////////////////////////////////////
函数名称:FMQ_PlaySong
函数功能:控制实验板上与蜂鸣器相连的引脚输出不同的频率的方波,依次来控制蜂鸣
器唱歌
参数介绍:cNumber:歌曲的选择,0代表“祝你平安”,‘1’代表“路边的野花不要采”
返回值:
注意事项:无
////////////////////////////////////////////////////////////////////////
void FMQ_PlaySong(unsigned char cNumber)
{
uchar cTemp1,cTemp2;
uint iAddr;
cCount = 0;//中断计数器清0
iAddr = cNumber * 217;//歌曲的地址,可以参看SONG[],你就会明白
while(1)
{//把音码变量数组里的值赋给临时变量
cTemp1 = SONG[iAddr++];
if (cTemp1 == 0xFF)//休止符
{
TR0 = 0;
DelayUs(100);//延时
}
else if (cTemp1 == 0x00)//判断是否歌曲结束
{
return;
}
else
{
cTemp2 = SONG[iAddr++];//判断完,不是休止符与结束符后,让蜂鸣器唱歌
TR0 = 1;//让定时器0开始工作
while(1)
{
FMQ = ~FMQ;//让蜂鸣器不停地在开与关之间切换
DelayUs(cTemp1);
if(cTemp2 == cCount)
{
cCount = 0;
break;
}
}
}
}
}
////////////////////////////////////////////////////////////////////////
函数名称:main
函数功能:完成系统的初始化,让实验板上的蜂鸣器不停循环的唱上面的两首歌
参数介绍:无
返回值:
注意事项:无
////////////////////////////////////////////////////////////////////////
void main()
{
DelayUs(100);//稳定系统
Init_Time0();//定时器0中断初始化
while(1)
{
FMQ_PlaySong(0); //播放“祝你平安”
DelayUs(100);//延时一下,以便播放下一首歌
FMQ_PlaySong(1); //播放“祝你平安”
DelayUs(100);//延时一下,以便播放下一首歌
}
}



评论


技术专区

关闭