博客
关于我
51单片机 音乐播放器
阅读量:362 次
发布时间:2019-03-04

本文共 10233 字,大约阅读时间需要 34 分钟。

//宏定义部分
#define L1 262 //低音1
#define L2 286 //低音2
#define L3 311 //低音3
#define L4 349 //低音4
#define L5 392 //低音5
#define L6 440 //低音6
#define L7 494 //低音7
#define Z1 523 //中音1
#define Z2 587 //中音2
#define Z3 659 //中音3
#define Z4 698 //中音4
#define Z5 784 //中音5
#define Z6 880 //中音6
#define Z7 987 //中音7
#define H1 1046 //高音1
#define H2 1174 //高音2
#define H3 1318 //高音3
#define H4 1396 //高音4
#define H5 1567 //高音5
#define H6 1760 //高音6
#define H7 1975 //高音7
//硬件端口定义
sbit sound = P1 ^ 4; //蜂鸣器
sbit KAISHI = P1 ^ 0; //开始
sbit ZANTING = P1 ^ 1; //暂停
sbit PRE_KEY = P1 ^ 2; //上一首
sbit NEXT_KEY = P1 ^ 3; //下一首
sbit yianjian = P1 ^ 5; //选择第1首歌的按键
sbit eranjian = P1 ^ 6; //选择第2首歌的按键
sbit sananjian = P1 ^ 7; //选择第3首歌的按键
//程序变量定义
unsigned int C;
unsigned char u, t;
unsigned char velocity = 60; //100ms一个拍子
unsigned char press_key = 0; //按键按下状态
unsigned char open_flag = 1; //1表示正在播放
unsigned char music_crr = 0; //当前播放的音乐编号(0、1、2)
//音乐节拍定义
unsigned int code music0[] = {
Z6, Z7, H1, Z7, H1, H3,
Z7, Z3, Z3, Z6, Z5, Z6,
H1, Z5, Z3, Z3, Z4, Z3,
Z4, H1, Z3, H1, H1, H1,
Z7, Z4, Z4, Z7, Z7, Z6,
Z7, H1, Z7, H1, H3, Z7,
Z3, Z3, Z6, Z5, Z6, Z5,
Z3, Z3, Z4, H1, Z7, H1,
H2, H2, H2, H1, H1, Z6,
Z6, Z5, Z6, H1, Z5, Z3,
Z4, H1, Z7, H1, H2, H5,
H5, H2, Z5, Z5, Z6, Z6,
Z3, Z2, Z3, Z5, Z3, Z2,
Z1, Z1, Z2, Z1, 0xff
};
unsigned char code music0_JP[] = {
4, 4, 12, 4, 8, 8,
20, 4, 4, 12, 4, 8, 8,
20, 4, 4, 4, 12, 4, 8, 8,
20, 4, 4, 4, 4, 8, 4, 2, 2, 4, 2, 2,
8, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 8, 8, 8, 2, 2,
2, 2, 4, 4, 8, 8, 2, 2, 2, 2, 2, 2, 4, 12, 8, 8
};
unsigned int code music1[] = {
Z3, Z3, Z5, Z6, H1, H1,
Z6, Z5, Z5, Z6, Z5, Z3,
Z3, Z3, Z5, Z6, H1, H1,
Z6, Z5, Z5, Z6, Z5, Z3,
Z3, Z2, Z3, Z5, Z3, Z2,
Z1, Z1, Z2, Z1, 0xff
};
unsigned char code music1_JP[] = {
16, 8, 8, 8, 8, 8, 8,
16, 8, 8, 32, 16, 8, 8, 32,
16, 16, 16, 8, 8, 16, 16, 32,
16, 8, 8, 16, 8, 8, 32, 1, 8, 8
};
unsigned int code music2[] = {
H3, H3, H3, H2, H1, H2, H5, H5, H1, H1, H1, H1, Z6,
Z7, H3, H3, Z5, Z6, H6, H5, H4, H3, H2, H1, H1,
Z6, H1, H2, H5, H5, H2, H1, H2, H2, Z1, H3, H3,
H3, H2, H1, H2, H5, H5, H1, H1, H1, H1, Z6, Z7,
H3, H3, Z5, Z6, H6, H5, H4, H3, H2, H1, H1, Z6,
H1, H2, H5, H5, H2, H1, H2, H2, Z1, H3, H3,
H3, H2, H1, H2, H5, H5, H1, H1, H1, H1, Z6, Z7,
H3, H3, Z5, Z6, H6, H5, H4, H3, H2, H1, H1, Z6,
H1, H2, H5, H5, H2, H1, H2, H2, Z1, H3, H3,
H3, H2, H1, H2, H5, H5, H1, H1, H1, H1, Z6, Z7,
H3, H3, Z5, Z6, H6, H5, H4, H3, H2, H1, H1, Z6,
H1, H2, H5, H5, H2, H1, H2, H2, Z1, H3, H3,
H3, H2, H1, H2, H5, H5, H1, H1, H1, H1, Z6, Z7,
H3, H3, Z5, Z6, H6, H5, H4, H3, H2, H1, H1, Z6,
H1, H2, H5, H5, H2, H1, H2, H2, Z1, H3, H3,
H3, H2, H1, H2, H5, H5, H1, H1, H1, H1, Z6, Z7,
H3, H3, Z5, Z6, H6, H5, H4, H3, H2, H1, H1, Z6,
H1, H2, H5, H5, H2, H1, H2, H2, Z1, H3, H3,
H3, H2, H1, H2, H5, H5, H1, H1, H1, H1, Z6, Z7,
H3, H3, Z5, Z6, H6, H5, H4, H3, H2, H1, H1, Z6,
H1, H2, H5, H5, H2, H1, H2, H2, Z1, H3, H3,
H3, H2, H1, H2, H5, H5, H1, H1, H1, H1, Z6, Z7,
H3, H3, Z5, Z6, H6, H5, H4, H3, H2, H1, H1, Z6,
H1, H2, H5, H5, H2, H1, H2, H2, Z1, H3, H3,
H3, H2, H1, H2, H5, H5, H1, H1, H1, H1, Z6, Z7,
H3, H3, Z5, Z6, H6, H5, H4, H3, H2, H1, H1, Z6,
H1, H2, H5, H5, H2, H1, H2, H2, Z1, H3, H3,
H3, H2, H1, H2, H5, H5, H1, H1, H1, H1, Z6, Z7,
H3, H3, Z5, Z6, H6, H5, H4, H3, H2, H1, H1, Z6,
H1, H2, H5, H5, H2, H1, H2, H2, Z1, H3, H3,
H3, H2, H1, H2, H5, H5, H1, H1, H1, H1, Z6, Z7,
H3, H3, Z5, Z6, H6, H5, H4, H3, H2, H1, H1, Z6
};
unsigned char code music2_JP[] = {
8, 2, 2, 2, 2, 4, 4, 8,
8, 2, 2, 2, 2, 4, 4, 4, 4, 8, 4, 2, 2, 4, 2, 2,
8, 2, 2, 2, 2, 2, 2, 2, 8, 8, 8, 2, 2, 2, 2, 4, 4, 8, 8, 2, 2,
2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, 8, 8, 2, 2, 2, 2, 4, 4, 8, 8, 2, 2,
2, 2, 4, 4, 8, 4, 2, 2, 4, 2, 2, 8, 2, 2, 2, 2, 2, 2, 2, 2, 8, 8, 8, 2, 2,
2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, 8, 8, 2, 2, 2, 2, 4, 4, 8, 8, 2, 2,
2, 2, 4, 4, 8, 4, 2, 2, 4, 2, 2, 8, 2, 2, 2, 2, 2, 2, 2, 2, 8, 8, 8, 2, 2,
2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, 8, 8, 2, 2, 2, 2, 4, 4, 8, 8, 2, 2,
2, 2, 4, 4, 8, 4, 2, 2, 4, 2, 2, 8, 2, 2, 2, 2, 2, 2, 2, 2, 8, 8, 8, 2, 2,
2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, 8, 8, 2, 2, 2, 2, 4, 4, 8, 8, 2, 2,
2, 2, 4, 4, 8, 4, 2, 2, 4, 2, 2, 8, 2, 2, 2, 2, 2, 2, 2, 2, 8, 8, 8, 2, 2,
2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, 8, 8, 2, 2, 2, 2, 4, 4, 8, 8, 2, 2,
2, 2, 4, 4, 8, 4, 2, 2, 4, 2, 2, 8, 2, 2, 2, 2, 2, 2, 2, 2, 8, 8, 8, 2, 2
};
//延时函数
void delay(uint z) {
uint x;
while (z--) {
for (x = 125; x > 0; x--) {
;
}
}
}
void delay1() {
uint i, j;
for (i = 0; i < velocity; i++) {
for (j = 0; j < 125; j++) {
;
}
}
}
void init_timer() {
EA = 1; //总中断使能
ET1 = 1; //定时器T1中断允许
TMOD &= 0x0f; //清除TMOD的低4位
TMOD |= 0x01; //使用定时器T1的模式1(13位计数器)
TR1 = 1; //启动定时器T1
ET0 = 1; //定时器T0中断允许
}
unsigned char ScanKey() {
if (KAISHI == 0) {
delay(1);
if (KAISHI == 0) {
while (KAISHI == 0) {
return 1;
}
}
}
if (ZANTING == 0) {
delay(1);
if (ZANTING == 0) {
while (ZANTING == 0) {
return 2;
}
}
}
if (PRE_KEY == 0) {
delay(1);
if (PRE_KEY == 0) {
while (PRE_KEY == 0) {
return 3;
}
}
}
if (NEXT_KEY == 0) {
delay(1);
if (NEXT_KEY == 0) {
while (NEXT_KEY == 0) {
return 4;
}
}
}
if (yianjian == 0) {
delay(1);
if (yianjian == 0) {
while (yianjian == 0) {
return 5;
}
}
}
if (eranjian == 0) {
delay(1);
if (eranjian == 0) {
while (eranjian == 0) {
return 6;
}
}
}
if (sananjian == 0) {
delay(1);
if (sananjian == 0) {
while (sananjian == 0) {
return 7;
}
}
}
return 0;
}
void delay_key() {
if (press_key == 1) {
open_flag = 1;
press_key = 0;
}
if (press_key == 2) {
open_flag = 0;
press_key = 0;
}
if (press_key == 3) {
press_key = 0;
if (music_crr > 0) {
music_crr = (music_crr - 1) % 3;
} else {
music_crr = 2;
}
LCD_write_char(9, 0, music_crr + '1');
rtc_hour = 0;
rtc_min = 0;
rtc_sec = 0;
}
if (press_key == 4) {
press_key = 0;
music_crr = (music_crr + 1) % 3;
LCD_write_char(9, 0, music_crr + '1');
rtc_hour = 0;
rtc_min = 0;
rtc_sec = 0;
}
if (press_key == 5) {
press_key = 0;
music_crr = 0;
LCD_write_char(9, 0, music_crr + '1');
rtc_hour = 0;
rtc_min = 0;
rtc_sec = 0;
open_flag = 1;
}
if (press_key == 6) {
press_key = 0;
music_crr = 1;
LCD_write_char(9, 0, music_crr + '1');
rtc_hour = 0;
rtc_min = 0;
rtc_sec = 0;
open_flag = 1;
}
if (press_key == 7) {
press_key = 0;
music_crr = 2;
LCD_write_char(9, 0, music_crr + '1');
rtc_hour = 0;
rtc_min = 0;
rtc_sec = 0;
open_flag = 1;
}
if (open_flag == 1) {
TR0 = 1;
} else {
TR0 = 0;
}
LCD_dis_TIME(6, 1, rtc_hour, rtc_min, rtc_sec);
}
void main() {
LCD_init();
LCD_write_str(0, 0, " WELCOME!");
delay(1000);
LCD_write_str(0, 0, "Playing: ");
LCD_write_char(9, 0, '1');
LCD_write_str(0, 1, "Time:");
LCD_dis_TIME(6, 1, rtc_hour, rtc_min, rtc_sec);
init_timer();
TR1 = 0;
sound = 0;
open_flag = 0;
TR0 = 0;
LCD_dis_TIME(6, 1, rtc_hour, rtc_min, rtc_sec);
while (1) {
press_key = ScanKey();
delay_key();
if (music_crr == 0 && open_flag == 1) {
u = 0;
changdu = sizeof(music0);
while (music0[u] != 0xff) {
press_key = ScanKey();
delay_key();
if (music_crr != 0) {
init_timer();
TR1 = 0;
sound = 1;
break;
}
if (open_flag == 0) {
while (open_flag == 0) {
press_key = ScanKey();
delay_key();
}
}
C = 460830 / music0[u];
TH1 = (8192 - C) / 32;
TL1 = (8192 - C) % 32;
TR1 = 1;
changdu--;
for (t = 0; t < music0_JP[u]; t++) {
delay1();
}
TR1 = 0;
u++;
}
init_timer();
TR1 = 0;
sound = 1;
}
if (music_crr == 1 && open_flag == 1) {
u = 0;
changdu = sizeof(music1);
while (music1[u] != 0xff) {
press_key = ScanKey();
delay_key();
if (music_crr != 1) {
init_timer();
TR1 = 0;
sound = 1;
break;
}
if (open_flag == 0) {
while (open_flag == 0) {
press_key = ScanKey();
delay_key();
}
}
C = 460830 / music1[u];
TH1 = (8192 - C) / 32;
TL1 = (8192 - C) % 32;
TR1 = 1;
changdu--;
for (t = 0; t < music1_JP[u]; t++) {
delay1();
}
TR1 = 0;
u++;
}
init_timer();
TR1 = 0;
sound = 1;
}
if (music_crr == 2 && open_flag == 1) {
u = 0;
changdu = sizeof(music2);
while (music2[u] != 0xff) {
press_key = ScanKey();
delay_key();
if (music_crr != 2) {
init_timer();
TR1 = 0;
sound = 1;
break;
}
if (open_flag == 0) {
while (open_flag == 0) {
press_key = ScanKey();
delay_key();
}
}
C = 460830 / music2[u];
TH1 = (8192 - C) / 32;
TL1 = (8192 - C) % 32;
TR1 = 1;
changdu--;
for (t = 0; t < music2_JP[u] / 2; t++) {
delay1();
}
TR1 = 0;
u++;
}
init_timer();
TR1 = 0;
sound = 1;
}
}
}
void Time1() interrupt 3 {
sound = !sound;
TH1 = (8192 - C) / 32;
TL1 = (8192 - C) % 32;
}
void Time0() interrupt 1 {
TH0 = (65535 - 50000) / 255;
TL0 = (65535 - 50000) % 255;
num2++;
if (num2 == 20) {
num2 = 0;
rtc_sec++;
if (rtc_sec == 60) {
rtc_sec = 0;
rtc_min++;
if (rtc_min == 60) {
rtc_min = 0;
rtc_hour++;
if (rtc_hour == 24) {
rtc_hour = 0;
}
}
}
}
}

转载地址:http://fkce.baihongyu.com/

你可能感兴趣的文章
NuGet学习笔记001---了解使用NuGet给net快速获取引用
查看>>
nullnullHuge Pages
查看>>
NullPointerException Cannot invoke setSkipOutputConversion(boolean) because functionToInvoke is null
查看>>
null可以转换成任意非基本类型(int/short/long/float/boolean/byte/double/char以外)
查看>>
Number Sequence(kmp算法)
查看>>
Numix Core 开源项目教程
查看>>
numpy
查看>>
Numpy 入门
查看>>
NumPy 库详细介绍-ChatGPT4o作答
查看>>
NumPy 或 Pandas:将数组类型保持为整数,同时具有 NaN 值
查看>>
numpy 或 scipy 有哪些可能的计算可以返回 NaN?
查看>>
numpy 数组 dtype 在 Windows 10 64 位机器中默认为 int32
查看>>
numpy 数组与矩阵的乘法理解
查看>>
NumPy 数组拼接方法-ChatGPT4o作答
查看>>
numpy 用法
查看>>
Numpy 科学计算库详解
查看>>
Numpy.fft.fft和numpy.fft.fftfreq有什么不同
查看>>
numpy.linalg.norm(求范数)
查看>>
Numpy.ndarray对象不可调用
查看>>
Numpy.VisibleDeproationWarning:从不整齐的嵌套序列创建ndarray
查看>>