📄 main.c
字号:
//--------------------------- 实验程序名称:MP3播放器 ------------------------------
//
//开发平台:ATmega16教学实验板
//外设使用:1. T/C0定时器 2. AD模数转换(通道7) 3. SPI总线
//模块使用:1.AD键盘 2.SD卡 3.VS1003模块
//频率:外频16MHz
//电压:3.3V
//
//存储体:SD卡
//文件系统:FAT32
//显示器:不带
//音乐文件:SD卡上命名“音乐”文件夹,在“音乐”文件夹内存储歌曲,格式为“MP3“。
//按键操作: | Key6 | Key5 | Key4 | Key3 | Key2 | Key1 |
// | 播放 | 停止 | 上一首 | 音量+ | 音量- | 下一首 |
//
//原理:使用ATmega16读取SD卡中音乐文件传输到VS1003进行解码播放。
//重点:1.文件系统 2.SD卡驱动
//
//作者:廖华明(师兄)
//日期:2009.7.8
//
//----------------------------------------------------------------------------------
#include "SPI.h"
#include "Usart.h"
#include "fat.h"
#include "vs1003.h"
#include "AD_key.h"
//-------------- 音乐播放程序 -------------------//
void VS1003_Play(void);
//----------------- ------------------------------
//
// 主函数
//
//------------------------------------------------
void main()
{
Usart_Init(9600); // 串口初始化9600bps
SPI_Init(); // SPI初始化,默认速度400Hz
VS1003_Init(); // VS1003芯片初始化
while(SD_Init()); // SD卡循环初始化
Fat_Init(); // 文件系统初始化
AD_Init(); // AD初始化
TC0_Init(); // T/C0初始化
VS1003_Play(); // 音乐播放
}
//----------------- ------------------------------
//
// 音乐播放函数
//
//------------------------------------------------
void VS1003_Play(void)
{
uint32 n;
uint32 i;
uint32 size_buf=0; // 已播放的文件大小
uint32 num; // 音乐文件所在的簇
uint8 music_num=0; // 正在播放文件的号码
uint8 play_flag=0; // 播放标志
uint16 data_pointer=0;
uint8 music_next=0,music_last=0; // 音乐换曲标志
uint8 vol_flag=0; // 音量调节标志
AD_Flag=0; // AD键盘标志
AD_time=0; // AD键盘采样次数
key_num=0; // 按键号
GetMusicFile(); // 获取音乐文件
num = fclust[music_num]; // 调用音乐文件
while(1)
{
for(i=0;i<8;i++)
{
SD_ReadBlock(FirstDataSector+(num-2)*8+i,Fat_Buffer); // 获取音乐文件的数据
do
{
//--------------------------- AD按键检测 ---------------------------//
if(key_num==6&&AD_time==0)play_flag=1; // Key6按下,播放
else if(key_num==5&&AD_time==0)play_flag=0; // Key5按下,停止
else if(key_num==1&&AD_time==0)music_next=1; // Key1按下,下一首
else if(key_num==4&&AD_time==0)music_last=1; // Key4按下,上一首
else if(key_num==3&&AD_time==0)vol_flag=1; // Key3按下,音量+
else if(key_num==2&&AD_time==0)vol_flag=2; // Key2按下,音量-
//-------------- 音量调节 ----------------//
if(vol_flag!=0)
{
if(vol_flag==1)
{
if(VOL>27)VOL=29;
else VOL+=2;
}
else
{
if(VOL<2)VOL=0;
else VOL-=2;
}
VS1003_WriteReg(VS1003_SPI_VOL ,VOL_BUFFER[VOL]); // 送音量数据
while(VS1003_DREQ_STATE() != VS1003_DREQ); // 等待
key_num = 0;
vol_flag=0;
}
//----------------- 换曲操作 -----------------//
if(music_next!=0||music_last!=0)
{
data_pointer=512;
i=8;
}
//---------------- 音乐数据送入 ------------------//
else if(VS1003_DREQ_STATE()== VS1003_DREQ&&play_flag!=0)
{
for(n=0;n<32;n++)
{
VS1003_WriteDat(Fat_Buffer[data_pointer]); // 发送数据
data_pointer++;
}
size_buf+=32;
}
if(size_buf>=fsize[music_num]-64)
{
data_pointer=512;
i=8;
size_buf=0;
}
}while(data_pointer<511);
data_pointer=0;
}
//---------- 下一簇 ------------//
num = FatNextCluster(num);
if(num==CLUST_EOFE||music_next!=0||music_last!=0)
{
if(music_last!=0)
{
if(music_num>0)music_num--;
else music_num = fcount-1;
}
else
{
if(music_num<fcount-1)music_num++;
else music_num=0;
}
num = fclust[music_num];
play_flag=1;
music_next = 0;
music_last = 0;
key_num=0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -