基于STC单片机的智能语音控制小车Word文档格式.docx
《基于STC单片机的智能语音控制小车Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于STC单片机的智能语音控制小车Word文档格式.docx(26页珍藏版)》请在冰豆网上搜索。
![基于STC单片机的智能语音控制小车Word文档格式.docx](https://file1.bdocx.com/fileroot1/2023-2/3/24577485-8265-4d40-beaf-149e5c280ff5/24577485-8265-4d40-beaf-149e5c280ff51.gif)
uS/58=厘米或者uS/148=英寸;
或是:
距离=高电平时间*声速(340M/S)/2;
建议测量周期为60ms以上,以防止发射信号对回响信号的影响。
超声波电路如图3.4:
图3.4超声波电路
3.3LD3320语音识别单元
语音识别作为信息技术中一种人机接口的关键技术,具有重要的研究意义和广泛的应用价值。
语音识别技术的应用范围极为广泛,不仅涉及到日常生活的方方面面,在军事领域也发挥着极其重要的作用。
它是信息社会朝着智能化和自动化发展的关键技术,使人们对信息的处理和获取更加便捷,从而提高人们的工作效率。
语音识别是将人类的声音信号转化为文字或者指令的过程。
语音识别以语音为研究对象,它是语音信号处理的一个重要研究方向,是模式识别的一个分支。
根据在不同限制条件下的研究任务,产生了不同的研究领域。
这些领域包括:
根据对说话人说话方式的要求,可分为孤立字(词)、连接词和连续语音识别系统;
根据对说话人的依赖程度,可分为特定人和非特定人语音识别系统;
根据词汇量的大小,可分为小词汇量、中等词汇量、大词汇量以及无限词汇量语音识别系统。
从语音识别模型的角度讲,主流的语音识别系统理论是建立在统计模式识别基础之上的。
语音识别系统本质上是一种多维模式识别系统,对于不同的语音识别系统,人们所采用的具体识别方法及技术不同,但其基本原理都是相同的,即将采集到的语音信号送到特征提取模块处理,将所得到的语音特征参数送入模型库模块,由声音模式匹配模块根据模型库对该段语音进行识别,最后得出识别结果。
语音识别系统基本原理框图如图3.5所示,其中:
预处理模块滤除原始语音信号中的次要信息及背景噪音等,包括抗混叠滤波、预加重、模/数转换、自动增益控制等处理过程,将语音信号数字化;
特征提取模块对语音的声学参数进行
分析后提取出语音特征参数,形成特征矢量序列
图3.5语音识别系统框图
3.4电机驱动
小车轮子驱动采用直流减速电机,驱动芯片使用恒压恒流桥式2A驱动芯片
L298N。
L298是ST公司的产品,比较常见的是15脚Multiwatt封装的L298N,内部同样包含4通道逻辑驱动电路。
可以方便的驱动两个直流电机,或一个两相步进电机。
L298N芯片可以驱动两个二相电机,也可以驱动一个四相电机,输出电压最高可达50V,可以直接通过电源来调节输出电压;
可以直接用单片机的IO口提供信号;
而且电路简单,使用比较方便。
L298N可接受标准TTL逻辑电平信号VSS,VSS可接4.5~7V电压。
4脚VS接电源电压,VS电压范围VIH为+2.5~46V。
输出电流可达2.5A,可驱动电感性负载。
L298驱动电路如图3.6:
图3.6电机驱动电路
L298N电机驱动逻辑控制表1:
ENA
IN1
IN2
运转状态
X
停止
1
正转
反转
表1L298N电机驱动逻辑控制
根据电机驱动逻辑功能表,通过改变单片机IO口高低电平变化,可以方便实现小车前进、后退、左转、右转、停止。
3.5LCD1602液晶显示
LCD1602是工业字符型液晶,能够同时显示16x02即32个字符。
(16列2行)1602液晶也叫1602字符型液晶它是一种专门用来显示字母、数字、符号等的点阵型液晶模块它有若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符。
每位之间有一个点距的间隔每行之间也有间隔起到了字符间距和行间距的作用,正因为如此所以他不能显示图形。
其中RS为寄存器选择端,高位时是数据寄存器,低位时是指令寄存器;
RW时读写信号线,高位时是读,低位时是写;
E为使能控制端。
超声波避障的距离显示采用LCD1602液晶实现。
当超声波检测到前方障碍物在安全距离内(40cm),单片机驱使小车自动转弯,并将超声波测得的障碍物的距离送到液晶并显示出来。
液晶与单片机的电路图如图3.7:
图3.7液晶电路图
3.6电源与稳压电路
由于小车电机的驱动电压一般选择8V,单片机的电压为5V,要实现小车供电和续航,采用18650大容量可充电锂电池,锂电池可提供12V供电,为了不影响驱动电机的供电电源和单片机供电电源产生信号干扰,设计中加入了可调降压模块,使12V18650锂电池电压调至8V后供给直流减速电机,使12V18650锂电池经7805稳压至5V后供给STC单片机、L298N电机驱动芯片、基于LD3320的语音单元和超声波等使用,L7805的稳压和电源电路如图3.8:
3.7系统整体原理图与PCB主控图
系统整体原理图与PCB主控图如图3.9:
1)
系统整体原理图
(2)PCB主控图
图3.9
(1)系统整体原理图
(2)PCB主控图
四、软件设计
4.1系统总体软件设计
软件设计部分分为两大类,一类是语音芯片应用程序的开发设计,另一类是单片机下位机的程序编写。
小车操作流程是:
1,按下开关给单片机和驱动电路供电,系统初始化,语音启动小车;
3,通过语音控制小车前进、左转、右转、后退、停止;
4,行驶过程如遇障碍物,小车自动转弯避障,同时实时显示障碍物与车的距离。
小车操作流程如下图4.1:
图4.1小车操作流程图
4.2语音识别开发
图4.2语音编程界面
语音单元测试语音单元测试主要是语音识别参数进行测试,测试参数有麦克风灵敏度设置,语音端点检测,语音信号起始确认时间,语音信号结束时间,语音信号最长持续时间。
参数测试主要是麦克风灵敏度和语音端点检测。
通过控制变量法,在保持麦克风灵敏度一定的前提下,调节端点检测,来观察扬声器音频输出的准确性,反之,保持端点检测值至一定的前提下,调节麦克风灵敏度,以此来找到使语音准确输出的最优麦克风灵敏度参数和语音端点检测值,以保证语音输出的准确性。
误差分析:
本次作品的相对误差如表2,造成相对误差可从以下几方面分析。
其中,环境噪声是造成误差最重要的因素,在做系统测试时,并没有做到在低分贝理想环境下进行测试。
其次,本次作品是使用了麦克风,所以,麦克风的灵敏度不高也会造成误差。
在语音识别模块,语音断点检测和语音信息相似度也会造成误差。
本次作品电源设计设置的语音信息相差太近,会对识别造成难度。
最后,说话距离的远近也会造成误差,做测试时并不是每一次都在最佳距离范围内测试,所以会有误差。
语速
慢速
中速
较快
声音(dB)
60
120
距离(m)
3.85
2.65
3.15
2.25
2.75
1.95
测试次数
40
正确识别次数
37
35
31
29
27
正确率
92.5%
87.5%
77.5%
72.5%
67.5%
表2语音模块误差测试
4.3单片机下位机软件设计单片机下位机软件设计采用模块化结构,由主程序﹑定时子程序、定时器中断子程序、电机驱动子程序﹑串口中断子程序、显示子程序﹑超声波避障子程序﹑算法子程序构成。
其中:
避障中断服务子程序完成对超声波探测器产生的外部中断进行处理,如果超出预定的危险距离就进行避障。
遥控中断服务子程序完成对遥控信号产生的串口中断进行处理,对不同的遥控信号产生相应的控制信号。
超声波程序设计流程图4.3:
避障开始
图4.3超声波程序流程图
语音串口通信:
由于语音单元和单片机通信的方式是串口,为了小车能迅速响应语音单元发送来的信号,单片机使用串口中断的方式,在中断函数里面主要就是处理中断接收到的数据,并控制电机的转向,处理函数见附录二。
五、个人总结
本次设计是智能语音控制小车兼有避障功能,主控制芯片采用STC89C52单
片机,开发LD3320语音芯片,成功实现了语音控制小车和小车的自动避障的功能。
设计内容包括小车硬件、软件、LD3320语音单元编程、调试等。
在此期间主要完成的工作包括以下几个方面:
(1)设计初期收集电机驱动、单片机等相关资料,对智能小车的实现原理有比较清晰的了解。
(2)确定系统框图,对电源模块、单片机最小系统模块、LD3320语音单元和电机及其驱动电路模块等的实施方案进行比较,确定最终的智能小车控制的设计方案。
(3)根据智能小车控制的设计方案画原理图、PCB图,转印PCB图,手工制作PCB板。
(4)根据设计电路,购买元器件,焊接电路,完成硬件组装和调试。
(5)根据系统要实现前进、后退、左转、右转、停车、避障等功能编写出小车端的软件程序。
(6)软硬件分别调试通过后进行整体联合调试,并查找该系统存在的缺陷,并逐步完善。
(8)最终小车能够实现前进、后退、左转、右转、避障等功能,达到设计的基本要求。
通过此次实验设计,使我对单片机编程和设计都有了进一步的了解,对软硬件的应用更加熟悉,在电路设计、PCB制板等方面都有所加强。
软件设计方面,语音单元的可视化编程,在可视化编程设计方面也还有许多问题需要解决,这些都是自己以后要努力学习的地方。
小车虽然基本功能实现,但仍存在一些问题,避障的稳定性并不高,仍需要不断完善。
六、致谢
首先要感谢XX老师给了我们这样一个动手实践的机会,让我们有机会可以针对自己的兴趣进行一些自主课外动手实践。
本实验设计是在XX老师的指导下和XXXX同学的帮助下修改完成的。
在设计过程中,XX老师给予了悉心的指导,最重要的是给我们提供了解决问题的思路和方法,在此,我对XX老师的细心帮助和指导表示最真挚的感谢!
同时感谢所有帮助过我的老师和同学们!
参考文献:
[1]郭天祥,新概念51单片机C语言教程.北京:
电子工程出版社,2009.1:
98-103
[2]符强,任风华.基于手机蓝牙的遥控小车的设计[J].广西桂林电子科技大学信息与通信学院;
广西桂林电子科技大学电子工程与自动化学院,2010.
[3]谭思良等。
VisualC++串口通信工程开发实例导航[M].人民邮电出版社.203
[4]宋戈,黄鹤松,员玉良,蒋海峰.51单片机应用开发范例大全.北京:
人民邮电出版社,2010
[5]池保忠.基于单片机的电动车控制系统设计[J].机械与电子,2011,(4):
51-53.
[6]王晓侃苏全卫基于单片机控制的多功能电动车自行车智能保护仪的设计与实现电子设计工程2005,7,107-110.
[7]王立欣,靳刚,程树康.混合电动车用PWM整流器控制方法的研究[J].电机
与控制学报,2005,9
(2):
199-202.
[8]尹洪波基于单片机的电动车控制系统设计[J].中国新技术新产品,2013,3(上):
21-22
附录:
附录一
主控板和小车整体实物图:
附录二
单片机程序:
#include"
reg52.h"
#include<
intrins.h>
宏定义
*/
#defineucharunsignedchar
//宏定义无符号字符型
#defineuintunsignedint
//宏定义无符号整型
#defineLCD_DataP0
#defineBusy0x80
//检测LCD状态字中的Busy标识
**IO
引脚定义
sbitLCD_E=P2^7;
sbitLCD_RW=P2^6;
sbitLCD_RS=P2^5;
//定义引脚
sbitRX=P1^6;
//模块超声波模块ECH0接P1^3sbitTX=P1^7;
//超声波模块Trig接P1^4
sbitIN1=P1^0;
sbitIN2=P1^1;
sbitIN3=P1^2;
sbitIN4=P1^3;
sbitEN1=P1^4;
sbitEN2=P1^5;
unsignedcharcodenet[]={"
ZTAIJLCM"
};
unsignedcharcodeforward[]={"
ford"
unsignedcharcodeback[]={"
back"
unsignedcharcodeleft[]={"
left"
unsignedcharcoderight[]={"
righ"
unsignedcharcodestop[]={"
stop"
unsignedcharcodeClef[]={"
Clef"
unsignedinttime=0;
unsignedlongS=0;
bitflag=0,flagg=0;
unsignedcharl_disbuff[4]={0,0,0,0,};
//显示缓冲
uchardate;
ucharrec,startmove=0;
ucharx,speed=100,speed2;
ucharii;
ucharsudu;
uintmm,mmm;
voiddelayms(unsignedinttimer)
//毫秒延时
{
intx,y;
//若晶振速度太高可以在这后加
for(x=timer;
x>
0;
x--)for(y=120;
y>
y--);
小的延时
}
LCD_E=1;
}
unsignedcharReadStatusLCD(void){
LCD_Data=0xFF;
LCD_RS=0;
LCD_RW=1;
LCD_E=0;
while(LCD_Data&
Busy);
//检测忙信号
return(LCD_Data);
写指令
写数据
voidWriteCommandLCD(unsignedcharWCLCD,BuysC)
//BuysC为0时忽略忙检测
if(BuysC)ReadStatusLCD();
//根据需要检测忙
LCD_Data=WCLCD;
LCD_RW=0;
voidWriteDataLCD(unsignedchar
WDLCD)
ReadStatusLCD();
//检测忙
LCD_Data=WDLCD;
LCD_RS=1;
voidLCDInit(void)
LCD_Data=0;
WriteCommandLCD(0x38,0);
//三次模式设置,不检测忙信号delayms(5);
WriteCommandLCD(0x38,0);
delayms(5);
WriteCommandLCD(0x38,1);
//显示模式设置,开始要求每次检测忙信号
WriteCommandLCD(0x08,1);
//关闭显示
WriteCommandLCD(0x01,1);
//显示清屏
WriteCommandLCD(0x06,1);
//显示光标移动设置
WriteCommandLCD(0x0C,1);
//显示开及光标设置
/****按指定位置显示一个字符****/
voidDisplayOneChar(unsignedcharX,unsignedcharY,unsignedcharDData)
Y&
=0x1;
X&
=0xF;
//限制X不能大于15,Y不能大于1
if(Y)
X|=0x40;
//当要显示第二行时地址码+0x40;
X|=0x80;
//算出指令码
WriteCommandLCD(X,0);
//这里不检测忙信号,发送地址码
WriteDataLCD(DData);
/******按指定位置显示一串字符**/
voidDisplayListChar(unsignedcharX,unsignedcharY,unsignedcharcode*DData){
unsignedcharListLength;
ListLength=0;
//限制X不大于15,Y不大于1while(DData[ListLength]>
=0x20){
//若到达字串尾则退出
if(X<
=0xF)
//X坐标应小于0xF
DisplayOneChar(X,Y,DData[ListLength]);
//显示单个字符
ListLength++;
X++;
1,l_disbuff[1]);
voidConut(void)
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1.7)/100;
//算出来是CMif((S>
=100)||flag==1)
//超出测量范围显示“-”
flag=0;
DisplayOneChar(7,1,'
-'
);
DisplayOneChar(8,1,'
.'
DisplayOneChar(9,1,'
DisplayOneChar(10,1,'
DisplayOneChar(11,1,'
m'
else
l_disbuff[0]=S%1000/100+0x30;
//加上0X30是将数字转为ASCII码l_disbuff[1]=S%1000%100/10+0x30;
l_disbuff[2]=S%1000%10%10+0x30;
DisplayOneChar(7,1,l_disbuff[0]);
DisplayOneChar(9,
DisplayOneChar(10,
1,l_disbuff[2]);
if((S<
40||flag==1)&
(startmove==1||startmove==2))
IN1=1;
IN2=0;
IN3=1;
IN4=0;
delayms(5);
EN1=1;
EN2=1;
delayms(50);
IN1=0;
IN3=0;
IN4=1;
delayms(10);
DisplayListChar(1,1,Clef)delayms(800);
IN1=0;
IN2=1;
EN1=1;
EN2=1;
voidStartModule()//启动模块{
TX=1;
//启动一次模块
_nop_();
nop();
TX=0;
voidmain()
delayms(400);
//启动等待,等LCD讲入