【CH579M-R1】+串行通讯及MP3模块的音乐播放
<p>CH579M 提供了4组独立的UART,利用好这种资源可使小小的MCU构建出一个功能强大的系统,</p><p>这里就用其中的一组来串行控制MP3播放模块。</p>
<p>由于该MP3播放模块所使用的波特率为9600bps ,所以在选取一个合适的串行通讯程序后,第一件要做的事情就是看它能否达到这个要求,别看这个要求不高,但有些芯片是就高不就低,是无法满足该要求的。</p>
<p>第2个要求是能实现字节数据的收发,只提供PRINT语句来输出的环境是不符合要求的,因为PRINT语句一遇到0X00,就会断掉而不发送。</p>
<p>第3是为发送的方便,应将MP3的指令存入数组种,然后通过发送函数一次性发出。</p>
<p>将MP3模块的指令按如下的形式存入数组中:</p>
<p>uint8_t cmd[] = {0X7E, 0xFF, 0x06, 0X0D, 00, 00, 00, 0xFE, 0xEE, 0XEF}; //play</p>
<p>uint8_t cmd1[] = {0X7E, 0xFF, 0x06, 0X01, 00, 00, 00, 0xFE, 0xFA, 0XEF}; //next</p>
<p>uint8_t cmd2[] = {0X7E, 0xFF, 0x06, 0X02, 00, 00, 00, 0xFE, 0xF9, 0XEF}; //previous</p>
<p>uint8_t cmd3[] = {0X7E, 0xFF, 0x06, 0X03, 00, 00, 01, 0xFE, 0xF7, 0XEF}; //*play index</p>
<p>uint8_t cmd4[] = {0X7E, 0xFF, 0x06, 0X0E, 00, 00, 00, 0xFE, 0xED, 0XEF}; //pause</p>
<p>uint8_t cmd5[] = {0X7E, 0xFF, 0x06, 0X16, 00, 00, 00, 0xFE, 0xE5, 0XEF}; //stop</p>
<p>uint8_t cmd6[] = {0X7E, 0xFF, 0x06, 0X06, 00, 00, 10, 0xFE, 0xE5, 0XEF}; //*set Volume</p>
<p>第4是通过输入来指定播放乐曲的编号,并生成相应的MP3控制指令,见图1所示。</p>
<p></p>
<p>图1 按选择来发送MP3指令</p>
<p>第5完成程序编写,其主程序如下:</p>
<pre>
<code class="language-cpp">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;
playn(n);
UART1_SendString( cmd3, sizeof(cmd3));
}
}
}</code></pre>
<p>第6搭建播放系统,见图2所示。</p>
<p></p>
<p>图2 MP3播放装置构成</p>
<p>第7配置显示屏及选择按键,见图3所示。</p>
<p></p>
<p>第8编写程序并完成调试,其中K2:选歌 、K1:确认、K3:调音量。</p>
<p>其主程序的相应的内容为:</p>
<pre>
<code class="language-cpp">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 );
}
}
}</code></pre>
<p> </p>
<p>味道,可以可以,品味一样</p>
freebsder 发表于 2020-10-11 21:31
味道,可以可以,品味一样
<p>味道,品味一样,同道。</p>
<p><a href="https://bbs.eeworld.com.cn/thread-1140005-1-1.html" target="_blank">沁恒CH579M-R1开发板测评</a></p>
<p>汇总贴:<a href="https://bbs.eeworld.com.cn/thread-1140005-1-1.html">https://bbs.eeworld.com.cn/thread-1140005-1-1.html</a></p>
页:
[1]