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

📄 music.c

📁 收集到的一些常用功能模块
💻 C
字号:
/**
typedef unsigned char int8u;
typedef unsigned int int16u;
typedef signed char int8s;
typedef signed int int16s;


#define cnTimeH 0xd8
#define cnTimeL 0xef
void main(void)
{
	TH0 = cnTimeH;
	TL0 = cnTimeL;
}
**/
#include <reg52.h>
#include <intrins.h>
unsigned char n=0;  //n为节拍常数变量
//unsigned char code music_tab[]={
//0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0x20,0x10,0x20,0x80,0x26,0x20,0x30,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
//};

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 int0()  interrupt 1   //采用中断0 控制节拍
{  
   TH0=0xd8;
   TL0=0xef;
   n--;
}

void delay (unsigned char m)   //控制频率延时
{ 
//	#pragma  asm
//	         push R4
//DEL3:                  
//           MOV     R4,#02H    
//DEL4:                      
//        NOP                
//        DJNZ    R4,DEL4    
//        NOP                
//        DJNZ    R7,DEL3    
//        pop    R4

 while(--m)
 {
 	 _nop_();_nop_();_nop_();
 	 _nop_();_nop_();_nop_();
 	 
 }
}
void delay1 (unsigned char m)   //控制频率延时
{ 
 unsigned i=3*m;
 while(--i);
}

void delayms(unsigned char a)  //豪秒延时子程序
{
  while(--a);                  //采用while(--a) 不要采用while(a--); 各位可编译一下看看汇编结果就知道了!
}

void main()
{ 
	unsigned char p,m;   //m为频率常数变量
  unsigned char i=0;
  TMOD&=0x0f;
  TMOD|=0x01;
  TH0=0xd8;TL0=0xef;
  IE=0x82;
  while(1)
  {
    while(1)
    {
    	 p=music_tab[i];
       if(p==0x00)  
       { 
       	  i=0;
       	  delayms(250); 
       	//.................
       	  break;
       }
       else 
       {
       	 if(p==0xff)      //若碰到休止符,延时100ms,继续取下一音符
       	 { 
       	 	 i++;
       	 	 delayms(100);
       	 	 TR0=0; 
       	 	 continue;
       	 }  
         else           //取频率常数 和 节拍常数
         {
         	 m=music_tab[i++];  //取频率常数
         	 n=music_tab[i++];  //节拍常数
         }               
       }
       TR0=1;        //开定时器1
       while(n!=0) 
       { 
         P1=~P1;
         delay(m);  
       }             //等待节拍完成, 通过P1口输出音频(可多声道哦!)
       TR0=0;        //关定时器1
    } 
  }
}

⌨️ 快捷键说明

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