哪位大佬能指点下,用STC8A8K64D4单片机驱动SYN6288语音模块,始终不出声音。
本帖最后由 欢迎哈哈哈3 于 2024-6-15 18:13 编辑主程序
#include "stc8.h"
#include "main.h"
#include "UART.h"
void setinoutport()
{
P0M1=0X00;P0M0=0X00;
P1M1=0X00;P1M0=0X00;
P2M1=0X00;P2M0=0X00;
P3M1=0X00;P3M0=0X03;
}
main()
{
setinoutport();
Uart1_Init();
for(;;)
{
SYN_FrameInfo(1, "你好啊");//循环发送数据
P10=~P10;
Delay_ms(1000);
}
}
串口程序
#include "stc8.h"
#include "string.h"
//函数声明
void Uart1_Init(void);
void Uart1_SendChar(unsigned char Udat);
void Uart1_Send_Data(unsigned char *Buf,u8 j);
void SYN_FrameInfo(u8 Music, u8 *HZdata);
void Delay_ms(u16 t);
/**************芯片设置命令*********************/
u8 SYN_StopCom[] = {0xFD, 0X00, 0X02, 0X02, 0XFD}; //停止合成
u8 SYN_SuspendCom[] = {0XFD, 0X00, 0X02, 0X03, 0XFC}; //暂停合成
u8 SYN_RecoverCom[] = {0XFD, 0X00, 0X02, 0X04, 0XFB}; //恢复合成
u8 SYN_ChackCom[] = {0XFD, 0X00, 0X02, 0X21, 0XDE}; //状态查询
u8 SYN_PowerDownCom[] = {0XFD, 0X00, 0X02, 0X88, 0X77}; //进入POWER DOWN 状态命令
void Delay_ms(u16 s)
{
unsigned int j;
while((s--) != 0)
{
for(j = 0; j < 850; j++);
}
}
void Uart1_Init(void)
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xBF; //定时器时钟12T模式
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式
TL1 = 0xFD; //设置定时初始值
TH1 = 0xFD; //设置定时重载值
ET1 = 0; //禁止定时器中断
TR1 = 1; //定时器1开始计时
ES=1;
EA=1;
}
void Uart1_SendChar(unsigned char Udat)
{
SBUF=Udat; //将要发送的数据放入串口数据缓冲区
while(!TI); //等待发送完成
TI=0; //清零TI发送完成标记
}
//
void Uart1_Send_Data(u8 *Buf , u8 len)
{
unsigned char i;
for(i=0;i<len;i++) //发送数组数据
{
Uart1_SendChar(*(Buf+i)); //发送数据
Delay_ms(100); //延时,发送数据间隔
}
}
//串口1中断
void Uart1_Isr() interrupt 4
{
if(RI)
{
RI=0;
}
}
//Music:0:无背景音乐1~15:选择背景音乐
void SYN_FrameInfo(u8 Music, u8 *HZdata)
{
/****************需要发送的文本**********************************/
u8Frame_Info;
u8HZ_Length;
u8ecc= 0; //定义校验字节
u16 i = 0;
HZ_Length = strlen((u8*)HZdata); //需要发送文本的长度
/*****************帧固定配置信息**************************************/
Frame_Info = 0xFD ; //构造帧头FD
Frame_Info = 0x00 ; //构造数据区长度的高字节
Frame_Info = HZ_Length + 3; //构造数据区长度的低字节
Frame_Info = 0x01 ; //构造命令字:合成播放命令
Frame_Info = 0x01 | Music << 4 ; //构造命令参数:背景音乐设定
/*******************校验码计算***************************************/
for(i = 0; i < 5; i++) //依次发送构造好的5个帧头字节
{
ecc = ecc ^ (Frame_Info); //对发送的字节进行异或校验
}
for(i = 0; i < HZ_Length; i++) //依次发送待合成的文本数据
{
ecc = ecc ^ (HZdata); //对发送的字节进行异或校验
}
/*******************发送帧信息***************************************/
memcpy(&Frame_Info, HZdata, HZ_Length);
Frame_Info = ecc;
Uart1_Send_Data(Frame_Info, 5 + HZ_Length + 1);
}
/***********************************************************
* 名 称: YS_SYN_Set(uchar *Info_data)
* 功 能: 主函数 程序入口
* 入口参数: *Info_data:固定的配置信息变量
* 出口参数:
* 说 明:本函数用于配置,停止合成、暂停合成等设置 ,默认波特率9600bps。
* 调用方法:通过调用已经定义的相关数组进行配置。
**********************************************************/
void YS_SYN_Set(u8 *Info_data)
{
u8 Com_Len;
Com_Len = strlen((char*)Info_data);
Uart1_Send_Data(Info_data, Com_Len);
}
麻烦发一下你的电路原理图看看哈 串口初始化这里调整一下 zhangshiwei 发表于 2024-7-2 15:10
串口初始化这里调整一下
提供关于51单片机的例程http://www.51hei.com/bbs/dpj-235675-1.html zhangshiwei 发表于 2024-7-2 15:10
串口初始化这里调整一下
{:5_332:} 好的试一下,谢谢了
页:
[1]