找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 174|回复: 2
收起左侧

51单片机控制SYN6288语音播报程序

[复制链接]
ID:1055976 发表于 2024-4-29 15:01 | 显示全部楼层 |阅读模式
资料
SYN6288模块原理图
语音合成命令
接线
如何接线
实现原理
程序代码
main.c
syn6288.c
uart.c
delay.c
基于 51单片机的其他项目
尾声
资料
我用的是绿深电子技术的模块,资料也挺齐全的。也有相关例程。


SYN6288模块原理图
语音合成命令

接线
如何接线
接线其实很简单。

51单片机        SYN6288语音合成
TX        RX
VCC        VCC
GND        GND
实现原理
51单片机 串口接收数据,根据不同的数据 通过串口的形式发送给 SYN6288,从而控制SYN6288语音播报。

程序代码
我用的是STC89C52

main.c
  1. #include <reg52.h>
  2. #include "syn6288.h"
  3. #include "delay.h"
  4. #include "uart.h"

  5. /**************芯片设置命令*********************/
  6. unsigned char SYN_StopCom[] = {0xFD, 0X00, 0X02, 0X02, 0XFD}; //停止合成
  7. unsigned char SYN_SuspendCom[] = {0XFD, 0X00, 0X02, 0X03, 0XFC}; //暂停合成
  8. unsigned char SYN_RecoverCom[] = {0XFD, 0X00, 0X02, 0X04, 0XFB}; //恢复合成
  9. unsigned char SYN_ChackCom[] = {0XFD, 0X00, 0X02, 0X21, 0XDE}; //状态查询
  10. unsigned char SYN_PowerDownCom[] = {0XFD, 0X00, 0X02, 0X88, 0X77}; //进入POWER DOWN 状态命令

  11. unsigned char receive_ok = 0;  //接收标志位
  12. unsigned char command;                 //接收串口来的数据

  13. //串口1初始化
  14. void UART1_Init(void)
  15. {
  16.         SCON = 0x50;                //8位数据,可变波特率
  17.         TMOD |= 0x20;                //设定定时器1为8位自动重装方式
  18.         TL1 = 0xFD;                //设定定时初值
  19.         TH1 = 0xFD;                //设定定时器重装值
  20.         ET1 = 0;                //禁止定时器1中断
  21.         TR1 = 1;                //启动定时器1
  22.         ES = 1;
  23.         EA = 1;
  24.         RI = 0;
  25.         TI = 0;
  26. }


  27. void  main(void)
  28. {
  29.         UART1_Init();
  30.         SYN_FrameInfo(0, "[v3][t5]大家好"); //喇叭说 你好
  31.         delay(2000);
  32.         receive_ok = 1;
  33.         while(1)
  34.         {
  35.                 //选择背景音乐2。(0:无背景音乐  1-15:背景音乐可选)
  36.                 //m[0~16]:0背景音乐为静音,16背景音乐音量最大
  37.                 //v[0~16]:0朗读音量为静音,16朗读音量最大
  38.                 //t[0~5]:0朗读语速最慢,5朗读语速最快
  39.                 //其他不常用功能请参考数据手册

  40.                 /*判断指令*/
  41.                 switch(command)
  42.                 {
  43.                         case '1':           //如果是 1
  44.                         receive_ok = 0;
  45.                         SYN_FrameInfo(0, "[v3][t5]你好");  //喇叭说 你好
  46.                         delay(2000);
  47.                         command = 0;
  48.                         receive_ok = 1;
  49.                         break;
  50.                         case 'G':                          //如果你 G  喇叭说 这个是干垃圾
  51.                         receive_ok = 0;                //禁止接收串口数据
  52.                         SYN_FrameInfo(0, "[v3][t5]这个是干垃圾");
  53.                         delay(2000);
  54.                         command = 0;
  55.                         receive_ok = 1;                 //允许接收串口数据
  56.                         break;
  57.                         default :
  58.                         receive_ok = 1;
  59.                         break;
  60.                  }               
  61.                 //暂停合成,此时没有用到,用于展示函数用法
  62.                 //YS_SYN_Set(SYN_SuspendCom);
  63.         }

  64. }


  65. //串口1中断
  66. void Uart1_Isr() interrupt 4
  67. {
  68.         if(receive_ok == 1)        //如果可以接收数据了
  69.         {
  70.                 command = SBUF;        //接收数据
  71.                 while(!RI);
  72.                 RI=0;
  73.                 receive_ok = 0;      
  74.         }      

  75. }
