51单片机蜂鸣器播放《花海》

这篇博客详细介绍了如何使用C语言编程,在普中开发板上通过蜂鸣器播放乐曲《花海》。通过设置定时器和IO口,控制蜂鸣器频率,实现了音乐的播放。代码中定义了不同音符的频率表和乐谱,通过中断服务程序控制蜂鸣器的开和关,达到音乐播放的效果。
摘要由CSDN通过智能技术生成

普中开发板蜂鸣器《花海》演奏

有的板子的蜂鸣器IO口可能是P2^5

#include <REGX52.H>

void Timer0Init(void)		
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x18;		    //设置定时初值
	TH0 = 0xFC;		    //设置定时初值
	TF0 = 0;		    //清除TF0标志
	TR0 = 1;			//定时器开始计时
	ET0=1;
	EA=1;
	PT0=0;
}

void Delay(unsigned int xms)		//@12.000MHz
{
	unsigned char i, j;
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}

}

sbit Buzzer=P1^5;
#define SPEED 650
#define P    0
#define L1   1
#define L1_  2
#define L2   3
#define L2_  4
#define L3   5
#define L4   6
#define L4_  7
#define L5   8
#define L5_  9
#define L6   10
#define L6_  11
#define L7   12
#define M1   13
#define M1_  14
#define M2   15
#define M2_  16
#define M3   17
#define M4   18
#define M4_  19
#define M5   20
#define M5_  21
#define M6   22
#define M6_  23
#define M7   24
#define H1   25
#define H1_  26
#define H2   27
#define H2_  28
#define H3   29
#define H4   30
#define H4_  31
#define H5   32
#define H5_  33
#define H6   34
#define H6_  35
#define H7   36 
#define G1   37
#define G1_  38
#define G2   39
#define G2_  40
#define G3   41
#define G4   42
#define G4_  43
#define G5   44
#define G5_  45
#define G6   46
#define G6_  47
#define G7   48 
#define E1   49
#define E1_  50
#define E2   51
#define E2_  52
#define E3   53
#define E4   54
#define E4_  55
#define E5   56
#define E5_  57
#define E6   58
#define E6_  59
#define E7   60
unsigned int FreqSelet,MusicSelet;
unsigned int code FreqTable[]=
{
0,61719,61939,62135,62331,62506,62679,62833,62985,63132,63263,63390,63512,
63628,63731,63835,63928,64021,64103,64185,64260,64331,64400,64463,64524,
64580,64633,64684,64732,64777,64820,64860,64898,64934,64968,65000,65030,
65058,65085,65110,65134,65157,65178,65198,65217,65235,65252,65268,65283,
65297,65310,65323,65335,65346,65357,65367,65377,65385,65394,65402,65409
};
unsigned int code Music[]=
{	
	P,4,P,4,G1,2,G2,2,G3,2,G5,1,G5,9,G3,2,G2,2,G1,2,G2,1,G3,9,G1,2,G2,2,G3,2,G7,1,E1,7,
	E1,2,G7,2,E1,1,G7,3,G5,1,G6,3,G5,6,G1,2,G2,2,G3,2,G5,1,G5,9,G3,2,G2,2,G1,2,G2,1,G1,9,
	G1,2,G2,2,G3,2,G5,1,G1,6,G1,2,G1,2,H7,2,H6,2,H7,2,G1,12,G1,1,G3,3,G3,8,G3,2,G2,2,G1,2,
	G2,4,G3,2+4,P,4,G1,1,G3,2+1,G3,4+4,G4,2,G3,2,G5,4,G1,4+4,P,4,G1,1,G4,2+1,G4,4+4,G4,2,G3,2,
	G1,2,H5,2+2,G3,4+2,P,4,G1,1,G3,2+1,G2,4,G1,1,G3,2+1,G2,4,G1,1,G3,2+1,G2,4+4+4,G1,1,G3,3,G3,4+4,
	G3,2,G2,2,G1,2,G2,4,G5,6,P,4,G1,1,G3,3,G3,8,G4,2,G3,2,G5,4,G1,4+4,P,4,G1,1,G3,3,G4,8,G4,2,G3,2,
	G1,2,G5,4,G3,2,E1,8,P,2,G5,2,G4,2,G3,2,G1,2,G1,2,H7,4,G1,10,G1,2,G2,2,G3,2,G5,1,G5,9,G3,2,G2,2,
	G1,2,G2,1,G3,9,	G1,2,G2,2,G3,2,E1,1,E1,7,E1,2,G7,2,G6,1,G5,3,G6,1,G6,3,G5,6,G1,2,G2,2,G3,2,G5,1,	
	G5,9,G3,2,G2,2,G1,2,G2,1,G1,9,G1,2,G2,2,G3,2,G5,2,G5,2,G4,2,G4,2,G3,2,E1,2,G3,2,G3,4,G2,2,P,4,G1,2,
	G2,2,G3,2,G5,1,G5,9,G3,2,G2,2,G1,2,G2,1,G3,9,G1,2,G2,2,G3,2,E1,1,E1,7,E1,2,G7,2,G6,1,G5,3,G6,1,	
	G6,3,G5,6,G1,2,G2,2,G3,2,G5,1,G5,9,G3,2,G2,2,G1,2,G2,1,G1,9,G1,2,G2,2,G3,2,G5,1,G1,9,G1,2,H7,2,	
	H6,2,H7,1,G1,13,G3,12,
	0xFF
};
void main()
{
	Timer0Init();
	while(1)
	{
		if(Music[MusicSelet]!=0xFF)
		{
			FreqSelet=Music[MusicSelet];
			MusicSelet++;
			Delay(SPEED/4*Music[MusicSelet]);	
			MusicSelet++;
			TR0=0;
			Delay(5);
			TR0=1;
		}
		else
		{
			TR0=0;
			while(1);
		}
	}
}

