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

news/2025/2/12 8:06:42/

【朱老师课程总结 侵删】

第一部分、章节目录

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;				//10KHzTL0 = 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)	 //设置初值	//modifyTH0 = 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_Hzsbit 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, //33450x20,0x40,0x24,0x40,0x26,0x40,0x2b,0x40, //54320x30,0x40,0x30,0x40,0x2b,0x40,0x26,0x40, //11230x26,0x40,0x26,0x20,0x2b,0x20,0x2b,0x40, 0x2b,0x40,//3.2_2-0x26,0x40,0x26,0x40,0x24,0x40,0x20,0x40, //33450x20,0x40,0x24,0x40,0x26,0x40,0x2b,0x40, //54320x30,0x40,0x30,0x40,0x2b,0x40,0x26,0x40, //11230x2b,0x40,0x2b,0x20,0x30,0x20,0x30,0x40,0x30,0x40,//2.1_1-0xff,0x40,0x2b,0x40,0x2b,0x40,0x26,0x40,0x30,0x40, //22310x2b,0x40,0x26,0x20,0x24,0x20,0x26,0x40,0x30,0x40,//23_4_310x2b,0x40,0x26,0x20,0x24,0x20,0x26,0x40,0x2b,0x40,//23_4_320x30,0x40,0x2b,0x40,0x40,0x40,0x26,0x40,//12.530x26,0x40,0x26,0x40,0x24,0x40,0x20,0x40,//33450x20,0x40,0x24,0x40,0x26,0x40,0x24,0x20,0x2b,0x20,//5434_2_0x30,0x40,0x30,0x40,0x2b,0x40,0x26,0x40,//11230x2b,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.60x19,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-330x30,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+7630x20,0x40,0x20,0x20,0x20,0x40,0x20,0x20,//5555550x1c,0x40,0x19,0x40,0x1c,0x40,0x20,0x40,0x24,0x40,0x26,0x40,//6765430x2b,0x40,0x2b,0x40,0x2b,0x40,0x39,0x40,0x39,0x40,0x39,0x40,//222.6.6.60x33,0x40,0x39,0x40,0x40,0x40,0x20,0x40,0x30,0x40,0x2b,0x40,//.7.6.55120x26,0x40,0x26,0x40,0x26,0x40,0x26,0x40,0x26,0x40,0x26,0x40,//3333330x20,0x40,0x1c,0x40,0x20,0x40,0x24,0x40,0x26,0x40,0x2b,0x40,//5654320x30,0x40,0x30,0x40,0x30,0x40,0x40,0x40,0x40,0x40,0x40,0x40,//111.5.5.50x30,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,//6666660x18,0x40,0x19,0x40,0x1c,0x40,0x20,0x40,0x20,0x40,0x20,0x40,//.1765550x1c,0x40,0x20,0x40,0x24,0x40,0x26,0x40,0x26,0x40,0x26,0x40,//6543330x33,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,//1111110x18,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.60x19,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.30x19,0x40,0x19,0x40,0x19,0x40,0x26,0x40,//77730x1c,0x40,0x1c,0x20,0x20,0x20,0x1c,0x40,0x18,0x40,//6-5_6.10x20,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_570x19,0x40,0x19,0x40,0x19,0x40,0x1c,0x20,0x19,0x20,//7776_7_0x18,0x40,0x18,0x20,0x19,0x20,0x18,0x40,0x13,0x40,//.1-7_.1.30x19,0x40,0x19,0x40,0x19,0x40,0x26,0x40,//77730x1c,0x40,0x1c,0x20,0x20,0x20,0x1c,0x40,0x18,0x40,//6.5_6.10x20,0x40,0x20,0x40,0x20,0x40,0x26,0x20,0x26,0x20,//5553_3_0x24,0x40,0x18,0x20,0x19,0x40,0x19,0x20,0x18,0x40,//4.1_7-.10x15,0x40,0x13,0x20,0x18,0x20,0x18,0x40,0x18,0x40,//.2.3_.1_.1.10x18,0x20,0x19,0x20,0x1c,0x40,0x19,0x40,0x1c,0x40,//.1_7_6760x1c,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.50x00,  //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,       //44440x1c,0x20,0x1c,0x20,0x1c,0x20,0x1c,0x20,       //66660x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,       //55550x18,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,       //54310x2b,0x20,0xff,0x20,0x2b,0x20,0x1c,0x20,       //20260x20,0x20,0xff,0x20,0x24,0x20,0xff,0x20,       //50400x26,0x20,0xff,0x20,0x26,0x20,0x26,0x20,       //30330x20,0x20,0xff,0x20,0x24,0x20,0x26,0x20,       //50430x2b,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,       //20260x20,0x20,0xff,0x20,0x24,0x20,0xff,0x20,       //50400x26,0x20,0xff,0x20,0x26,0x20,0x26,0x20,       //30330x20,0x20,0xff,0x20,0x24,0x20,0x26,0x20,       //50430x2b,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,       //44440x1c,0x20,0x1c,0x20,0x1c,0x20,0x1c,0x20,       //66660x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,       //55550x18,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,       //54310x2b,0x20,0xff,0x20,0x2b,0x20,0x1c,0x20,       //20260x20,0x20,0xff,0x20,0x24,0x20,0xff,0x20,       //50400x26,0x20,0xff,0x20,0x26,0x20,0x26,0x20,       //30330x20,0x20,0xff,0x20,0x24,0x20,0x26,0x20,       //50430x2b,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,       //20260x20,0x20,0xff,0x20,0x24,0x20,0xff,0x20,       //50400x26,0x20,0xff,0x20,0x26,0x20,0x26,0x20,       //30330x20,0x20,0xff,0x20,0x24,0x20,0x26,0x20,       //50430x2b,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,       //20260x20,0x20,0xff,0x20,0x24,0x20,0xff,0x20,     	 //50400x26,0x20,0xff,0x20,0x26,0x20,0x26,0x20,       //30330x20,0x20,0xff,0x20,0x24,0x20,0x26,0x20,       //50430x2b,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秒                  */ 


