首页 理论教育 PIC16F877A系统的软件设计优化

PIC16F877A系统的软件设计优化

时间:2023-06-30 理论教育 版权反馈
【摘要】:本文介绍的PIC16F877A系统只有一个中断入口,系统的所有中断源的入口函数只有一个即void interrupt InterruptISR,所以需要在函数里判断中断源是哪一个。本文使用的PIC系统只有一次语音识别结束或超过最长识别时间产生的外部中断和串口接收中断,因此在中断服务函数对它们进行单独处理。

PIC16F877A系统的软件设计优化

1.语音交互

语音交互是通过语音技术,使得机器人能够听得懂人类语言,并能够做出语音应答。本文采用了ICRoute提供的LD3320非特定人语音识别模块和科大讯飞的XF-S4240语音合成模块实现机器人的语音交互功能。

语音识别流程图如图5-13所示。

978-7-111-43089-6-Chapter05-13.jpg

图5-13 语音识别流程图

添加识别列表的规则是,每个识别条目对应一个特定的编号(1个字节),不同的识别条目的编号可以相同,而且不用连续。本芯片最多支持50个识别条目,每个识别条目是标准普通话的汉语拼音(小写),每2个字(汉语拼音)之间用一个空格间隔。

如果传声器采集到声音,不管是否识别出正常结果,都会产生一个中断信号。而中断程序要根据寄存器的值分析结果。而一次识别结束会有多条候选识别结果,LD_ReadReg(0xba)值为1~4说明是有正确的识别结果。从4个候选结果的读取最优的或需要的。主要函数为

//初始化语音识别模块,激活DSP

LD_Init_ASR();

//添加关键词列表

U8 LD_AsrAddFixed()

//检查是否为忙状态

LD_Check_ASRBusyFlag_b2()

//开始语音识别

U8 LD_AsrRun()

//语音识别有结果,结果处理

void asr_handle()

//获取识别结果

LD_GetResult()

由于语音识别在某些情况下会出现误识别,所以某些需要识别的特殊命令可以添加确认命令,以确保由于误识别带来不可估计的后果。

单片机通过语音识别模块LD3320取得正确的识别结果后,处理相应的信息如启动布防或读取温度值,并通过语音合成模块XF-S4240输出语音信息,以达到语音交互的目的。

本系统中添加的语音命令词列表与对应的ID号为

978-7-111-43089-6-Chapter05-14.jpg

前者是需要识别的中文的汉语拼音,后者是正确识别后的输出结果。

2.信息采集与处理

本文研究的机器人信息采集来自温度传感器安防传感器、触摸传感器3类,它们是机器人对环境感知的主要途径。

(1)温度传感器程序

本系统的温度传感器采用DS18B20,它是单线数据传输,需要严格的通信协议来保证数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、读时序、写时序。时序规定主机作为主设备、单总线器件作为从设备,每一次命令的传输都是从主机自动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。对DS18B20的每一次操作均由4个步骤组成:初始化、ROM操作指令、RAM操作指令、收发数据。读写时序图如图5-14所示。

当用户想知道当前温度时,通过输入语音命令“温度”或触摸屏向PIC发送信息,PIC将检测到的温度通过语音合成模块播报出来,如果温度过高如大于30℃,语音提示用户打开空调,当温度过低如小于20℃,语音提示用户打开电暖气。测温流程图如图5-15所示。

(2)安防传感器程序

本系统的无线安防传感器采用315M DF无线通信模块进行无线通信,包括红外传感器、门磁传感器和烟雾传感器,安防信息经过处理后通过语音合成模块进行语音报警或通过串口将报警信息返回给Qt主程序。安防报警流程图如图5-16所示。

如图5-16所示,当系统处于撤防状态(系统上电后的默认状态),安防系统不工作。当通过输入语音命令“布防”或接受到来自Qt程序的布防命令后,系统进入布防状态,开始获取无线传感器采集的信息,用户如果外出则处于该种模式。当通过输入语音命令“红外

