1.實驗任務
(1.4X4組成的按鍵矩陣有16,設計為16個色調。
(2)妳可以隨意播放妳想表達的音樂。
2.電路原理圖
圖4.22.1
3.系統板的硬件連接
(1.用導線將“單片機系統”區的P1.0端口連接到“音頻放大模塊”區的SPK輸入端口;
(2)用8芯電纜將“單片機系統”區域的P3.0-P3.7端口連接到“4X4行列式鍵盤”區域的c1-c4r1-r4端口;
4.相關節目內容
(1.4X4行列式鍵盤識別;
(2)音樂制作的方法;
壹段音樂由許多不同的音階組成,每個音階對應不同的頻率,這樣我們就可以用不同頻率的組合來組成我們想要的音樂。當然,單片機產生不同的頻率是很方便的。我們可以利用單片機的定時器/計數器T0來產生這樣的方波頻率信號。因此,我們只需要正確地得到壹首歌曲的音階之間的頻率關系。現以單片機12MHZ晶振為例,與單片機計數T0相關的高、中、低音符計數值如下表所示。
音符頻率(HZ)簡單譜碼(T值)音符頻率(HZ)簡單譜碼(T值)
低1 DO 262 63628 # 4 FA# 740 64860
1 DO 63731 5 SO 784 64898
●2 RE 294 63835 # 5 SO # 831 64934
6 LA 880 64968 in # 2 RE # 311 63928
●3米330 64021 # 6 932 64994
低4 FA 349 64103中7 SI 988 65030
# 4 FA# 370 64185高1 DO 1046 65058
●5so 392 64260 # 1do # 1109 65085
# 5SO # 4156431高2re 1175110。
●6la 440 64400 # 2RE # 1245 65134
# 6 466 64463身高3米1318 65157
低7 SI 494 64524高4 FA 1397 65178。
鐘1do 523 64580 # 4fa # 1480 65198。
# 1 DO# 554 64633高5 SO 1568 65217
2 Re 587 64684 # 5 SO # 1661 65235。
# 2 RE# 622 64732高6拉1760 65252
3米659 64777 # 6 1865 65268
中等4 FA 698 64820高7 SI 1967 65283
接下來我們將為這個音符建壹個表,通過查找來幫助單片機獲取相應的數據。
低音0-19,中音20-39,高音40-59。
表:DW 0,63628,63835,64021,64103,64260,64400,64524,0,0
DW 0,63731,63928,0,64185,64331,64463,0,0
DW 0 64580 64684 64777 64820 64898 64968 65030 0 0
DW 0,64633,64732,0,64860,64934,64994,0,0,0
DW 0 65058 65110 65157 65178 65217 65252 65283 0
DW 0,65085,65134,0,65198,65235,65268,0,0,0
DW 0
2、音樂的節拍,以壹拍為單位(C調)
旋律值延遲旋律值延遲
調整4/4 125毫秒和4/4 62毫秒。
調整3/4 187毫秒,調整3/4 94毫秒
調諧2/4 250毫秒調諧2/4 125毫秒。
對於不同的曲調,我們也可以用單片機的另壹個定時器/計數器來完成。
下面我們用AT89S51單片機來制作壹首《生日快樂》歌曲,來解釋壹下單片機是如何產生的。
該程序中使用了兩個定時器/計數器。其中T0用於生成音符頻率,T1用於生成節拍。
5.程序框圖
我不能粘貼它。
7.c語言源程序
# include & ltAT89X51。H & gt
無符號字符碼表[]={0x3f,0x06,0x5b,0x4f,
0x66、0x6d、0x7d、0x07、
0x7f、0x6f、0x77、0x7c、
0x39,0x5e,0x79,0x 71 };
無符號字符溫度;
無符號字符密鑰;
無符號字符I,j;
無符號字符STH0
無符號字符STL0
無符號int代碼tab[]={64021,64103,64260,64400,
64524,64580,64684,64777,
64820,64898,64968,65030,
65058,65110,65157,65178};
無效總管(無效)
{
TMOD = 0x 01;
ET0 = 1;
EA = 1;
while(1)
{
P3 = 0x ff;
P3 _ 4 = 0;
temp = P3;
溫度=溫度& amp0x0f
if (temp!=0x0f)
{
for(I = 50;我& gt0;我-)
for(j = 200;j & gt0;j-);
temp = P3;
溫度=溫度& amp0x0f
if (temp!=0x0f)
{
temp = P3;
溫度=溫度& amp0x0f
開關(溫度)
{
案例0x0e:
key = 0;
打破;
案例0x0d:
key = 1;
打破;
案例0x0b:
key = 2;
打破;
案例0x07:
key = 3;
打破;
}
temp = P3;
p 1 _ 0 = ~ p 1 _ 0;
P0 =表[鍵];
sth 0 = tab[key]/256;
STL 0 = tab[key]% 256;
TR0 = 1;
溫度=溫度& amp0x0f
while(temp!=0x0f)
{
temp = P3;
溫度=溫度& amp0x0f
}
TR0 = 0;
}
}
P3 = 0x ff;
P3 _ 5 = 0;
temp = P3;
溫度=溫度& amp0x0f
if (temp!=0x0f)
{
for(I = 50;我& gt0;我-)
for(j = 200;j & gt0;j-);
temp = P3;
溫度=溫度& amp0x0f
if (temp!=0x0f)
{
temp = P3;
溫度=溫度& amp0x0f
開關(溫度)
{
案例0x0e:
key = 4;
打破;
案例0x0d:
key = 5;
打破;
案例0x0b:
key = 6;
打破;
案例0x07:
key = 7;
打破;
}
temp = P3;
p 1 _ 0 = ~ p 1 _ 0;
P0 =表[鍵];
sth 0 = tab[key]/256;
STL 0 = tab[key]% 256;
TR0 = 1;
溫度=溫度& amp0x0f
while(temp!=0x0f)
{
temp = P3;
溫度=溫度& amp0x0f
}
TR0 = 0;
}
}
P3 = 0x ff;
P3 _ 6 = 0;
temp = P3;
溫度=溫度& amp0x0f
if (temp!=0x0f)
{
for(I = 50;我& gt0;我-)
for(j = 200;j & gt0;j-);
temp = P3;
溫度=溫度& amp0x0f
if (temp!=0x0f)
{
temp = P3;
溫度=溫度& amp0x0f
開關(溫度)
{
案例0x0e:
key = 8;
打破;
案例0x0d:
key = 9;
打破;
案例0x0b:
key = 10;
打破;
案例0x07:
key = 11;
打破;
}
temp = P3;
p 1 _ 0 = ~ p 1 _ 0;
P0 =表[鍵];
sth 0 = tab[key]/256;
STL 0 = tab[key]% 256;
TR0 = 1;
溫度=溫度& amp0x0f
while(temp!=0x0f)
{
temp = P3;
溫度=溫度& amp0x0f
}
TR0 = 0;
}
}
P3 = 0x ff;
P3 _ 7 = 0;
temp = P3;
溫度=溫度& amp0x0f
if (temp!=0x0f)
{
for(I = 50;我& gt0;我-)
for(j = 200;j & gt0;j-);
temp = P3;
溫度=溫度& amp0x0f
if (temp!=0x0f)
{
temp = P3;
溫度=溫度& amp0x0f
開關(溫度)
{
案例0x0e:
key = 12;
打破;
案例0x0d:
key = 13;
打破;
案例0x0b:
key = 14;
打破;
案例0x07:
key = 15;
打破;
}
temp = P3;
p 1 _ 0 = ~ p 1 _ 0;
P0 =表[鍵];
sth 0 = tab[key]/256;
STL 0 = tab[key]% 256;
TR0 = 1;
溫度=溫度& amp0x0f
while(temp!=0x0f)
{
temp = P3;
溫度=溫度& amp0x0f
}
TR0 = 0;
}
}
}
}
void t0(void)使用0中斷1
{
TH0 = STH0
TL0 = STL0
p 1 _ 0 = ~ p 1 _ 0;
}