1.使用了 P0,P1,P2,P3,P4
2.
3.
使用到了定时器,并把定时器计数数率的模式调为了12T模式
4.
5.
6.
7.main
/*******************************************************
** 波特率:9600 bit/S
** 延时口令模式: 即识别时都说“小明”这个口令唤醒后,如果15秒内不进行语音识别则退出唤醒
/*********************************************************/
#include "config.h"
/************************************************************************************/
// nAsrStatus 用来在main主程序中表示程序运行的状态,不是LD3320芯片内部的状态寄存器
// LD_ASR_NONE: 表示没有在作ASR识别
//ASR,英文的全称是Automated?Speech?Recognition,即自动语音识别技术,它是一种将人的语音转换为文本的技术。
//语音识别是一个多学科交叉的领域,它与声学、语音学、语言学、数字信号处理理论、信息论、计算机科学等众多学科紧密相连。
//由于语音信号的多样性和复杂性,目前的语音识别系统只能在一定的限制条件下获得满意的性能,或者说只能应用于某些特定的场合。
//语音识别系统的性能大致取决于以下4类因素:1.?识别词汇表的大小和语音的复杂性;2.?语音信号的质量;3.?单个说话人还是多说话人;4.?硬件。
// LD_ASR_RUNING: 表示LD3320正在作ASR识别中
// LD_ASR_FOUNDOK: 表示一次识别流程结束后,有一个识别结果
// LD_ASR_FOUNDZERO: 表示一次识别流程结束后,没有识别结果
// LD_ASR_ERROR: 表示一次识别流程中LD3320芯片内部出现不正确的状态
/***********************************************************************************/
uint8 idata nAsrStatus = 0;
void MCU_init();//对4组引脚进行了不同的初始化、选择了定时器时钟模式、选择定时器模式、定时器的初值、定时器/计数器溢出标志位定时器开始计时、定时器0的中断允许控制位、设置管脚模式、//外部中断0中断请求标志位、允许外部中断0中断、开总中断控制位
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;
sbit SRD5 = P1 ^ 3;
sbit SRD6 = P1 ^ 2;//凭感觉改的-----------------------------------------------------------------------------------------------------------------------------------------------------
/***********************************************************
* 名 称: 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
//UARTSendByte(0);//---------------------------------------------------------------------------
while(1)
{
if(over_time>=500)
{
over_time=0;
G0_flag = DISABLE;
LED = 1;
UARTSendByte(0x38);//超时十进制8--------------------------------------------------------------------------
}
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标志
// 定时器/计数器0溢出标志位.当T0允许计数后,T0从初值开始加1计数,最高
//位产生溢出时,置“1”TF0,并向CPU请求中断,当CPU响应时,由硬件清"0”
//TF0,TF0也可以由程序查询或清“0”
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;
UARTSendByte(0x39);// PrintCom("<G>你好,主人"); -----------------------------唤醒小明
LED = 0;
}
else if(ENABLE == G0_flag)
{
// G0_flag = DISABLE;
// LED = 1;
switch(dat)
{
case CODE_1: //餐巾纸--------------打开干垃圾桶
over_time=0;
SRD1 = 1;
UARTSendByte(0x31);
break;
case CODE_2: //干燥剂---------------打开干垃圾桶
over_time=0;
SRD1 = 0;
UARTSendByte(0x31);
break;
case CODE_3: //橡皮泥---------------打开干垃圾桶
over_time=0;
SRD2 = 1;
UARTSendByte(0x31);
break;
case CODE_4: //菜叶---------------打开湿垃圾桶
over_time=0;
SRD2 = 0;
UARTSendByte(0x32);
break;
case CODE_5: //杂草---------------打开湿垃圾桶
over_time=0;
SRD3 = 1;
UARTSendByte(0x32);
break;
case CODE_6: //果皮---------------打开湿垃圾桶
over_time=0;
SRD3 = 0;
UARTSendByte(0x32);
break;
case CODE_7: //玻璃酒瓶---------------打开可回收垃圾桶
over_time=0;
SRD4 = 1;
UARTSendByte(0x33);
break;
case CODE_8: //洗手液瓶---------------打开可回收垃圾桶
over_time=0;
SRD4 = 0;
UARTSendByte(0x33);
break;
case CODE_9: //塑料文具---------------打开可回收垃圾桶
over_time=0;
SRD5 = 1;
UARTSendByte(0x33);
break;
case CODE_10: //充电电池---------------打开有害垃圾桶
over_time=0;
SRD5 = 0;
UARTSendByte(0x34);
break;
case CODE_11: //过期药物---------------打开有害垃圾桶
over_time=0;
SRD6 = 1;
UARTSendByte(0x34);
break;
case CODE_12: //水银温度计---------------打开有害垃圾桶
over_time=0;
SRD6 = 0;
UARTSendByte(0x34);
break;
default:
break;
}
}
else
{
//PrintCom("请说出一级口令\r\n"); /*text.....*/
}
}
void tm0_isr() interrupt 1
{
TL0 = 0x00; //设置定时初值
TH0 = 0x28; //设置定时初值
WDT_CONTR=0x3D;
if(G0_flag == ENABLE)
{
over_time++;
}
}
(1) MCU_init
/***********************************************************
* 名 称: void MCU_init()
* 功 能: 单片机初始化
* 入口参数:
* 出口参数:
* 说 明:
* 调用方法:
* P0,P1,P2,P3,P4
**********************************************************/
void MCU_init()
{
P0 = 0xff;//该芯片有4组引脚,初试化,给没组引脚的每个引脚赋值高低电平。高电平为5V低电平为0V
P1 = 0x00;
P2 = 0xff;
P3 = 0xff;
P4 = 0xff;
AUXR &= 0x7F; //定时器时钟12T模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x00; //设置定时初值
TH0 = 0x28; //设置定时初值
TF0 = 0; //清除TF0标志
// 定时器/计数器0溢出标志位.当T0允许计数后,T0从初值开始加1计数,最高
//位产生溢出时,置“1”TF0,并向CPU请求中断,当CPU响应时,由硬件清"0”
//TF0,TF0也可以由程序查询或清“0”
TR0 = 1; //定时器0开始计时
ET0=1;
LD_MODE = 0; // 设置MD管脚为低,并行模式读写
IE0 = 1;
EX0 = 1;
EA = 1;
WDT_CONTR=0x3D;
}
(2)
AUXR &= 0x7F; //定时器时钟12T模式
(3)
TMOD |= 0x01; //设置定时器模式
TL0 = 0x00; //设置定时初值
TH0 = 0x28; //设置定时初值
(4)
TF0 = 0; //清除TF0标志
// 定时器/计数器0溢出标志位.当T0允许计数后,T0从初值开始加1计数,最高
//位产生溢出时,置“1”TF0,并向CPU请求中断,当CPU响应时,由硬件清"0”
//TF0,TF0也可以由程序查询或清“0”
(5)
TR0 = 1; //定时器0开始计时
(6)
ET0=1;//中断允许控制位
(7)
LD_MODE = 0; // 设置MD管脚为低,并行模式读写
//驱动端口定义
sbit LD_MODE =P4^3; /读写模式选择/
(8)
IE0 = 1;
(9)
EX0 = 1;
(10)
EA = 1;
(11)
WDT_CONTR=0x3D;
(12)
(1)
P1M0
(2)
/************************************************************************
功能描述: 复位LD模块
入口参数: none
返 回 值: none
其他说明: none
**************************************************************************/
void LD_Reset()
{
RSTB = 1;//sbit RSTB=P3^5; /*复位端口*/
delay(5);
RSTB = 0;
delay(5);
RSTB = 1;
delay(5);
CSB = 0;//sbit CSB=P2^1; /*模块片选端口*/
delay(5);
CSB = 1;
delay(5);
}
(3)
/************************************************************************
函 数 名: 串口初始化
功能描述: 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
}
10.
11.
/*******************************************************
** CPU: STC11L08XE
** 晶振:22.1184MHZ
** 波特率:9600 bit/S
** 延时口令模式: 即识别时都说“小明”这个口令唤醒后,如果15秒内不进行语音识别则退出唤醒
/*********************************************************/
#include "config.h"
#define LD_INDEX_PORT (*((volatile unsigned char xdata*)(0x8100)))
#define LD_DATA_PORT (*((volatile unsigned char xdata*)(0x8000)))
void LD_WriteReg( unsigned char address, unsigned char dataout )
{
LD_INDEX_PORT = address;
LD_DATA_PORT = dataout;
}
unsigned char LD_ReadReg( unsigned char address )
{
LD_INDEX_PORT = address;
return (unsigned char)LD_DATA_PORT;
}
12.
13.
14.