51개의 마이크로 컨트롤러를 기반으로 한 뮤직박스 설계(프로테우스 시뮬레이션 + 프로그램 + 회로도 + PCB + 보고서 + 설명 영상)


51 마이크로컨트롤러 뮤직박스 시뮬레이션 설계 기반(프로테우스 시뮬레이션 + 프로그램 + 회로도 + PCB + 보고서 + 설명 영상)

시뮬레이션 다이어그램 Proteus 7.8 이상

프로그램 컴파일러: keil 4/keil 5

프로그래밍 언어: C 언어

디자인 번호: S0030

주요 기능:

본 과목은 마이크로컨트롤러의 원리와 제어이론을 이용하여 음악연주 컨트롤러의 하드웨어 회로를 설계하고, 프로그래밍을 위해 C언어를 사용하도록 구성된다. 마이크로 컨트롤러 내부의 타이머를 제어하여 서로 다른 주파수의 구형파를 생성함으로써 스피커를 구동하여 서로 다른 음색의 음악을 내보내고 지연 시간을 사용하여 발음 시간의 길이를 제어합니다. 악보를 해당 타이밍 상수로 변환하면 사운드 생성 장치에서 즐거운 음악을 재생할 수 있습니다.

2 디자인 지침

2.1 설계 요구사항

(1) I/O 포트를 사용하여 특정 주파수의 구형파를 생성하고 부저를 구동하며 다양한 톤을 방출하여 음악을 재생합니다.

(2) 노래의 연속 재생 또는 단일 루프를 실현할 수 있습니다.

(3) 3곡 이상 저장

2.2 추가 기능

(1) 디지털 튜브를 사용하여 현재 재생 중인 트랙을 표시합니다.

(2) LED 패턴 조명은 연주 음표에 따라 변경됩니다.

(3) 버튼을 눌러 다음 노래로 전환합니다.

다음은 이 설계 정보의 표시 다이어그램입니다.

시뮬레이션

img

시뮬레이션 시작

시뮬레이션을 시작한 후 디지털 튜브를 사용하여 현재 재생 중인 트랙을 표시하고 LED 패턴 조명이 재생 중인 음표에 따라 변경되며 버튼을 눌러 다음 노래를 전환할 수 있습니다. 단일 사이클 또는 전체 사이클을 제어하려면 토글 스위치를 사용하십시오. 내장곡 '천년의 사랑', '외로운 모래톱', '일곱 아들의 노래', '감사하는 마음'

회로도 PCB 다이어그램

img

프로그램 작성:

img

sbit key1=P3^2;  /*暂停键 */
sbit key2=P3^3;  /* 切换歌曲键*/
sbit fm=P1^1;  /*蜂鸣器口*/
sbit P1_7=P1^7;
uchar count2=1; /*歌曲标志*/
uchar timeh,timel,i;

uchar code DSY_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
						0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x70};  
uint code tone_delay_table[]={ 64021,64103,64260,64400,64524,64580,64684,
							64777,64820,64898,64968,65030,65058,65110,65157,65178};/*每个音符对应的延迟*/
uchar code huayang[]={0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x0f,0xf0,0x00};

void delay_ms(uchar x) /*延迟函数*/
{
	uchar i;
	while(x--)
	for(i=0;i<120;i++);
}


