當前位置:菜譜大全網 - 素菜食譜大全 - 如何將樂譜翻譯成51單片機C程序代碼

如何將樂譜翻譯成51單片機C程序代碼

用定時器T0中斷播放《欲望》主題曲

# include & ltreg 51 . h & gt;//包含51單片機寄存器定義的頭文件。

sbit sound=p3^7;//將聲音位定義為P3.7

無符號int C;//存儲定時器的定時常數。

//以下是C調低音的音頻宏定義。

#定義l_dao 262 //將宏“l_dao”定義為262Hz的低音“1”的頻率。

#define l_re 286 //將“l_re”宏定義為286Hz的低音“2”的頻率。

#定義l_mi 311 //定義“l_mi”宏為低音“3”311Hz的頻率。

#define l_fa 349 //將宏“l_fa”定義為349Hz的低音“4”的頻率。

#define l_sao 392 //將宏“l_sao 392”定義為392Hz的低音“5”的頻率。

#define l_la 440 //將“l_a”宏定義為440Hz的低音“6”的頻率。

#定義l_xi 494 //定義宏“l_xi”為494Hz的低音“7”的頻率。

//下面是C調中音的音頻宏定義。

# definedao 523//宏“道”定義為中音“1”的523Hz的頻率。

#定義re 587 //將“re”的宏定義為587Hz的中音“2”的頻率。

#define mi 659 //將“mi”宏定義為659Hz的中音“3”的頻率。

#define fa 698 //將“fa”宏定義為698Hz的中音“4”的頻率。

#define sao 784 //將“sao”宏定義為784Hz的中音“5”的頻率。

#定義la 880 //將“la”宏定義為880Hz的中音“6”的頻率。

#定義xi 987 //宏“xi”被定義為523H的中音“7”的頻率。

//以下是C調高音的音頻宏定義。

#定義h_dao 1046 //定義“h_dao”宏為高音“1”1046hz的頻率。

#定義h_re 1174 //定義“h_re”宏為高音“2”的頻率1174Hz。

#定義h_mi 1318 //定義“h_mi”宏為高音“3”的頻率1318Hz。

#定義h_fa 1396 //定義“h_fa”宏為高音“4”1396hz的頻率。

#定義h_sao 1567 //定義“h_sao”宏為高音“5”1567hz的頻率。

#定義h_la 1760 //定義“h_la”宏為高音“6”1760hz的頻率。

#定義h_xi 1975 //定義“h_xi”宏為高音“7”的頻率1975Hz。

/*******************************************

功能:1個延時單元,延時200ms。

******************************************/

無效延遲()

{

無符號字符I,j;

for(I = 0;我& lt250;i++)

for(j = 0;j & lt250;j++)

}

/*******************************************

函數函數:主函數

******************************************/

無效總管(無效)

{

無符號字符I,j;

//以下是《渴望》主打歌的簡譜。

無符號int碼f [] = {re,mi,re,Dao,l _ la,Dao,l _ la,//每行對應壹個小節音符。

l _騷,l _米,l _騷,l _拉,道,

l_la,道,騷,拉,咪,騷,

re,

米,熱,米,騷,米,

l _騷,l _米,l _騷,l _拉,道,

l_la,l_la,道,l_la,l_sao,l_re,l_mi,

l_sao,

啦,啦,騷,啦,騷,

法,咪,騷,咪,

啦,騷,咪,熱,咪,啦_啦,道,

re,

米,熱,米,騷,米,

l _騷,l _米,l _騷,l _拉,道,

拉,道,熱,拉,道,熱,米,

re,

拉,道,熱,拉,道,熱,米,

re,

0x ff };//使用0xff作為音符的結束符號。

//下面是樂譜中每個音符的節拍。

//“4”對應4個延遲單元,“2”對應2個延遲單元,“1”對應1個延遲單元。

無符號字符碼JP[ ]={4,1,1,4,1,1,2,

2,2,2,2,8,

4,2,3,1,2,2,

10,

4,2,2,4,4,

2,2,2,2,4,

2,2,2,2,2,2,2,

10,

4,4,4,2,2,

4,2,4,4,

4,2,2,2,2,2,2,

10,

4,2,2,4,4,

2,2,2,2,6,

4,2,2,4,1,1,4,

10,

4,2,2,4,1,1,4,

10

};

EA = 1;//打開主機中斷

ET0 = 1;//允許定時器T0中斷

TMOD = 0x 00;//使用定時器T0的模式1(13位計數器)

While(1) //無限循環

{

I = 0;//從第1個音符f[0]開始彈奏。

while(f[i]!=0xff) //只要未讀取結束符號,就繼續播放。

{

c = 460830/f[I];

TH0 =(8192-C)/32;//可以證明這是13位計數器TH0的高8位的初始值賦值方法。

TL0 =(8192-C)% 32;//可以證明這是13位計數器TL0的低5位的初始值賦值方法。

TR0 = 1;//啟動定時器T0

for(j = 0;j & ltJP[I];J++) //控制節拍數。

delay();//延遲1拍單位

TR0 = 0;//關閉定時器T0

i++;//播放下壹個音符

}

}

}

/***********************************************************

功能:定時器T0的中斷服務子程序使P3.7引腳輸出音頻方波。

************************************************************/

無效時間0(void)使用1中斷1

{

聲音=!聲音;//將P3.7引腳的輸出電平反相,形成方波。

TH0 =(8192-C)/32;//可以證明這是13位計數器TH0的高8位的初始值賦值方法。

TL0 =(8192-C)% 32;//可以證明這是13位計數器TL0的低5位的初始值賦值方法。

}