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) ボタンを押して次の曲に切り替えます。

この設計情報の表示図は次のとおりです。

シミュレーション

画像

シミュレーションを開始する

シミュレーション開始後、デジタル管を使用して現在再生中のトラックを表示し、演奏音に合わせてLEDパターンの点灯が変化し、ボタンを押すことで次の曲に切り替えることができます。トグルスイッチを使用して、シングルサイクルまたはフルサイクルを制御します。内蔵曲「千年の愛」「孤独な砂州」「七人の息子の歌」「グレイトフル・ハート」

PCB の概略図

画像

プログラミング:

画像

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;
}

設計レポート

報告

システムブロック図

画像

この設計は、メイン制御チップとして STC89C516RD+ を使用します (シミュレーションは STC89C51、STC89C52、AT89C51、AT89C52D およびその他の 51 個のマイクロコントローラーで置き換えることができます)。ブザーは音楽を生成する出力デバイスとして使用されます。再生モードは MOD を通じて制御できます。デジタル管 (LED) は、現在の曲番号をリアルタイムで表示できます。このうち、P3.3 は外部ボタンに接続され、P0 ポートはデジタル管出力データポートとして使用され、P2 ポートは LED 出力データポートと P1.1 ブザーポートとして使用されます。

プログラミング

ピッチ、テンポ、コーディングを決定する方法

一般に、マイコンで演奏する音楽は基本的に単音周波数であり、それに対応する振幅の倍音周波数が含まれていないため、電子キーボードのように多彩な音色を奏でることはできません。したがって、マイクロコントローラーで音楽を再生する場合、「ピッチ」と「ビート」という 2 つの概念を理解するだけで済みます。つまり、音符を歌うのにかかる時間を表します。

ピッチの決定

音の高さの違いをC、D、E、F、G、A、Bと表し、この7文字が曲名で、通常はド、レ、ミ、ファ、ソ、の順に歌います。 LA、SI、つまり、簡略記譜で歌われる1、2、3、4、5、6、7という数字は、漢字の「多来ミファソラシ」の発音に相当します。歌うときの楽音のことを「トーン」、つまりトーンと呼びます。 C、D、E、F、G、A、Bの音間の距離を12等分し、それぞれの等分を「半音」といいます。 2つの音の間の距離は「半音」2つ分であり、これを「全音」と呼びます。ピアノなどの鍵盤楽器では、C-D、D-E、F-G、G-A、A-B の 2 つの音の間に黒鍵があり、それらの間の距離が全音になります; E-F、B-C 2 つの音の間に黒鍵はありません。それらの間の距離は半音です。通常、1、2、3、4、5、6、7 のように歌われる音を自然音と呼び、左上隅に | または b 記号が付いている音を変化音と呼びます。 ﹟はシャープ記号と呼ばれ、本来の音を半音上げることを意味し、bはフラット記号といい、本来の音を半音下げることを意味します。たとえば、高音域 DO (1046Hz) の周波数は中音域 DO (523Hz) の周波数のちょうど 2 倍であり、中音域 DO (523Hz) の周波数は低音域 DO (266Hz) の周波数のちょうど 2 倍です。同様に、高音域 RE (1175Hz) は中音域 RE (587Hz) の周波数のちょうど 2 倍であり、中音域 RE (587Hz) の周波数は低音域 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 をカウントし、956 回ごとに I/O が反転する限り、ミッドレンジ DO (523Hz)取得できる。

ビートの決定

音楽を作曲するには、音程だけではなく、メロディー(一定のリズム)を持ち、音符ひとつひとつの速さや豊かさを調整できるビートが必要です。 「ビート」、つまりビートとは、私たちが音楽を聴いて思わず手を叩いたり足を踏み鳴らしたりするように、単に時間を刻むという意味です。 1 拍が実際には 0.5 秒である場合、1/4 拍は 0.125 秒です。 1 拍が何秒かについては、厳密な規則はありません。人間の心臓の鼓動と同じように、ほとんどの人の心拍数は 1 分間に 72 拍です。耳に心地よい音であれば、心拍数が速い人も遅い人もいます。サウンドの持続時間のリアルタイム値。通常はビートで表されます。休符は発音の一時停止を示します。

楽曲は多くの異なる音符で構成されており、各音符は異なる周波数に対応しており、異なる周波数の組み合わせによって拍数に応じた遅延を加えて音楽を形成することができます。音楽の基本的な知識を理解すると、さまざまな周波数のオーディオ パルスを生成することで音楽を生成できることがわかります。マイクロコントローラーがさまざまな周波数のパルスを生成すると非常に便利で、マイクロコントローラーのタイマー/カウンターを使用して、このような方形波周波数信号を生成します。したがって、音楽の音符と対応する周波数の関係、およびマイコンのタイミングカウントを明確にする必要があります。

ノートのエンコーディング

ドレミファソラシはそれぞれ1~7、アクセントのドは8、強勢のレは9、ポーズは0とコード化されています。再生長は 16 分音符単位 (このプログラムでは 165ms) で、1 拍は 4 分音符、つまり 16 分音符 4 つ分を 4 としてプログラムされています。コードの上位4ビットはピッチ、下位4ビットは再生時間を使用しており、ピッチとビートでコードを構成します。スコアの終了マークとして 0xff を使用します。たとえば、「ド」という音は 2 拍、つまり 2 分音符の発音長を持ち、0x18 としてエンコードされます。

曲の再生デザイン。まず、曲の楽譜をエンコードし、データ型 unsigned char の配列に格納します。プログラムは配列から数値を取得し、上位 4 ビットを分離してトーンを取得し、対応する値を見つけてタイマー 0 に割り当てます。これにより、ブザーを定期的に鳴らして対応するトーンを取得し、下位桁を分離します。数値 4 ビットの遅延時間を取得し、ソフトウェア遅延を呼び出します。

メインプログラムのフローチャート

画像

物理マップ

画像

情報リスト (情報リスト内のすべての文書を提供します):

シミュレーション + コード + 回路図 PCB + 設計レポート + 説明ビデオ
画像

データのダウンロードリンク:

おすすめ

転載: blog.csdn.net/weixin_52733843/article/details/134588519