資料
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
- #include <reg52.h>
- #include "syn6288.h"
- #include "delay.h"
- #include "uart.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 狀態命令
- unsigned char receive_ok = 0; //接收標志位
- unsigned char command; //接收串口來的數據
- //串口1初始化
- void UART1_Init(void)
- {
- SCON = 0x50; //8位數據,可變波特率
- TMOD |= 0x20; //設定定時器1為8位自動重裝方式
- TL1 = 0xFD; //設定定時初值
- TH1 = 0xFD; //設定定時器重裝值
- ET1 = 0; //禁止定時器1中斷
- TR1 = 1; //啟動定時器1
- ES = 1;
- EA = 1;
- RI = 0;
- TI = 0;
- }
- void main(void)
- {
- UART1_Init();
- SYN_FrameInfo(0, "[v3][t5]大家好"); //喇叭說 你好
- delay(2000);
- receive_ok = 1;
- while(1)
- {
- //選擇背景音樂2。(0:無背景音樂 1-15:背景音樂可選)
- //m[0~16]:0背景音樂為靜音,16背景音樂音量最大
- //v[0~16]:0朗讀音量為靜音,16朗讀音量最大
- //t[0~5]:0朗讀語速最慢,5朗讀語速最快
- //其他不常用功能請參考數據手冊
- /*判斷指令*/
- switch(command)
- {
- case '1': //如果是 1
- receive_ok = 0;
- SYN_FrameInfo(0, "[v3][t5]你好"); //喇叭說 你好
- delay(2000);
- command = 0;
- receive_ok = 1;
- break;
- case 'G': //如果你 G 喇叭說 這個是干垃圾
- receive_ok = 0; //禁止接收串口數據
- SYN_FrameInfo(0, "[v3][t5]這個是干垃圾");
- delay(2000);
- command = 0;
- receive_ok = 1; //允許接收串口數據
- break;
- default :
- receive_ok = 1;
- break;
- }
- //暫停合成,此時沒有用到,用于展示函數用法
- //YS_SYN_Set(SYN_SuspendCom);
- }
- }
- //串口1中斷
- void Uart1_Isr() interrupt 4
- {
- if(receive_ok == 1) //如果可以接收數據了
- {
- command = SBUF; //接收數據
- while(!RI);
- RI=0;
- receive_ok = 0;
- }
- }
復制代碼
syn6288.c
- #include <reg52.h>
- #include <string.h>
- #include "uart.h"
- #include "syn6288.h"
- /**************芯片設置命令*********************/
- /*外部聲明*/
- extern unsigned char SYN_StopCom[];
- extern unsigned char SYN_SuspendCom[];
- extern unsigned char SYN_RecoverCom[];
- extern unsigned char SYN_ChackCom[];
- extern unsigned char SYN_PowerDownCom[];
- //Music: 0:無背景音樂 1~15:選擇背景音樂
- 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((char*)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;
- UART1_SendString(Frame_Info, 5 + HZ_Length + 1);
- }
- uart.c
- #include <reg52.h>
- #include "uart.h"
- /*串口發送一字節數據*/
- void UART1_SendByte(unsigned char DAT)
- {
- SBUF = DAT;
- while(TI == 0);
- TI=0;
- }
- /*串口發送字符串數據*/
- void UART1_SendString(unsigned char *DAT, unsigned char len)
- {
- unsigned char i;
- for(i = 0; i < len; i++)
- {
- UART1_SendByte(*DAT++);
- }
- }
復制代碼
delay.c
- #include <reg52.h>
- #include "delay.h"
- //軟件延時1ms
- void delay(unsigned int uldata)
- {
- unsigned int j = 0;
- unsigned int g = 0;
- for (j = 0; j < uldata; j++)
- for (g = 0; g < 110; g++);
- }
- #include <reg52.h>
- #include "delay.h"
- //軟件延時1ms
- void delay(unsigned int uldata)
- {
- unsigned int j = 0;
- unsigned int g = 0;
- for (j = 0; j < uldata; j++)
- for (g = 0; g < 110; g++);
- }
復制代碼
尾聲
如果覺得這篇文章對你有用。歡迎大家點贊、哈哈
繼續加油 |