单片机蜂鸣器唱歌c语言程序,STC89C52单片机蜂鸣器唱歌实验

原标题: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); //延时一下,以便播放下一首歌

}

}

责任编辑: