【STC单片机学习】第十一课:蜂鸣器

【朱老师课程总结 侵删】

第一部分、章节目录

1.11.1.蜂鸣器的原理​​                                           

1.11.2.让蜂鸣器响起来

1.11.3.用定时器控制蜂鸣器音调

1.11.4.蜂鸣器发出滴滴声

1.11.5.让蜂鸣器唱歌1

1.11.6.让蜂鸣器唱歌2


第二部分、章节介绍

1.11.1.蜂鸣器的原理
    本节从工作原理、分类上讲解了无源蜂鸣器和有源蜂鸣器2种的发声原理和所需要的控制信号特性,为驱动蜂鸣器做理论积累。
1.11.2.让蜂鸣器响起来
    本节用最简单的代码让蜂鸣器响起来,主要目的是验证上节的理论。
1.11.3.用定时器控制蜂鸣器音调
    本节用定时器定时间来控制蜂鸣器发出不同音调的声音,主要让大家提升编程功底的同时,理解定时时间、蜂鸣器音调等几个因素之间的关联性。
1.11.4.蜂鸣器发出滴滴声
    本节在上节基础上,增加代码实现蜂鸣器发出滴滴声
1.11.5.让蜂鸣器唱歌1
    本节讲解蜂鸣器唱歌的原理,以及乐谱如何转化成为音乐数据。
1.11.6.让蜂鸣器唱歌2
    本节对写好的蜂鸣器唱歌程序进行分析理解,目的是让大家能够读懂这段代码。

 

第三部分、随堂记录

1.11.1.蜂鸣器的原理                                         

1.11.1.1、蜂鸣器简介
(1)分类:无源蜂鸣器和有源蜂鸣器:这里的"源"不是电源,是震荡源
(2)外观和内部结构
无源和有源外观略有差别
查看源图像查看源图像


(3)无源蜂鸣器发声原理

  • 蜂鸣器发声原理是电流通过电磁线圈,使电磁线圈产生磁场来驱动振动膜发声的,因此需要一定的电流才能驱动它
  • 单片机IO引脚输出的电流较小,单片机输出的TTL电平基本上驱动不了蜂鸣器,因此需要增加一个电流放大的电路。三极管的作用为驱动,通过三极管放大驱动电流,从而可以让蜂鸣器发出声音。
  • 电路图如下,如果要驱动无源蜂鸣器需要在三极管的基极(B)上加载不同频率的信号。对IO口进行电平翻转信号,可以做出“多来米发索拉西”多种音调(初中物理:发生体的震动快慢,男女生音调、暖壶)的效果。




(4)电平翻转控制信号,是高低电平相间的方波


(6)音调如何控制?音阶与频率又有确定的对应关系,因此就可以做出来“do re mi fa sol la si”的效果。音调受震动频率控制,就等于控制信号的频率。频率越高音调越高,听起来越刺耳。所以软件可以控制!频率是通过控制定时时间来决定的!
F = 1/T


(7)声音大小(响度)如何控制?由硬件决定的,没法写代码去控制声音大小。

1.11.1.2、有源蜂鸣器

(1)内置震荡电路后形成有源蜂鸣器,发声原理和无源很像,但是只需要在三极管的基极(B)上给高电平就可以了。通过震荡,内部自动形成方波。
(2)当然有源蜂鸣器也可以用频率信号驱动!可以直接当无源用!
(3)无源蜂鸣器的缺陷
     不容易控制,必须控制好频率!而有源蜂鸣器方便程序控制
(4)无源蜂鸣器缺陷
    成本较高!

1.11.2.让蜂鸣器响起来

1.11.2.1、接线确定。P0.0接到J8上面。
1.11.2.2、最简单:使用delay让蜂鸣器响起来,关键是计算声音频率(人耳可听的声音频率范围:20-20000Hz)
关键是调整延时函数!调节delay时间感受音调变化

#include<reg51.h>

/******************接线*******************
			J7(buzzer)-P0.0
******************************************/

sbit Buzzer = P0^0;

//延时函数
//10kHz
void delay100us(void)   //误差 0us
{
    unsigned char a,b;
    for(b=1;b>0;b--)
        for(a=47;a>0;a--);
}
// 20Hz
//void delay50ms(void)   //误差 0us
//{
//    unsigned char a,b;
//    for(b=165;b>0;b--)
//        for(a=150;a>0;a--);
//}

void main(void)
{
	Buzzer = 1;
	while(1)
	{
			Buzzer = !Buzzer;
			delay100us();
	}
}

1.11.3.用定时器控制蜂鸣器音调

1.11.3.1、上节驱动方法的问题
(1)不容易精准控制时间--每次都得新建一个新的delay(),而且别的单片机,可能不能用单片机小精灵!
(2)CPU控制蜂鸣器中不能做其他事

1.11.3.2、定时器控制蜂鸣器响

任务描述:定时器每隔一段时间响一次(10KHz),与此同时,静态数码管从0-F循环显示!

(1)计算定时时间:10KHz => 1/10000s = 100us =>高电平+低电平一共100us,那高电平和低电平的时间都是50us。所以要定的时间就是50us
(2)外部晶振12MHz + 12T设置 => 内部时钟频率1MHz => 1us => 计数值为50
(3)初值为65535-50+1=65486=0xFFCE   则TH0 = 0xFF,TL0 = 0xCE;

#include<reg51.h>

/******************接线*****************************
  本程序实现,在静态数码管显示0-F过程中,蜂鸣器在响!			
            J7(buzzer)-P0.0
			静态数码管-P1
**************************************************/

sbit Buzzer = P0^0;


// 独立数码管的段码表
unsigned char val[16] = 
{
	0xc0, 0xf9, 0xa4, 0xb0, 
	0x99, 0x92, 0x82, 0xf8, 
	0x80, 0x90, 0x88, 0x83,
	0xc6, 0xa1, 0x86, 0x8e
};


//延时函数
void delay()
{
	unsigned char i = 200,j = 100;
	while(i--)
		while(j--);
}

//定时器中断处理程序
void timer0_buzser() interrupt 1 using 1
{
		TH0 = 0xFF;
		TL0 = 0xCE;
		Buzzer = !Buzzer;
	
}

void main(void)
{
	unsigned char i = 0;
	TMOD = 0x01;     //使用16位定时器
	TH0 = 0xFF;				//10KHz
	TL0 = 0xCE;
	ET0 = 1;					
	EA = 1;
	TR0 = 1;
	
	Buzzer = 1;
	while (1)
	{
		//主线任务
		for (i=0; i<16; i++)
		{
			P1 = val[i];
			delay();
		}
	}
}

1.11.3.3、音调改变:现在想要一个特定频率的音调,怎么办呢?

假设想要得到 F(Hz)的频率,对应的周期为T(s),需要计数次数为n,计数初值为N;
则

T = 1/(F*2);
n = T*1000000=500000/F;
N = 65535-n+1;

于是N = 65536-500000/F;

TH0 = N/256;
TL0 = N%256;
//add
#define F_Hz 	1000                 //要定多少Hz,就写多少
#define N 		(65536-50000/F_Hz)	 //设置初值	

//modify
	TH0 = N/256;				
	TL0 = N%256;

1.11.4.蜂鸣器发出滴滴声

首先,大家可能有个疑问,滴滴声,和之前蜂鸣器的声音有什么不同吗?咱们先运行下效果,大家看看差别!

上节课的程序,都是蜂鸣器一直在吱吱的响;滴滴声,就像水滴一样,中间是有停顿的!如何做到?

在t1时间,我们可以定时让蜂鸣器响,在t2时间,我们可以只进行计数count。
程序实现的思路就是

  • 设置一个新的变量count,计数个数和蜂鸣器的频率对应;可以宏定义一个CNT = 1000000/F_Hz
    注意,count用char还能存下吗?
  • 要区分是从有声音到没声音,还是从没声音到有声音!所以要有个标志位flag。
  • 调整不同的频率,听效果!
#include<reg51.h>

/******************接线*******************
				滴滴声
			J7(buzzer)-P0.0
			静态数码管-P1
******************************************/


#define F_Hz 	1000                //要定多少Hz,就写多少
#define N 		(65536-50000/F_Hz)	 //设置初值	
#define CNT 	1000000/F_Hz

sbit Buzzer = P0^0;
unsigned int count = CNT;			 //计数次数
unsigned char flag = 0;				 // flag = 0表示有声音,flag = 1表示没声音


// 独立数码管的段码表
unsigned char val[16] = 
{
	0xc0, 0xf9, 0xa4, 0xb0, 
	0x99, 0x92, 0x82, 0xf8, 
	0x80, 0x90, 0x88, 0x83,
	0xc6, 0xa1, 0x86, 0x8e
};

/*************延时函数*************/
void delay()
{
	unsigned char i = 200,j = 100;
	while(i--)
		while(j--);
}

void timer0_buzser() interrupt 1 using 1
{
	TH0 = N/256;				
	TL0 = N%256;
	if(count-- == 0)
	{
		//说明开始翻转了
		if(flag == 0)
		{
			//从有声音到无声音
			flag = 1;
		}
		else
		{
			//从无声音到有声音
			flag = 0;
			Buzzer = !Buzzer;
		}
			count = CNT;
	}
	else
	{
		//不翻转时
		if(flag == 0)
		{
			Buzzer = !Buzzer;  //响CNT-1次
		}
		else
		{
			//啥也不做
		}
	}

}
void main(void)
{
	unsigned char i = 0;
	TMOD = 0x01;     //使用16位定时器
	TH0 = N/256;				
	TL0 = N%256;
	ET0 = 1;					
	EA = 1;
	TR0 = 1;
	
	Buzzer = 1;
	
	//设置响和不响的周期时间
	count = CNT;
	flag = 0;
	
	while (1)
	{
		//主线任务
		for (i=0; i<16; i++)
		{
			P1 = val[i];
			delay();
		}
	}
}

还可以改,有声音和没声音的长度不一样!只要在蜂鸣器响和只计数这里改一下!比如我们设置,有声音时间是无声音的5倍!


这个地方是什么呢?没错就是PWM,有关PWM的介绍,可以看我的一篇文章!
单片机PWM输出原理与实践
 

1.11.5.让蜂鸣器唱歌1

1.11.5.1、为什么蜂鸣器可以唱歌
(1)发声音调可变(频率)
(2)发声长度可变(节拍)

1.11.5.2、体验写好的唱歌程序

/************************************************************************  
[文件名]  C51音乐程序(八月桂花)  
[功能]    通过单片机演奏音乐  
  
/**********************************************************************/   
#include <REG51.H>    
//#include <INTRINS.H>    
//本例采用89C52, 晶振为11.0592MHZ    
//关于如何编制音乐代码, 其实十分简单,各位可以看以下代码.    
//频率常数即音乐术语中的音调,而节拍常数即音乐术语中的多少拍;    
//所以拿出谱子, 试探编吧!    

sbit Beep =  P0^0 ; 			// 要根据实际的接线来修改
   
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   
};   

 // T0定时控制的是音乐的节拍(某一个音节持续的时间)而不管音调(频率)
 // 音调是直接使用delay做出来的。
void int0()  interrupt 1   //采用中断0 控制节拍    
{  
	TH0 = 0xd8;   
   	TL0 = 0xef;   
   	n--;   
}   
   
void delay (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;  		// timer0 工作在模式1,16位定时器下 
  	TH0 = 0xd8;
	TL0 = 0xef;   		// 这个TH和TL的值合起来定了1个10ms左右的一个时间
  	IE = 0x82;   
play:   
   	while (1)   
    {   
a: 		p = music_tab[i];   
       	if (p == 0x00)   		// 一遍播放完了,延时1s后自动开始下一遍    
		{ 
			i=0, delayms(1000); 
			goto play;
		}     //如果碰到结束符,延时1秒,回到开始再来一遍    
       	else if (p == 0xff)  
		{ 
			i = i + 1;
			delayms(100), TR0 = 0; 
			goto a;
		}  //若碰到休止符,延时100ms,继续取下一音符    
        else         
		{
			m = music_tab[i++], n = music_tab[i++];
		}  // m取频率常数 和 n取节拍常数    
		TR0 = 1;                              //开定时器1    
		while (n != 0)
		{ 
			Beep = ~Beep;
			delay(m);        	//等待节拍完成, 通过P1口输出音频(可多声道哦!)    
       	}
		TR0 = 0;                         	//关定时器1    
    }   
}
  

(1)复制代码过去(八月桂花)
(2)修改控制蜂鸣器的IO引脚定义

1.11.5.3、乐理知识入门(不想学的直接下课好了hhhh)转自:(arduino)详解蜂鸣器演奏音乐并配有LED闪烁实验
从上面代码我们可以看出,如果我们能够控制好频率(定时)和节拍(延时),那就有可能演奏出动听的音乐。因此,我们首先需要搞清楚各音调的频率,具体见下表:


我们知道了音调的频率后,下一步就是控制音符的演奏时间。每个音符都会播放一定的时间,这样才能构成一首优美的曲子,而不是生硬的一个调的把所有的音符一股脑的都播放出来。
音符节奏分为一拍、半拍、1/4拍、1/8拍,我们规定一拍音符的时间为1;半拍为0.5;1/4拍为0.25;1/8拍为0.125……,所以我们可以为每个音符赋予这样的拍子播放出来,音乐就成了。

以欢乐颂为例:怎么看还可以参考这个怎么看乐谱简谱


 

/***********************************************
					song:《欢乐颂》
					
					author: 冯庆巍
					
					引脚:P0.0接蜂鸣器
	**********************************************/
										/*12Mhz晶振工作*/
										
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit voice=P0^0;
uchar code sound[]={0xff,
                    0x26,0x40,0x26,0x40,0x24,0x40,0x20,0x40, //3345
										0x20,0x40,0x24,0x40,0x26,0x40,0x2b,0x40, //5432
										0x30,0x40,0x30,0x40,0x2b,0x40,0x26,0x40, //1123
										0x26,0x40,0x26,0x20,0x2b,0x20,0x2b,0x40, 0x2b,0x40,//3.2_2-
                    0x26,0x40,0x26,0x40,0x24,0x40,0x20,0x40, //3345
										0x20,0x40,0x24,0x40,0x26,0x40,0x2b,0x40, //5432
										0x30,0x40,0x30,0x40,0x2b,0x40,0x26,0x40, //1123
										0x2b,0x40,0x2b,0x20,0x30,0x20,0x30,0x40,0x30,0x40,//2.1_1-
										0xff,0x40,
										0x2b,0x40,0x2b,0x40,0x26,0x40,0x30,0x40, //2231
										0x2b,0x40,0x26,0x20,0x24,0x20,0x26,0x40,0x30,0x40,//23_4_31
										0x2b,0x40,0x26,0x20,0x24,0x20,0x26,0x40,0x2b,0x40,//23_4_32
										0x30,0x40,0x2b,0x40,0x40,0x40,0x26,0x40,//12.53
										0x26,0x40,0x26,0x40,0x24,0x40,0x20,0x40,//3345
										0x20,0x40,0x24,0x40,0x26,0x40,0x24,0x20,0x2b,0x20,//5434_2_
										0x30,0x40,0x30,0x40,0x2b,0x40,0x26,0x40,//1123
										0x2b,0x40,0x2b,0x20,0x30,0x20,0x30,0x40,0x30,0x40,//2.1_1-
										0x00,
                   };
