- 實驗目的
用51系列單片機設計一個可以切歌的音樂播放器。
- 實驗儀器
AT89C52單片機。
音樂播放模塊。
- 設計要求
采用重裝定時器計數(shù)方式1的初值來實現(xiàn)發(fā)出不同頻率的聲音,通過控制延時長度來實現(xiàn)不同的節(jié)拍,之后將音樂數(shù)據(jù)表填入,即可實現(xiàn)音樂播放。
可通過功能按鍵切換歌曲
- 實驗原理
音樂播放采用重裝定時器計數(shù)方式1的初值來實現(xiàn)發(fā)出不同頻率的聲音,通過控制延時長度來實現(xiàn)不同的節(jié)拍,之后將音樂數(shù)據(jù)表填入,即可實現(xiàn)音樂播放。
音樂切換方面采取按鍵輸入,按鍵檢測到低電平,則判斷有信號輸入,等待10ms去抖后,等待下一個高電平,進行音樂的切換。
- 實驗流程
- 根據(jù)課本學習喇叭發(fā)生實驗、警車聲音、救護車聲音、喇叭滴答聲音、報警發(fā)聲、消防車、音樂播放等一系列實驗了解了喇叭發(fā)聲以及調(diào)節(jié)頻率的方法。學習獨立按鍵的用法用于切換歌曲
- 模仿音樂播放的代碼,進行修改,將源代碼的歌曲樂譜換成“鈴兒響叮當”和“Spider Dance”的樂譜
- 將單片機喇叭短接,代碼燒錄入單片機。
?
?文章來源:http://www.zghlxwxcb.cn/news/detail-568245.html
- 實驗結(jié)果
單片機正常運行,先播放“鈴兒響叮當”的旋律,當我按下獨立按鍵INT1時,歌曲切換為“Spider Dance”的旋律,如果重新按下獨立按鍵INT1,可以切換回“鈴兒響叮當”。
- 代碼
?
#include <reg52.h>
sbit SPK = P1 ^ 2; //定義喇叭接口
sbit KEY = P3 ^ 3; //設置獨立按鍵INT1,按下按鍵時切換歌曲
sbit LED = P1 ^ 7; //用于切換歌曲的顯示,當LED = 1時播放鈴兒響叮當,否則播放Spider Dance
int Timer0_H, Timer0_L, Time; //定義定時器變量和時間變量
code unsigned char MUSIC1[] = { //歌曲“鈴兒響叮當”的樂譜,每個音由3個變量構(gòu)成,前兩個變量用來確定音樂頻率,第三個變量確定持續(xù)時間
3,2,2,3,2,2, 3,2,4, 3,2,2,3,2,2, 3,2,4,
3,2,2,5,2,2, 1,2,3,2,2,1, 3,2,8,
4,2,2,4,2,2, 4,2,2,4,2,2, 4,2,2,3,2,2, 3,2,2,3,2,2,
5,2,2,5,2,2, 4,2,2,2,2,2, 1,2,4, 1,3,4, 0,0,0
};
code unsigned char MUSIC2[] = { //歌曲“Spider Dance”的樂譜,如果前兩個變量為(0,0)時則為空拍
6,3,4, 3,3,4, 1,3,4, 6,2,4,
0,0,2, 2,3,2, 2,3,2, 0,0,4, 2,3,2, 1,3,2, 5,2,2, 6,2,2,
0,0,2, 3,3,2, 2,3,2, 1,3,2, 2,3,2, 3,3,2, 5,2,2, 6,2,2,
1,3,2, 6,2,2, 5,2,2, 6,3,2, 0,0,2, 5,3,2, 3,3,1, 2,3,1, 1,3,2,
6,2,4, 4,2,4, 7,2,4, 4,2,4,
1,3,4, 4,2,4, 2,3,8,
3,3,4, 2,3,4, 6,3,4, 3,3,4,
5,3,4, 4,3,4, 3,3,4, 0,0,4,
6,3,2, 3,4,2, 2,4,2, 3,4,2, 6,3,2, 3,4,2, 2,4,2, 3,4,2,
3,3,2, 2,4,2, 2,4,2, 2,4,2, 3,3,2, 3,4,2, 7,3,2, 2,4,2,
6,3,2, 3,4,2, 2,4,2, 3,4,2, 7,3,2, 3,4,2, 2,4,2, 3,4,2,
1,4,2, 3,4,2, 2,4,2, 3,4,2, 2,4,2, 4,4,2, 3,4,2, 4,4,2,
4,3,2, 1,4,2, 7,3,2, 1,4,2, 4,3,2, 2,4,2, 1,4,2, 2,4,2,
4,3,2, 3,4,2, 2,4,2, 3,4,2, 4,3,2, 4,4,2, 3,4,2, 4,4,2, 0,0,0
};
code unsigned char FREQH[]= { //頻率表前八位,第0行頻率為低兩個8度的音,第1行頻率為低一個8度的音,第2行為正常音,第3行為高8度的音
//(抱歉,樂理基礎沒學好,音的標準說法忘了咋說了,懂意思就好)
// 比如說正常音la,持續(xù)時間為2,那就是(6,2,2)
0xF2,0XF3,0xF5,0xF5,0XF6,0XF7,0XF8,
0xF9,0XF9,0XFA,0XFA,0XFB,0XFB,0XFC,0XFC,
0xFC,0XFD,0XFD,0XFD,0XFD,0XFE,
0xFE,0XFE,0XFE,0XFE,0XFE,0XFE,0XFF
};
code unsigned char FREQL[]= { //頻率表后八位
0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F,
0xEE,0x44,0x6B,0xB4,0xF4,0x2D,
0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16
};
void DelayUs2x(unsigned char t) //延遲函數(shù)
{
while (--t)
{
}
}
void DelayMs(unsigned char t) //延遲時間函數(shù),略微修改,時間不準
{
while (--t)
{
DelayUs2x(245);
}
}
void delay(unsigned char t) //延遲時間函數(shù)
{
unsigned char i;
for (i = 0; i < t; i++)
DelayMs(125);
TR0 = 0;
}
void Init_Timer0(void) //定時器初始化函數(shù)
{
TMOD |= 0x01; //模式1,16位定時器/計數(shù)器
EA = 1; //總中斷打開
ET0 = 1; //定時器中斷打開
}
void TIM0_ISR() interrupt 1 //定時器中斷函數(shù),用于讀取音符頻率值,產(chǎn)生對應的音符
{
TR0 = 0; //定時器暫停
SPK = !SPK; //喇叭反轉(zhuǎn)
TH0 = Timer0_H; //重置定時
TL0 = Timer0_L;
TR0 = 1; //定時器開始
}
void Song()
{
if (Timer0_H == -1 && Timer0_L == -1) //空拍判斷,喇叭不發(fā)聲
{
delay(Time);
}
else
{
TH0 = Timer0_H; //重置定時
TL0 = Timer0_L;
TR0 = 1;
delay(Time);
}
}
void main(void)
{
unsigned char k, i;
Init_Timer0();
KEY = 1;
LED = 1;
while (1)
{
i = 0;
if (LED) //播放“鈴兒響叮當”
{
while (i < 76) //這個數(shù)字是MUSIC數(shù)組里的變量數(shù)
{
k = MUSIC1[i] + 7 * MUSIC1[i + 1] - 1;//頻率位置,用兩個變量進行判斷
Timer0_H = FREQH[k];// 獲取頻率高八位
Timer0_L = FREQL[k];// 獲取頻率低八位
Time = MUSIC1[i + 2];// 獲取持續(xù)時間
i += 3;
Song();
if (!KEY) //判斷獨立按鍵按下
{
while (!KEY) //判斷按鍵釋放
{ }
LED = !LED; //切歌
break;
}
}
}
else
{
while (i < 280) //播放“Spider Dance”
{
k = MUSIC2[i] + 7 * MUSIC2[i + 1] - 1;
Timer0_H = FREQH[k];
Timer0_L = FREQL[k];
Time = MUSIC2[i + 2];
i += 3;
Song();
if (!KEY)
{
while (!KEY)
{ }
LED = !LED;
break;
}
}
}
}
}
?文章來源地址http://www.zghlxwxcb.cn/news/detail-568245.html
到了這里,關于【AT89C52單片機項目】音樂播放器的設計的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!