# 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位的初始值賦值方法。
}