uchar code qnzl[]={   /*千年之恋*/
0x12,0x22,0x34,0x84,0x74,0x54,0x38,0x42,0x32,0x22,0x42,0x34,0x84,0x72,0x82,0x94,0xA8,0x08,
0x32,0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62,
0x32,0x31,0x21,0x32,0x82,0x71,0x81,0x71,0x51,0x32,0x22,
0x32,0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62,
0x32,0x31,0x21,0x32,0x83,0x82,0x71,0x72,0x02,
0x63,0xA1,0xA2,0x62,0x92,0x82,0x52,
0x31,0x51,0x63,0x51,0x63,0x51,0x63,0x51,0x62,0x82,0x7C,0x02,
0x61,0x71,0x82,0x71,0x62,0xA2,0x71,0x76,
0x61,0x71,0x82,0x71,0x62,0x52,0x31,0x36,
0x61,0x71,0x82,0x71,0x62,0xA3,0x73,0x62,0x53,
0x42,0x63,0x83,0x83,0x91,0x91,
0x61,0x71,0x82,0x71,0x62,0x0A2,0x71,0x76,
0x61,0x71,0x82,0x71,0x62,0x52,0x31,0x36,
0x61,0x71,0x82,0x71,0x62,0xA3,0x73,0x62,0x53,
0x42,0x82,0x88,0x02,0x74,0x93,0x89,0xff	  /*结束标志*/
};
uchar code jmszl[]={ /*寂寞沙洲冷*/
0x12,0x12,0x22,0x32,0x31,0x22,0x21,0x22,
0x21,0x31,0x51,0x52,0x31,0x52,0x61,0x15,0x14,
0x51,0x52,0x31,0x52,0x62,0x13,0x11,0x13,0x32,0x28,0x08,0x28,
0x31,0x32,0x31,0x32,0x11,0x21,0x51,0x52,0x51,0x52,
0x51,0x51,0x31,0x32,0x31,0x32,0x81,0x72,0x63,
0x62,0x71,0x81,0x72,0x61,0x61,0x52,0x31,0x21,0x32,0x51,0x54,
0x22,0x12,0x11,0x12,0x11,0x12,0x12,0x14,0x26,0x32,0x26,
0x32,0x61,0x51,0x51,0x31,0x31,0x21,0x31,0x51,0x61,0x51,0x31,0x51,
0x02,0x32,0x81,0x81,0x81,0x81,0x62,0x52,0x34,
0x31,0x81,0x81,0x81,0x61,0x91,0x82,
0x51,0x51,0x51,0x51,0x31,0x61,0x53,
0x21,0x11,0x21,0x11,0x22,0x11,0x21,0x26,
0x32,0x61,0x51,0x51,0x31,0x31,0x21,0x31,0x51,0x61,0x51,0x31,0x51,0x52,
0x31,0x31,0x81,0x81,0x81,0x61,0x91,0x81,0x61,0x31,0x56,
0x32,0x32,0x81,0x81,0x81,0x81,0x91,0x81,0x61,0x81,0x61,0x51,0x31,0x51,0x34,
0x21,0x31,0x51,0x31,0x21,0x11,0x61,0x21,0x16,0xff  /*结束标志*/
};
uchar code qizige[]={  /*七子之歌*/
0x54,0x32,0x52,0x32,0x54,0x62,0x52,0x32,0x62,0x54,
0x14,0x12,0x22,0x34,0x52,0x32,0x02,0x32,0x58,
0x52,0x52,0x62,0x52,0x32,0x54,0x52,0x62,0x52,0x82,0x62,0x58,
0x14,0x52,0x32,0x22,0x12,0x24,0x32,0x54,0x2,0x22,0x34,0x1f,0x18,
0x04,0x54,0xa4,0x92,0x81,0x62,0x52,0x54,0x62,0x64,0x52,0x62,0x81,0xa2,0x82,0x9c,
0x02,0x52,0xa4,0x92,0x81,0x62,0x52,0x54,0x62,0x64,0x52,0x64,0xa2,0x92,0x9f,
0xa4,0x92,0x81,0x62,0x52,0x54,0x84,0x62,0x52,0x32,0x22,0x14,
0x04,0x22,0x32,0x58,0x58,0x04,0x52,0x62,0x8f,
0xff /*结束标志*/
};
uchar code ganen[]={ /*感恩的心*/
0x12,0x14,0x22,0x32,0x54,0x32,0x84,0x72,0x62,0x54,
0x02,0x62,0x62,0x52,0x54,0x12,0x22,0x32,0x28,
0x12,0x14,0x22,0x32,0x54,0x32,0x84,0x92,0x82,0x54,
0x32,0x24,0x21,0x61,0x54,0x22,0x32,0x12,0x18,
0x22,0x24,0x12,0x24,0x11,0x21,0x34,0x32,0x21,0x31,0x34,
0x12,0x22,0x22,0x22,0x11,0x21,0x22,0x64,0x52,0x52,0x32,0x38,
0x31,0x52,0x51,0x52,0x31,0x51,0x58,0x31,0x82,0x81,0x82,0x31,0x61,0x68,
0x62,0x62,0x62,0x51,0x61,0x64,0x61,0x82,0x61,0x9c,
0x52,0xa4,0x92,0xa4,0x32,0x84,0x72,0x64,0x62,0x94,0x82,0x94,
0x61,0x81,0x92,0x91,0x91,0x92,0x81,0xa1,0xa2,0x92,0x94,
0x52,0xa4,0x92,0xa4,0x32,0x84,0x72,0x64,
0x52,0x62,0x81,0x81,0x82,0x92,0xa2,0x94,0x82,0x72,0x82,0x88,
0xff  /*结束标志*/
};
/*简谱音调对应的定时器初值*/
/*适合11.0592M的晶振*/
uchar code cuzhi[]={
					0xff,0xff,  /*占位*/
					0xFC,0x8E,  /*中央C调1~7*/
					0xFC,0xED,
					0xFD,0x43,
					0xFD,0x6A,
					0xFD,0xB3,
					0xFD,0xF3,
					0xFE,0x2D,
					0xFE,0x47,  /*高八度1~7*/
					0xFE,0x76,
					0xFE,0xA1,
					0xFE,0xC7,
					0xFE,0xD9,
					0xFE,0xF9,
					0xFF,0x16
					};
