#include <reg52.h>
sbit SPK = P1 ^ 2; //定義喇叭接口
sbit KEY = P3 ^ 3; //設(shè)置獨(dú)立按鍵INT1,按下按鍵時切換歌曲
sbit LED = P1 ^ 7; //用于切換歌曲的顯示,當(dāng)LED = 1時播放鈴兒響叮當(dāng),否則播放Spider Dance
int Timer0_H, Timer0_L, Time; //定義定時器變量和時間變量
code unsigned char MUSIC1[] = { //歌曲“鈴兒響叮當(dāng)”的樂譜,每個音由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度的音
//(抱歉,樂理基礎(chǔ)沒學(xué)好,音的標(biāo)準(zhǔn)說法忘了咋說了,懂意思就好)
// 比如說正常音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ù),略微修改,時間不準(zhǔn)
{
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位定時器/計(jì)數(shù)器
EA = 1; //總中斷打開
ET0 = 1; //定時器中斷打開
}
void TIM0_ISR() interrupt 1 //定時器中斷函數(shù),用于讀取音符頻率值,產(chǎn)生對應(yīng)的音符
{
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) //播放“鈴兒響叮當(dāng)”
{
while (i < 76) //這個數(shù)字是MUSIC數(shù)組里的變量數(shù)
{
k = MUSIC1[i] + 7 * MUSIC1[i + 1] - 1;//頻率位置,用兩個變量進(jìn)行判斷
Timer0_H = FREQH[k];// 獲取頻率高八位
Timer0_L = FREQL[k];// 獲取頻率低八位
Time = MUSIC1[i + 2];// 獲取持續(xù)時間
i += 3;
Song();
if (!KEY) //判斷獨(dú)立按鍵按下
{
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;
}
}
}
}
}
錯誤: Build target 'Target 1'
compiling aaaaa.c...
AAAAA.C(33): error C141: syntax error near ';'
AAAAA.C(34): error C141: syntax error near ';'
Target not created |