51單片機蜂鳴器音樂簡譜轉換工具

2021-01-08 電子產品世界
相信您在作蜂鳴器發聲實驗時肯定為複雜的頻率與音調之間的轉換而傷腦筋,這裡向大家介紹一款工具可以大大簡化轉換操作,只需要輸入簡譜就能自動生成音樂播放程序代碼。

以下此程序的主界面:

本文引用地址:http://www.eepw.com.cn/article/201611/315982.htm

程序範例可以點主界面上的「關於」按鈕後就能找到,但是代碼也不全,需要加入對音樂程序的調用代碼,其它範例裡也寫的很清楚了,只需要調用Play函數就行了,其調用格式如下:


Play(樂曲名,調號,升降八度,演奏速度);

經過實踐,此函數的的後三個參數分別設為0,2和350時演奏出的音樂比較符合「原味」,下面給出本站的入門型51實驗板結合此工具作的音樂程序:


//51單片機播放音樂庫文件
/**************************************************************************
SOUND PLAY FOR 51MCU
COPYRIGHT (c) 2005 BY JJJ.
-- ALL RIGHTS RESERVED --
File Name: SoundPlay.h
Author: Jiang Jian Jun
Created: 2005/5/16
Modified: NO
Revision: 1.0
*******************************************************************************/
/*說明**************************************************************************
曲譜存貯格式 unsigned char code MusicName{音高,音長,音高,音長...., 0,0}; 末尾:0,0 表示結束(Important)
音高由三位數字組成:
個位是表示 1~7 這七個音符
十位是表示音符所在的音區:1-低音,2-中音,3-高音;
百位表示這個音符是否要升半音: 0-不升,1-升半音。
音長最多由三位數字組成:
個位表示音符的時值,其對應關係是:
|數值(n): |0 |1 |2 |3 | 4 | 5 | 6
|幾分音符: |1 |2 |4 |8 |16 |32 |64 音符=2^n
十位表示音符的演奏效果(0-2): 0-普通,1-連音,2-頓音
百位是符點位: 0-無符點,1-有符點
調用演奏子程序的格式
Play(樂曲名,調號,升降八度,演奏速度);
|樂曲名 : 要播放的樂曲指針,結尾以(0,0)結束;
|調號(0-11) : 是指樂曲升多少個半音演奏;
|升降八度(1-3) : 1:降八度, 2:不升不降, 3:升八度;
|演奏速度(1-12000): 值越大速度越快;
***************************************************************************/
#ifndef __SOUNDPLAY_H_REVISION_FIRST__
#define __SOUNDPLAY_H_REVISION_FIRST__
#include
//**************************************************************************
#define SYSTEM_OSC 11059200//12000000 //定義晶振頻率12000000HZ
#define SOUND_SPACE 4/5 //定義普通音符演奏的長度分率,//每4分音符間隔
sbit BeepIO = P3^5; //定義輸出管腳
unsigned int code FreTab[12] = { 262,277,294,311,330,349,369,392,415,440,466,494 }; //原始頻率表
unsigned char code SignTab[7] = { 0,2,4,5,7,9,11 }; //1~7在頻率表中的位置
unsigned char code LengthTab[7]= { 1,2,4,8,16,32,64 };
unsigned char Sound_Temp_TH0,Sound_Temp_TL0; //音符定時器初值暫存
unsigned char Sound_Temp_TH1,Sound_Temp_TL1; //音長定時器初值暫存
//**************************************************************************
void InitialSound(void)
{
BeepIO = 1;
Sound_Temp_TH1 = (65535-(1/1200)*SYSTEM_OSC)/256; // 計算TL1應裝入的初值 (10ms的初裝值)
Sound_Temp_TL1 = (65535-(1/1200)*SYSTEM_OSC)%256; // 計算TH1應裝入的初值
TH1 = Sound_Temp_TH1;
TL1 = Sound_Temp_TL1;
TMOD |= 0x11;
ET0 = 1;
ET1 = 0;
TR0 = 0;
TR1 = 0;
EA = 1;
}
void BeepTimer0(void) interrupt 1 //音符發生中斷
{
BeepIO = !BeepIO;
TH0 = Sound_Temp_TH0;
TL0 = Sound_Temp_TL0;
}
//**************************************************************************
void Play(unsigned char *Sound,unsigned char Signature,unsigned Octachord,unsigned int Speed)
{
unsigned int NewFreTab[12]; //新的頻率表
unsigned char i,j;
unsigned int Point,LDiv,LDiv0,LDiv1,LDiv2,LDiv4,CurrentFre,Temp_T,SoundLength;
unsigned char Tone,Length,SL,SH,SM,SLen,XG,FD;
for(i=0;i<12;i++) // 根據調號及升降八度來生成新的頻率表
{
j = i + Signature;
if(j > 11)
{
j = j-12;
NewFreTab[i] = FreTab[j]*2;
}
else
NewFreTab[i] = FreTab[j];
if(Octachord == 1)
NewFreTab[i]>>=2;
else if(Octachord == 3)
NewFreTab[i]<<=2;
}
SoundLength = 0;
while(Sound[SoundLength] != 0x00) //計算歌曲長度
{
SoundLength+=2;
}
Point = 0;
Tone = Sound[Point];
Length = Sound[Point+1]; // 讀出第一個音符和它時時值
LDiv0 = 12000/Speed; // 算出1分音符的長度(幾個10ms)
LDiv4 = LDiv0/4; // 算出4分音符的長度
LDiv4 = LDiv4-LDiv4*SOUND_SPACE; // 普通音最長間隔標準
TR0 = 0;
TR1 = 1;
while(Point < SoundLength)
{
SL=Tone%10; //計算出音符
SM=Tone/10%10; //計算出高低音
SH=Tone/100; //計算出是否升半
CurrentFre = NewFreTab[SignTab[SL-1]+SH]; //查出對應音符的頻率
if(SL!=0)
{
if (SM==1) CurrentFre >>= 2; //低音
if (SM==3) CurrentFre <<= 2; //高音
Temp_T = 65536-(50000/CurrentFre)*10/(12000000/SYSTEM_OSC);//計算計數器初值
Sound_Temp_TH0 = Temp_T/256;
Sound_Temp_TL0 = Temp_T%256;
TH0 = Sound_Temp_TH0;
TL0 = Sound_Temp_TL0 + 12; //加12是對中斷延時的補償
}
SLen=LengthTab[Length%10]; //算出是幾分音符
XG=Length/10%10; //算出音符類型(0普通1連音2頓音)
FD=Length/100;
LDiv=LDiv0/SLen; //算出連音音符演奏的長度(多少個10ms)
if (FD==1)
LDiv=LDiv+LDiv/2;
if(XG!=1)
if(XG==0) //算出普通音符的演奏長度
if (SLen<=4)
LDiv1=LDiv-LDiv4;
else
LDiv1=LDiv*SOUND_SPACE;
else
LDiv1=LDiv/2; //算出頓音的演奏長度
else
LDiv1=LDiv;
if(SL==0) LDiv1=0;
LDiv2=LDiv-LDiv1; //算出不發音的長度
if (SL!=0)
{
TR0=1;
for(i=LDiv1;i>0;i--) //發規定長度的音
{
while(TF1==0);
TH1 = Sound_Temp_TH1;
TL1 = Sound_Temp_TL1;
TF1=0;
}
}
if(LDiv2!=0)
{
TR0=0; BeepIO=1;
for(i=LDiv2;i>0;i--) //音符間的間隔
{
while(TF1==0);
TH1 = Sound_Temp_TH1;
TL1 = Sound_Temp_TL1;
TF1=0;
}
}
Point+=2;
Tone=Sound[Point];
Length=Sound[Point+1];
}
BeepIO = 1;
}
//**************************************************************************
#endif
//揮著翅膀的女孩
unsigned char code Music_Girl[]={ 0x17,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x15,0x03,
0x16,0x03, 0x17,0x03, 0x17,0x03, 0x17,0x03, 0x18,0x03,
0x19,0x02, 0x16,0x03, 0x17,0x03, 0x18,0x02, 0x18,0x03,
0x17,0x03, 0x15,0x02, 0x18,0x03, 0x17,0x03, 0x18,0x02,
0x10,0x03, 0x15,0x03, 0x16,0x02, 0x15,0x03, 0x16,0x03,
0x17,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x1A,0x03,
0x1B,0x03, 0x1F,0x03, 0x1F,0x03, 0x17,0x03, 0x18,0x03,
0x19,0x02, 0x16,0x03, 0x17,0x03, 0x18,0x03, 0x17,0x03,
0x18,0x03, 0x1F,0x03, 0x1F,0x02, 0x16,0x03, 0x17,0x03,
0x18,0x03, 0x17,0x03, 0x18,0x03, 0x20,0x03, 0x20,0x02,
0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x20,0x03, 0x21,0x03,
0x20,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x1F,0x03,
0x1B,0x03, 0x19,0x03, 0x19,0x03, 0x15,0x03, 0x1A,0x66,
0x1A,0x03, 0x19,0x03, 0x15,0x03, 0x15,0x03, 0x17,0x03,
0x16,0x66, 0x17,0x04, 0x18,0x04, 0x18,0x03, 0x19,0x03,
0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x20,0x03, 0x21,0x03,
0x20,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x1F,0x03,
0x1B,0x03, 0x19,0x03, 0x19,0x03, 0x15,0x03, 0x1A,0x66,
0x1A,0x03, 0x19,0x03, 0x19,0x03, 0x1F,0x03, 0x1B,0x03,
0x1F,0x00, 0x1A,0x03, 0x1A,0x03, 0x1A,0x03, 0x1B,0x03,
0x1B,0x03, 0x1A,0x03, 0x19,0x03, 0x19,0x02, 0x17,0x03,
0x15,0x17, 0x15,0x03, 0x16,0x03, 0x17,0x03, 0x18,0x03,
0x17,0x04, 0x18,0x0E, 0x18,0x03, 0x17,0x04, 0x18,0x0E,
0x18,0x66, 0x17,0x03, 0x18,0x03, 0x17,0x03, 0x18,0x03,
0x20,0x03, 0x20,0x02, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66,
0x20,0x03, 0x21,0x03, 0x20,0x03, 0x1F,0x03, 0x1B,0x03,
0x1F,0x66, 0x1F,0x04, 0x1B,0x0E, 0x1B,0x03, 0x19,0x03,
0x19,0x03, 0x15,0x03, 0x1A,0x66, 0x1A,0x03, 0x19,0x03,
0x15,0x03, 0x15,0x03, 0x17,0x03, 0x16,0x66, 0x17,0x04,
0x18,0x04, 0x18,0x03, 0x19,0x03, 0x1F,0x03, 0x1B,0x03,
0x1F,0x66, 0x20,0x03, 0x21,0x03, 0x20,0x03, 0x1F,0x03,
0x1B,0x03, 0x1F,0x66, 0x1F,0x03, 0x1B,0x03, 0x19,0x03,
0x19,0x03, 0x15,0x03, 0x1A,0x66, 0x1A,0x03, 0x19,0x03,
0x19,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x00, 0x18,0x02,
0x18,0x03, 0x1A,0x03, 0x19,0x0D, 0x15,0x03, 0x15,0x02,
0x18,0x66, 0x16,0x02, 0x17,0x02, 0x15,0x00, 0x00,0x00};
//同一首歌
unsigned char code Music_Same[]={ 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x66, 0x18,0x03,
0x17,0x02, 0x15,0x02, 0x16,0x01, 0x15,0x02, 0x10,0x02,
0x15,0x00, 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x02,
0x17,0x03, 0x18,0x03, 0x19,0x02, 0x15,0x02, 0x18,0x66,
0x17,0x03, 0x19,0x02, 0x16,0x03, 0x17,0x03, 0x16,0x00,
0x17,0x01, 0x19,0x02, 0x1B,0x02, 0x1B,0x70, 0x1A,0x03,
0x1A,0x01, 0x19,0x02, 0x19,0x03, 0x1A,0x03, 0x1B,0x02,
0x1A,0x0D, 0x19,0x03, 0x17,0x00, 0x18,0x66, 0x18,0x03,
0x19,0x02, 0x1A,0x02, 0x19,0x0C, 0x18,0x0D, 0x17,0x03,
0x16,0x01, 0x11,0x02, 0x11,0x03, 0x10,0x03, 0x0F,0x0C,
0x10,0x02, 0x15,0x00, 0x1F,0x01, 0x1A,0x01, 0x18,0x66,
0x19,0x03, 0x1A,0x01, 0x1B,0x02, 0x1B,0x03, 0x1B,0x03,
0x1B,0x0C, 0x1A,0x0D, 0x19,0x03, 0x17,0x00, 0x1F,0x01,
0x1A,0x01, 0x18,0x66, 0x19,0x03, 0x1A,0x01, 0x10,0x02,
0x10,0x03, 0x10,0x03, 0x1A,0x0C, 0x18,0x0D, 0x17,0x03,
0x16,0x00, 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x70,
0x18,0x03, 0x17,0x02, 0x15,0x03, 0x15,0x03, 0x16,0x66,
0x16,0x03, 0x16,0x02, 0x16,0x03, 0x15,0x03, 0x10,0x02,
0x10,0x01, 0x11,0x01, 0x11,0x66, 0x10,0x03, 0x0F,0x0C,
0x1A,0x02, 0x19,0x02, 0x16,0x03, 0x16,0x03, 0x18,0x66,
0x18,0x03, 0x18,0x02, 0x17,0x03, 0x16,0x03, 0x19,0x00,
0x00,0x00 };
//兩隻蝴蝶
unsigned char code Music_Two[] ={ 0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03,
0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02,
0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03,
0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x16,0x03,
0x17,0x01, 0x16,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x01,
0x10,0x03, 0x15,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03,
0x16,0x03, 0x15,0x03, 0x10,0x03, 0x15,0x03, 0x16,0x01,
0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03,
0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02,
0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03,
0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x19,0x03,
0x19,0x01, 0x19,0x03, 0x1A,0x03, 0x19,0x03, 0x17,0x01,
0x16,0x03, 0x16,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03,
0x16,0x03, 0x15,0x03, 0x10,0x03, 0x10,0x0D, 0x15,0x00,
0x19,0x03, 0x19,0x03, 0x1A,0x03, 0x1F,0x03, 0x1B,0x03,
0x1B,0x03, 0x1A,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03,
0x16,0x0D, 0x17,0x01, 0x17,0x03, 0x17,0x03, 0x19,0x03,
0x1A,0x02, 0x1A,0x02, 0x10,0x03, 0x17,0x0D, 0x16,0x03,
0x16,0x01, 0x17,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x03,
0x19,0x02, 0x1F,0x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E,
0x1B,0x04, 0x17,0x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E,
0x1B,0x04, 0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03,
0x17,0x0D, 0x16,0x03, 0x17,0x03, 0x19,0x01, 0x19,0x03,
0x19,0x03, 0x1A,0x03, 0x1F,0x03, 0x1B,0x03, 0x1B,0x03,
0x1A,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03, 0x16,0x03,
0x17,0x01, 0x17,0x03, 0x17,0x03, 0x19,0x03, 0x1A,0x02,
0x1A,0x02, 0x10,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x01,
0x17,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x03, 0x19,0x03,
0x1F,0x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04,
0x17,0x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04,
0x17,0x16, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04,
0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03, 0x0F,0x02,
0x10,0x03, 0x15,0x00, 0x00,0x00 };
void main()
{
InitialSound();
while(1)
{
Play(Music_Girl,0,2,350);
Play(Music_Same,0,2,350);
Play(Music_Two,0,2,350);
}
}