void Timer0_Routine() interrupt 1
{
	if(FreqTable[FreqSelet])
	{
		TL0 = FreqTable[FreqSelet]%256;		
		TH0 = FreqTable[FreqSelet]/256;		
		Buzzer=!Buzzer;
	}
}

这个可以通过控制蜂鸣器的频率和占空比来实现。以下是一个简单的花海音乐程序示例,使用的是51单片机的定时器和蜂鸣器模块: ``` #include <reg51.h> #define uint unsigned int //花海音乐的频率表 const uint freq[8] = {262, 294, 330, 349, 392, 440, 494, 523}; //花海音乐的节拍表 const uint beat[8] = {4, 4, 8, 8, 4, 4, 8, 8}; //定时器1中断服务函数 void timer1_isr() interrupt 3 { static uint i = 0, j = 0; TH1 = 0xFC; //重新赋初值 TL1 = 0x67; if (++j >= beat[i]) { //按照节拍切换音符 j = 0; if (++i >= 8) i = 0; } if (freq[i] != 0) { //发声 P1 = ~P1; //反转蜂鸣器口线 delay(5000 / freq[i]); //延时控制频率 } else { //静音 P1 = 1; delay(5000 / freq[0]); } } //延时函数 void delay(uint t) { uint i, j; for (i = t; i > 0; i--) for (j = 110; j > 0; j--); } //主函数 void main() { TMOD = 0x10; //定时器1工作在模式1 TH1 = 0xFC; //设定初值 TL1 = 0x67; TR1 = 1; //启动定时器1 ET1 = 1; //开定时器1中断 EA = 1; //开总中断 while (1) {} } ``` 在上面的程序中,我们先定义了一个花海音乐的频率表和节拍表,分别对应8个不同的音符和它们的节拍。然后,在定时器1中断服务函数中,我们使用了两个静态变量i和j来记录当前的音符和节拍,每次定时器中断都会根据节拍切换到下一个音符,并且发出对应的频率。如果当前的音符是0,表示静音,则只需要让蜂鸣器保持静止即可。 最后,在主函数中,我们启动了定时器1和中断,并且让程序进入无限循环状态,这样就可以一直播放花海音乐了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值