uchar zdjs=0, jp;
del(yj);
void main(void)
  {
      uint dpjs=0;
      uchar yj;
      TMOD=0x01,IE=0x82;
      TH0=0xd8, TL0=0xef;
   TR0=1;
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--;  
       }
   
     }
/*                                 冯庆巍编制                    */
/*                            2020年11月19日22时54分43秒                  */ 

1.11.6.让蜂鸣器唱歌2

工具下载:乐谱编辑工具

1.11.6.1、我和我的祖国
《我和我的祖国》简谱教学

/***********************************************
					song:《欢乐颂》
					
					author: 冯庆巍
					
					引脚:P0.0接蜂鸣器
	**********************************************/
										/*12Mhz晶振工作*/
										
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit voice=P0^0;
uchar code sound[]={0xff,
										0x18,0x40,0x15,0x40,0x13,0x40,0x15,0x40,0x18,0x40,0x1c,0x40,//1+2+3+2+1+6 
										0x19,0x40,0x1c,0x40,0x26,0x40,0x20,0x40,0x20,0x20,0x20,0x40,0x20,0x20,//7635.5.
										0x18,0x40,0x15,0x40,0x13,0x40,0x15,0x40,0x18,0x40,0x1c,0x40,//1.2.3.2.1.6
	                  0x19,0x40,0x20,0x40,0x20,0x20,0x26,0x20,0x1c,0x40,0x1c,0x20,0x1c,0x40,0x1c,0x20,//75.36.6.
                    0x20,0x40,0x24,0x40,0x26,0x40,0x2b,0x40,0x2b,0x40,0x2b,0x40,//5432.
										0x33,0x40,0x39,0x40,0x40,0x40,0x26,0x40,0x26,0x40,0x26,0x40,//7-6-5-3.
                    0x24,0x40,0x26,0x20,0x2b,0x40,0x30,0x20,//43_21_
										0x30,0x40,0x26,0x40,0x26,0x40,0x40,0x40,0x26,0x40,0x26,0x40,//1335-33
										0x30,0x40,0x26,0x40,0x26,0x40,0x40,0x40,0x26,0x40,0x26,0x40,//1335-33	
										0x20,0x40,0x1c,0x40,0x20,0x40,0x24,0x40,0x26,0x40,0x2b,0x40,//565432   
										0x30,0x40,0x30,0x20,0x40,0x40,0x40,0x20,//1115-5-5-
										0x30,0x40,0x26,0x40,0x18,0x40,0x19,0x40,0x1c,0x40,0x26,0x40,//131+763
										0x20,0x40,0x20,0x20,0x20,0x40,0x20,0x20,//555555
                    0x1c,0x40,0x19,0x40,0x1c,0x40,0x20,0x40,0x24,0x40,0x26,0x40,//676543
										0x2b,0x40,0x2b,0x40,0x2b,0x40,0x39,0x40,0x39,0x40,0x39,0x40,//222.6.6.6
										0x33,0x40,0x39,0x40,0x40,0x40,0x20,0x40,0x30,0x40,0x2b,0x40,//.7.6.5512
                    0x26,0x40,0x26,0x40,0x26,0x40,0x26,0x40,0x26,0x40,0x26,0x40,//333333
                    0x20,0x40,0x1c,0x40,0x20,0x40,0x24,0x40,0x26,0x40,0x2b,0x40,//565432
                    0x30,0x40,0x30,0x40,0x30,0x40,0x40,0x40,0x40,0x40,0x40,0x40,//111.5.5.5
                    0x30,0x40,0x26,0x40,0x18,0x40,0x19,0x40,0x15,0x40,0x15,0x20,0x18,0x20,//131.72.-1._
                    0x1c,0x40,0x1c,0x40,0x1c,0x40,0x1c,0x40,0x1c,0x40,0x1c,0x40,//666666
                    0x18,0x40,0x19,0x40,0x1c,0x40,0x20,0x40,0x20,0x40,0x20,0x40,//.176555
										0x1c,0x40,0x20,0x40,0x24,0x40,0x26,0x40,0x26,0x40,0x26,0x40,//654333
										0x33,0x40,0x33,0x40,0x39,0x40,0x40,0x40,0x40,0x40,0x55,0x40,//.7.6_.52_
										0x30,0x40,0x30,0x40,0x30,0x40,0x30,0x40,0x30,0x40,0x30,0x40,//111111
										0x18,0x40,0x15,0x40,0x13,0x40,0x15,0x40,0x18,0x40,0x1c,0x40,//1+2+3+2+1+6 
										0x19,0x40,0x1c,0x40,0x26,0x40,0x20,0x40,0x20,0x20,0x20,0x40,0x20,0x20,//7635.5.
										0x18,0x40,0x15,0x40,0x13,0x40,0x15,0x40,0x18,0x40,0x1c,0x40,//1.2.3.2.1.6
	                  0x19,0x40,0x20,0x40,0x20,0x20,0x26,0x20,0x1c,0x40,0x1c,0x20,0x1c,0x40,0x1c,0x20,//75.36.6.
                    0x20,0x40,0x24,0x40,0x26,0x40,0x2b,0x40,0x2b,0x40,0x2b,0x40,//5432.
										0x33,0x40,0x39,0x40,0x40,0x40,0x26,0x40,0x26,0x40,0x26,0x40,//7-6-5-3.
										0x24,0x40,0x24,0x40,0x24,0x40,0x2b,0x40,0x2b,0x40,0x30,0x40,//4-21_
										0x30,0x40,0x30,0x40,0x30,0x40,0x30,0x40,0x30,0x40,0xff,0x40,//1.10_
										0x00,
                   };