978-7-111-43089-6-Chapter05-15.jpg

图5-14 读写时序图

978-7-111-43089-6-Chapter05-16.jpg

图5-15 DS18B20温度检测流程图

撤防”或接受到来自Qt程序的红外撤防命令后,系统进入红外撤防状态,此时红外传感器不工作,系统将不会检测是否有人靠近。当通过输入语音命令“撤防”或接受到来自Qt程序的撤防命令后,系统重新进入撤防状态,安防系统停止工作。

(3)触摸传感器程序(www.xing528.com)

本系统采用的触摸传感器为TS08N,与单片机通过普通I/O口相连,通过检测其I/O口的电平变化判断是哪一路触摸传感器有触摸输入,信息处理后通过语音合成模块播报语音信息。

3.中断与串口通信

嵌入式系统开发中,中断是一个非常重要的概念。本文介绍的PIC16F877A系统只有一个中断入口,系统的所有中断源的入口函数只有一个即void interrupt InterruptISR(void),所以需要在函数里判断中断源是哪一个。本文使用的PIC系统只有一次语音识别结束或超过最长识别时间产生的外部中断和串口接收中断,因此在中断服务函数对它们进行单独处理。中断服务流程图如图5-17所示。

978-7-111-43089-6-Chapter05-17.jpg

图5-16 安防报警流程图

978-7-111-43089-6-Chapter05-18.jpg

图5-17 中断服务流程图

(1)编写中断服务函数的原则

1)中断服务函数不能返回一个值。

2)中断服务函数不能传递参数。

3)在许多的处理器/编译器中,浮点一般都是不可重入的。有些处理器/编译器需要让额外的寄存器入栈,有些处理器/编译器就是不允许在ISR中做浮点运算。

4)中断服务函数应该是短而有效率的,在ISR中做浮点运算是不明智的。

5)避免在中断内使用函数调用。虽然PIC允许在中断服务函数里调用其他函数,但为了解决递归调用的问题,此函数必须为中断服务专用。因此,可以直接把原本要写在其他函数内的代码直接写在中断服务程序中。

6)避免在中断内进行数学运算。数学运算将很有可能用到库函数和许多中间变量,就算不出现递归调用的问题,只在中断入口和出口处为了保护和恢复这些中间临时变量就需要大量的开销,就严重影响中断服务的效率。

(2)串口通信协议

串口设置:波特率9600,数据位8,停止位1。

数据通信格式见表5-1。

表5-1 安防通信协议格

978-7-111-43089-6-Chapter05-19.jpg

表内参数解释如下:

帧头:固定为0xBB,占用1B。

类型:见表5-2的设备类型码,占用1B。

ID:为每种设备类型的某一具体设备定义的唯一识别码,占用1B。

命令:见表5-3的单一简单设备命令码,占用1B。

数据域格式:见表5-4,规定了数据域中的数据类型,占用1B。

长度:本次通信的数据域总长度,占用4B。当不存在分包情况时,总长度=本帧长度,否则总长度>本帧长度。

本帧长度:标识数据域的长度,占用1B。

数据域:通信帧中承载的实际数据,数据格式由每种设备类型自行定义,占用Len个字节。

校验和:从类型开始到数据域结束的所有数据和的低8位,占用1B。

帧尾:固定为0xEE或者0xCC,占用1B。当为0xEE时,说明该帧为某次通信的最后一包通信帧,所有有效数据已经全部发送完毕;当为0xCC时,说明该帧为某次通信的分包帧,其后还有其他通信帧。

注:在一帧通信帧中,数据域的最大长度为255B,如果需要发送的数据超过了255B,那么需要进行分包处理。

表5-2 设备类型码

978-7-111-43089-6-Chapter05-20.jpg

表5-3 单一简单设备命令码定义

978-7-111-43089-6-Chapter05-21.jpg

表5-4 数据域格式定义

978-7-111-43089-6-Chapter05-22.jpg

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