void delay1(uint z); /*	 延时1MS*/
void delay(uint z);  /*延时165ms,既16分音符*/
void song();
void beep(); /*蜂鸣器叫一声*/
void main()
{
	P0=0xbf;
//	KK=0;

	EA=1;
	EX0=1;
	IT0=1;
	EX1=1;
	IT1=1;
	TMOD=0x01;
	TH0=0;
	TL0=0;
	ET0=1;
	while(1)
	{
	    if(P1_7==1)
		{
			count2++;//歌曲递增
		if(count2==5)
			count2=0;
		}
		if(count2!=0)
		{
			song();
			delay1(1000);
		}
	
	}
}

void int0() interrupt 0 
{
	EA=0;
	delay1(1); 
	if(key1==0)
	{
		count2=0;/*暂停音乐*/
		TR0=0;
	}
	EA=1;
} 

void int1() interrupt 2 
{
	TR0 = 0;	
	delay1(1);  /*去抖*/
	if(key2==0)
	{
		i=0;/*从头开始唱*/
		count2++;
		TR0=~TR0;
		if(count2==5)
		count2=0;
	}
}

void timer0() interrupt 1/*用于产生各种音调*/
{
/*	if(count2==0)	
	{
		TH0 = tone_delay_table[keynum]/256;
		TL0 = tone_delay_table[keynum]%256;
		fm = ~fm;
	}	*/

	
	if(count2!=0) //放音乐
	{
		TH0=timeh;
		TL0=timel;
		fm=~fm;
	}
}

void song()
{
	uint temp;
	uchar jp;
	i=0;
	while(1)
	{

		
		if(count2==0)
		{
			break;
		}
		if(count2==1)  //选曲
		temp=jmszl[i];
		if(count2==2)
		temp=qnzl[i];
		if(count2==3)
		temp=qizige[i];
		if(count2==4)
		temp=ganen[i];
		if(temp==0xff)
		break;
		jp=temp/16;
		P2 = huayang[jp];
		P0=DSY_table[count2];
		if(jp!=0)
		{
			timeh=cuzhi[jp*2];
			timel=cuzhi[jp*2+1];
		}
		else
		{
			TR0=0;
			fm=1;
		}
		delay(temp%16);
		TR0=0;
	
		fm=1;
		delay1(10);
		TR0=1;
		i++;
	}
	TR0=0;
	fm=1;
}

