测试程序如下:
可是仍然没有声音。
/******************************************************************************
- 实现功能:实现芯片上电分别指定播放第一曲和第二曲,基本的程序供用户测试
- 运行环境: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) ;
}
更多回帖