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

📄 music.c

📁 用51单片机播放音乐《天空之城》
💻 C
字号:
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
typedef bit BOOL  ; 

sbit voice=P2^0;
sbit rs = P2^6 ; 
sbit rw = P3^6 ;
sbit ep = P2^7 ;

uchar code sound[]={0xff,
                    0x1c,0x30,0x19,0x30,0x18,0x40,0x19,0x30,0x18,0x30,0x13,0x30,0x19,0x80,
                    0x26,0x30,0x26,0x30,0x1c,0x40,0x20,0x30,0x1c,0x30,0x18,0x30,0x20,0x60,
                    0x26,0x30,0x26,0x30,0x24,0x40,0x26,0x30,0x24,0x30,0x18,0x40,0x26,0x60,
                    0x18,0x20,0x18,0x20,0x18,0x20,0x19,0x40,0x24,0x30,0x24,0x30,0x19,0x30,
                    0x19,0x60,0x1c,0x30,0x19,0x30,0x18,0x40,0x19,0x30,0x18,0x30,0x13,0x30,
                    0x19,0x60,0x26,0x30,0x26,0x30,0x1c,0x40,0x20,0x30,0x1c,0x30,0x18,0x30,
                    0x20,0x80,0x26,0x30,0x24,0x30,0x24,0x30,0x18,0x30,0x19,0x20,0x19,0x30,
                    0x18,0x30,0x15,0x20,0x15,0x20,0x13,0x20,0x18,0x40,0x18,0x30,0x19,0x30,
                    0x1c,0x20,0x1c,0x20,0x19,0x30,0x20,0x30,0x1c,0x60,0x18,0x30,0x15,0x30,
                    0x13,0x40,0x15,0x30,0x13,0x30,0x10,0x30,0x15,0x60,0x20,0x30,0x20,0x30,
                    0x18,0x30,0x19,0x30,0x18,0x30,0x13,0x30,0x13,0x60,0x1c,0x20,0x19,0x20,
                    0x18,0x30,0x19,0x30,0x15,0x20,0x15,0x20,0x18,0x40,0x20,0x30,0x20,0x30,
                    0x12,0x30,0x13,0x30,0x15,0x30,0x18,0x30,0x13,0xc0,0x13,0x80,0x13,0x30,
                    0x0e,0x80,0x10,0x30,0x10,0x30,0x13,0x20,0x15,0x20,0x18,0x40,0x18,0x30,
                    0x15,0x30,0x18,0x20,0x15,0x20,0x15,0x30,0x10,0x30,0x13,0x60,0x13,0x30,
                    0x0e,0x60,0x10,0x60,0x13,0x20,0x15,0x20,0x18,0x40,0x18,0x30,0x15,0x30,
                    0x15,0x20,0x18,0x20,0x15,0x30,0x19,0x30,0x1c,0x60,0x1c,0x30,0x19,0x30,
                    0x1c,0xc0,0x00,
                   };
				   
void delay(uchar) ;
void lcd_wcmd(uchar) ;
BOOL lcd_bz() ;
void lcd_pos(uchar) ;
void lcd_wdat(uchar) ;
void display(uchar,uchar *) ;

code uchar  dis1[] = {"LOVECCNU"} ;
code uchar  dis2[] = {" MUSIC! "} ;
				   
void longdelay(uchar s)  //长延时
{
	 while(s--)
	 {
	  	delay(60) ;
	 }
}

void delay(uchar ms)
{       // 延时子程序
	 uchar i ;
	 while(ms--)
	 {
	  	for(i = 0 ; i<250;i++) ;
	 }
}

BOOL lcd_bz()
{       // 测试LCD忙碌状态
	 BOOL result ;
	 rs = 0 ;
	 rw = 1 ;
	 ep = 1 ;
	 result = (BOOL)(P0 & 0x80) ;
	 ep = 0 ;
	 return result ; 
}

void lcd_wcmd(uchar cmd)
{       // 写入指令数据到LCD
 	while(lcd_bz()) ;
	rs = 0 ;
	rw = 0 ;
	ep = 0 ;
	P0 = cmd ;
	ep = 1 ;
	ep = 0 ;  
}

void lcd_pos(uchar pos)
{       //设定显示位置
 	lcd_wcmd(pos | 0x80) ;
}

void lcd_wdat(uchar dat) 
{       //写入字符显示数据到LCD
 	while(lcd_bz()) ;
  	rs = 1 ;
  	rw = 0 ;
  	ep = 0 ;
  	P0 = dat ;
  	ep = 1 ;
  	ep = 0 ; 
}

void lcd_init()
{       //LCD初始化设定
	 lcd_wcmd(0x38) ;   //function set
	 delay(1) ;
	 lcd_wcmd(0x38) ;   //function set
	 delay(1) ;
	 lcd_wcmd(0x08) ;   //display on/off
	 delay(1) ;
	 lcd_wcmd(0x01) ;   //清除LCD的显示内容
	 delay(1) ;
	 lcd_wcmd(0x06) ;   //entry mode set
	 delay(1) ;
	 lcd_wcmd(0x0c) ;   //entry mode set
	 delay(1) ;
}

/*---------------
函数名称:display()
功能 :在LCD上显示数组的数据
说明 :先写显示地址,后写显示数据
调用 :lcd_wcmd(), lcd_pos()
入口参数:pos 写入的位置,q指向要写入的数据所在的数组
返回值 :无
----------------*/
void display(uchar pos, uchar *q)
{ 
	 uchar i ;
	 //lcd_wcmd(0x01) ; //clear 
	 delay(10) ;
	 lcd_pos(pos) ;
	 for(i=0 ;i<16;i++)
	 {
		  lcd_wdat(*q) ;
		  q++ ;
		  longdelay(2) ;
	 } 
}
				   
				   	
uchar zdjs=0, jp;
del(yj);
void main(void)
  {
      uint dpjs=0;
      uchar yj;
      TMOD=0x01,IE=0x82;
      TH0=0xd8, TL0=0xef;
      TR0=1;
	
	 P1=0xf0;
	 delay(200) ;
	 P1=0xff;
	 lcd_init() ;    // 初始化LCD   
	 delay(10) ;
	 display(0x00,dis1) ;
	 display(0x40,dis2) ;
	 lcd_wcmd(0x07) ;   //entry mode set
	 P1=0xf0;

while(1)
   { 
     
      zdjs=0;
      dpjs++; yj=sound[dpjs]; 
     dpjs++; jp=sound[dpjs];
   while(zdjs!=jp)
       { 
      if(yj!=0xff)
   {
             if(yj!=0)
               {
             voice=!voice;
                 del(yj);
                }
                else
          {
          dpjs=0; 
                      break;
                     }
    }
    else
      {
        voice=0;
                 del(jp);
    }
      }
       }
   }
time0() interrupt 1  using 1
      {
         TH0=0xd8, TL0=0xef;
         zdjs++;
           }
del(yj)
    {
      uchar yj2=2;
       while(yj!=0)
         {      
               while(yj2!=0)
                  {
                     yj2--;
                     }
                  yj2=2;
             yj--;  
       }
   
     }

⌨️ 快捷键说明

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