1、1基于 STC 单片机的智能语音控制小车一、实验目的1.随着科技的进步和社会的发展,汽车技术的发展越来越智能化。本次接口实验设计就是基于简单智能化的基础上,采用 LD3320 语音单元和 STC 单片机和L298N 电机驱动,开发出基于语音无线控制与智能避障的小车,实现非特定人声语音控制小车,以及小车超声波自动避障行驶的功能,同时液晶显示出超声波前方障碍物的距离。2掌握用 Altium Designer10 软件绘制原理图和 PCB 电路,以及电路板的制作过程(包括转印、腐蚀,焊接,下载与调试) ,熟练 Keil uVision4 环境以及单片机 C 代码的编写、调试和 hex 文件的生成并下
2、载到单片机芯片内,掌握软硬联调技巧与方法。3掌握 基于 LD3320 的语音单元的编程、语音处理及与单片机间的通信。二、系统总体方案本次设计的小车采用 STC89C52 单片机作为主控芯片,通过 LD3320 语音单元接单片机控制小车行驶状态(包括前进、后退、左转、右转及停车) ;小车行驶过程中遇到障碍物,如果没有接收到语音信号而超声波检测模块检测周围障碍物小于安全距离 40cm,小车自动转向,距离通过 LCD1602 液晶显示出来;采用 L298 作为电机驱动芯片驱动小车行驶。系统总体框图如图 2.1:H C - S R 0 4超声波模块L D 3 3 2 0语音单元S T C 8 9 C
3、5 2单片机L C D 1 6 0 2液晶显示1 8 6 5 0锂电池电源L 2 9 8 N电机驱动直流减速电机降压模块扬声器7 8 0 5稳压电路图 2.1 系统总体框图2三、硬件设计3.1 主控系统本次设计采用 STC89C52 单片机作为控制芯片,STC89C52RC 是 STC 公司生产的一种低功耗、高性能 CMOS8 位微控制器,具有 8K 字节系统可编程 Flash 存储器。单片机系统电路图 2:图 3.1 单片机最小系统原理图复位电路:手动复位,按下复位按钮,复位脚得到 VCC 的高电平,单片机复位,按钮松开后,单片机开始工作。如图 3.2(1):时 钟 电 路 : 在 52 单
4、 片 机 片 内 有 一 个 高 增 益 的 反 相 放 大 器 , 反 相 放 大 器 的 输入 端 为 XTAL1, 输 出 端 为 XTAL2, 由 该 放 大 器 构 成 的 振 荡 电 路 和 时 钟 电 路 一起 构 成 了 单 片 机 的 内 部 时 钟 方 式 。 如图 3.2(2):(1)复位电路: (2) 时钟电路:图 3.2 (1)复位电路 (2)时钟电路33.2 超声波模块超声波模块(HC-SR04)是小车测距和避障的重要模块。该模块可提供 2cm-400cm 的非接触式距离感测功能,测距精度可达高到 3mm;模块包括超声波发射器、接收器与控制电路。基本工作原理:(1)
5、采用 IO 口 TRIG 触发测距,给至少 10us 的高电平信号;(2)模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回;(3)有信号返回,通过 IO 口 ECHO 输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S)/2;超声波时序图 3.3:图 3.3 超声波时序图由时序图表明你只需要提供一个 10uS 以上脉冲触发信号,该模块内部将发出 8 个 40kHz 周期电平并检测回波。一旦检测到有回波信号则输出回响信号。回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。公式:uS
6、/58=厘米或者 uS/148=英寸;或是:距离=高电平时间*声速(340M/S)/2;建议测量周期为 60ms 以上,以防止发射信号对回响信号的影响。超声波电路如图 3.4:4VCGND超 声 波1TRI2EHO3U图 3.4 超声波电路3.3 LD3320 语音识别单元语音识别作为信息技术中一种人机接口的关键技术,具有重要的研究意义和广泛的应用价值。语音识别技术的应用范围极为广泛,不仅涉及到日常生活的方方面面,在军事领域也发挥着极其重要的作用。它是信息社会朝着智能化和自动化发展的关键技术,使人们对信息的处理和获取更加便捷,从而提高人们的工作效率。语音识别是将人类的声音信号转化为文字或者指令
7、的过程。语音识别以语音为研究对象,它是语音信号处理的一个重要研究方向,是模式识别的一个分支。根据在不同限制条件下的研究任务,产生了不同的研究领域。这些领域包括:根据对说话人说话方式的要求,可分为孤立字(词)、连接词和连续语音识别系统;根据对说话人的依赖程度,可分为特定人和非特定人语音识别系统;根据词汇量的大小,可分为小词汇量、中等词汇量、大词汇量以及无限词汇量语音识别系统。从语音识别模型的角度讲,主流的语音识别系统理论是建立在统计模式识别基础之上的。语音识别系统本质上是一种多维模式识别系统,对于不同的语音识别系统,人们所采用的具体识别方法及技术不同,但其基本原理都是相同的,即将采集到的语音信号
8、送到特征提取模块处理,将所得到的语音特征参数送入模型库模块,由声音模式匹配模块根据模型库对该段语音进行识别,最后得出识别结果。语音识别系统基本原理框图如图 3.5 所示,其中:预处理模块滤除原始语5音信号中的次要信息及背景噪音等,包括抗混叠滤波、预加重、模数转换、自动增益控制等处理过程,将语音信号数字化;特征提取模块对语音的声学参数进行分析后提取出语音特征参数,形成特征矢量序列。预处理 特征提取 相似性度量 后处理参考模式库输入语音识别训练识别结果图 3.5 语音识别系统框图3.4 电机驱动小车轮子驱动采用直流减速电机,驱动芯片使用恒压恒流桥式 2A 驱动芯片L298N。L298 是 ST 公
9、司的产品,比较常见的是 15 脚 Multiwatt 封装的 L298N,内部同样包含 4 通道逻辑驱动电路。可以方便的驱动两个直流电机,或一个两相步进电机。L298N 芯片可以驱动两个二相电机,也可以驱动一个四相电机,输出电压最高可达 50V,可以直接通过电源来调节输出电压;可以直接用单片机的 IO 口提供信号;而且电路简单,使用比较方便。L298N 可接受标准 TTL 逻辑电平信号 VSS,VSS 可接 4.57 V 电压。4 脚VS 接电源电压,VS 电压范围 VIH 为2.546 V。输出电流可达 2.5 A,可驱动电感性负载。L298 驱动电路如图 3.6:6图 3.6 电机驱动电路
10、L298N 电机驱动逻辑控制表 1:ENA IN1 IN2 运转状态0 X X 停止1 1 0 正转1 0 1 反转1 1 1 停止1 0 0 停止表 1 L298N 电机驱动逻辑控制根据电机驱动逻辑功能表,通过改变单片机 IO 口高低电平变化,可以方便实现小车前进、后退、左转、右转、停止。3.5 LCD1602 液晶显示LCD1602 是工业字符型液晶,能够同时显示 16x02 即 32 个字符。 (16 列 2行)1602 液晶也叫 1602 字符型液晶它是一种专门用来显示字母、数字、符号等的点阵型液晶模块它有若干个 5X7 或者 5X11 等点阵字符位组成,每个点阵字符位都可以显示一个字
11、符。每位之间有一个点距的间隔每行之间也有间隔起到7了字符间距和行间距的作用,正因为如此所以他不能显示图形。其中 RS 为寄存器选择端,高位时是数据寄存器,低位时是指令寄存器;RW 时读写信号线,高位时是读,低位时是写;E 为使能控制端。超声波避障的距离显示采用 LCD1602 液晶实现。当超声波检测到前方障碍物在安全距离内(40cm) ,单片机驱使小车自动转弯,并将超声波测得的障碍物的距离送到液晶并显示出来。液晶与单片机的电路图如图 3.7:图 3.7 液晶电路图3.6 电源与稳压电路由于小车电机的驱动电压一般选择 8V,单片机的电压为 5V,要实现小车供电和续航,采用 18650 大容量可充
12、电锂电池,锂电池可提供 12V 供电, 为了不影响驱动电机的供电电源和单片机供电电源产生信号干扰,设计中加入了可调降压模块,使 12V18650 锂电池电压调至 8V 后供给直流减速电机,使12V18650 锂电池经 7805 稳压至 5V 后供给 STC 单片机、L298N 电机驱动芯片、基于 LD3320 的语音单元和超声波等使用, L7805 的稳压和电源电路如图83.8:图 3.8 L7805 稳压和电源电路3.7 系统整体原理图与 PCB 主控图系统整体原理图与 PCB 主控图如图 3.9:(1) 系统整体原理图9(2)PCB 主控图图 3.9 (1)系统整体原理图 (2)PCB 主
13、控图四、 软件设计4.1 系统总体软件设计软件设计部分分为两大类,一类是语音芯片应用程序的开发设计,另一类是单片机下位机的程序编写。小车操作流程是:1,按下开关给单片机和驱动电路供电,系统初始化,语音启动小车;3,通过语音控制小车前进、左转、右转、后退、停止;4,行驶过程如遇障碍物,小车自动转弯避障,同时实时显示障碍物与车的距离。小车操作流程如下图 4.1:10开始超声波开启计算障碍物距离距离小于 4 0 m中断发生初始化串口中断语音中断服务输出运动状态L C D 1 6 0 2 显示结束y e sn o定时器中断小车处于运动中y e sy e sn on o转弯图 4.1 小车操作流程图4.
14、2 语音识别开发11图 4.2 语音编程界面语音单元测试语音单元测试主要是语音识别参数进行测试,测试参数有麦克风灵敏度设置,语音端点检测,语音信号起始确认时间,语音信号结束时间,语音信号最长持续时间。参数测试主要是麦克风灵敏度和语音端点检测。通过控制变量法,在保持麦克风灵敏度一定的前提下,调节端点检测,来观察扬声器音频输出的准确性,反之,保持端点检测值至一定的前提下,调节麦克风灵敏度,以此来找到使语音准确输出的最优麦克风灵敏度参数和语音端点检测值,以保证语音输出的准确性。误差分析:本次作品的相对误差如表 2,造成相对误差可从以下几方面分析。其中,环境噪声是造成误差最重要的因素,在做系统测试时,
15、并没有做到在低分贝理12想环境下进行测试。其次,本次作品是使用了麦克风,所以,麦克风的灵敏度不高也会造成误差。在语音识别模块,语音断点检测和语音信息相似度也会造成误差。本次作品电源设计设置的语音信息相差太近,会对识别造成难度。最后,说话距离的远近也会造成误差,做测试时并不是每一次都在最佳距离范围内测试,所以会有误差。语速 慢速 中速 较快声音(dB) 60 120 60 120 60 120距离(m) 3.85 2.65 3.15 2.25 2.75 1.95测试次数 40正确识别次数 37 35 35 31 29 27正确率 92.5% 87.5% 87.5% 77.5% 72.5% 67.
16、5%表 2 语音模块误差测试4.3 单片机下位机软件设计单片机下位机软件设计采用模块化结构,由主程序定时子程序、定时器中断子程序、电机驱动子程序串口中断子程序、显示子程序超声波避障子程序算法子程序构成。其中:避障中断服务子程序完成对超声波探测器产生的外部中断进行处理,如果超出预定的危险距离就进行避障。遥控中断服务子程序完成对遥控信号产生的串口中断进行处理,对不同的遥控信号产生相应的控制信号。超声波程序设计流程图 4.3:13避障开始定时器初始化定时时间到 ,发送触发信号P W M 初始化收到回波信号计算障碍物距离小于 4 0 c m 前进转弯1 6 0 2 显示距离y e sn oy e sN
17、 o 图 4.3 超声波程序流程图语音串口通信:由于语音单元和单片机通信的方式是串口,为了小车能迅速响应语音单元发送来的信号,单片机使用串口中断的方式,在中断函数里面主要就是处理中断接收到的数据,并控制电机的转向,处理函数见附录二。五、个人总结本次设计是智能语音控制小车兼有避障功能,主控制芯片采用 STC89C52 单片机,开发 LD3320 语音芯片,成功实现了语音控制小车和小车的自动避障的功能。设计内容包括小车硬件、软件、LD3320 语音单元编程、调试等。在此期间主要完成的工作包括以下几个方面:(1)设计初期收集电机驱动、单片机等相关资料,对智能小车的实现原理有比较清晰的了解。14(2)
18、确定系统框图,对电源模块、单片机最小系统模块、LD3320 语音单元和电机及其驱动电路模块等的实施方案进行比较,确定最终的智能小车控制的设计方案。(3)根据智能小车控制的设计方案画原理图、PCB 图,转印 PCB 图,手工制作PCB 板。(4)根据设计电路,购买元器件,焊接电路,完成硬件组装和调试。(5)根据系统要实现前进、后退、左转、右转、停车、避障等功能编写出小车端的软件程序。(6)软硬件分别调试通过后进行整体联合调试,并查找该系统存在的缺陷,并逐步完善。(8)最终小车能够实现前进、后退、左转、右转、避障等功能,达到设计的基本要求。通过此次实验设计,使我对单片机编程和设计都有了进一步的了解
19、,对软硬件的应用更加熟悉,在电路设计、PCB 制板等方面都有所加强。软件设计方面,语音单元的可视化编程,在可视化编程设计方面也还有许多问题需要解决,这些都是自己以后要努力学习的地方。小车虽然基本功能实现,但仍存在一些问题,避障的稳定性并不高,仍需要不断完善。六、致谢首先要感谢XX老师给了我们这样一个动手实践的机会,让我们有机会可以针对自己的兴趣进行一些自主课外动手实践。本实验设计是在XX老师的指导下和XXXX 同学的帮助下修改完成的。在设计过程中,XX老师给予了悉心的指导,最重要的是给我们提供了解决问题的思路和方法,在此,我对XX老师的细心帮助和指导表示最真挚的感谢!同时感谢所有帮助过我的老师
20、和同学们!15参考文献:1 郭天祥,新概念 51 单片机 C 语言教程.北京:电子工程出版社,2009.1:98-1032 符强,任风华.基于手机蓝牙的遥控小车的设计J.广西桂林电子科技大学信息与通信学院;广西桂林电子科技大学电子工程与自动化学院,2010.3 谭思良等。VisualC+串口通信工程开发实例导航M.人民邮电出版社.2034 宋戈,黄鹤松,员玉良,蒋海峰.51 单片机应用开发范例大全.北京:人民邮电出版社,20105 池保忠. 基于单片机的电动车控制系统设计J.机械与电子,2011,(4):51-53.6 王晓侃 苏全卫 基于单片机控制的多功能电动车自行车智能保护仪的设计与实现
21、电子设计工程 2005,7,107-110.7 王立欣, 靳 刚,程树康.混合电动车用 PWM 整流器控制方法的研究J.电机与控制学报, 2005, 9(2): 199-202.8 尹洪波 基于单片机的电动车控制系统设计J.中国新技术新产品,2013,3(上):21-2216附录:附录一主控板和小车整体实物图:17附录二单片机程序:#include “reg52.h“#include /*宏定义*/#define uchar unsigned char /宏定义无符号字符型#define uint unsigned int /宏定义无符号整型#define LCD_Data P0#define
22、 Busy 0x80 /检测 LCD 状态字中的 Busy 标识/*IO 引脚定义*/sbit LCD_E =P27;sbit LCD_RW=P26;sbit LCD_RS=P25; /定义引脚sbit RX =P16;/模块超声波模块 ECH0 接 P13sbit TX =P17;/ 超声波模块 Trig 接 P14sbit IN1=P10;sbit IN2=P11;sbit IN3=P12;sbit IN4=P13;sbit EN1=P14;sbit EN2=P15;unsigned char code net = “ ZTAI JLCM “;unsigned char code forw
23、ard = “ ford “;unsigned char code back = “ back “;unsigned char code left = “ left “;unsigned char code right = “ righ “;unsigned char code stop = “ stop “;unsigned char code Clef = “ Clef “;unsigned int time=0;unsigned long S=0;bit flag =0,flagg=0;unsigned char l_disbuff4= 0,0,0,0,;/显示缓冲uchar date;
24、uchar rec,startmove=0;uchar x,speed=100,speed2;uchar ii;uchar sudu;uint mm,mmm;void delayms(unsigned int timer) /毫秒延时18int x,y;for(x=timer;x0;x-)for(y=120;y0;y-);/*读状态*/unsigned char ReadStatusLCD(void)LCD_Data = 0xFF; LCD_RS = 0;LCD_RW = 1;LCD_E = 0;LCD_E = 0;LCD_E = 1;while (LCD_Data /检测忙信号return(
25、LCD_Data);/*写数据*/void WriteDataLCD(unsigned char WDLCD)ReadStatusLCD(); /检测忙LCD_Data = WDLCD;LCD_RS = 1;LCD_RW = 0;LCD_E = 0; /若晶振速度太高可以在这后加小的延时LCD_E = 0; /延时LCD_E = 1;/*写指令*/void WriteCommandLCD(unsigned char WCLCD,BuysC) /BuysC 为 0 时忽略忙检测if (BuysC) ReadStatusLCD(); /根据需要检测忙LCD_Data = WCLCD;LCD_RS
26、= 0;LCD_RW = 0; LCD_E = 0;LCD_E = 0;LCD_E = 1; /*初始化*/void LCDInit(void)LCD_Data = 0;WriteCommandLCD(0x38,0); /三次模式设置,不检测忙信号delayms(5); 19WriteCommandLCD(0x38,0);delayms(5);WriteCommandLCD(0x38,0);delayms(5);WriteCommandLCD(0x38,1); /显示模式设置 ,开始要求每次检测忙信号WriteCommandLCD(0x08,1); /关闭显示WriteCommandLCD(0
27、x01,1); /显示清屏WriteCommandLCD(0x06,1); /显示光标移动设置WriteCommandLCD(0x0C,1); /显示开及光标设置/*按指定位置显示一个字符*/void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)Y X /限制 X 不能大于 15,Y 不能大于 1if (Y) X |= 0x40; /当要显示第二行时地址码+0x40;X |= 0x80; /算出指令码WriteCommandLCD(X, 0); /这里不检测忙信号,发送地址码WriteDataLCD(
28、DData);/*按指定位置显示一串字符*/void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)unsigned char ListLength;ListLength = 0;Y X /限制 X 不大于 15,Y 不大于 1while (DDataListLength=0x20) /若到达字串尾则退出if (X =100)|flag=1) /超出测量范围显示“-” flag=0;DisplayOneChar(7, 1,-);DisplayOneChar(8, 1,.);DisplayO
29、neChar(9, 1,-);DisplayOneChar(10, 1,-);DisplayOneChar(11, 1,m);elsel_disbuff0=S%1000/100+0x30;/加上 0X30 是将数字转为 ASCII码l_disbuff1=S%1000%100/10+0x30;l_disbuff2=S%1000%10 %10+0x30;DisplayOneChar(7, 1,l_disbuff0);DisplayOneChar(8, 1,.);DisplayOneChar(9, 1,l_disbuff1);DisplayOneChar(10, 1,l_disbuff2);Disp
30、layOneChar(11, 1,m);if(S40|flag=1) IN2=0;IN3=1; IN4=0;delayms(5); EN1=1;EN2=1; delayms(50);IN1=0; IN2=0;IN3=0; IN4=1;delayms(10); EN1=1;EN2=1;DisplayListChar(1, 1,Clef);delayms(800);IN1=0; IN2=1;IN3=0; IN4=1;delayms(10);EN1=1;EN2=1;void StartModule() /启动模块21TX=1; /启动一次模块_nop_(); _nop_(); _nop_(); _n
31、op_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_();TX=0;void main()delayms(400); /启动等待,等 LCD 讲入工作状态LCDInit(); /初始化delayms(5); /延时片刻(DisplayListChar(0, 0,net);TMOD=0x21; /设 T0 为方式 1 11.0592M 晶振T
32、H1=0xfd;TL1=0xfd;SCON=0x50; /串口的工作方式,设置为方式 1TR1=1; /打开定时器ES=1; /打开串口中断TH0=0;TL0=0; ET0=1; /允许 T0 中断EA=1; /开启总中断while(1)StartModule();while(!RX); /当 RX 为零时等待TR0=1; /开启计数while(RX); /当 RX 为 1计数并等待TR0=0; /关闭计数Conut(); /计算delayms(200);22void zd0() interrupt 1 /T0 中断来计数器溢出,超过测距范围flagg=1; /中断溢出标志/*中断服务子函数*
33、/ void com_isr(void) interrupt 4if(RI)rec=SBUF; /从串口缓冲区取得数据flag=1;RI=0; /清除串行接受标志位/*根据串口指令电机运转函数*/delayms(10);if(rec=0x01) /正转(前进) startmove=1;DisplayListChar(1, 1,forward);IN1=0; IN2=1;IN3=0; IN4=1;delayms(100); EN1=1;EN2=1;flag=0;if(rec=0x02)/反转(后退) startmove=2;IN1=1; IN2=0;IN3=1; IN4=0;DisplayLis
34、tChar(1, 1,back);delayms(100);EN1=1;EN2=1;flag=0;if(rec=0x03) /左转IN1=0; IN2=0;IN3=0; IN4=1;delayms(10);EN1=1;EN2=1;DisplayListChar(1, 1,left);delayms(800);IN1=0; IN2=1;IN3=0; N4=1;delayms(10);23EN1=1;EN2=1;flag=0;if(rec=0x04) /右转IN1=0; IN2=1;IN3=0; IN4=0;delayms(10); EN1=1;EN2=1;DisplayListChar(1, 1,right);delayms(800);IN1=0; IN2=1;IN3=0; IN4=1;delayms(10);EN1=1;EN2=1;flag=0;if(rec=0x05) /停车startmove=0;DisplayListChar(1, 1,stop);IN1=0; IN2=1;IN3=0; IN4=0;delayms(10);EN1=0;EN2=0;flag=0;startmove=0;24附录三语音单元可视化编程部分程序: