[原创]廉价语音模块试用实例

2020-02-08 09:09发布

模块很便宜,品牌叫天龙,在淘宝上搜来的。带2首背景曲,15个音效,女声发音。
tts_2.jpg (96.67 KB, 下载次数: 2) 下载附件 2012-5-11 12:06 上传

程序实际跑通的。BUSY信号送到RB0, RST连接到RD7。串口连接RD4/RD5

//USART2,连接汉语语音合成芯片组件TTS。RD4设为TX2(对语音芯片的RX),RD5设为RX2,
//RB0连接BUSY
//RD7作为模块RESET。开启U2_RC中断响应,以便重启TTS之后不被吊死
#include <P18f46j11.h>
#include <usart.h>
#include <timers.h>
#include <stdlib.h>
#include <delays.h>
#define LED1 LATDbits.LATD2

//以下预先声明各个函数
void main (void);
void InterruptHandlerHigh (void);

unsigned char u2_rc;
//***************主函数*****************
void main()
{
unsigned char i,j;
//**************USART2 INIT**********************
EECON2=0x55;                        //修改重定位锁定标志前的必须序列
EECON2=0xAA;
PPSCONbits.IOLOCK=0;                                //打开重定向锁
RPINR16=22;                                                        //RX2赋予RP22(RD5)
RPOR21=5;                                                `        //TX2连接到RP21(RD4)
EECON2=0x55;                        //修改重定位锁定标志前的必须序列
EECON2=0xAA;
PPSCONbits.IOLOCK=1;                                //关闭重定向锁
Close2USART();                                                //关闭串口
//下句打开串口2,收中断,高速,9600
Open2USART( USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE &
USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_LOW,51 );
RCSTA2bits.ADDEN=0;                                        //消除9位通信的地址相关设置
BAUDCON2bits.ABDOVF=0;                                //将波特率计满指示清0
BAUDCON2bits.RXDTP=0;                                //将空闲反相关闭
BAUDCON2bits.BRG16=1;                                //选择16位波特率
ANCON1bits.PCFG12=1;                                //RB0(AN12)=IO
TRISBbits.TRISB0=1;                                        //
//****************INTERRUPT INIT*******************
INTCONbits.PEIE=1;
INTCONbits.GIE=1;
//**************************IO INIT********************
TRISDbits.TRISD2=0;                //RD2 led output
TRISDbits.TRISD7=0;                //RD7 TTS模块RESET
//*********TTS RESET**************************
LATDbits.LATD7=0;
Delay1KTCYx(150);                                        //减慢发送速度而设
Delay1KTCYx(150);                                        //减慢发送速度而设
LATDbits.LATD7=1;
Delay1KTCYx(150);                                        //减慢发送速度而设
while (!TXSTA2bits.TRMT);
putrs2USART("<N>1");                                ////have a try
Delay1KTCYx(100);                                        //减慢发送速度而设
while (!TXSTA2bits.TRMT);
putrs2USART("<W>1");                                ////have a try
Delay1KTCYx(100);                                        //减慢发送速度而设
while (!TXSTA2bits.TRMT);
putrs2USART("<X>1");                                ////have a try
Delay1KTCYx(100);                                        //减慢发送速度而设
while (!TXSTA2bits.TRMT);
putrs2USART("<M>0");                                ////have a try
Delay1KTCYx(100);                                        //减慢发送速度而设
while (!TXSTA2bits.TRMT);
putrs2USART("<G>x18 ,老婆大人,你好!x13");     
Delay1KTCYx(100);                                        //减慢发送速度而设
putrs2USART("<I>2");                                ////have a try
Delay1KTCYx(100);                                        //减慢发送速度而设
while (!TXSTA2bits.TRMT);
putrs2USART("<G>x11 你来啦!今天天气真好 x12");                                //a try
while (!TXSTA2bits.TRMT);
putrs2USART("x14 请你吃西瓜,你先吃大边,你再吃小边 x15");                                //a try
while (!TXSTA2bits.TRMT);
putrs2USART("x16 有时间咱们去人人乐超市吧? x17");                                //a try

//**************************主循环************************
while(1)
{
Delay1KTCYx(100);                                        //减慢发送速度而设
if (PORTBbits.RB0)
LED1=1;                                                                //测试指示
else
LED1=0;                                                                //测试指示
//到达MAIN最后部分
}
}

//----------------------------------------------------------------------------
// High priority interrupt vector
#pragma code InterruptVectorHigh = 0x08
void
InterruptVectorHigh (void)
{
  _asm
    goto InterruptHandlerHigh   //jump to interrupt routine
  _endasm
}
//----------------------------------------------------------------------------
// High priority interrupt routine
#pragma code
#pragma interrupt InterruptHandlerHigh
void InterruptHandlerHigh ()
{
if (INTCONbits.TMR0IF)
{                           //check for TMR0 overflow
INTCONbits.TMR0IF = 0;        //clear interrupt flag
}
else if (PIR3bits.RC2IF)
{
u2_rc = RCREG2;                //若USART2收中断,以读出数据方式清除标志
}
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。