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

基于51单片机+LD3320语音模块+SYN6288语音合成——语音识别智能分类垃圾桶「建议收藏」语音识别智能分类垃圾桶基本介绍器件51单片机LD3320语音模块SYN6288语音合成SG90舵机(4个)usb-ttl模块垃圾桶四个(4个)面包板(建议用)实现思路与接线实现流程图接线呈现图代码编写语音模块(部分代码)语音模块串口调试结果51单片机代码(部分代码 )项目展示基本介绍这个一个基于51单片机做的一个语音识别分类智能垃圾桶,通过我们说话来对垃圾词语进行分类。比如:垃圾桶(一级指令)易拉罐(垃圾词语),我们通过说话说出关键字让语音模块接收到——语音模块通过串口发指令给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都可

51单片机 SYN6288语音播报
VCC(5V) VCC
GND GND
TX RX
51单片机 LD3320语音模块
VCC(5V) VCC
GND GND
RX TX
51单片机 舵机
VCC(5V / 3.3V) VCC
GND GND
P1.0 舵机1 信号线
P1.1 舵机2 信号线
P1.2 舵机3 信号线
P1.3 舵机4 信号线

代码编写

语音模块(部分代码)

语音模块 厂家是有给源码的,我们只需要改成我们需要的就行。
厂家给的文件:
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资料

基于51单片机+LD3320语音模块+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 ; 			//构造帧头FD
	Frame_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。或者评论区留下的你的联系方式。

继续加油!!!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/153111.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 免费申请国外免费域名超详细教程

    免费申请国外免费域名超详细教程1.首先申请免费域名网站:https://my.freenom.com/domains.php2.填入域名,这里我们以xcflag为列(尽量选择复杂一点的或者五个字母以上的域名,因为简单的有些域名是需要收费的),点击检查可用性。3.可以看到很多免费的域名(用的谷歌翻译插件,翻译有时候不是很准确,free翻译过来应该是免费而不是自由,之后会写一些关于谷歌插件的笔记,详细讲解)4.我们选择xcflag.tk点击立即获取,稍等一会点击购物车查看绿色按钮5.默认三个月试用,这里下拉框我们选择十二个月

    2022年6月30日
  • Windows 手动 修改host文件「建议收藏」

    Windows 手动 修改host文件「建议收藏」在C:\Windows\System32\drivers\etc\目录下有一个hosts文件,复制出来,修改后再粘贴回去(注意:一定要复制出来再修改,否则无法正常保存)

    2022年10月12日
  • 嵌入式和pc的区别_嵌入式系统基础教程第2版

    嵌入式和pc的区别_嵌入式系统基础教程第2版Atitit嵌入式系统与pc系统的对比目录1.哈佛结构和冯诺依曼结构普林斯顿结构区12.中断程序类库调用13.指令集三大流程语句与运算语句赋值语句14.异常处理25.存储管理(内存26.安卓嵌入式26.1.Python嵌入式26.2.Java嵌入式开发27.常见软件功能区别27.1.Dbn…

    2022年10月4日
  • 【Anconda】关于安装Anaconda3各种各样的问题,吐血总结!!!(failed to create anacoda menu!!++)「建议收藏」

    【Anconda】关于安装Anaconda3各种各样的问题,吐血总结!!!(failed to create anacoda menu!!++)「建议收藏」昨天总结了装python和pycharm。本来想着马上接着总结Anaconda的,谁知道,这一安装,竟然花了我一天一夜的时间,(悲伤辣么大啊简直)。遇到了各种各样的问题,重装20几遍,每次问题都不同还。(掩面悲伤)直到刚才总算是可以了。面对问题的时候第一想法就是百度,结果尝试了所有百度的方法仍然无法解决问题。还是自己太笨了。总之,还是把自己遇到的问题总结一下把,以防不…

    2022年6月2日
  • xiao77论坛php,论坛

    论坛1.如何加其他人为好友?ID头像下方有“加好友”、“发消息”、“打招呼”和“串个门”的互动功能。在发帖的头像区和该人的个人资料区都可以进行互动,且有不同的奖励。2.看到喜欢的帖子如何保存?可点击帖子下方的“收藏”按钮,然后回到个人空间的收藏应用中查看即可。3.如何查看所有我参与过的帖子?登录成功后,在页面右上角点击“帖子”即可查看。4.如何知道我参与的帖子有了新的回复?当有人回复了你的…

    2022年4月5日
  • zabbix监控网卡流量

    zabbix监控网卡流量

    2022年3月12日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号