|
資料
SYN6288模塊原理圖
語音合成命令
接線
如何接線
實(shí)現(xiàn)原理
程序代碼
main.c
syn6288.c
uart.c
delay.c
基于 51單片機(jī)的其他項(xiàng)目
尾聲
資料
我用的是綠深電子技術(shù)的模塊,資料也挺齊全的。也有相關(guān)例程。
SYN6288模塊原理圖
語音合成命令
接線
如何接線
接線其實(shí)很簡單。
51單片機(jī) SYN6288語音合成
TX RX
VCC VCC
GND GND
實(shí)現(xiàn)原理
51單片機(jī) 串口接收數(shù)據(jù),根據(jù)不同的數(shù)據(jù) 通過串口的形式發(fā)送給 SYN6288,從而控制SYN6288語音播報(bào)。
程序代碼
我用的是STC89C52
main.c
- #include <reg52.h>
- #include "syn6288.h"
- #include "delay.h"
- #include "uart.h"
- /**************芯片設(shè)置命令*********************/
- 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}; //恢復(fù)合成
- unsigned char SYN_ChackCom[] = {0XFD, 0X00, 0X02, 0X21, 0XDE}; //狀態(tài)查詢
- unsigned char SYN_PowerDownCom[] = {0XFD, 0X00, 0X02, 0X88, 0X77}; //進(jìn)入POWER DOWN 狀態(tài)命令
- unsigned char receive_ok = 0; //接收標(biāo)志位
- unsigned char command; //接收串口來的數(shù)據(jù)
- //串口1初始化
- void UART1_Init(void)
- {
- SCON = 0x50; //8位數(shù)據(jù),可變波特率
- TMOD |= 0x20; //設(shè)定定時(shí)器1為8位自動重裝方式
- TL1 = 0xFD; //設(shè)定定時(shí)初值
- TH1 = 0xFD; //設(shè)定定時(shí)器重裝值
- ET1 = 0; //禁止定時(shí)器1中斷
- TR1 = 1; //啟動定時(shí)器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朗讀語速最快
- //其他不常用功能請參考數(shù)據(jù)手冊
- /*判斷指令*/
- switch(command)
- {
- case '1': //如果是 1
- receive_ok = 0;
- SYN_FrameInfo(0, "[v3][t5]你好"); //喇叭說 你好
- delay(2000);
- command = 0;
- receive_ok = 1;
- break;
- case 'G': //如果你 G 喇叭說 這個(gè)是干垃圾
- receive_ok = 0; //禁止接收串口數(shù)據(jù)
- SYN_FrameInfo(0, "[v3][t5]這個(gè)是干垃圾");
- delay(2000);
- command = 0;
- receive_ok = 1; //允許接收串口數(shù)據(jù)
- break;
- default :
- receive_ok = 1;
- break;
- }
- //暫停合成,此時(shí)沒有用到,用于展示函數(shù)用法
- //YS_SYN_Set(SYN_SuspendCom);
- }
- }
- //串口1中斷
- void Uart1_Isr() interrupt 4
- {
- if(receive_ok == 1) //如果可以接收數(shù)據(jù)了
- {
- command = SBUF; //接收數(shù)據(jù)
- while(!RI);
- RI=0;
- receive_ok = 0;
- }
- }
復(fù)制代碼
syn6288.c
- #include <reg52.h>
- #include <string.h>
- #include "uart.h"
- #include "syn6288.h"
- /**************芯片設(shè)置命令*********************/
- /*外部聲明*/
- 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)
- {
- /****************需要發(fā)送的文本**********************************/
- unsigned char Frame_Info[50];
- unsigned char HZ_Length;
- unsigned char ecc = 0; //定義校驗(yàn)字節(jié)
- unsigned int i = 0;
- HZ_Length = strlen((char*)HZdata); //需要發(fā)送文本的長度
- /*****************幀固定配置信息**************************************/
- Frame_Info[0] = 0xFD ; //構(gòu)造幀頭FD
- Frame_Info[1] = 0x00 ; //構(gòu)造數(shù)據(jù)區(qū)長度的高字節(jié)
- Frame_Info[2] = HZ_Length + 3; //構(gòu)造數(shù)據(jù)區(qū)長度的低字節(jié)
- Frame_Info[3] = 0x01 ; //構(gòu)造命令字:合成播放命令
- Frame_Info[4] = 0x01 | Music << 4 ; //構(gòu)造命令參數(shù):背景音樂設(shè)定
- /*******************校驗(yàn)碼計(jì)算***************************************/
- for(i = 0; i < 5; i++) //依次發(fā)送構(gòu)造好的5個(gè)幀頭字節(jié)
- {
- ecc = ecc ^ (Frame_Info[i]); //對發(fā)送的字節(jié)進(jìn)行異或校驗(yàn)
- }
- for(i = 0; i < HZ_Length; i++) //依次發(fā)送待合成的文本數(shù)據(jù)
- {
- ecc = ecc ^ (HZdata[i]); //對發(fā)送的字節(jié)進(jìn)行異或校驗(yàn)
- }
- /*******************發(fā)送幀信息***************************************/
- 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"
- /*串口發(fā)送一字節(jié)數(shù)據(jù)*/
- void UART1_SendByte(unsigned char DAT)
- {
- SBUF = DAT;
- while(TI == 0);
- TI=0;
- }
- /*串口發(fā)送字符串?dāng)?shù)據(jù)*/
- void UART1_SendString(unsigned char *DAT, unsigned char len)
- {
- unsigned char i;
- for(i = 0; i < len; i++)
- {
- UART1_SendByte(*DAT++);
- }
- }
復(fù)制代碼
delay.c
- #include <reg52.h>
- #include "delay.h"
- //軟件延時(shí)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"
- //軟件延時(shí)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++);
- }
復(fù)制代碼
尾聲
如果覺得這篇文章對你有用。歡迎大家點(diǎn)贊、哈哈
繼續(xù)加油 |
|