點擊下載Music Encode

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

再例如:關於「世上只有媽媽好」的單片機音樂演奏程序

單片機演奏一個音符,是通過引腳,周期性的輸出一個特定頻率的方波。
這就需要單片機,在半個周期內輸出低電平、另外半個周期輸出高電平,周而復始。
半個周期的時間是多長呢?眾所周知,周期為頻率的倒數,可以通過音符的頻率計算出半周期。
演奏時,要根據音符頻率的不同,把對應的、半個周期的定時時間初始值,送入定時器,再由定時器按時輸出高低電平。

下面是個網上廣泛流傳的單片機音樂演奏程序,它可以循環的播放「世上只有媽媽好」這首樂曲。很多人都關心如何修改這個樂曲的內容,但是不知如何入手。
做而論道對這個程序,給出說明,希望對大家有所幫助,以後大家自己就能夠編寫進去新的樂曲。

在這個程序中,有兩個數據表,其中存放了事先算好的、各種音符頻率所對應的、半周期的定時時間初始值。
有了這些數據,單片機就可以演奏從低音、中音、高音和超高音,四個八度共28個音符。

演奏樂曲時,就根據音符的不同數值,從半周期數據表中找到定時時間初始值,送入定時器即可控制發音的音調。
比如把表中的0xF2和0x42送到定時器,定時器按照這個初始值來產生中斷,輸出的方波,人們聽起來,這就是低音1。