디자인 보고서

보고서

시스템 블록 다이어그램

img

이 디자인은 STC89C516RD+를 메인 제어 칩으로 사용합니다.(시뮬레이션은 STC89C51, STC89C52, AT89C51, AT89C52D 및 기타 51 마이크로컨트롤러로 대체 가능) 버저는 음악을 생성하는 출력 장치로 사용됩니다. 재생 모드는 MOD를 통해 제어할 수 있습니다. 키 디지털 튜브(LED)는 현재 노래 번호를 실시간으로 표시할 수 있습니다. 그 중 P3.3은 외부 버튼과 연결되며, P0 포트는 디지털 튜브 출력 데이터 포트로, P2 포트는 LED 출력 데이터 포트와 P1.1 부저 포트로 사용된다.

프로그램 작성

피치, 템포 및 코딩을 결정하는 방법

일반적으로 마이크로컨트롤러가 연주하는 음악은 기본적으로 단일음 주파수로, 해당 진폭의 고조파 주파수가 포함되어 있지 않아 전자 키보드처럼 다양한 음색을 낼 수 없습니다. 따라서 마이크로 컨트롤러에서 음악을 재생할 때 두 가지 개념만 이해하면 됩니다. 즉, "피치"와 비트는 음표를 부르는 데 걸리는 시간을 나타냅니다.

피치 결정

다양한 음조의 음조는 C, D, E, F, G, A, B로 표시되며 이 7개의 문자는 악보의 이름으로 보통 DO, RE, MI, FA, SO, LA, SI, 즉 단순화된 악보로 부르는 숫자 1, 2, 3, 4, 5, 6, 7은 한자 "두오라이미파솔라시"의 발음과 동일하다. 노래할 때 나오는 음악적인 소리를 'tone', 즉 Tone이라고 합니다. C, D, E, F, G, A, B 음 사이의 거리를 12개의 동일한 부분으로 나누고 각 동일한 부분을 "반음"이라고 합니다. 두 음 사이의 거리가 두 개의 "반음"이며, 이를 "온음"이라고 합니다. 피아노와 같은 건반악기에서는 C-D, D-E, F-G, G-A, A-B 사이에 검은 건반이 있고, 그 사이의 거리가 온음이고, E-F, B-C 두 음 사이에는 검은 건반이 없으며, 그들 사이의 거리는 반음입니다. 일반적으로 1, 2, 3, 4, 5, 6, 7로 부르는 음을 자연음이라고 하고, 왼쪽 상단에 | 또는 b 기호가 있는 것을 변경음이라고 합니다. ﹟를 샤프부호라고 하는데, 이는 원점을 기준으로 소리가 반음 올라간 것을 의미하고, b는 플랫부호라 하여, 원점을 기준으로 소리가 반음 낮아졌다는 것을 의미합니다. 예를 들어 고음 DO(1046Hz)의 주파수는 중음 DO(523Hz)의 정확히 두 배이고, 중음 DO(523Hz)의 주파수는 저음 DO(266Hz)의 정확히 두 배입니다. Treble RE(1175Hz)는 Midrange RE(587Hz)의 주파수의 정확히 2배이고, Midrange RE(587Hz)의 주파수는 Bass RE(294Hz)의 주파수의 정확히 2배입니다.

오디오 펄스를 생성하려면 특정 톤의 주기(1/주파수)를 찾은 다음 이 주기를 반주기 시간인 2로 나누면 됩니다. 타이머를 사용하여 이 반주기 시간을 계산합니다. 타이머가 만료될 때마다 I/O 출력 펄스를 반전합니다. 그런 다음 이 반주기 시간 동안 타이머를 반복한 다음 I/O 단계를 반전합니다. 결과는 다음에서 얻을 수 있습니다. I/O 핀 이 주파수의 펄스. AT89C51의 내부 타이머를 사용하여 카운터 모드 MODE1에서 작동하고 카운트 값 TH0 및 TL0을 변경합니다. 또한, 종료 기호와 나머지 기호는 각각 00H, FFH 코드로 표시할 수 있으며, 테이블 조회 결과가 00H이면 곡이 끝났음을 의미하고, 테이블 조회 결과가 FFH이면 해당 일시정지 효과가 발생한다. 예를 들어, 주파수는 523Hz이고 주기 T=1/523=1912us이므로 카운터가 956us/1us=956을 계산하고 I/O가 956회마다 반전되고 중간 범위 DO(523Hz) 얻어 질 수있는.