uchar zdjs=0, jp;
del(yj);
void main(void)
  {
      uint dpjs=0;
      uchar yj;
      TMOD=0x01,IE=0x82;
      TH0=0xd8, TL0=0xef;
   TR0=1;
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--;  
       }
   
     }
/*                                 冯庆巍编制                    */
/*                            2020年11月19日22时54分43秒                  */ 


1.11.6.2、天空之城(部分)

 

/***********************************************
					song:《天空之城-久石让》
					
					author: 冯庆巍
					
					引脚:P0.0接蜂鸣器
	**********************************************/
										/*12Mhz晶振工作*/
										

#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit voice=P0^0;
uchar code sound[]={0xff,
										0xff,0x40,0xff,0x40,0xff,0x40,0x1c,0x20,0x19,0x20, //0006_7_
										0x18,0x40,0x18,0x20,0x19,0x20,0x18,0x40,0x13,0x40,//.1-7_.1.3
										0x19,0x40,0x19,0x40,0x19,0x40,0x26,0x40,//7773
										0x1c,0x40,0x1c,0x20,0x20,0x20,0x1c,0x40,0x18,0x40,//6-5_6.1
										0x20,0x40,0x20,0x40,0x20,0x40,0x26,0x20,0x26,0x20,//5553_3_
										0x24,0x40,0x24,0x20,0x26,0x20,0x24,0x20,0x18,0x40,0x18,0x20,//4-3_4_.1-
										0x26,0x40,0x26,0x40,0xff,0x20,0x18,0x20,0x18,0x20,0x18,0x20,//330_.1_.1_.1_
										0x19,0x40,0x19,0x20,0x20,0x20,0x20,0x40,0x19,0x40,//7-5_57
										0x19,0x40,0x19,0x40,0x19,0x40,0x1c,0x20,0x19,0x20,//7776_7_
                    0x18,0x40,0x18,0x20,0x19,0x20,0x18,0x40,0x13,0x40,//.1-7_.1.3
										0x19,0x40,0x19,0x40,0x19,0x40,0x26,0x40,//7773
                    0x1c,0x40,0x1c,0x20,0x20,0x20,0x1c,0x40,0x18,0x40,//6.5_6.1
                    0x20,0x40,0x20,0x40,0x20,0x40,0x26,0x20,0x26,0x20,//5553_3_
                    0x24,0x40,0x18,0x20,0x19,0x40,0x19,0x20,0x18,0x40,//4.1_7-.1
                    0x15,0x40,0x13,0x20,0x18,0x20,0x18,0x40,0x18,0x40,//.2.3_.1_.1.1
                    0x18,0x20,0x19,0x20,0x1c,0x40,0x19,0x40,0x1c,0x40,//.1_7_676
                    0x1c,0x40,0x1c,0x40,0x1c,0x40,0x18,0x20,0x15,0x20,//666.1_.2_
                    0x13,0x40,0x13,0x20,0x15,0x20,0x13,0x40,0x10,0x40,//.3-.2_.3.5
										0x00,  //0000
	
                   };
