一,头文件
我刚刚买回来的模块并不是51.52芯片的,所以
LE52.H 使用不了,我的Keil4脾气也暴躁,包含所有头文件的config.h也编译出现错误,因此我自己建立了一个包含所有头文件的头文件all.h(所以目录中的LE52.H与config都是没用的),其余的usart.h与SYN6288.h没怎么改,SYN6288.h中的uint8_t 要记得换成unsigned char 因为我没有给这个宏定义,我的keil4太难驯服了
二,主程序
1.说完头文件先说说串口程序usart.c
#include "all.h"
unsigned char a,flag;
unsigned char DAT;
unsigned int x=0;
void UartIni(void)
{
TMOD=0x20; //定时器初始化
SCON=0x50;//选择模式
TH1=256-3;//9600波特率
TL1=256-3;
TR1=1;
ES=1;//开启中断
EA=1;
}
void UARTSendByte(DAT)
{
ES=0; //关闭中断
SBUF = DAT;
while(!TI);
TI=0;
ES=1;//开启中断
}
void PrintCom(unsigned char *DAT,unsigned char len)
{
unsigned char i;
for(i=0;i<len;i++)
{
UARTSendByte(*DAT++);
}
}
void Uart_Isr() interrupt 4
{
DAT=SBUF;
RI=0;
x=1;
}
2.SYN6288.c程序其实几乎都没有改,我一般就把uint8_t替换成unsigned char
#include "all.h"
/**************芯片设置命令*********************/
unsigned char SYN_StopCom[]={0xFD,0X00,0X02,0X02,0XFD};//停止合成
unsigned char SYN_SuspendCom[]={0XFD,0X00,0X02,0X03,0XFC};//暂停合成
unsigned char SYN_RecoverCom[]={0XFD,0X00,0X02,0X04,0XFB};//恢复合成
unsigned char SYN_ChackCom[]={0XFD,0X00,0X02,0X21,0XDE};//状态查询
unsigned char SYN_PowerDownCom[]={0XFD,0X00,0X02,0X88,0X77};//进入POWER DOWN 状态命令
/***********************************************/
void SYN_FrameInfo(unsigned char Music,unsigned char *HZdata)
{
/****************需要发送的文本**********************************/
unsigned char Frame_Info[50];
unsigned char HZ_Length;
unsigned char ecc = 0; //定义校验字节
unsigned int i=0;
HZ_Length =strlen(HZdata); //需要发送文本的长度
/*****************帧固定配置信息**************************************/
Frame_Info[0] = 0xFD ; //构造帧头FD
Frame_Info[1] = 0x00 ; //构造数据区长度的高字节
Frame_Info[2] = HZ_Length + 3; //构造数据区长度的低字节
Frame_Info[3] = 0x01 ; //构造命令字:合成播放命令
Frame_Info[4] = 0x01 | Music<<4 ; //构造命令参数:背景音乐设定
/*******************校验码计算***************************************/
for(i = 0; i<5; i++) //依次发送构造好的5个帧头字节
{
ecc=ecc^(Frame_Info[i]); //对发送的字节进行异或校验
}
for(i= 0; i<HZ_Length; i++) //依次发送待合成的文本数据
{
ecc=ecc^(HZdata[i]); //对发送的字节进行异或校验
}
/*******************发送帧信息***************************************/
memcpy(&Frame_Info[5], HZdata, HZ_Length);
Frame_Info[5+HZ_Length]=ecc;
PrintCom(Frame_Info,5+HZ_Length+1);
}
void YS_SYN_Set(unsigned char *Info_data)
{
unsigned char Com_Len;
Com_Len =strlen(Info_data);
PrintCom(Info_data,Com_Len);
}
3.main.c程序如下,这里最重要的是SYN_FrameInfo函数的使用,如果在while里面记得要加上延时函数,要不程序一直运行太快,喇叭一句话都来不及说,真正开发的时候也要加入延时,这样喇叭才正常
#include "all.h"
// sbit P1_0=P1^0;
void delay_ms(unsigned int n)
{
unsigned int q=0,w=0;
for(q=0;q<n;q++)
{
for(w=0;w<120;w++);
}
}
void MCU_init();
extern void SYN_FrameInfo(unsigned char Music,unsigned char *HZdata);
void delay(unsigned long uldata);
void main(void)
{
unsigned int n=6,i=0;
UartIni(); /*串口初始化*/
// delay_ms(5000);
// SYN_FrameInfo(0,"大家好,我是[t5]渣渣灰") ;
// delay_ms(5000);
while(1)
{
switch(P1)
{
case 0x00:
SYN_FrameInfo(0,"我是[t5]渣渣灰初代") ; delay_ms(10000); break;
case 0x01:
SYN_FrameInfo(0,"我是[t5]渣渣灰一号") ; delay_ms(10000); break;
case 0x02:
SYN_FrameInfo(0,"我是[t5]渣渣灰二号") ; delay_ms(10000); break;
case 0x03:
SYN_FrameInfo(0,"我是[t5]渣渣灰三号") ; delay_ms(10000); break;
case 0x04:
SYN_FrameInfo(0,"我是[t5]渣渣灰四号") ; delay_ms(10000); break;
case 0x05:
SYN_FrameInfo(0,"我是[t5]渣渣灰五号") ; delay_ms(10000); break;
case 0x06:
SYN_FrameInfo(0,"我是[t5]渣渣灰六号") ; delay_ms(10000); break;
default :
delay_ms(1000) ; break;
}
}
}
void delay(unsigned long uldata)
{
unsigned int j = 0;
unsigned int g = 0;
for (j=0;j<5;j++)
{
for (g=0;g<uldata;g++)
{
_nop_();
_nop_();
三、总结
这个其实不算很难,就是小问题挺多,大概向上面一样分三步,第一步串口初始化调试串口,使用Printfcom循环发送字节;第二步,初始化SYN6288,一般送的资料里面都有原始代码,不需要更改;第三步,SYN_FrameInfo函数的使用(在买回来的时候会有说明书的,这个有很多调节方法,不过我只是说说程序移植)