⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 music.c

📁 单片机音乐编程
💻 C
字号:
/********************************************************************
//模 块 名 :  PWM音乐演示程序
//创 建 者 :  杨 勇	 
      日期 :   2007年4月29日 23:10				
//修 改 者 : 									
      日期 :
//功能描述 :  
//其他说明 :  22.1184MHz晶振 
//芯片型号 :   AT89S52
//配    置 : 
//版    本 :  V1.0
********************************************************************/



#include <reg52.h>   
#include <intrins.h>

#define uint unsigned int
#define uchar unsigned char

//本例采用89C52, 晶振为 22.1184MHzMHZ
//关于如何编制音乐代码, 其实十分简单,各位可以看以下代码.
//频率常数即音乐术语中的音调,而节拍常数即音乐术语中的多少拍;

unsigned char n=0;       //n为节拍常数变量
unsigned char code music_tab[] ={
0x18, 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 Music_Play(void);
void delay (unsigned char m);
void delayms(unsigned char a);


/*=============================================================================
//函 数 名:  void Music_Play(void)
//参    数:  无
//返 回 值:  无
//函数功能:  音乐播放函数
//编 写 者:  杨 勇
//编写日期:  2007年4月29日 23:12
===============================================================================*/
void Music_Play(void)
{ 
  uchar p,m;   //m为频率常数变量
  uchar i=0;
  TMOD&=0x0f;
  TMOD =0x01;
  TH0=0xc6;
  TL0=0xb6;
  IE=0x82;

play:
   while(1)
    {
    a: p=music_tab[i];
       if(p==0x00)      
	   { 
	     i=0; 
		 delayms(2000);
		 goto play;
	   }     //如果碰到结束符,延时1秒,回到开始再来一遍
       else
	    if(p==0xff) 
	    { 
		  i=i+1;
		  delayms(200);
		  TR0=0; 
		  goto a;
		}  //若碰到休止符,延时100ms,继续取下一音符          
		else        
	    {
		  m=music_tab[i++];
		  n=music_tab[i++];
		}  //取频率常数 和 节拍常数
        TR0=1;                                             //开定时器1
        while(n!=0)
		{
		  P3 |=0x40;	   
	      delay(m);                        //等待节拍完成, 通过P1口输出音频(可多声道哦!)
		  P3 &=0xbf;	   
	      delay(m); 
		}
	  TR0=0;                                             //关定时器1
    } 
}


/*=============================================================================
//函 数 名:  void int0()  interrupt 1 
//参    数:  无
//返 回 值:  无
//函数功能:  定时器0中断服务函数
//编 写 者:  杨 勇
//编写日期:  2007年4月29日 23:16
===============================================================================*/
void int0()  interrupt 1   //采用中断0 控制节拍
{  
  TH0=0xc6;
  TL0=0xb6;
  n--;
}

/*=============================================================================
//函 数 名:  void delay (unsigned char m)
//参    数:  无
//返 回 值:  无
//函数功能:  延时函数
//编 写 者:  杨 勇
//编写日期:  2007年4月29日 23:17
===============================================================================*/
void delay (unsigned char m)   //控制频率延时
{ 
 unsigned i=3*m;
 while(--i);
}

/*=============================================================================
//函 数 名:  void delay (unsigned char m)
//参    数:  无
//返 回 值:  无
//函数功能:  延时函数
//编 写 者:  杨 勇
//编写日期:  2007年4月29日 23:17
===============================================================================*/
void delayms(unsigned char a)  //豪秒延时子程序
{
  while(--a);                  //采用while(--a) 不要采用while(a--); 各位可编译一下看看汇编结果就知道了!
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -