【CH579M-R1】+串行通讯及MP3模块的音乐播放
[复制链接]
CH579M 提供了4组独立的UART,利用好这种资源可使小小的MCU构建出一个功能强大的系统,
这里就用其中的一组来串行控制MP3播放模块。
由于该MP3播放模块所使用的波特率为9600bps ,所以在选取一个合适的串行通讯程序后,第一件要做的事情就是看它能否达到这个要求,别看这个要求不高,但有些芯片是就高不就低,是无法满足该要求的。
第2个要求是能实现字节数据的收发,只提供PRINT语句来输出的环境是不符合要求的,因为PRINT语句一遇到0X00,就会断掉而不发送。
第3是为发送的方便,应将MP3的指令存入数组种,然后通过发送函数一次性发出。
将MP3模块的指令按如下的形式存入数组中:
uint8_t cmd[] = {0X7E, 0xFF, 0x06, 0X0D, 00, 00, 00, 0xFE, 0xEE, 0XEF}; //play
uint8_t cmd1[] = {0X7E, 0xFF, 0x06, 0X01, 00, 00, 00, 0xFE, 0xFA, 0XEF}; //next
uint8_t cmd2[] = {0X7E, 0xFF, 0x06, 0X02, 00, 00, 00, 0xFE, 0xF9, 0XEF}; //previous
uint8_t cmd3[] = {0X7E, 0xFF, 0x06, 0X03, 00, 00, 01, 0xFE, 0xF7, 0XEF}; //*play index
uint8_t cmd4[] = {0X7E, 0xFF, 0x06, 0X0E, 00, 00, 00, 0xFE, 0xED, 0XEF}; //pause
uint8_t cmd5[] = {0X7E, 0xFF, 0x06, 0X16, 00, 00, 00, 0xFE, 0xE5, 0XEF}; //stop
uint8_t cmd6[] = {0X7E, 0xFF, 0x06, 0X06, 00, 00, 10, 0xFE, 0xE5, 0XEF}; //*set Volume
第4是通过输入来指定播放乐曲的编号,并生成相应的MP3控制指令,见图1所示。
图1 按选择来发送MP3指令
第5完成程序编写,其主程序如下:
int main()
{
UINT8 len;
GPIOA_SetBits(GPIO_Pin_9);
GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PU);
GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA);
UART1_DefInit();
mDelaymS( 500 );
while(1)
{
len = UART1_RecvString(RxBuff);
if( len )
{
n=RxBuff[0];
playn(n);
UART1_SendString( cmd3, sizeof(cmd3));
}
}
}
第6搭建播放系统,见图2所示。
图2 MP3播放装置构成
第7配置显示屏及选择按键,见图3所示。
第8编写程序并完成调试,其中K2:选歌 、K1:确认、K3:调音量。
其主程序的相应的内容为:
int main()
{
UINT8 n=10,i;
GPIOA_SetBits(GPIO_Pin_9);
GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PU);
GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA);
UART1_DefInit();
GPIOB_ModeCfg( GPIO_Pin_8, GPIO_ModeIN_PU );
GPIOB_ModeCfg( GPIO_Pin_16, GPIO_ModeIN_PU );
GPIOA_ModeCfg( GPIO_Pin_7, GPIO_ModeIN_PU );
OLED_Init();
OLED_Clear();
OLED_ShowString(0,0,"CH579M TEST",16);
OLED_ShowString(0,2,"OLED_MP3 ",16);
mDelaymS(1000 );
OLED_Clear();
OLED_ShowCHinese(0,0,0);
OLED_ShowCHinese(18,0,1);
OLED_ShowCHinese(36,0,2);
while(1)
{
if(GPIOB_ReadPortPin(GPIO_Pin_16)==0)
{
if(i<6) i++;
else i=1;
if(i==1)
{
OLED_Clear();
OLED_ShowCHinese(0,0,0); //澎湖湾
OLED_ShowCHinese(18,0,1);
OLED_ShowCHinese(36,0,2);
}
。。。
if(i==4)
{
OLED_Clear();
OLED_ShowCHinese(0,0,9); //味道
OLED_ShowCHinese(18,0,10);
}
。。。
if(GPIOA_ReadPortPin(GPIO_Pin_7)==0)
{
if(n<32) n=n+2;
else n=10;
setVolume(n);
UART1_SendString( cmd6, sizeof(cmd6));
}
mDelaymS(200 );
}
}
}
|