樂曲的數據,也要寫個數據表,程序中以 code unsigned char sszymmh[] 命名。
這個表中每三個數字,說明了一個音符,它們分別代表:
第一個數字是音符的數值1234567之一,代表多來咪發...;
第二個數字是0123之一,代表低音、中音、高音、超高音;
第三個數字是時間長度,以半拍為單位。
樂曲數據表的結尾是三個0。

程序如下:

#include
sbit speaker = P1^7;
unsigned char timer0h, timer0l, time;
//---
//單片機晶振採用11.0592MHz
// 頻率-半周期數據表 高八位 本軟體共保存了四個八度的28個頻率數據
code unsigned char FREQH[] = {
0xF2, 0xF3, 0xF5, 0xF5, 0xF6, 0xF7, 0xF8, //低音1234567
0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC,//1,2,3,4,5,6,7,i
0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE, //高音 234567
0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF}; //超高音 1234567

// 頻率-半周期數據表 低八位
code unsigned char FREQL[] = {
0x42, 0xC1, 0x17, 0xB6, 0xD0, 0xD1, 0xB6, //低音1234567
0x21, 0xE1, 0x8C, 0xD8, 0x68, 0xE9, 0x5B, 0x8F, //1,2,3,4,5,6,7,i
0xEE, 0x44, 0x6B, 0xB4, 0xF4, 0x2D, //高音 234567
0x47, 0x77, 0xA2, 0xB6, 0xDA, 0xFA, 0x16}; //超高音 1234567
//---
//世上只有媽媽好數據表 要想演奏不同的樂曲, 只需要修改這個數據表
code unsigned char sszymmh[] = {
6, 2, 3, 5, 2, 1, 3, 2, 2, 5, 2, 2, 1, 3, 2, 6, 2, 1, 5, 2, 1,
//一個音符有三個數字。前為第幾個音、中為第幾個八度、後為時長(以半拍為單位)。
//6, 2, 3 分別代表:6, 中音, 3個半拍;
//5, 2, 1 分別代表:5, 中音, 1個半拍;
//3, 2, 2 分別代表:3, 中音, 2個半拍;
//5, 2, 2 分別代表:5, 中音, 2個半拍;
//1, 3, 2 分別代表:1, 高音, 2個半拍;
//
6, 2, 4, 3, 2, 2, 5, 2, 1, 6, 2, 1, 5, 2, 2, 3, 2, 2, 1, 2, 1,
6, 1, 1, 5, 2, 1, 3, 2, 1, 2, 2, 4, 2, 2, 3, 3, 2, 1, 5, 2, 2,
5, 2, 1, 6, 2, 1, 3, 2, 2, 2, 2, 2, 1, 2, 4, 5, 2, 3, 3, 2, 1,
2, 2, 1, 1, 2, 1, 6, 1, 1, 1, 2, 1, 5, 1, 6, 0, 0, 0};
//---

void t0int() interrupt 1 //T0中斷程序,控制發音的音調
{
TR0 = 0; //先關閉T0
speaker = !speaker; //輸出方波, 發音
TH0 = timer0h; //下次的中斷時間, 這個時間, 控制音調高低
TL0 = timer0l;
TR0 = 1; //啟動T0
}
//---
void delay(unsigned char t) //延時程序,控制發音的時間長度
{
unsigned char t1;
unsigned long t2;
for(t1 = 0; t1 < t; t1++) //雙重循環, 共延時t個半拍
for(t2 = 0; t2 < 8000; t2++); //延時期間, 可進入T0中斷去發音
TR0 = 0; //關閉T0, 停止發音
}
//---
void song() //演奏一個音符
{
TH0 = timer0h; //控制音調
TL0 = timer0l;
TR0 = 1; //啟動T0, 由T0輸出方波去發音
delay(time); //控制時間長度
}
//---
void main(void)
{
unsigned char k, i;
TMOD = 1; //置T0定時工作方式1
ET0 = 1; //開T0中斷
EA = 1; //開CPU中斷
while(1) {
i = 0;
time = 1;
while(time) {
k = sszymmh[i] + 7 * sszymmh[i + 1] - 1;
//第i個是音符, 第i+1個是第幾個八度
timer0h = FREQH[k]; //從數據表中讀出頻率數值
timer0l = FREQL[k]; //實際上, 是定時的時間長度
time = sszymmh[i + 2]; //讀出時間長度數值
i += 3;
song(); //發出一個音符
} } }
//======================================
應網友要求,下面再詳細寫一下樂譜和數據的轉換關係。
以李叔同大師的《送別》的前二小節來說明轉換的方法。

