收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
该语音识别系统能够读入不同报警类型的语音,并予以波形显示;利用单片机对不同报警类型语音进行匹配识别,根据识别结果输出声音报警和光指示报警,要求误报率应低于10%;对语音进行预处理,对语音信号进行特征参数提取;通过STM32单片机编写控制程序;实现上位机的开发,完成嵌入式系统与上位机的交互。
3.2 非功能性需求
考虑相关的社会、健康、安全、法律及环境方面的制约因素;讨论或分析或预测本项目所应用或涉及的相关新技术或新产品、新工艺对本项目的积极意义和对社会、安全、健康、法律及文化方面可能存在的正、负影响。给出两种设计方案并进行论证。
4 设备器件
4.1 STM32单片机
具体型号是STM32F103,对其进行开发的语言是C语言,编译器为keil5。
4.2 LD3320语音识别芯片
LD3320是非特定人语音识别芯片,内部已经集成了语音识别处理器和一些信号调制电路,拥有高性能的A/D转换器、D/A转换器、麦克风音频信号输入接口、音频解码输出接口等,用户只需要用软件编辑好待识别的关键词列表,LD3320最大可以支持50条关键词句,把这些列别以字符的形式传送到芯片中,就可以对待识别的语音信号进行近似度分析,识别后输出结果。
4.3 TFT-LCD液晶显示屏
TFT-LCD即薄膜场效应晶体管,是有源矩阵类型液晶显示屏(AM-LCD)中的一种。
5 设计方案
语音识别报警监控系统主要由 STM32单片机、LD3320 语音识别模块、报警电路模块、上位机模块组成。
将LD3320语音识别芯片与我们自己设计的报警电路接在单片机STM32上,通过对单片机STM32进行编程来实现处理输入的语音信号,触发对应的报警电路等操作,编程语言为C语言,编程软件为KEIL5,由LD3320进行语音的采集,在STM32单片机上对识别结果进行逻辑判断,从而输出端口产生对应的输出信号,由显示屏、LED灯、蜂鸣器构成的报警电路模块用来显示报警效果。用C#语言编写上位机软件,软件安装在PC电脑上,通过串口使得上位机与下位机(单片机STM32)进行通信。
6 语音识别模块的开发
硬件上将语音识别芯片LD3320接在单片机STM32上。
具体端口连接:LD3320的MISO口与STM32的PA6口相接,MOSI口与PA7口相接,SCK口与PA5口相接,NSS口与PA4口相接,RST口与PB15口相接,WR口与PB13口相接,IRQ口与PB12口相接,NC口悬空。
软件上通过给STM32编写C语言程序来实现对语音信号的处理。
语音识别的操作顺序是:语音识别用初始化(包括通用初始化)→写入识别列表→开始识别,并准备好中断响应函数,打开中断允许位。
这里需要说明一下,如果不用中断方式,也可以通过查询方式工作。在“开始识别”后,读取寄存器 B2H 的值,如果为 21H 就表示有识别结果产生。在此之后读取候选项等操作与中断方式相同。
首先进行通用初始化,再进行语音识别用初始化,再写入识别列表。列表的规则是,每个识别条目对应一个特定的编号(1 个字节),不同的识别条目的编号可以相同,而且不用连续。该芯片最多支持 50个识别条目,每个识别条目是标准普通话的汉语拼音(小写),每 2个字(汉语拼音)之间用一个空格间隔。我们添加了四个关键词,分别是“全亮”、“全灭”、“闪烁”、“流水灯”,这些关键词仅供我们测试所用,在实际的现场可根据实际情况增加、删除和修改关键词。
接下来是开始识别,在代码中用变量nAsrStatus表示main主程序中表示程序运行的状态,有如下几个状态:LD_ASR_NONE表示没有在作ASR识别,LD_ASR_RUNING表示LD3320正在作ASR识别,LD_ASR_FOUNDOK表示一次识别流程结束后,有一个识别结果,LD_ASR_FOUNDZERO表示一次识别流程结束后,没有识别结果, LD_ASR_ERROR表示一次识别流程中LD3320芯片内部出现不正确的状态。在编程时要把对该状态的设置放在正式 LD3320 芯片开始识别以前。一次ASR识别流程结束后,去取ASR识别结果,通过C语言的switch语句对语音识别的结果进行匹配,从而触发对应的报警电路代码,上位机代码等。
然后当有声音输入时,会产生中断不管是否识别出正常结果,都会产生一个中断信号。而中断程序要根据寄存器的值分析结果。读取 BA 寄存器的值,可以知道有几个候选答案,而 C5 寄存器里的答案是得分最高、最可能正确的答案。例如发音为“全亮”并被成功识别(无其他候选),那么 BA 寄存器里的数值是 1,而 C5 寄存器里的值是对应的编码 3。
7 报警电路模块的开发
报警电路模块主要由一个LCD-TFT、两个LED灯和一个蜂鸣器组成。LED灯与蜂鸣器是直接使用单片机STM32自带的,无需外接,而对于LCD-TFT,将其与单片机STM32相连,硬件连接图如下:
通过对STM32的编程,来控制报警显示的效果。将不同的状态对应的报警显示效果分别封装成函数,在语音识别之后选择对应的函数执行,从而触发对应的报警显示效果。预设了“全亮”状态下两盏LED灯都亮,LCD显示“当前状态:全亮”;“全灭”状态下两盏LED灯都灭,LCD显示“当前状态:全灭”;“闪烁”和“报警”状态下两盏LED灯闪烁,蜂鸣器响,LCD显示“当前状态:闪烁”;“第一个闪”状态下一个LED灯闪烁,一个LED灯熄灭,LCD显示“当前状态:第一个闪”。
LED灯的亮灭通过控制对应管脚的高低电平即可,蜂鸣器也是一样,对于LCD显示内容的控制,通过取模工具,输入需要的字符,如汉字、数字和字母,该工具会直接生成C语言代码,再通过LCD_ShowString()和LCD_ShowChinese()两个函数控制LCD上显示的内容。
8 上位机模块的开发
开发工具为VS,语言为C#。
首先先新建项目,选择visual C#语言下面的windows窗体应用程序。
然后设置窗体的组件,在工具箱中有各种各样的组件,使用的话可以拖需要的组件进入到form中即可,按照预期的功能设置窗体,最终窗体界面如下:
在该窗体中,预设两个下拉框用来设置端口与波特率,一个开关用来连接和断开上位机和单片机间的通信,一个文本框用来显示当前的状态,一个文本框用来显示历史接收数据,一个下拉框用来选择用户想要单片机呈现的状态,一个按钮用来将用户选择的状态信息传输到单片机一端,从而上位机控制的效果。
private void Form1\_Load(object sender, EventArgs e)
{
for (int i = 0; i < 20; i++)
{
try
{
string str = "COM" + i;
serialPort1.PortName = str;
serialPort1.Open();
comboBox1.Items.Add(str);
serialPort1.Close();
comboBox1.Text = str;
}
catch { }
}
comboBox1.Text = "COM3";
comboBox2.Text = "115200";
}
上述代码用来自动设置上位机的端口号,从而实现上位机与单片机的连接,若已知端口和波特率的话,也可直接设置comboBox1.Text为已知端口号,设置comboBox2.Text为已知波特率。
private void button1\_Click(object sender, EventArgs e)
{
if(Button_State)
{
try
{
serialPort1.PortName = comboBox1.Text;
serialPort1.BaudRate = Convert.ToInt32(comboBox2.Text, 10);
serialPort1.Open();
button1.Text = "断开";
Button_State = false;
}
catch (Exception)
{
if (serialPort1.IsOpen)
serialPort1.Close();
MessageBox.Show("端口打开失败,请检查端口", "错误");
}
}
else
{
serialPort1.Close();
button1.Text = "连接";
Button_State = true;
}
}
上述代码是点击“断开/连接”按钮后触发的函数代码,用变量Button_State表示当前上位机与单片机间是否连接,根据连接情况与否,通过if 语句执行对应的代码,通过函数serialPort1.Close()来断开连接,通过serialPort1.PortName来设置端口号,通过serialPort1.BaudRate来设置波特率,通过serialPort1.Open()来开启连接。
private void serialPort1\_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
textBox2.Text=serialPort1.ReadExisting();
if (textBox2.Text.Contains("LCD"))
textBox2.Text = " ";
textBox1.AppendText(textBox2.Text);
if (textBox2.Text.Contains("流"))
textBox3.Text = "流水灯";
else if (textBox2.Text.Contains("闪"))
textBox3.Text = "闪烁";
else if (textBox2.Text.Contains("第"))
![img](https://img-blog.csdnimg.cn/img_convert/ae3aab767daf07bf09cd5859a7541915.png)
![img](https://img-blog.csdnimg.cn/img_convert/ea49adba6191cccd716ade6663445c5a.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**
础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**