【五、音乐MP3控制】
这里使用的是WTV020-SD语音模块(因为手上就有这个模块了。。。有好的模块可以替换掉)
1、产品特征 Ø 产品支持外挂最大1G容量的SD卡; Ø 支持播放4Bit ADPCM格式文件; Ø 自动识别语音文件; Ø 可装载6KHz~32KHz、36KHz采样率AD4音频; Ø 可装载6KHz~16KHz采样率WAV音频; Ø 16bitDAC及PWM音频输出; Ø 最多可存放512段语音; Ø WTV020-SD-20S,WTV020-SD-16P两种模块类型; | | Ø 支持微型处理器和按键控制; Ø 可以调用任意段落的语音进行播放; Ø 掉电保存操作数据功能; Ø 加载语音无需软件辅助,直接放置语音到SD卡便可; Ø 支持文件组合播放,包括静音组合; Ø 工作电压:DC2.5~3.6V; Ø 静态电流:16uA(不插SD卡) |
2、产品概述WTV020-SD模块是一款可重复擦写语音内容的大容量存储类型的语音模块,可外挂最大容量为1GB的SD卡存储器。能加载WAV格式语音和AD4格式语音。 WTV020-SD模块以WTV020SD-20S语音芯片为主控核心,具有MP3控制模式,按键一对一控制模式(3段语音跟5段语音两种),上电循环播放控制模式以及二线串口控制模式。控制模式是在芯片制样时设置的,在操作过程中不能切换各种控制模式,如需要使用哪种模式进行控制,可向我司订做。 MP3控制模式:具有播放/停止,下一曲,上一曲,音量+,音量-等功能。 按键一对一控制模式(3段语音):一个按键对应触发一个语音,具备播放3段语音及调节音量加减的功能,所有按键被默认为脉冲不可重复触发。 按键一对一控制模式(5段语音):具有三种控制方式,⑴、所有按键均为脉冲可重复触发;⑵、所有按键均为播放/停止触发(单曲不循环);⑶、所有按键均为播放/停止(单曲可循环)。 上电循环播放控制模式:上电后,不需要触发任何I/O口,直接自动播放SD卡存储器内的所有语音,并拥有断电记忆点播放功能,当断电后再上电,自动从上次的断电处继续播放语音。具有两种控制方式,⑴、P04拥有脉冲播放/暂停功能;⑵、P05拥有电平播放/暂停功能。 二线串口控制模式:由单片机通过CLK时钟和DI数据线发送数据对WTV020-SD模块进行控制。可随意播放任何一个地址的语音。此状态下,能进行语音组合播放。 语音内容更新直接通过SD卡读卡器在PC上更换。该模块支持FAT文件系统。支持6KHz~32KHz、36KHz采样率的AD4语音和6KHz~16KHz采样率的WAV音频,能自动识别语音采样率以及语音文件格式。
点击这里可以下载此文档手册 ( 访问密码 8861 )
- //音乐设置
- #define STOP 0xffff //停止播放
- #define PLAY 0xfffe //播放
- #define PAUSE 0xfffe //暂停
- #define SINGLE_CYCLE 0xfffd //单曲循环
- #define STOP_CYCLE 0xfffc //停止循环
- #define ALL_CYCLE 0xfffb //所有循环
- #define REST PORTG_2
- #define DI PORTG_1
- #define CLK PORTG_0
- volatile unsigned int voice_buf[8] = {0xfff0,0xfff1,0xfff2,0xfff3,0xfff4,0xfff5,0xfff6,0xfff7}; //音量 0xf0为静音 0xf7 为音量最大
- volatile unsigned char voice;
- volatile unsigned int song_number;
复制代码- void init_fun() //初始化模块
- {
- voice = 1; //初始音量设置为3, 0为最小,即静音; 7为最高
-
- song_number = 0; //第1首歌曲
- REST = 1;
- DI = 1;
- CLK = 1;
- reset_fun();
- delay_ms(300);
- sent_data(voice_buf[voice]);
- sent_data(ALL_CYCLE);
- }
- void reset_fun() //复位模块
- {
- REST = 0;
- delay_ms(6);
- REST = 1;
- delay_ms(6);
- }
- void sent_data(uint dat) //发送数据
- {
- unsigned int i;
- uint j;
- for(i=0;i<16;i++)
- {
- CLK = 0;
- j = (dat >> (15 - i)) & 0x01;
- DI = j;
- delay_ms(2);
- CLK = 1;
- delay_ms(2);
- }
- DI = 1;
- CLK = 1;
- }
- void next_song() //下一曲
- {
- song_number++;
- if(song_number > 0x1ff) song_number = 0x00;
- sent_data(song_number);
- }
- void pre_song() //上一曲
- {
- if(song_number == 0x00)
- {
- song_number = 0x200;
- }
- song_number--;
- sent_data(song_number);
- }
- void voice_up() //音量加
- {
- voice++;
- if(voice >= 7) voice = 7;
- sent_data(voice_buf[voice]);
- }
- void voice_down() //音量减
- {
- if(voice <= 0) voice = 1;
- voice--;
- sent_data(voice_buf[voice]);
- }
- void play_song(int song_num)
- {
- song_number = song_num;
- if(song_number > 0x1ff) song_number = 0x00;
- sent_data(PLAY);
- sent_data(song_number);
- }
复制代码
串口数据处理部分程序
- case 0x20://设置music ok
- temp1 = ((status1[3] & 0b11100000) >> 5);
- status[3] = status1[3];
- status[2] = status1[2];
- temp2 = (((status1[2] & 0b00000001) << 3) | temp1);
- if(temp2 != 0)
- {
- switch(temp2)
- {
- case 0x01://播放/暂停
- sent_data(PLAY);break;
- case 0x02://上一曲
- pre_song();break;
- case 0x03://下一曲
- next_song();break;
- case 0x04://音量+
- voice_up();break;
- case 0x05://音量-
- voice_down();break;
- case 0x06://停止播放
- sent_data(STOP);break;
- case 0x07://单曲循环
- sent_data(SINGLE_CYCLE);break;
- case 0x08://所有循环
- sent_data(ALL_CYCLE);break;
- case 0x09://停止循环
- sent_data(STOP_CYCLE);break;
- case 0x0a://随机播放一首歌
- sent_data(random_fun(0,512));
- break;//暂时不设置
- }
- status[3] = (status1[3] & 0b00011111);
- status[2] = (status1[2] & 0b11111110);
- }
- break;
复制代码 主函数中音乐相关处理程序:
- //音乐处理
- if(command_music!=0)
- {
- switch(command_music)
- {
- case 0x00:break;//无动作
- case 0x01://播放/暂停
- sent_data(PLAY);
- break;
- case 0x02://上一曲
- pre_song();
- break;
- case 0x03://下一曲
- next_song();
- break;
- case 0x04://音量加
- voice_up();
- break;
- case 0x05://音量减
- voice_down();
- break;
- case 0x06://停止
- sent_data(STOP);
- break;
- case 0x07://单曲循环
- sent_data(SINGLE_CYCLE);
- break;
- case 0x08://所有循环
- sent_data(ALL_CYCLE);
- break;
- case 0x09://停止循环
- sent_data(STOP_CYCLE);
- break;
- case 0x0a://随机播放一首歌曲
- play_song(random_fun(0,512));
- break;
- }
- command_music = 0;
- }
复制代码
|