基于51单片机的利用定时器产生乐曲设计

程序运行图:

基于51单片机的利用定时器产生乐曲设计_第1张图片

仿真原理图:

基于51单片机的利用定时器产生乐曲设计_第2张图片

部分程序:

#include               //库文件

#define uchar unsigned char//宏定义无符号字符型

#define uint unsigned int  //宏定义无符号整型

/********************************************************************

                            初始定义

*********************************************************************/

uchar Count;

sbit _Speak =P3^7 ; //讯响器控制脚

/********************************************************************

                            歌曲字根码

*********************************************************************/

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,};

/********************************************************************

                            定时中断服务函数

*********************************************************************/

void Time0_Init()

{

         TMOD = 0x01;

         IE = 0x82;

         TH0 = 0xD8;

         TL0 = 0xEF; //12MZ晶振,10ms

}

/*********************************************************************/

void Time0_Int() interrupt 1

{

         TH0 = 0xD8;

         TL0 = 0xEF;                      

         Count++; //长度加1

}

/*********************************************************************/

void Delay_xMs(unsigned int x) //1MS 延时子程序

{

         unsigned int i,j;

         for( i =0;i < x;i++ )

         {

                  for( j =0;j<3;j++ );

         }

}

/*********************************************************************/

void Play_Song(unsigned char i) //:歌曲播放子程序i 为播放哪一段曲目

{

         unsigned char Temp1,Temp2;

         unsigned int Addr;

         Count = 0; //中断计数器清0

         Addr = i * 217;

while(1)

         {

                  Temp1 = SONG[Addr++];

                  if ( Temp1 == 0xFF ) //休止符

                          {

                                   TR0 = 0; Delay_xMs(100);

                          }

         else if ( Temp1 == 0x00 ) //歌曲结束符

                  {

                          return;

                  }

else

{

         Temp2 = SONG[Addr++];

         TR0 = 1;

         while(1)

         {

    

                          Count = 0;

                          break;

                  }

         }

}

}

}

void main() //主程序

{

         Time0_Init(); //定时器0 中断初始化

         while(1)

         {

                  Play_Song(0);

         } //播放

}

资料包括:

基于51单片机的利用定时器产生乐曲设计_第3张图片

 

需要完整的资料可在我的资源里下载,也可以加入我的纷传圈子,里面有资源压缩包的百度网盘下载地址及提取码。

纷传点击用微信打开即可,过程有点繁琐请见谅。

你可能感兴趣的:(基于51单片机的设计,51单片机,嵌入式硬件,单片机)