本节课结束!


http://www.ppmy.cn/news/880839.html

相关文章

stc89c51单片机音乐盒系统设计_基于单片机的音乐盒设计资料 含PCB与原理图,源程序和报告...

1 选题的背景 本次课设是应用单片机原理和控制理论设计音乐演奏控制器的硬件电路,并利用C语言进行程序设计。通过控制单片机内部的定时器来产生不同频率的方波,驱动喇叭发出不同的音调的音乐,在利用延迟来控制发音时间的长短。把乐谱转化成相应的定时常数就可以从发音设备中…

总务部竞赛部联合培训(硬件)

文章目录 一&#xff0e;按键&#xff08;1&#xff09;按键介绍&#xff08;2&#xff09;上拉输入和下拉输入&#xff08;2&#xff09;上拉输入和下拉输入&#xff08;3&#xff09;按键抖动和消抖硬件消抖&#xff1a;软件消抖&#xff1a; 二&#xff0e;蜂鸣器&#xff0…

10. 从0学ARM-基于Exynos4412的pwm详解

十一、PWM详解 一、什么是PWM PWM&#xff0c;英文名Pulse Width Modulation&#xff0c;是脉冲宽度调制缩写&#xff0c;它是通过对一系列脉冲的宽度进行调制&#xff0c;等效出所需要的波形&#xff08;包含形状以及幅值&#xff09;&#xff0c;对模拟信号电平进行数字编码…

AIRS Opencat机器猫

Nybble程序注意事项 &#xff08;1&#xff09;串口监视器换行问题 程序框图 &#xff08;1&#xff09;WriteInstinct工程框架 主框图 下面是代码块与上述程序流程图中功能对应&#xff1a; writeConst()函数向片上EEPROM写数据&#xff08;a)&#xff08;具体的代码在(a)文…

如何用五千块的电脑弹奏出价值十万钢琴的效果

如何用五千块的电脑弹奏出价值十万钢琴的效果 免责声明&#xff1a;本文所涉及资源包括采样器&#xff0c;音源等仅供个人学习交流&#xff0c;商业用途请自行购买正式版本&#xff0c;否则后果自负&#xff0c;本文概不承担一切责任 五千块的电脑&#xff1f;不用纠结&#…

STC学习:可切换内容的电子音乐

程序设计目标及程序运行效果说明 程序设计目标&#xff1a;通过无源蜂鸣器与按键key1、按键key2两外接模块实现电子音乐的播放、暂停、切换功能。 程序运行效果说明&#xff1a;下载程序后&#xff0c;通过按下key1来进行音乐的播放&#xff0c;通过再次按下key1可以暂停音乐的…

STC学习:可振动感应的电子音乐

程序设计目标及程序运行效果说明 程序设计目标&#xff1a;通过无源蜂鸣器与振动传感器外接模块实现电子音乐的切换功能。 程序运行效果说明&#xff1a;通过振动可以切换正在播放的歌曲。 程序相关电路及原理说明 1.原理说明 本实验板采用的是无源蜂鸣器&#xff0c;无源内部…

STC学习:电子音乐

程序设计目标及程序运行效果说明 程序设计目标&#xff1a;通过无源蜂鸣器模块实现音乐播放。 程序运行效果说明&#xff1a;下载程序后&#xff0c;开始音乐的播放。 程序相关电路及原理说明 1.原理说明 本实验板采用的是无源蜂鸣器&#xff0c;无源内部不带震荡源&#xff0…