LD3320+STC11L08XE与SYN6288-语音合成芯片链接以及故障排查
·
1.更改STC11L08XE内部程序协议;
main.c
/*******************************************************
** CPU: STC11L08XE
** 晶振:22.1184MHZ
** 波特率:9600 bit/S
** 延时口令模式: 即识别时都说“小杰”这个口令唤醒后,如果15秒内不进行语音识别则退出唤醒
/*********************************************************/
#include "config.h"
/************************************************************************************/
// nAsrStatus 用来在main主程序中表示程序运行的状态,不是LD3320芯片内部的状态寄存器
// LD_ASR_NONE: 表示没有在作ASR识别
// LD_ASR_RUNING: 表示LD3320正在作ASR识别中
// LD_ASR_FOUNDOK: 表示一次识别流程结束后,有一个识别结果
// LD_ASR_FOUNDZERO: 表示一次识别流程结束后,没有识别结果
// LD_ASR_ERROR: 表示一次识别流程中LD3320芯片内部出现不正确的状态
/***********************************************************************************/
uint8 idata nAsrStatus = 0;
void MCU_init();
void ProcessInt0(); //识别处理函数
void delay(unsigned long uldata);
void User_handle(uint8 dat);//用户执行操作函数
void Delay200ms();
void Led_test(void);//单片机工作指示
uint8_t G0_flag = DISABLE; //运行标志,ENABLE:运行。DISABLE:禁止运行
sbit LED = P4 ^ 2; //信号指示灯
int over_time;
sbit SRD1 = P1 ^ 7;
sbit SRD2 = P1 ^ 6;
sbit SRD3 = P1 ^ 5;
sbit SRD4 = P1 ^ 4;
/***********************************************************
* 名 称: void main(void)
* 功 能: 主函数 程序入口
* 入口参数:
* 出口参数:
* 说 明:
* 调用方法:
**********************************************************/
void main(void)
{
uint8 idata nAsrRes;
uint8 i = 0;
P1M0 = 0xFF;
P1M1 = 0x00;
SRD1 = SRD2 = SRD3 = SRD4 = 0;
Led_test();
MCU_init();
LD_Reset();
UartIni(); /*串口初始化*/
nAsrStatus = LD_ASR_NONE; // 初始状态:没有在作ASR
PrintCom("欢迎使用");
while(1)
{
if(over_time>=500)
{
over_time=0;
G0_flag = DISABLE;
LED = 1;
PrintCom("主人,我先退下了");
}
switch(nAsrStatus)
{
case LD_ASR_RUNING:
case LD_ASR_ERROR:
break;
case LD_ASR_NONE:
{
nAsrStatus = LD_ASR_RUNING;
if (RunASR() == 0) /* 启动一次ASR识别流程:ASR初始化,ASR添加关键词语,启动ASR运算*/
{
nAsrStatus = LD_ASR_ERROR;
}
break;
}
case LD_ASR_FOUNDOK: /* 一次ASR识别流程结束,去取ASR识别结果*/
{
nAsrRes = LD_GetResult(); /*获取结果*/
User_handle(nAsrRes);//用户执行函数
nAsrStatus = LD_ASR_NONE;
break;
}
case LD_ASR_FOUNDZERO:
default:
{
nAsrStatus = LD_ASR_NONE;
break;
}
}// switch
}// while
}
/***********************************************************
* 名 称: LED灯测试
* 功 能: 单片机是否工作指示
* 入口参数: 无
* 出口参数:无
* 说 明:
**********************************************************/
void Led_test(void)
{
LED = ~ LED;
Delay200ms();
LED = ~ LED;
Delay200ms();
LED = ~ LED;
Delay200ms();
LED = ~ LED;
Delay200ms();
LED = ~ LED;
Delay200ms();
LED = ~ LED;
}
/***********************************************************
* 名 称: void MCU_init()
* 功 能: 单片机初始化
* 入口参数:
* 出口参数:
* 说 明:
* 调用方法:
**********************************************************/
void MCU_init()
{
P0 = 0xff;
P1 = 0x00;
P2 = 0xff;
P3 = 0xff;
P4 = 0xff;
AUXR &= 0x7F; //定时器时钟12T模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x00; //设置定时初值
TH0 = 0x28; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1;
LD_MODE = 0; // 设置MD管脚为低,并行模式读写
IE0 = 1;
EX0 = 1;
EA = 1;
WDT_CONTR=0x3D;
}
/***********************************************************
* 名 称: 延时函数
* 功 能:
* 入口参数:
* 出口参数:
* 说 明:
* 调用方法:
**********************************************************/
void Delay200us() //@22.1184MHz
{
unsigned char i, j;
_nop_();
_nop_();
i = 5;
j = 73;
do
{
while (--j);
}
while (--i);
}
void delay(unsigned long uldata)
{
unsigned int j = 0;
unsigned int g = 0;
while(uldata--)
Delay200us();
}
void Delay200ms() //@22.1184MHz
{
unsigned char i, j, k;
i = 17;
j = 208;
k = 27;
do
{
do
{
while (--k);
}
while (--j);
}
while (--i);
}
/***********************************************************
* 名 称: 中断处理函数
* 功 能:
* 入口参数:
* 出口参数:
* 说 明:
* 调用方法:
**********************************************************/
void ExtInt0Handler(void) interrupt 0
{
ProcessInt0();
}
/***********************************************************
* 名 称:用户执行函数
* 功 能:识别成功后,执行动作可在此进行修改
* 入口参数: 无
* 出口参数:无
* 说 明:
**********************************************************/
void User_handle(uint8 dat)
{
if(0 == dat)
{
G0_flag = ENABLE;
over_time=0;
PrintCom("你好,主人");
LED = 0;
}
else if(ENABLE == G0_flag)
{
// G0_flag = DISABLE;
// LED = 1;
switch(dat)
{
case CODE_1: /*命令“开灯”*/
over_time=0;
SRD1 = 1;
PrintCom("灯已打开");
break;
case CODE_2: /*命令“关灯”*/
over_time=0;
SRD1 = 0;
PrintCom("灯已关闭");
break;
case CODE_3: /*命令“打开电视”*/
over_time=0;
SRD2 = 1;
PrintCom("电视机已打开");
break;
case CODE_4: /*命令“关闭电视”*/
over_time=0;
SRD2 = 0;
PrintCom("电视机已关闭");
break;
case CODE_5: /*命令“打开冰箱”*/
over_time=0;
SRD3 = 1;
PrintCom("冰箱已打开");
break;
case CODE_6: /*命令“关闭冰箱”*/
over_time=0;
SRD3 = 0;
PrintCom("冰箱已关闭");
break;
case CODE_7: /*命令“打开空调”*/
over_time=0;
SRD4 = 1;
PrintCom("空调已打开");
break;
case CODE_8: /*命令“关闭空调”*/
over_time=0;
SRD4 = 0;
PrintCom("空调已关闭");
break;
case CODE_9: /*命令“全部打开”*/
over_time=0;
SRD1 = 1;
SRD2 = 1;
SRD3 = 1;
SRD4 = 1;
PrintCom("已全部打开");
break;
case CODE_10: /*命令“全部关闭”*/
over_time=0;
SRD1 = 0;
SRD2 = 0;
SRD3 = 0;
SRD4 = 0;
PrintCom("已全部关闭");
break;
case CODE_11: /*命令“.....”*/
over_time=0;
PrintCom("");
break;
case CODE_12: /*命令“.....”*/
over_time=0;
PrintCom("");
break;
case CODE_13: /*命令“.....”*/
over_time=0;
PrintCom("");
break;
case CODE_14: /*命令“.....”*/
over_time=0;
PrintCom("");
break;
case CODE_15: /*命令“.....”*/
over_time=0;
PrintCom("");
break;
case CODE_16: /*命令“.....”*/
over_time=0;
PrintCom("");
break;
case CODE_17: /*命令“.....”*/
over_time=0;
PrintCom("");
break;
case CODE_18: /*命令“.....”*/
over_time=0;
PrintCom("");
break;
case CODE_19: /*命令“.....”*/
over_time=0;
PrintCom("");
break;
case CODE_20: /*命令“.....”*/
over_time=0;
PrintCom("");
break;
case CODE_21: /*命令“.....”*/
over_time=0;
PrintCom("");
break;
case CODE_22: /*命令“.....”*/
over_time=0;
PrintCom("");
break;
case CODE_23: /*命令“.....”*/
over_time=0;
PrintCom("");
break;
case CODE_24: /*命令“.....”*/
over_time=0;
PrintCom("");
break;
case CODE_25: /*命令“.....”*/
over_time=0;
PrintCom("");
break;
case CODE_26: /*命令“.....”*/
over_time=0;
PrintCom("");
break;
case CODE_27: /*命令“.....”*/
over_time=0;
PrintCom("");
break;
case CODE_28: /*命令“.....”*/
over_time=0;
PrintCom("");
break;
case CODE_29: /*命令“.....”*/
over_time=0;
PrintCom("");
break;
case CODE_30: /*命令“.....”*/
over_time=0;
PrintCom("");
break;
case CODE_31: /*命令“.....”*/
over_time=0;
PrintCom("");
break;
case CODE_32: /*命令“.....”*/
over_time=0;
PrintCom("");
break;
case CODE_33: /*命令“.....”*/
over_time=0;
PrintCom("");
break;
case CODE_34: /*命令“.....”*/
over_time=0;
PrintCom("");
break;
case CODE_35: /*命令“.....”*/
over_time=0;
PrintCom("");
break;
case CODE_36: /*命令“.....”*/
over_time=0;
PrintCom("");
break;
case CODE_37: /*命令“.....”*/
over_time=0;
PrintCom("");
break;
case CODE_38: /*命令“.....”*/
over_time=0;
PrintCom("");
break;
case CODE_39: /*命令“.....”*/
over_time=0;
PrintCom("");
break;
case CODE_40: /*命令“.....”*/
over_time=0;
PrintCom("");
break;
case CODE_41: /*命令“.....”*/
over_time=0;
PrintCom("");
break;
case CODE_42: /*命令“.....”*/
over_time=0;
PrintCom("");
break;
case CODE_43: /*命令“.....”*/
over_time=0;
PrintCom("");
break;
case CODE_44: /*命令“.....”*/
over_time=0;
PrintCom("");
break;
case CODE_45: /*命令“.....”*/
over_time=0;
PrintCom("");
break;
case CODE_46: /*命令“.....”*/
over_time=0;
PrintCom("");
break;
case CODE_47: /*命令“.....”*/
over_time=0;
PrintCom("");
break;
case CODE_48: /*命令“.....”*/
over_time=0;
PrintCom("");
break;
case CODE_49: /*命令“.....”*/
over_time=0;
PrintCom("");
break;
default:/*text.....*/
break;
}
}
else
{
//PrintCom("请说出一级口令\r\n"); /*text.....*/
}
}
void tm0_isr() interrupt 1
{
TL0 = 0x00; //设置定时初值
TH0 = 0x28; //设置定时初值
WDT_CONTR=0x3D;
if(G0_flag == ENABLE)
{
over_time++;
}
}
usart.c
#include "config.h"
#include "stdio.h"
#include "usart.h"
#include "string.h"
#define FOSC 22118400L //System frequency
uint32_t baud=9600; //UART baudrate
uint8_t RX_BUF[50];
uint8_t NUM_1=0;
/************************************************************************
函 数 名: 串口初始化
功能描述: STC10L08XE 单片机串口初始化函数
返回函数: none
其他说明: none
**************************************************************************/
void UartIni(void)
{
SCON = 0x50; //8-bit variable UART
TMOD |= 0x20; //Set Timer1 as 8-bit auto reload mode
TH1 = TL1 = -(FOSC/12/32/baud); //Set auto-reload vaule
TR1 = 1; //Timer1 start run
ES = 1; //Enable UART interrupt
EA = 1; //Open master interrupt switch
}
/************************************************************************
功能描述: 串口发送一字节数据
入口参数: DAT:带发送的数据
返 回 值: none
其他说明: none
**************************************************************************/
void UARTSendByte(uint8_t DAT)
{
ES = 0;
TI=0;
SBUF = DAT;
while(TI==0);
TI=0;
ES = 1;
}
/************************************************************************
功能描述: 串口发送字符串数据
入口参数: *DAT:字符串指针
返 回 值: none
其他说明: API 供外部使用,直观!
**************************************************************************/
void PrintCom(uint8_t *DAT)
{
unsigned char Frame_Info[48];
unsigned char HZ_Length;
unsigned char ecc = 0;
unsigned int i = 0;
HZ_Length = strlen((char*)DAT);
// /*****************??1ì?¨????D??¢**************************************/
Frame_Info[0] = 0xFD ; //11?ì??í·FD
Frame_Info[1] = 0x00 ; //11?ìêy?Y??3¤?èμ???×??ú
Frame_Info[2] = HZ_Length + 3+12; //11?ìêy?Y??3¤?èμ?μí×??ú
Frame_Info[3] = 0x01 ; //11?ì?üá?×?£oo?3é2¥·??üá?
Frame_Info[4] = 0x01 | 0 << 4 ; //11?ì?üá?2?êy£o±3?°ò?à?éè?¨
// /*******************·¢?í??D??¢***************************************/
memcpy(&Frame_Info[5], "[v7][m1][t5]", 12);
memcpy(&Frame_Info[17], DAT, HZ_Length);
// /*******************D£?é??????***************************************/
for(i = 0; i < 5+12+HZ_Length; i++) //òà′?·¢?í11?ìo?μ?5????í·×??ú
{
ecc = ecc ^ (Frame_Info[i]); //??·¢?íμ?×??ú??DDòì?òD£?é
}
Frame_Info[5 + 12 + HZ_Length] = ecc;
//// USART3_SendString(Frame_Info, 5 + HZ_Length + 1);
//
for(i=0;i<(5 + HZ_Length + 12 + 1);i++)
{
UARTSendByte(Frame_Info[i]);
}
}
void Uart_Isr() interrupt 4 using 1
{
if (RI)
{
RI=0;
RX_BUF[NUM_1]=SBUF;
NUM_1++;
if(NUM_1>=49)
NUM_1=0;
if(NUM_1>=3)
{
if(RX_BUF[NUM_1]==0xF8&&RX_BUF[NUM_1-1]==0xF8&&RX_BUF[NUM_1-2]==0xF8)
IAP_CONTR=0x60;
}
}
}
修改串口协议:
原始发送协议:

按照SYN6288修改后发送协议:

留意:STC11L08XE内存原因,说话缓存只能48定义:减去5个字节帧头和[v7][m1][t5]的12个字节剩余31个字节,每个中文字符占2个字节。因此只能说15个字;可以删除[v7][m1][t5]进行扩展12个字节即6个字。

2.此时:收发串口数据一致:

但是此时互插后,仍然无法链接通讯;
重点:最终发现两边收发tx、rx两根线需要下拉电阻才可以通讯;
手上只有120Ω,就直接使上了。两边tx->RX;rx->TX;交叉互接。

更多推荐



所有评论(0)