這部分的歌詞是:「長 亭 外, 古 道 邊,」;
這部分的樂譜是:| 5 35 1 - | 6 16 5 - |。
(注意:樂譜中的1是高音,上邊是帶點的;還有些音符,應該有下劃線,在這裡都無法標出。感興趣的網友應該去查看正規的樂譜。)

那麼,據此就可以寫出《送別》前二小節的數據表:
//---
code unsigned char sszymmh[] = {
5, 2, 2, 3, 2, 1, 5, 2, 1, 1, 3, 4,
//嗦,中音,2個半拍; 咪,中音,1個半拍; 嗦,中音,1個半拍; 哆,高音,4個半拍
6, 2, 2, 1, 3, 1, 6, 2, 1, 5, 2, 4,
//啦,中音,2個半拍; 哆,高音,1個半拍; 啦,中音,1個半拍; 嗦,中音,4個半拍
0, 0, 0};
//結束標記
//---

記住:三個數字一組,代表一個音符。
第一個數字是1234567之一,代表音符哆來咪發...;
第二個數字是0123之一,代表低音、中音、高音、超高音;
第三個數字是半拍的個數,代表時間長度。
當三個數字都是0,就代表樂曲數據表的結尾。

用這個數據表,替換掉程序中《世上只有媽媽好》的數據表,本程序就可以播放《送別》的前兩小節。

