利用C程序实现音乐点唱功能及几种案例分享
1、快乐点唱机实验
/* ch09-5-4.c_ 快乐点唱机实验 */
#include
sbit buzzer = P3^7; // 声明输出端
unsigned char keys,i; // 声明按钮及播放谱变量
unsigned char tone_H, tone_L; // 声明计时量变量
void beat_125(unsigned char); // 声明节拍函数
unsigned char code song1[]={ 1, 1, 2, 1, 4, 3, 1, 1, 2, 1, 5, 4,
1, 1, 8, 6, 4, 3, 2, 11, 11, 6, 4, 5, 4, 15 };
unsigned char code beat1[]={ 4, 4, 8, 8, 8, 16, 4, 4, 8, 8, 8, 16,
4, 4, 8, 8, 8, 8, 8, 4, 4, 8, 8, 8, 16 };
unsigned char code song2[]={ 1, 1, 1, 3, 2, 1, 3, 3, 3, 5, 4, 3, 5, 4, 3, 2,
2, 1, 0, 1, 2, 3, 4, 3, 2, 3, 4, 5, 5, 4, 3, 2, 1, 15};
unsigned char code beat2[]={ 4, 4, 4, 6, 2, 4, 4, 4, 4, 6, 2, 4, 4, 4, 4, 12 ,
8, 2, 2, 4, 4, 4, 8, 2, 2, 4, 4, 4, 2, 2, 4, 4, 12 };
unsigned char code song3[]={ 8, 7, 6, 5, 5, 6, 8, 5, 6, 5, 3, 2, 5, 3, 12,
8, 7, 6, 5, 5, 6, 8, 5, 6, 5, 3, 2, 5, 1, 12,
2, 3, 2, 5, 6, 5, 6, 8, 9, 8, 7, 6, 9, 5, 12,
6, 8, 5, 6, 3, 5, 6, 5, 3, 2, 3, 5, 3, 2, 1, 0, 15 };
unsigned char code beat3[]={ 8, 4, 4, 8, 8, 8, 8, 16, 8, 4, 4, 8, 8, 24, 8,
8, 4, 4, 8, 8, 8, 8, 16, 8, 4, 4, 8, 8, 24, 8,
8, 4, 4, 16, 8, 4, 4, 16, 8, 4, 4, 8, 8, 24, 8,
8, 8, 8, 8, 8, 4, 4, 8, 8, 8, 4, 4, 8, 8, 24, 8 };
unsigned char code song4[]={ 2, 2, 3, 5, 6, 5, 6, 7, 9, 7, 7, 6, 5, 6,
7, 9, 9, 7, 9, 5, 6, 6, 2, 7, 7, 6, 5, 5,
6, 6, 7, 6, 5, 3, 2, 3, 5, 3, 5, 6, 7, 9,
9, 9, 10, 9, 7, 7, 6, 5, 3, 2, 7, 7, 6, 5, 5, 15};
unsigned char code beat4[]={ 12, 4, 8, 8, 8, 4, 4, 16, 12, 4, 4, 4, 8, 32,
12, 4, 8, 4, 4, 12, 4, 16, 12, 4, 8, 4, 4, 32,
12, 4, 8, 4, 4, 8, 4, 4, 16, 12, 8, 8, 8, 32,
12, 4, 8, 4, 4, 8, 4, 4, 16, 12, 4, 8, 4, 4, 32 };
unsigned int code tone[]={ 1012, 956, 852, 759, 716, 638,
568, 506, 478, 426, 379,531, 10 };//音阶定义
void play1(void); // 声明play1函数
void play2(void); // 声明play2函数
void play3(void); // 声明play3函数
void play4(void); // 声明play4函数
void beat_125(unsigned char); // 声明节拍函数
//================================================
main()
{ buzzer=1; // 蜂 器初始值
IE=0x82; // 启用Timer 0
TMOD=0x01; // 设定MODE1
while (1) // while循环
{ P2=0xff; // 将Port2规划为输入埠
keys=~P2; // 读取按钮
switch (keys) // 判读
{ case 0x01: play1(); break; // 按下S1,播放第一首歌
case 0x02: play2(); break; // 按下S2,播放第二首歌
case 0x04: play3(); break; // 按下S3,播放第三首歌
case 0x08: play4(); break; // 按下S4,播放第四首歌
} buzzer=1; // 蜂 器不动作
} // while循环结束
} // 主程序结束
//==第一首歌=================================
void play1(void)
{ i=0;
while(song1[i]!=15) // while循环开始
{ tone_H=(65536-tone[song1[i]])/256;// 读取音阶计数量之高八位元
tone_L=(65536-tone[song1[i]])%256;// 读取音阶计数量之低八位元
TH0=tone_H; // 填入音阶计数量之高八位元
TL0=tone_L; // 填入音阶计数量之低八位元
TR0=1; // 启动Timer 0
beat_125(beat1[i]); // 指定节拍
i++; // 下一个音
TR0=0; // 关闭Timer 0
} // 结束播放
}
//==第二首歌=================================
void play2(void)
{ i=0;
while(song2[i]!=15) // while循环开始
{ tone_H=(65536-tone[song2[i]])/256;// 读取音阶计数量之高八位元
tone_L=(65536-tone[song2[i]])%256;// 读取音阶计数量之低八位元
TH0=tone_H; // 填入音阶计数量之高八位元
TL0=tone_L; // 填入音阶计数量之低八位元
TR0=1; // 启动Timer 0
beat_125(beat2[i]); // 指定节拍
i++; // 下一个音
TR0=0; // 关闭Timer 0
}
} // 结束播放
//==第三首歌=================================
void play3(void)
{ i=0;
while(song3[i]!=15) // while循环开始
{ tone_H=(65536-tone[song3[i]])/256;// 读取音阶计数量之高八位元
tone_L=(65536-tone[song3[i]])%256;// 读取音阶计数量之低八位元
TH0=tone_H; // 填入音阶计数量之高八位元
TL0=tone_L; // 填入音阶计数量之低八位元
TR0=1; // 启动Timer 0
beat_125(beat3[i]); // 指定节拍
i++; // 下一个音
TR0=0; // 关闭Timer 0
}
} // 结束播放
//==第四首歌=================================
void play4(void)
{ i=0;
while(song4[i]!=15) // while循环开始
{ tone_H=(65536-tone[song4[i]])/256;// 读取音阶计数量之高八位元
tone_L=(65536-tone[song4[i]])%256;// 读取音阶计数量之低八位元
TH0=tone_H; // 填入音阶计数量之高八位元
TL0=tone_L; // 填入音阶计数量之低八位元
TR0=1; // 启动Timer 0
beat_125(beat4[i]); // 指定节拍
i++; // 下一个音
TR0=0; // 关闭Timer 0
}
} // 结束播放
//====Timer 0中断子程序==================
void tone_timer(void) interrupt 1 // Timer 0中断子程序开始
{ TH0=tone_H; // 填入计时量之高八位元
TL0=tone_L; // 填入计时量之低八位元
buzzer=~buzzer; // 蜂 器反相输出
} // 结束中断子程序
//====节拍函数==================
void beat_125(unsigned char x) // 节拍函数开始
{ unsigned char i,j,k; // 声明变量
for (i=0;i
for (j=0;j<125;j++) // j循环
for (k=0;k<120;k++);// k循环
} // 结束节拍函数
2、生日快乐歌实验
/* 生日快乐歌实验(ch09-5-3.c) */
#include
sbit buzzer = P3^7; // 声明输出端
unsigned char i=0; // 声明变量
unsigned char tone_H, tone_L; // 声明计时量变量
void beat_125(unsigned char); // 声明节拍函数
unsigned char code song[]={ 1, 1, 2, 1, 4, 3, 1, 1, 2, 1, 5, 4,
1, 1, 8, 6, 4, 3, 2, 11, 11, 6, 4, 5, 4, 15};//歌曲
unsigned char code beat[]={ 4, 4, 8, 8, 8, 16, 4, 4, 8, 8, 8, 16,
4, 4, 8, 8, 8, 8, 8, 4, 4, 8, 8, 8, 16}; //节拍
unsigned int code tone[]={ 1012, 956, 852, 759, 716, 638, // 中音Si ̄So
568, 506, 478, 426, 379, 536, 10 }; //音阶定义
// ========主程式 ===============
main()
{ buzzer=1; // 蜂鸣器初始值
IE=0x82; // 启用Timer 0
TMOD=0x01; // 设定MODE1
while(song[i]!=15) // while循环开始
{ TH0=tone_H=(65536-tone[song[i]])/256; //填入音阶计数量之高八位元
TL0= tone_L=(65536-tone[song[i]]) % 256;//填入音阶计数量之低八位元
TR0=1; // 启动Timer 0
beat_125(beat[i]); // 指定节拍
i++; // 下一个音
TR0=0; // 关闭T0停止播放
buzzer=1; // 蜂鸣器不动作
} // 结束播放
} // 主程式结束
//====Timer 0中断副程式==================
void tone_timer(void) interrupt 1 // Timer 0中断副程式开始
{ TH0=tone_H; // 填入计时量之高八位元
TL0=tone_L; // 填入计时量之低八位元
buzzer=~buzzer; // 蜂 器反相输出
} // 结束中断副程式
//====节拍函数==================
void beat_125(unsigned char x) // 节拍函数开始
{ unsigned char i,j,k; // 声明变量
for (i=0;i
for (j=0;j<125;j++) // j循环
for (k=0;k<120;k++); // k循环
} // 结束节拍函数
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