300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 基于51单片机+LD3320语音模块+SYN6288语音合成——语音识别智能分类垃圾桶

基于51单片机+LD3320语音模块+SYN6288语音合成——语音识别智能分类垃圾桶

时间:2021-04-03 18:05:41

相关推荐

基于51单片机+LD3320语音模块+SYN6288语音合成——语音识别智能分类垃圾桶

语音识别智能分类垃圾桶

基本介绍器件51单片机LD3320语音模块SYN6288语音合成SG90舵机(4个)usb-ttl模块垃圾桶四个(4个)面包板(建议用)其他实现思路与接线实现流程图呈现图接线代码编写语音模块(部分代码)语音模块串口调试结果SYN6288语音播报SYN6288资料51单片机控制SYN6288语音播报 程序代码舵机51单片机控制舵机 程序代码51单片机—智能垃圾桶 程序代码(部分)main.csyn6288.c项目展示基于 51单片机的其他项目总结

基本介绍

这个一个基于51单片机做的一个语音识别分类智能垃圾桶,我这里用的是STC89C52通过我们说话来对垃圾词语进行分类。比如:垃圾桶(一级指令)易拉罐(垃圾词语),我们通过说话 说出关键字 让语音模块 接收到 —— 语音模块通过串口发指令给51单片机,针对指令 51单片机发指令和语音合成模块,让喇叭说话、 并且控制指令对应的舵机从而实现对垃圾桶开盖。实现起来其实不难。

器件

51单片机

LD3320语音模块

我用的是这个 飞音云店铺的 开源的。

SYN6288语音合成

SG90舵机(4个)

180°不带限位。

usb-ttl模块

垃圾桶四个(4个)

面包板(建议用)

其他

还有什么杜邦线啥的这里就不说了。

实现思路与接线

实现流程图

这图自己画的哈哈哈 也还行吧 美术生的功底没能展示出来。

人说话——语音模块识别——发指令给51单片机——51根据指令控制舵机 and 控制语音合成进行 播报。

呈现图

接线

注意供电问题 有时候供电不够会导致效果不太好

如果有多个 VCC 可以 分来接 舵机 和 语音 和 SYN6288。

语音模块:5V供电

SYN6288:5V供电

舵机: 5V 3.3V都可

代码编写

语音模块(部分代码)

语音模块 厂家是有给源码的,我们只需要改成我们需要的就行。

厂家给的文件:

LDChip.c