复制代码


syn6288.c
  1. #include <reg52.h>
  2. #include <string.h>
  3. #include "uart.h"
  4. #include "syn6288.h"

  5. /**************芯片设置命令*********************/
  6. /*外部声明*/
  7. extern unsigned char SYN_StopCom[];
  8. extern unsigned char SYN_SuspendCom[];
  9. extern unsigned char SYN_RecoverCom[];
  10. extern unsigned char SYN_ChackCom[];
  11. extern unsigned char SYN_PowerDownCom[];


  12. //Music:  0:无背景音乐  1~15:选择背景音乐
  13. void SYN_FrameInfo(unsigned char Music, unsigned char *HZdata)
  14. {
  15.         /****************需要发送的文本**********************************/
  16.         unsigned char  Frame_Info[50];
  17.         unsigned char  HZ_Length;
  18.         unsigned char  ecc  = 0;                          //定义校验字节
  19.         unsigned int i = 0;
  20.         HZ_Length = strlen((char*)HZdata);                         //需要发送文本的长度

  21.         /*****************帧固定配置信息**************************************/
  22.         Frame_Info[0] = 0xFD ;                         //构造帧头FD
  23.         Frame_Info[1] = 0x00 ;                         //构造数据区长度的高字节
  24.         Frame_Info[2] = HZ_Length + 3;                 //构造数据区长度的低字节
  25.         Frame_Info[3] = 0x01 ;                         //构造命令字:合成播放命令
  26.         Frame_Info[4] = 0x01 | Music << 4 ; //构造命令参数:背景音乐设定

  27.         /*******************校验码计算***************************************/
  28.         for(i = 0; i < 5; i++)                                   //依次发送构造好的5个帧头字节
  29.         {
  30.                 ecc = ecc ^ (Frame_Info[i]);                //对发送的字节进行异或校验
  31.         }

  32.         for(i = 0; i < HZ_Length; i++)                   //依次发送待合成的文本数据
  33.         {
  34.                 ecc = ecc ^ (HZdata[i]);                                 //对发送的字节进行异或校验
  35.         }
  36.         /*******************发送帧信息***************************************/
  37.         memcpy(&Frame_Info[5], HZdata, HZ_Length);
  38.         Frame_Info[5 + HZ_Length] = ecc;
  39.         UART1_SendString(Frame_Info, 5 + HZ_Length + 1);
  40. }



  41. uart.c
  42. #include <reg52.h>
  43. #include "uart.h"

  44. /*串口发送一字节数据*/
  45. void UART1_SendByte(unsigned char DAT)
  46. {
  47.         SBUF = DAT;
  48.         while(TI == 0);
  49.         TI=0;
  50. }

  51. /*串口发送字符串数据*/
  52. void UART1_SendString(unsigned char *DAT, unsigned char len)
  53. {
  54.         unsigned char i;
  55.         for(i = 0; i < len; i++)
  56.         {
  57.                 UART1_SendByte(*DAT++);
  58.         }
  59. }
复制代码


delay.c
  1. #include <reg52.h>
  2. #include "delay.h"

  3. //软件延时1ms
  4. void  delay(unsigned int uldata)
  5. {
  6.         unsigned int j  =  0;
  7.         unsigned int g  =  0;
  8.         for (j = 0; j < uldata; j++)
  9.                 for (g = 0; g < 110; g++);
  10. }
  11. #include <reg52.h>
  12. #include "delay.h"

  13. //软件延时1ms
  14. void  delay(unsigned int uldata)
  15. {
  16.         unsigned int j  =  0;
  17.         unsigned int g  =  0;
  18.         for (j = 0; j < uldata; j++)
  19.                 for (g = 0; g < 110; g++);
  20. }
复制代码

尾声
如果觉得这篇文章对你有用。欢迎大家点赞、哈哈

继续加油
回复

使用道具 举报

ID:301191 发表于 2024-5-5 15:08 | 显示全部楼层
顶一下
回复

使用道具 举报

ID:1085441 发表于 2024-5-5 17:41 | 显示全部楼层
6288停产了吧?现在是6658,功能更强一些
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表