资讯详情

一个利用51单片机播放音乐的程序

见b站演示视频https://www.bilibili.com/video/BV1m44y1A7xr/

/************************************************************************ [文件名] C51音乐程序(春节序曲) [功能] 单片机演奏音乐 [实现原理] (1)音乐主要由音符和时值(节拍)组成,这两部分可以转换为数字参数。 (2)每个音符对应一个振动频率,蜂鸣器将相应的振动频率输入无源蜂鸣器 声音对应的音符(如C大调) do 震动频率为261.6Hz,然后向蜂鸣器输入261.6Hz信号) (3)时值控制更简单,每个音符振动的持续时间可以用定时器控制 (4)由此可见,实际上,音符和时值的控制可以转化为单片机的计时器控制,那么如何获得计时器呢? 答案是用延迟函数获得音符的振动频率,用定时器获得时值。 答案是用延迟函数获得音符的振动频率,用定时器获得时值。 由于时值所需的计时跨度比震动长得多,因此可以考虑采用延时函数得到音符的震动频率,用定时器得到音符的时值。 如果反过来使用,音符频率的快速振动会导致定时器频繁中断,对主程序中的延迟函数影响很大,则时间值不准确。 (5)因此,编谱实际上是一个包含延迟函数参数和定时器参数的数组,分别对应于音符和时值。 本例由一位数组编写,规则为音符、时值、音符、时值 ...循环往复。另外,为了方便谱写,增加谱写 本例还使用宏定义将每个音符对应的延迟函数参数定义为可读性 do re mi fa so等符号,将时值(节拍)对应的 定时器参数定义成全音符、二分音符、四分音符 ..。 /**********************************************************************/    #include <REG52.H>  #include <INTRINS.H>  本例采用89C52, 晶振为12MHZ   sbit Beep =  P1^5;  ///蜂鸣器管脚 unsigned int n=0;  //n取值范围为0~65535 /***************D大调音阶宏定义 ,0代表低音,1代表高音**********************************/ /***********每个音符对应几个i(当延迟时间=8i 6 us时间),百度每个音符的具体频率是多少?*********/           /* Do Do# Re Re# Mi Fa Fa# So So# La La# Si 低音频率(8us) 850 802 757 714 674 636 601 567 535 505 476 450 中音频率(8us) 424 401 378 357 337 318 300 283 267 252 238 224 高音频率(8us) 212 200 189 178 168 159 150 141 133 126 119 112 */  #define Do0 850 //do专用指令改为大写D #define Do 424 #define Do1 212 #define Do11 106  #define re0 575 #define re 378 #define re1 189 #define re11 94  #define mi0 674 #define mi 337
#define mi1 168

#define fa0 636
#define fa 318
#define fa1 159

#define so0 567
#define so 283
#define so1 141

#define la0 505
#define la 252
#define la1 126

#define si0 450
#define si 224
#define si1 112 

#define B8XZ 0xff //八休止符,本例中只用到八分休止
#define STP 0x00 //结束符


/*********G大调音阶宏定义,GDo为G调的Do,********************************/
/* Do Do# Re Re# Mi Fa Fa# So So# La La# Si 低音频率(8us) 637 601 567 536 505 477 450 425 401 378 357 337 中音频率(8us) 318 300 283 267 252 238 225 212 200 189 178 168 高音频率(8us) 159 150 141 133 126 119 112 106 100 94 89 84 */
#define GDo0 637
#define GDo 318
#define GDo1 159
#define GDo11 79

#define Gre0 567
#define Gre 283
#define Gre1 141
#define Gre11 70

#define Gmi0 505
#define Gmi 252
#define Gmi1 126

#define Gfa0 477
#define Gfa 238
#define Gfa1 119

#define Gso0 425
#define Gso 212
#define Gso1 106

#define Gla0 378
#define Gla 189
#define Gla1 94

#define Gsi0 337
#define Gsi 168
#define Gsi1 84


/***快板下,音符时值宏定义,快板455ms一拍,定时器0每10ms一 次,定时器0函数中n为1时为10ms,本例中B为快板*/

#define B0 182 //B0全音符 多少个m 
#define B0D 273 //D意思为附点音符

#define B2 91 //二分音符
#define B2D 137

#define B4 46 //四分音符
#define B4D 68

#define B8 23 //八分音符
#define B8D 34

#define B16 11 //十六分音符
#define B16D 17

#define B32 6 // 本例中,定单倚音的时值为主音的1/4,则主音实际时值为原来的1/2再附点
#define B32D 9 //其余特殊节奏型暂未定义

#define B8SYY 2 //8分音符的三倚音时值


