【自学嵌入式:51单片机】用51单片机+蜂鸣器播放《忘れてやらない》前奏

如题,跟着江科大学了一下,浅浅卖弄一下,让AI分析简谱,得出了一个音符应该是多少ms,一个四分之一拍是多少ms,其他和江科大蜂鸣器那节课的教学内容差不多,程序和开发板电路在后文会提到。

实现效果

具体见https://www.bilibili.com/video/BV17i81znEPh

开发板电路

image
image
image

程序

#include <REGX52.H>
#define SPEED 326

sbit beep = P2^5;

void Delay(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;

	while(xms--)
	{
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
	}
}


unsigned int code FreqTable[]={
	63628,63731,63835,63928,64021,64103,64185,64260,64331,64400,64463,64528,
	64580,64633,64684,64732,64777,64820,64860,64898,64934,64968,65000,65030,
	65058,65085,65110,65134,65157,65178,65198,65217,65235,65252,65268,65283,
	0
};

unsigned char code Music[] = {
	11, 16, 15, 11, 13, 11, 13, 8, 9, 10,
	11, 16, 15, 11, 13, 11, 13, 16, 20,
	11, 16, 15, 11, 13, 11, 13, 8, 9, 10,
	11, 16, 15, 11, 13, 11, 13, 16, 20,
	23, 16, 23, 16, 23, 16, 23, 25,
	23, 16, 23, 16, 23, 20, 18, 16,
	23, 16, 23, 16, 23, 16, 23, 25, 27, 24, 20, 18, 16,
	13, 16, 18, 20, 16, 25, 20, 18, 16,
	20, 23, 25, 28, 25, 32, 30, 28, 33, 32, 33, 35, 32, 30, 28
};

unsigned char code Pai[] = {
	2, 2, 2, 2, 2, 2, 2, 2, 2, 4,
	2, 2, 2, 2, 2, 2, 2, 2, 4,
	2, 2, 2, 2, 2, 2, 2, 2, 2, 4,
	2, 2, 2, 2, 2, 2, 2, 2, 4,
	2, 2, 2, 2, 2, 2, 2, 2,
	2, 2, 2, 2, 2, 2, 2, 2,
	2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4,
	2, 2, 2, 2, 2, 2, 2, 2, 2,
	2, 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 4
};
unsigned char MusicSelect = 0;
unsigned char MusicLen = 91;

unsigned char FreqSelect = 0;

//初始化定时器0
void initTimer0()
{
	TMOD=0x01;
	TL0 = FreqTable[FreqSelect]%256;
	TH0 = FreqTable[FreqSelect]/256;		//设置定时初值
	EA = 1; //允许中断
	ET0 = 1; //允许定时器0中断
	TR0 = 1; //定时器0开始工作
}

void timer0() interrupt 1
{
	if(FreqTable[FreqSelect])
	{
		TL0 = FreqTable[FreqSelect]%256;
		TH0 = FreqTable[FreqSelect]/256;
		if(FreqSelect != 255)
		{
			beep = !beep;
		}
		else
		{
			beep = 1;
		}
	}
}

void main()
{
	initTimer0();
	while(1)
	{
		FreqSelect = Music[MusicSelect];
		Delay(SPEED / 4 * Pai[MusicSelect]);
		MusicSelect++;
		if(MusicSelect < MusicLen)
		{
			//隔断每个音符
			TR0 = 0;
			Delay(20);
			TR0 = 1;
		}
		else
		{
			TR0 = 0;
			Delay(10000);
			MusicSelect=0;
		}
	}
}
posted @ 2025-07-31 20:45  秦瑞迁  阅读(299)  评论(0)    收藏  举报