单片机学习小组
直播中

Conhecemos

6年用户 4经验值
私信 关注

请问如何利用51单片机实现DFPlayer Mini模块播放?

测试程序如下:

可是仍然没有声音。


/******************************************************************************

-    实现功能:实现芯片上电分别指定播放第一曲和第二曲,基本的程序供用户测试

-  运行环境:STC      晶振:11.0592M         波特率:9600

-  备注        :在普中科技的 51 开发板上调试 OK  --- STC89C516RD+ 1、该测试程序必须是模块或者芯片方案中有设备在线, 譬如 U 盘、 TF 卡

******************************************************************************/

#include "REG52.h"

#define COMM_BAUD_RATE    9600         //串口波特率

#define OSC_FREQ        11059200        //运行晶振: 11.05926MHZ

#define INT8U  unsigned char

#define INT16U int

#define INT32U long int


unsigned char Send_buf[10] = {0};


void  Delay_Ms(INT32U z)

{

INT32U x=0  , y=0;

for(x=110 ; x>0  ;x--)

for(y=z;  y>0;y-- );

}


/******************************************************************************

-  功能描述: 串口 1 初始化

-  注:        设置为 9600 波特率

******************************************************************************/  


void  Serial_init(void)

{

TMOD = 0x20;        //  设置 T1   为波特率发生器

SCON = 0x50;        //  0101,0000 8 位数据位,  无奇偶校验

PCON = 0x00;        //PCON=0;

TH1=256-(OSC_FREQ/COMM_BAUD_RATE/32/12);//设置为 9600   波特率

TL1=256-(OSC_FREQ/COMM_BAUD_RATE/32/12);


TR1        = 1;        //定时器 1 打开

REN        = 1;        //串口 1 接收使能

ES        = 1;        //串口 1 中断使能

}


void  Uart_PutByte(INT8U ch)

{

SBUF    = ch;

while(!ti){;} TI = 0;

}


/******************************************************************************

-   功能描述: 串口向外发送命令[包括控制和查询]

- 参数说明: CMD:表示控制指令, 请查阅指令表, 还包括查询的相关指令 feedback:是否需要应答[0:不需要应答,1:需要应答] data:传送的参数

******************************************************************************/  


void  SendCmd(INT8U len)

{

INT8U i = 0  ;

Uart_PutByte(0x7E); //起始

for(i=0;  i

{

Uart_PutByte(Send_buf)  ;

}

Uart_PutByte(0xEF)  ;//结束

}


/******************************************************************************

-  功能描述:求和校验

-  和校验的思路如下:

发送的指令, 去掉起始和结束。 将中间的 6 个字节进行累加, 最后取反码。 接收端就将接收到的一帧数据,去掉起始和结束。 将中间的数据累加, 再加上接收到的校验字节。 刚好为 0.这样就代表接收到的数据完全正确。

******************************************************************************/  


void  DoSum( INT8U *Str, INT8U  len)

{

INT16U xorsum = 0; INT8U i;

for(i=0;  i

{

xorsum    = xorsum +  Str;

}

xorsum        =  0 -xorsum;

*(Str+i)        =  (INT8U)(xorsum >>8);

*(Str+i+1) = (INT8U)(xorsum &   0x00ff);

}


void  Uart_SendCMD(INT8U CMD  ,INT8U feedback ,  INT16U dat)

{

Send_buf[0] =  0xff;        //保留字节

Send_buf[1]  = 0x06;        //长度

Send_buf[2]  = CMD;                //控制指令

Send_buf[3]  = feedback;//是否需要反馈

Send_buf[4] = (INT8U)(dat >>   8);//datah

Send_buf[5] = (INT8U)(dat); //datal

DoSum(&Send_buf[0],6);//校验

SendCmd(8);        //发送此帧数据

}


void main()

{

Serial_init();//串口寄存器的初始化设置

//Uart_SendCMD(0x03 , 0 , 0x01) ;//播放第一首

//Delay_Ms(1000);//延时大概 6S

//Uart_SendCMD(0x03 , 0 , 0x02) ;//播放第二首

//Delay_Ms(1000);//延时大概 6S

Uart_SendCMD(0x03 , 0 , 0x04) ;//播放第四首

while(1) ;

}

已退回2积分

回帖(1)

我爱文筱婷

2024-11-7 15:30:42
大哥, 你的DoSum函数内的 for循环的是不完整的, 请补全
举报

更多回帖

×
20
完善资料,
赚取积分