相關焦點

  • 51單片機玩轉物聯網基礎篇04-蜂鳴器
    一、基礎知識1.蜂鳴器簡介蜂鳴器是一種一體化結構的電子訊響器,採用直流電壓供電,廣泛應用於計算機、印表機、複印機、報警器、電子玩具、汽車電子設備、電話機、定時器等電子產品中作發聲器件。>注意:不可以用單片機I/O口直接驅動蜂鳴器發聲,因為I/O口驅動負載能力有限
  • 單片機驅動蜂鳴器C51程序
    #include reg51.h>#include intrins.h>#include absacc.h>#define uchar unsigned char#define uint unsigned intsbit k1=P1^4; //按鈕1sbit k2=P1
  • 51單片機按鍵控制蜂鳴器啟停程序
    51單片機按鍵控制蜂鳴器啟停程序#include<reg52.h> #define uint unsigned int //宏定義sbit SPK=P3^5; //定義喇叭埠sbit key=
  • 51單片機學習14-蜂鳴器驅動
    這篇驅動蜂鳴器,單片機IO口通過開關三極體來驅動蜂鳴器,這裡用PNP的三極體,常用SS8550。三極體b極電阻一般選用1K。
  • 基於51單片機的電子時鐘課程設計
    第一章 設計目的及要求1.目的通過對電子時鐘系統進行編程與Protues仿真,進一步掌握單片機的組成,P1、P0、P2、P3口的應用,蜂鳴器的應用,定時中斷程序的編寫及應用,對之前學習的單片機課程進行回顧與應用;初步掌握Protues仿真方法以及用keil軟體編寫程序的方法。
  • 基於51單片機的兩路溫度控制器的設計方案
    3.2報警電路  本設計採用蜂鳴器和電風扇報警電路。蜂鳴器報警電路由三極體和蜂鳴器組成。當溫度低於設定的最低溫度時,則蜂鳴器報警。電風扇報警電路由三極體和電風扇組成。當溫度高於設定的最高溫度時,則電風扇報警。  3.3顯示電路  本系統採用L E D數碼顯示管顯示,LED亮度高,可視角度高。LCD的可視角度低,亮度較低,價格高。
  • 圖形化編程玩51單片機(十三)簡單實用門鈴實驗
    特別提示:從本期起,將原來的文章標題「零基礎學51單片機」更改為「圖形化編程玩51單片機」本期實驗:模擬簡易門鈴;且有關閉門鈴功能。【使用說明】:當按下單片機上的S2按鍵後,蜂鳴器會發出八次短暫的「嘟嘟」聲作為呼叫。S3用於關閉或者打開門鈴。當門鈴處於關閉時,按下S2不會有呼叫效果。實際應用中,S2按鍵可作為門外的來客呼叫開關。S3可作為室內的門鈴控制開關。
  • 基於Proteus單片機的音樂演奏實現系統
    當前的很多用單片機實現音樂演奏的系統都是利用開發板結合仿真器實現的,這種方法不是很複雜,實現也較方便,但是調試不是很方便,且成本也較高。 本文提出的一種基於Proteus的單片機演奏音樂的方法,非常簡單實用,且該方法基於軟體來實現的,所以成本非常低,調試方便,效果也很不錯,適合於愛好音樂的單片機學習者。
  • 51單片機之4位數加法計算器的設計報告
    電子時鐘是現代社會中的主要計時工具之一,廣泛應用於手機,電腦,汽車等社會生活需要的各個方面,及對時間有要求的場合。本設計採用AT89C52單片機作為主要核心部件,附以上電復位電路,時鐘電路及按鍵調時電路組成。數字鐘已成為人們日常生活中: 必不可少的必需品, 廣泛用於個人家庭以及車站、 碼頭、劇場、辦公室等公共場所,給人們的生活、學習、工作、娛樂帶來極大的方便。
  • 51單片機AD轉換電路設計實現
    51單片機AD轉換電路設計實現關於AD轉換的原理,大家在《數字電子技術》中已經學過,這裡做過多的介紹,本文介紹一款經典的8位AD轉換晶片ADC0804,基於51單片機設計AD轉換電路,並完成測量值的轉換。
  • 單片機驅動蜂鳴器原理與設計
    蜂鳴器是一種一體化結構的電子訊響器,本文介紹如何用單片機驅動蜂鳴器,他廣泛應用於計算機、印表機、複印機、報警器、電話機等電子產品中作發聲器件。   蜂鳴器主要分為壓電式蜂鳴器和電磁式蜂鳴器兩種類型。
  • 單片機基礎:燥起來吧,蜂鳴器
    一、不可不知道的蜂鳴器基礎知識1、 蜂鳴器簡介:蜂鳴器是一種發聲器件 (這就夠了,就像知道LED是一種發光器件就OK)2、蜂鳴器分類:根據結構分,有壓電式和電磁式;根據」源「分,有無源蜂鳴器和有源蜂鳴器。3、必備知識點:物理學裡定義,聲音是由物體振動發出的,蜂鳴器也是如此,故」源」指的是蜂鳴器帶不帶振蕩源。
  • 利用蜂鳴器和單片機演奏簡單的音樂電路設計
    利用蜂鳴器和單片機演奏簡單的音樂本文引用地址:http://www.eepw.com.cn/article/172876.htm實驗原理圖*//* ---- *///本程序用T0 來產生音調,用T1 產生音長#include reg51.h>#define uchar unsigned char#define yx 4/5 /* 定義普通音符演奏的長度分率 */#define plen 2 /* 定義晶振的時鐘周期(us) */#define
  • 一種非常簡單的用arduino控制蜂鳴器播放音樂的方案
    今天來聊聊用arduino控制蜂鳴器播放音樂的方案,當然必須還是老風格,雖然可能不是最佳方案,但一定是簡單粗暴易懂的。走起。。
  • 51單片機+PID算法水溫控制系統設計
    方案2:採用單片機AT89S52為核心。採用數字溫度傳感器DS18B20採集溫度變化信號,將其轉換成數位訊號並通過單片機處理後去控制溫度,使其達到穩定。使用單片機具有編程靈活,控制簡單的優點,使系統能簡單的實現溫度的控制及顯示,並且通過軟體編程能實現各種控制算法使系統還具有控制精度高的特點。
  • 51單片機之計時器與計數器
    例如:外接晶振為12MHz時,51單片機相關周期的具體值為:振蕩周期=1/12us;狀態周期=1/6us;機器周期=1us;指令周期=1~4us;初始化程序應完成如下工作:對TMOD賦值,以確定T0和T1的工作方式。
  • 基於51單片機的人體紅外模塊的自動門設計
    方案二:採用51系列單片機。系統的要求不高,程序的編寫也比較簡單,需要用到的I/O口的數量用該系列的單片機來操作完全能夠實現,無需再擴展,充分的利用了單片機資源。另外,經典的51系列單片機的處理速度也能夠滿足系統要求,性價比相對CPLD器件更高。綜合以上兩種方案,本系統選擇方案二,以AT89C51作為系統的微控制器。4.
  • 蜂鳴器原理
    導讀:本文主要介紹的是蜂鳴器的原理,感興趣的盆友們快來學習一下吧~~~很漲姿勢的哦~~~本文引用地址:http://www.eepw.com.cn/article/277228.htm1.蜂鳴器原理--簡介  蜂鳴器其實就是一種一體化結構的電子訊響器
  • 單片機小白學步(22) IO口:蜂鳴器的使用/三極體的工作原理
    前面我們說了,單片機IO口能通過的電流是有限的,過大的電流可能會燒壞管腳,或者不能正常工作。蜂鳴器和LED相比最主要的區別,就是蜂鳴器比LED需要的電流大很多,電壓一般也會高一些。為了讓單片機驅動蜂鳴器,也就是控制蜂鳴器工作,我們需要使用一些特別的電路。不知道大家是否了解繼電器,繼電器的特點就是用小電流低電壓,控制大電流高電壓電路。
  • 如何利用51單片機設計一個電子密碼鎖系統?
    打開APP 如何利用51單片機設計一個電子密碼鎖系統? 本電子密碼鎖的系統電路的主晶片是AT89C51, 其中包括時鐘脈衝、電阻、電解電容以及由一個按鍵構成的復位電路,還有一個由八段數碼管組成的密碼顯示器以及一個蜂鳴器和五個LED燈管,一個NPN 三極體和一個繼電器,結合上面所述的驅動電路構成了此電子密碼鎖的系統電路