/*中板下,音符时值宏定义,中板682ms一拍,定时器0每10ms一 次,定时器0函数中n为1时为10ms,本例中,ZB为中板*/
#define ZB0 273 //B0全音符
#define ZB0D 409 //D为 附点音符

#define ZB2 136
#define ZB2D 205

#define ZB4 68
#define ZB4D 102

#define ZB8 34
#define ZB8D 51

#define ZB16 17
#define ZB16D 26

#define ZB32 9// 本例中,定单倚音的时值为主音的1/4,则主音实际时值为原来的1/2再附点
#define ZB32D 13 //其余特殊节奏型暂未定义

#define ZB8SYY 2 //8分音符的三倚音时值 


/*谱子的数组,谱子可以百度,时间太长了,已经忘记下面的排版是每行一小节还是什么了, 不过元素的排列顺序为音符参数, 时值参数,音符参数, 时值参数......*/
    
unsigned int code music_tab[] ={ 
          
mi1,B8,mi1,B16,re1,B16,Do1,B4,mi1,B8,mi1,B16,re1,B16,
Do1,B4,mi1,B8,mi,B16,re1,B16,Do1,B8,so,B8,mi,B8,la,B8,
so,B8D,la,B16,so,B8,la,B8,so,B8D,la,B16,so,B8,la,B8,
so,B8,la,B8,so,B8,la,B8,so,B8,la,B8,so,B8,la,B8,
so,B16,la,B16,si,B16,la,B16,so,B16,la,B16,si,B16,la,B16,so,B16,la,B16,si,B16,la,B16,so,B16,la,B16,si,B16,la,B16,
so,B4,so,B4,so,B2,
so,B8,so,B16,la,B16,so,B8,so,B16,la,B16,
Do1,B8,Do1,B16,la,B16,Do1,B8,Do1,B16,re1,B16,
mi1,B8,mi1,B16,re1,B16,mi1,B8,mi1,B16,re1,B16,
mi1,B8,mi1,B16,re1,B16,Do1,B8,Do1,B16,la,B16,
so,B8,so,B16,la,B16,so,B8,so,B16,la,B16,
Do1,B8,Do1,B16,la,B16,Do1,B8,Do1,B16,re1,B16,
mi1,B8,mi1,B16,re1,B16,mi1,B8,mi1,B16,re1,B16,
mi1,B8,mi1,B16,re1,B16,Do1,B8,Do1,B16,la,B16,
so,B8,so,B16,la,B16,Do1,B8,Do1,B16,re,B16,
mi1,B8,mi1,B16,re,B16,Do1,B4,Do1,B4,mi,B4,Do1,B4,mi,B4,
Do1,B8D,la,B16,Do1,B8,la,B8,so,B8,Do1,B8,la,B8,so,B8,mi,B8,so,B8,re,B8,mi,B8,so,B8,la,B8,mi,B8,mi,B16,re,B16,Do,B4,mi1,B8,mi1,B16,re1,B16,Do1,B0,

Do1,B8D,mi1,B16,re1,B8,mi1,B8,so,B4D,Do1,B8,la,B8,so,B16,mi,B8,re,B16,mi,B16,so,B2,Do1,B8D,mi1,B16,re1,B8,mi1,B8,so,B4D,Do,B8,la,B8,so,B8,mi,B8,re,B8,Do,B2,  
Do1,B8D,mi1,B16,re1,B8,mi1,B8,so,B4D,Do1,B8,la,B8,so,B16,mi,B8,re,B16,mi,B16,so,B2,Do1,B8D,mi1,B16,re1,B8,mi1,B8,so,B4D,Do,B8,la,B8,so,B8,mi,B8,re,B8,Do,B2,  

la,B8,la,B8,so,B8,mi,B4,  
      la,B8,so,B8,mi,B4,
      la,B8,so,B8,mi,B4,
      la,B8,so,B8,la,B8,
so,B8,la,B8,so,B8,la,B8,
so1,B8,la1,B8,so1,B8,la1,B8,
so1,B8,la1,B8,so1,B8,la1,B8,
so1,B4,so1,B4,so1,B2D,            // 前半部分结束,

//到转G调处
0xff,0xff,0xff,
Gmi,ZB8,Gre,ZB4,Gmi,ZB8,Gso,ZB8,Gso,ZB4,Gla,ZB8,
GDo1,ZB4,Gla,ZB8,Gmi1,ZB8,GDo1,ZB2,
Gmi1,ZB8,Gsi,ZB4,Gla,ZB8,Gso,ZB8,Gmi,ZB4,Gso,ZB8,
Gla,ZB8D,Gso,ZB16,Gla,ZB4,Gso,ZB2,
Gso,ZB8D,Gla,ZB16,GDo1,ZB4,Gla,ZB8,GDo1,ZB4,Gre1,ZB8,  

GDo1,ZB4,Gla,ZB8,Gso,ZB8,Gmi,ZB2,
Gso,ZB8D,Gla,ZB16,GDo1,ZB4,Gre1,ZB8,GDo1,ZB4,Gsi,ZB8,
Gla,ZB8D,Gso,ZB16,Gla,ZB4,Gso,ZB2,
Gmi0,ZB8,Gre0,ZB4,Gmi0,ZB8,Gso0,ZB8,Gso0,ZB4,Gla0,ZB8,
GDo,ZB4,Gla0,ZB8,Gmi,ZB8,GDo,ZB2,  
			
Gmi,ZB8,Gsi0,ZB4,Gso0,ZB8,Gso0,ZB8,Gmi0,ZB4,Gso0,ZB8,
Gla0,ZB8D,Gso0,ZB16,Gla0,ZB4,Gso0,ZB2,
Gso0,ZB8D,Gla0,ZB16,GDo,ZB4,Gla0,ZB8,GDo,ZB4,Gre,ZB8,
GDo,ZB4,Gla0,ZB8,Gso0,ZB8,Gmi0,ZB2,
Gso0,ZB8D,Gla0,ZB16,GDo,ZB4,Gre,ZB8,GDo,ZB4,Gsi0,ZB8,  

Gla0,ZB8D,Gso0,ZB16,Gla0,ZB8,GDo,ZB8,Gso0,ZB2,
Gmi1,ZB8D,Gso1,ZB16,Gre1,ZB8,Gmi1,ZB8,Gso1,ZB2,
Gso1,ZB8D,Gla1,ZB16,GDo11,ZB4,Gre11,ZB8,GDo11,ZB4,Gsi1,ZB8,
Gla1,ZB8D,Gso1,ZB16,Gla1,ZB8,GDo11,ZB8,Gso1,ZB4D,GDo11,ZB8,
Gla1,ZB8,Gso1,ZB8,Gla1,ZB8,GDo11,ZB8,Gso1,ZB4D,Gla1,ZB8,    
Gso1,ZB4D,Gla1,ZB8,Gso1,ZB4D,Gsi1,ZB8,
Gla1,ZB8D,Gso1,ZB16,Gla1,ZB8,GDo11,ZB8,Gso1,ZB2,
Gmi1,ZB8,Gre1,ZB4,Gmi1,ZB8,Gso1,ZB8,Gmi1,ZB4,Gla1,ZB8,
GDo1,ZB4,Gla1,ZB8,Gmi1,ZB8,GDo1,ZB2,
Gmi1,ZB8,Gsi1,ZB4,Gla1,ZB8,Gso1,ZB8,Gmi1,ZB4,Gso1,ZB8,  

Gla1,ZB4,Gso1,ZB8,Gla1,ZB2,Gso1,ZB0, 

//中间部分结束,转回D大调,快板
so1,B4D,la1,B16,Do11,B4,la1,B8,Do11,B4,re11,B8,
Do11,B4,la1,B8,so1,B8,mi1,B2,
so1,B8D,la1,B16,Do11,B4,re11,B8,Do11,B4,si1,B8,
la1,B8D,so1,B16,la1,B4,so1,B2, 

la1,B8D,so1,B16,la1,B8,la1,B8,so1,B2,
re,B8D,mi,B16,re,B16,mi,B16,re,B16,mi,B16,/**/fa,B8D,so,B16,fa,B16,so,B16,fa,B16,so,B16,/**/fa,B8D,so,B16,fa,B16,so,B16,fa,B16,so,B16,
mi1,B8,mi1,B16,re1,B16,Do1,B4,/**/mi1,B8,mi1,B16,re1,B16,Do1,B4,/**/mi1,B8,mi1,B16,re1,B16,Do1,B8,so,B8,//

//重复开头
so,B8D,la,B16,so,B8,la,B8,so,B8D,la,B16,so,B8,la,B8,/**/so,B8,la,B16,so,B8,la,B16,so,B8,la,B16,so,B8,la,B16,/**/so,B16,la,B16,si,B16,la,B16,so,B16,la,B16,si,B16,la,B16,so,B16,la,B16,si,B16,la,B16,so,B16,la,B16,si,B16,la,B16,//
so,B4,so,B4,so,B2,
so,B8,so,B16,la,B16,so,B8,so,B16,la,B16,
Do1,B8,Do1,B16,la,B16,Do1,B8,Do1,B16,re1,B16,
mi1,B8,mi1,B16,re1,B16,mi1,B8,mi1,B16,re1,B16,
mi1,B8,mi1,B16,re1,B16,Do1,B8,Do1,B16,la,B16,
so,B8,so,B16,la,B16,so,B8,so 

标签: zb2188板型电阻

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台