原标题:STC89C52单片机蜂鸣器唱歌实验
实现功能:通过对定时器的配置,让其产生不同频率的方波,根据频
率的不同而发出不同的声音,来达到唱歌的目的
实验板型号:KBL-XYD-C52
实验名称: 蜂鸣器唱歌实验
编写人: 谢应东
编写日期: 2012-4-26
#include
#define uchar unsigned char
#define uint unsigned 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() interrupt 1 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); //延时一下,以便播放下一首歌
}
}
责任编辑: