设计一个用串口控制的音乐播放器。 要求: 通过串口接收要播放的音符,do、re、mi、fa、sol、la、ti和高音do分别用数字1~8表示 收到音符后自动播放,每个音符的音长为0.25s 可在播放的同时接收新的音符,支持单个和批量发送 在六位七段数码管上显示播放的音符,当前播放的显示在最右侧。给出具体步骤和代码
时间: 2024-03-02 15:50:28 浏览: 149
步骤如下:
1. 硬件准备
* 音乐模块(如DFPlayer Mini)
* 六位七段数码管
* Arduino开发板
* 杜邦线等
2. 软件设计
* 安装并引用DFPlayer Mini库
* 设置串口通信
* 解析接收到的音符指令
* 播放音符
* 显示当前播放的音符
具体代码如下:
```c++
#include <SoftwareSerial.h>
#include <DFRobotDFPlayerMini.h>
SoftwareSerial mySerial(10, 11); // 串口通信引脚
DFRobotDFPlayerMini myDFPlayer; // DFPlayer Mini对象
int notes[8] = {262, 294, 330, 349, 392, 440, 494, 523}; // 音符对应的频率
int noteIndex = 0; // 当前播放的音符下标
void setup() {
mySerial.begin(9600); // 串口通信初始化
Serial.begin(9600);
while (!Serial); // 等待串口连接
myDFPlayer.begin(mySerial); // DFPlayer Mini初始化
myDFPlayer.volume(20); // 设置音量
}
void loop() {
if (mySerial.available()) {
String noteStr = mySerial.readStringUntil('\n'); // 读取串口数据
if (noteStr.length() == 1 && noteStr[0] >= '1' && noteStr[0] <= '8') {
noteIndex = noteStr[0] - '1'; // 解析音符指令
myDFPlayer.playMp3Folder(noteIndex + 1); // 播放音符
}
}
displayNote(); // 显示当前播放的音符
}
void displayNote() {
static uint32_t lastTime = 0; // 记录上一次显示的时间
static uint8_t digitIndex = 0; // 当前显示的位数
static uint8_t digitValue = 0; // 当前显示的数字
if (millis() - lastTime >= 250) { // 每0.25s更新一次显示
lastTime = millis();
digitValue = notes[noteIndex] / 100; // 获取当前播放的音符的百位数
if (digitIndex == 0) {
digitalWrite(2, HIGH); // 使能第一位数码管
digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, LOW); // 其余三位数码管不使能
displayDigit(digitValue); // 显示百位数
} else if (digitIndex == 1) {
digitalWrite(2, LOW); digitalWrite(3, HIGH); // 使能第二位数码管
displayDigit(notes[noteIndex] / 10 % 10); // 显示十位数
} else if (digitIndex == 2) {
digitalWrite(3, LOW); digitalWrite(4, HIGH); // 使能第三位数码管
displayDigit(notes[noteIndex] % 10); // 显示个位数
} else if (digitIndex == 3) {
digitalWrite(4, LOW); digitalWrite(5, HIGH); // 使能第四位数码管
displayDigit(noteIndex + 1); // 显示当前播放的音符
}
digitIndex++;
if (digitIndex > 3) digitIndex = 0; // 显示完四位数后重新开始
}
}
void displayDigit(uint8_t digit) {
digitalWrite(8, HIGH); // 数码管段码为低电平有效,因此先将所有段码置高电平
switch (digit) {
case 0: digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); digitalWrite(12, LOW); digitalWrite(13, LOW); digitalWrite(7, LOW); break;
case 1: digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, HIGH); digitalWrite(12, HIGH); digitalWrite(13, HIGH); digitalWrite(7, HIGH); break;
case 2: digitalWrite(9, LOW); digitalWrite(10, HIGH); digitalWrite(11, LOW); digitalWrite(12, LOW); digitalWrite(13, HIGH); digitalWrite(7, LOW); break;
case 3: digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); digitalWrite(12, HIGH); digitalWrite(13, HIGH); digitalWrite(7, LOW); break;
case 4: digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, HIGH); digitalWrite(12, HIGH); digitalWrite(13, LOW); digitalWrite(7, LOW); break;
case 5: digitalWrite(9, HIGH); digitalWrite(10, LOW); digitalWrite(11, LOW); digitalWrite(12, HIGH); digitalWrite(13, LOW); digitalWrite(7, LOW); break;
case 6: digitalWrite(9, HIGH); digitalWrite(10, LOW); digitalWrite(11, LOW); digitalWrite(12, LOW); digitalWrite(13, LOW); digitalWrite(7, LOW); break;
case 7: digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, HIGH); digitalWrite(12, HIGH); digitalWrite(13, HIGH); digitalWrite(7, LOW); break;
case 8: digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); digitalWrite(12, LOW); digitalWrite(13, LOW); digitalWrite(7, LOW); break;
case 9: digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); digitalWrite(12, HIGH); digitalWrite(13, LOW); digitalWrite(7, LOW); break;
}
}
```
以上就是用串口控制的音乐播放器的具体步骤和代码。
阅读全文