uchar zdjs=0, jp;
del(yj);
void main(void)
  {
      uint dpjs=0;
      uchar yj;
      TMOD=0x01,IE=0x82;
      TH0=0xd8, TL0=0xef;
   TR0=1;
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--;  
       }
   
     }
/*                                 冯庆巍编制                    */
/*                            2020年11月20日20时03分43秒                  */ 



1.11.6.3、黑人抬棺

/***********************************************
					song:《黑人抬棺BGM》
					
					author: 冯庆巍
					
					引脚:P0.0接蜂鸣器
	**********************************************/
										/*12Mhz晶振工作*/
										

#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit voice=P0^0;
uchar code sound[]={0xff,
                      0x24,0x20,0x24,0x20,0x24,0x20,0x24,0x20,       //4444
	                  0x1c,0x20,0x1c,0x20,0x1c,0x20,0x1c,0x20,       //6666
	                  0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,       //5555
	                  0x18,0x20,0x18,0x20,0x18,0x20,0x18,0x20,       //1.1.1.1.
	                  0x15,0x20,0x15,0x20,0x15,0x20,0x15,0x20,       //2.2.2.2.
	                  0x15,0x20,0x15,0x20,0x15,0x20,0x15,0x20,       //2.2.2.2.
	                  0x20,0x20,0x24,0x20,0x26,0x20,0x30,0x20,       //5431
                      0x2b,0x20,0xff,0x20,0x2b,0x20,0x1c,0x20,       //2026
	                  0x20,0x20,0xff,0x20,0x24,0x20,0xff,0x20,       //5040
	                  0x26,0x20,0xff,0x20,0x26,0x20,0x26,0x20,       //3033
	                  0x20,0x20,0xff,0x20,0x24,0x20,0x26,0x20,       //5043
	                  0x2b,0x20,0xff,0x20,0x2b,0x20,0x12,0x20,       //2024.
	                  0x13,0x20,0x12,0x20,0x13,0x20,0x12,0x20,       //3.4.3.4.
	                  0x2b,0x20,0xff,0x20,0x2b,0x20,0x12,0x20,       //2024.
                      0x13,0x20,0x12,0x20,0x13,0x20,0x12,0x20,       //3.4.3.4.
	                  0x2b,0x20,0xff,0x20,0x2b,0x20,0x1c,0x20,       //2026
	                  0x20,0x20,0xff,0x20,0x24,0x20,0xff,0x20,       //5040
	                  0x26,0x20,0xff,0x20,0x26,0x20,0x26,0x20,       //3033
	                  0x20,0x20,0xff,0x20,0x24,0x20,0x26,0x20,       //5043
	                  0x2b,0x20,0xff,0x20,0x2b,0x20,0x12,0x20,       //2024.
	                  0x13,0x20,0x12,0x20,0x13,0x20,0x12,0x20,       //3.4.3.4.
					  0x2b,0x20,0xff,0x20,0x2b,0x20,0x12,0x20,       //2024.
					  0x13,0x20,0x12,0x20,0x13,0x20,0x12,0x20,       //3.4.3.4.
					  0x48,0x20,0x48,0x20,0x48,0x20,0x48,0x20,       //4444
					  0x1c,0x20,0x1c,0x20,0x1c,0x20,0x1c,0x20,       //6666
					  0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,       //5555
					  0x18,0x20,0x18,0x20,0x18,0x20,0x18,0x20,       //1.1.1.1.
					  0x15,0x20,0x15,0x20,0x15,0x20,0x15,0x20,       //2.2.2.2.
					  0x15,0x20,0x15,0x20,0x15,0x20,0x15,0x20,       //2.2.2.2.
					  0x20,0x20,0x24,0x20,0x26,0x20,0x30,0x20,       //5431
					  0x2b,0x20,0xff,0x20,0x2b,0x20,0x1c,0x20,       //2026
	                  0x20,0x20,0xff,0x20,0x24,0x20,0xff,0x20,       //5040
					  0x26,0x20,0xff,0x20,0x26,0x20,0x26,0x20,       //3033
	                  0x20,0x20,0xff,0x20,0x24,0x20,0x26,0x20,       //5043
					  0x2b,0x20,0xff,0x20,0x2b,0x20,0x12,0x20,       //2024.
                      0x13,0x20,0x12,0x20,0x13,0x20,0x12,0x20,       //3.4.3.4.
					  0x2b,0x20,0xff,0x20,0x2b,0x20,0x12,0x20,       //2024.
                      0x13,0x20,0x12,0x20,0x13,0x20,0x12,0x20,       //3.4.3.4.
					  0x2b,0x20,0xff,0x20,0x2b,0x20,0x1c,0x20,       //2026
	                  0x20,0x20,0xff,0x20,0x24,0x20,0xff,0x20,       //5040
					  0x26,0x20,0xff,0x20,0x26,0x20,0x26,0x20,       //3033
	                  0x20,0x20,0xff,0x20,0x24,0x20,0x26,0x20,       //5043
					  0x2b,0x20,0xff,0x20,0x2b,0x20,0x12,0x20,       //2024.
                      0x13,0x20,0x12,0x20,0x13,0x20,0x12,0x20,       //3.4.3.4.
					  0x2b,0x20,0xff,0x20,0x2b,0x20,0x12,0x20,       //2024.
                      0x13,0x20,0x12,0x20,0x13,0x20,0x12,0x20,       //3.4.3.4.
					  0x2b,0x20,0xff,0x20,0x2b,0x20,0x1c,0x20,       //2026
	                  0x20,0x20,0xff,0x20,0x24,0x20,0xff,0x20,     	 //5040
					  0x26,0x20,0xff,0x20,0x26,0x20,0x26,0x20,       //3033
	                  0x20,0x20,0xff,0x20,0x24,0x20,0x26,0x20,       //5043
					  0x2b,0x20,0xff,0x20,0x2b,0x20,0x12,0x20,       //2024.
                      0x13,0x20,0x12,0x20,0x13,0x20,0x12,0x20,       //3.4.3.4.
					  0x2b,0x20,0xff,0x20,0x2b,0x20,0x12,0x20,       //2024.
                      0x13,0x20,0x12,0x20,0x13,0x20,0x12,0x20,       //3.4.3.4.
					  0xff,0x20,0xff,0x20,0xff,0x20,0xff,0x20,
					  0x00,  //0000
	
                   };
uchar zdjs=0, jp;
del(yj);
void main(void)
  {
      uint dpjs=0;
      uchar yj;
      TMOD=0x01,IE=0x82;
      TH0=0xd8, TL0=0xef;
   TR0=1;
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--;  
       }
   
     }
/*                                 冯庆巍编制                    */
/*                            2020年11月19日22时54分43秒                  */ 


本节课结束!

猜你喜欢

转载自blog.csdn.net/qq_27148893/article/details/109719101