비트의 결정

음악을 작곡하려면 음높이만으로는 충분하지 않고, 음악에 멜로디(고정된 리듬)가 있고 각 음표의 속도와 충만도를 조절할 수 있는 비트도 필요합니다. "비트", 즉 비트는 단순히 음악을 들으면서 박수를 치거나 무의식적으로 발을 구르듯이 박자를 치는 것을 의미합니다. 1비트가 실제로 0.5초라면 1/4비트는 0.125초입니다. 박동당 몇 초인지에 대해서는 엄격한 규칙이 없습니다. 인간의 심장 박동과 마찬가지로 대부분의 사람들의 심장 박동은 분당 72박자입니다. 귀에 듣기 좋은 소리라면 어떤 사람의 심장 박동은 더 빠르고 어떤 사람은 느립니다. 일반적으로 비트로 표현되는 사운드 지속 시간의 실시간 값입니다. 쉼표는 발음의 일시 정지를 나타냅니다.

음악은 여러 가지 음으로 구성되며 각 음은 서로 다른 주파수에 대응하므로, 서로 다른 주파수의 조합을 사용하여 비트 수에 해당하는 지연을 추가하여 음악을 구성할 수 있습니다. 음악에 대한 기본 지식을 이해하면 다양한 주파수의 오디오 펄스를 생성하여 음악을 생성할 수 있다는 것을 알 수 있습니다. 마이크로컨트롤러가 서로 다른 주파수의 펄스를 생성하는 것은 매우 편리합니다. 마이크로컨트롤러의 타이머/카운터는 이러한 구형파 주파수 신호를 생성하는 데 사용됩니다. 따라서 음악의 음표와 해당 주파수, 마이크로컨트롤러의 타이밍 카운트 사이의 관계를 명확히 할 필요가 있습니다.

노트 인코딩

do re mi fa so la si는 각각 1~7로 코딩되었고, 악센트 do는 8, 강세 re는 9, 휴지는 0으로 코딩되었다. 재생 길이는 16분음표 단위(본 프로그램에서는 165ms)이며, 1박자는 4분음표로 16분음표 4개에 해당하며 4로 프로그래밍되어 있습니다. 피치는 코드의 상위 4비트로 사용되며, 재생시간은 하위 4비트로 사용되므로 피치와 비트가 코드를 구성합니다. 점수의 끝 표시로 0xff를 사용합니다. 예를 들어, 성조 do는 2박자, 즉 2분음표의 발음 길이를 가지며, 0x18로 인코딩된다.

노래 재생 디자인. 먼저, 노래의 악보를 인코딩하고 이를 unsigned char 데이터 유형의 배열에 저장합니다. 프로그램은 배열에서 숫자를 가져온 다음 상위 4비트를 분리하여 신호음을 얻은 다음 해당 값을 찾아 타이머 0에 할당하여 부저를 정기적으로 작동시켜 해당 신호음을 얻은 다음 낮은 숫자를 분리합니다. 4비트 중 지연 시간을 얻은 다음 소프트웨어 지연을 호출합니다.

주요 프로그램 흐름도

img

물리적 지도

img

정보 목록(정보 목록의 모든 문서 제공):

시뮬레이션 + 코드 + 회로도 PCB + 설계 보고서 + 설명 비디오
img

데이터 다운로드 링크:

추천

출처blog.csdn.net/weixin_52733843/article/details/134588519