uint8 LD_AsrAddFixed(){uint8 k, flag;uint8 nAsrAddLength;#define DATE_A 50 /*数组二维数值*/#define DATE_B 70/*数组一维数值*/uint8 code sRecog[DATE_A][DATE_B] = {"la ji tong",\"yan tou",\"jiao shui",\"jiao dai",\"fan qie",\"guo pi",\"sheng cai",\"fei jiu dian chi",\"guo qi yao pin",\"sha chong ji",\"kuang quan shui ping",\"bao zhi",\"yi la guan"};/*添加关键词,用户修改*/uint8 code pCode[DATE_A] = {CODE_CMD,\CODE_YT,\ CODE_JS,\ CODE_JD,\CODE_FQ,\CODE_GP,\CODE_SC,\CODE_FJDC,\CODE_GQYP,\CODE_SCJ,\CODE_KQSP,\CODE_BZ,\CODE_YLG};/*添加识别码,用户修改*/}

厂家给的文件:

main.c

void User_handle(uint8 dat){//UARTSendByte(dat);//串口识别码(十六进制)if(0==dat){G0_flag=ENABLE;LED=0;UARTSendByte('1'); /*text.....*/}else if(ENABLE==G0_flag){G0_flag=DISABLE;LED=1;switch(dat) /*对结果执行相关操作,客户可删除Printcom 串口输出语句替换为其他需要控制的代码*/{/*干垃圾*/ case CODE_YT:UARTSendByte('G'); /*text.....*/break; case CODE_JS: UARTSendByte('G'); /*text.....*/break; case CODE_JD:UARTSendByte('G'); /*text.....*/break; /*湿垃圾*/case CODE_FQ:UARTSendByte('S'); /*text.....*/break;case CODE_GP:UARTSendByte('S'); /*text.....*/break;case CODE_SC:UARTSendByte('S'); /*text.....*/break;/*有害垃圾*/case CODE_FJDC:UARTSendByte('Y'); /*text.....*/break;case CODE_GQYP:UARTSendByte('Y'); /*text.....*/break;case CODE_SCJ:UARTSendByte('Y'); /*text.....*/break;/*可回收垃圾*/case CODE_KQSP:UARTSendByte('K'); /*text.....*/break;case CODE_BZ:UARTSendByte('K'); /*text.....*/break;case CODE_YLG:UARTSendByte('K'); /*text.....*/break;default: //啥也不做break;}}}

语音模块串口调试结果

测试:垃圾桶 易拉罐 垃圾桶 果皮

这边语音模块是没啥问题了,我们先单个模块这样编写代码,完事整合一起就是一个智能垃圾桶了。

SYN6288语音播报

SYN6288资料

SYN6288模块原理图:

语音合成命令:

51单片机控制SYN6288语音播报 程序代码

可以参考我写的这篇文章。

51单片机+SYN6288语音播报

舵机

51单片机控制舵机 程序代码

可以参考我写的这篇文章。

基于51单片机+SG90舵机

51单片机—智能垃圾桶 程序代码(部分)

部分代码

main.c

#include <reg52.h>#include "syn6288.h"#include "delay.h"#include "uart.h"unsigned int count;//次数标识unsigned int angle=5; //角度标识sbit pwmg = P1^0; //PWM信号输出 sbit pwms = P1^1;//PWM信号输出sbit pwmy = P1^2;//PWM信号输出sbit pwmk = P1^3;//PWM信号输出unsigned char value = 0; //控制舵机 标志位unsigned char send_flag_ok = 1; //1 允许发送 0不允许发送unsigned char receive_flag_ok = 0; //0不允许接收1 允许接收/*****************SYN6288芯片设置命令*********************/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 状态命令/*主函数入口*/void main(void){uart_Init(); //启动串口receive_flag_ok = 1; //可以接收send_flag_ok = 0; //禁止发送timer0_Init();//启动定时器/*死循环*/while(1){switch(value){case 'e':{ET0 = 0; //打开定时器0 中断send_flag_ok = 1; //开发送SYN_FrameInfo(0, "[v16][t5]我在");value = 0;/*禁发送 开接收*/ send_flag_ok = 0; //禁发送 ET0 = 1;break;}case 0:/*禁发送 开接收*/send_flag_ok = 0; receive_flag_ok = 1;break; case 5:{send_flag_ok = 0; //禁发送receive_flag_ok = 0;//开接收for(angle=14;angle>4;angle--)//开盖{delay_ms(2);} send_flag_ok = 1;ET0 = 0;SYN_FrameInfo(0, "[v16][t5]这个是干垃圾");delay2s();ET0 = 1;send_flag_ok = 0;for(angle=4;angle<14;angle++)//关盖从0到88度,步进11度{delay_ms(2);}value = 0;receive_flag_ok = 1; break;}case 6:{send_flag_ok = 0; receive_flag_ok = 0;for(angle=16;angle>4;angle--)//开盖{delay_ms(2);} send_flag_ok = 1;ET0 = 0;SYN_FrameInfo(0, "[v16][t5]这个是湿垃圾");delay2s();ET0 = 1;send_flag_ok = 0;for(angle=4;angle<16;angle++)//关盖从0到88度,步进11度{delay_ms(2);}value = 0;receive_flag_ok = 1; break;}case 7:{send_flag_ok = 0; receive_flag_ok = 0;for(angle=14;angle>4;angle--)//开盖{delay_ms(2);}send_flag_ok = 1;ET0 = 0;SYN_FrameInfo(0, "[v16][t5]这个是有害垃圾");delay2s();ET0 = 1;send_flag_ok = 0;for(angle=4;angle<14;angle++)//关盖从0到88度,步进11度{delay_ms(2);} value = 0;receive_flag_ok = 1; break;}case 8:{send_flag_ok = 0; receive_flag_ok = 0;for(angle=4;angle<14;angle++)//开盖从0到88度,步进11度{delay_ms(2);}send_flag_ok = 1;ET0 = 0; SYN_FrameInfo(0, "[v16][t5]这个是可回收垃圾");delay2s();ET0 = 1;send_flag_ok = 0;for(angle=14;angle>4;angle--)//关盖{delay_ms(2);} value = 0; receive_flag_ok = 1;break;}default: send_flag_ok = 0; receive_flag_ok = 1;break;} }}

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 ; //构造帧头FDFrame_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);}

项目展示

基于 51单片机的其他项目

基于51单片机+遥控灯

基于51单片机+SG舵机

基于51单片机+LCD1602显示

基于51单片机+红外遥控解码+LCD1602显示

基于51单片机+DHT11温湿度+LCD1602显示

基于51单片机+DS18B20温度测温器+LCD1602显示

基于51单片机+SYN6288语音播报

基于51单片机+ESP8266模块(HTTP)上传温湿度到oneNET APP显示+LCD1602显示

总结

我做一个一开始是用的 普中的51单片机 2.0板子 ,供电啥的都还可以,如果是用最小系统的板子 如果程序没问题要看板子的供电是不是不太稳的 ,如果两个或者多个 接到单片机的同一个VCC 可能会引起供电不稳定,导致项目有时候没啥反应。总的来说 垃圾桶这个实现是不算难的,应该是属于简单的了,会点51的小伙伴可以来做做一个智能垃圾桶,可以用来比赛的,可以优化,增加新的功能啥的 这都是可以的。最近实在太忙了,用的几天的的时候,每天抽时间写下了这篇文章,觉得好的可以点赞哈。还得继续加油!

如果觉得这篇文章对你有用。欢迎大家点赞、评论哈哈

需要整个工程代码和 模块的相关资料,私信我 或者 +我扣扣:844797079。或者评论区留下的你的联系方式。

继续加油!!!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。