多功能汽车电子门锁文档格式.docx
《多功能汽车电子门锁文档格式.docx》由会员分享,可在线阅读,更多相关《多功能汽车电子门锁文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
在特定人发出正确的触发口令如“张三”和“开门”的口令后,实现开门。
2)、语音地图
在发出正确的触发口令后,提问地名,自动回答其所在的位置,如问“电脑城”,回答“岗顶”。
3)、语音控制播歌
发出正确的触发口令如“张三”和“开门”的口令后,实现播歌。
司机可以很方便的播放音乐。
4)、密码开门
此系统采用按键输入模式,密码初始设置为3位,(从软件上很容易实现更多位数的密码操作,为操作演示计,我们采用3位)。
5)、汽车下车门铃
在按k1键后,蜂鸣器响,作为乘客下车的的门铃。
6)、自动报警器
在连续输入三次密码错误时,蜂鸣器报警。
7)、在三次语音识别错误时,切换到密码开门,防止出现异常时开不了门。
3.系统硬件设计
此系统硬件部分电路核心部分为**单片机及其外围电路(包括语音识别、输出电路),电路总体设计模块方框图如下:
通过IOA0接口给出高电平,使三极8050管通,并用一个IN4007整流,从而从使蜂鸣器报警。
同样方法通过IOA4给出高电平,用直流电动机实现开门。
4.系统软件设计
1、设计原理:
2、程序功能实现简介图如下:
3、对操作程序的解释以及要求:
1)、直接输入密码开门;
输入k2键选择输入密码,输入3位密码后按确认键,比较密码,密码正确表开启门禁系统。
2)、语音功能和键盘扫描功能等级相同;
如果是第一次进入语音识别模式,需要进行语音识别训练,训练两遍正确后,完成训练操作,此时语音识别功能实时监测。
在语音识别实时监测的同时,我们的键盘扫描并没有停止,也就是说我们的键盘输入等级相同语音识别模式,在任何情况下键盘输入都是有效的。
主程序见附录
(二):
4、采集和压缩语音注意事项
《实验仪指导书上册》有较详细的介绍,这里只说明采集和压缩语音要注意的地方,这使我花费两天的时间。
一般电脑都是没配置的,不能直接用来录音,要先对电脑进行配置。
1、控制面板音效管理员喇叭组态,如图选择,要出现凸现麦克风
2、在录音之前还需调整你的“声音与音频属性”,双击电脑桌面右下角的音量图标,打开后点选项中的属性如图:
需要把录音项打勾,在MIC一栏中选中,其它的不要选择,因为我们要录的只是自己要歌唱的声音。
3、用Windows自带的录机录好音,再选属性进行转换
4、用GoldWave进行裁减到最精简。
6.系统设计过程中的体验和困惑
一、体会
1.要学习系统相关知识:
只有在系统学I/O端口组合控制设置表、片内存储器等相关知识等才能真正理解看起来似乎简单的程序和编程。
2.嵌入式和PC编程有很大不同:
通过这次设计,我们深深体会到,嵌入式编程不是和在PC机上程有很大不同,密切联系硬件,密码开门要考虑到反应时间。
要考虑flash大小。
3.实践出真知:
理论指导着实践,但实践才是最终的目标。
我们在设计过程中,往往遇到这样的情况,设计的电路从理论上似乎毫无差错,但实现起来却是困难重重。
只有在不断的摸索中才能找到方法和真正理解理论。
7.参考文献
《**单片机原理与实践》
《**单片机原理及其毕业设计精选》
《**16位单片机应用基础》
《实验仪实验指导书》
8.附录
//========================================================================================
//工程名称:
Guard_SD.spj
//功能描述:
语音识别DEMO程
//每次上电复位后请训练3条命令,第一条为触发命令(用户名,如:
张三),
//后两条开门,播发音乐(也可以有用户自己任意设定两条命令)为控制命令,
//为了便于DEMO,会用语音提示请开门.“请开门”,请播放音乐“
//每次识别时先说用户名,识别成功则回答“I'
mhere.”,再说控制命令。
//识别成功则用语音提示。
//--命令回答
//--开门开门声
//--播放音乐播放音乐声
//文件来源:
《SPCE061单片机原理及应用技术》第八章**单片机应用及开发技术,第338页
//IDE环境:
SUNPLUSu'
nSPTMIDE1.8.0(orlater)
//
//涉及的库:
CMacro.lib
//组成文件:
main.c
//FIQ.asm/hardware.asm/InitIO.asm
//hardware.inc/hardware.h
//日期:
2002-6-12
//===========================================================================================
#include"
bsrsd.h"
#include"
hardware.h"
key.h"
#defineP_IOA_Data(volatileunsignedint*)0x7000
#defineP_IOA_Buffer(volatileunsignedint*)0x7001
#defineP_IOA_Dir(volatileunsignedint*)0x7002
#defineP_IOA_Attrib(volatileunsignedint*)0x7003
#defineP_IOB_Data(volatileunsignedint*)0x7005
#defineP_IOB_Buffer(volatileunsignedint*)0x7006
#defineP_IOB_Dir(volatileunsignedint*)0x7007
#defineP_IOB_Attrib(volatileunsignedint*)0x7008
#defineP_Watchdog_Clear(volatileunsignedint*)0x7012
#defineNAME_ID0x100
#defineCOMMAND_ONE_ID0x101
#defineCOMMAND_TWO_ID0x102
#defineCOMMAND_THREE_ID0x103
#defineRSP_NAME0//1.请说名字.
#defineRSP_FIRE1//2.请说开门.
#defineRSP_GUARD2//3.播放音乐.
#defineRSP_PLACE3//4.请说地名
#defineRSP_AGAIN4//5.Sayagain.
#defineRSP_NOVOICE5//6.Novoicedetected.
#defineRSP_NAMEDIFF6//7.Twogivennamesaredifferent.
#defineRSP_HERE7//8.I'
mhere
#defineRSP_STANDBY8//9.Iamstandingby.
#defineRSP_READY9//10.播发音乐!
#defineRSP_COMPUTER10//11.岗顶---电脑城
//..................globalvariables.....................
intgActivated=0;
//1---触发命令识别成功
//intKey=0;
unsignedinttimes=3,i=0,j,k=0,count;
unsignedintPassword[3]={0x04,0x02,0x04};
//设置密码为先后分别按k1、k2、k3
unsignedintTemp[3];
//0---无触发命令
/*unsignedintKeyScan(void);
//键盘扫描函数
voidDelay(void);
*///延时函数
//***************播放提示语音***********************//
//input:
播放序号
//output:
NO
//*****************************************************//
voidPlayRespond(intResult)
{
BSR_StopRecognizer();
//关闭识别器
SACM_A2000_Initial
(1);
//初始化播放器
SACM_A2000_Play(Result,3,3);
//播放提示语音
while((SACM_A2000_Status()&
0x0001)!
=0)
{
SACM_A2000_ServiceLoop();
}
SACM_A2000_Stop();
//停止播放
BSR_InitRecognizer(BSR_MIC);
//初始化识别器
//BSR_EnableCPUIndicator();
}
//***************训练命令函数***********************//
命令序号、提示语序号
0----训练成功-1------训练失败
intTrainWord(intWordID,intRespondID)
intres;
PlayRespond(RespondID);
while
(1)
res=BSR_Train(WordID,BSR_TRAIN_TWICE);
if(res==0)//训练成功
break;
switch(res)
{
case-1:
//没有检测到命令
PlayRespond(RSP_NOVOICE);
return-1;
case-2:
//需要再训练一次
PlayRespond(RSP_AGAIN);
break;
case-3:
//环境太吵
case-4:
//存储器满
case-5:
//两次命令不一样
PlayRespond(RSP_NAMEDIFF);
case-6:
//命令序号超出范围
case-7:
//命令已存在
}
return0;
//***************主程序***********************//
//C语言
//************************************************//
intmain()
intres,timeCnt=0,iKey=0;
;
InitIO();
BSR_DeleteSDGroup(0);
//初始化存储器,选用SPCE061A内部RAM存储语音样本
//PlayRespond(RSP_INTRO);
while(TrainWord(NAME_ID,0)!
=0);
//训练用户名
while(TrainWord(COMMAND_ONE_ID,1)!
//训练第一条命令
while(TrainWord(COMMAND_TWO_ID,2)!
//训练第二条命令
while(TrainWord(COMMAND_THREE_ID,3)!
//训练第三条命令
BSR_EnableCPUIndicator();
PlayRespond(RSP_STANDBY);
//播放提示语?
I'
mstandingby.
System_Initial();
iKey=SP_GetCh();
switch(iKey)
case0x01:
*P_IOA_Dir=0x0001;
//设置IOA1口为同相高电平输出,实现开门
*P_IOA_Attrib=0x0001;
*P_IOA_Data=0x0001;
break;
case0x02:
count=0;
while
(1){
iKey=SP_GetCh();
//取键值来自key.asm
if(iKey==0x01)
if(iKey!
=0x00)
if(iKey==Password[i])
count++;
i++;
else
i=0;
count=0;
if(count==3)
*P_IOA_Dir=0x0005;
*P_IOA_Attrib=0x0005;
*P_IOA_Data=0x0005;
}
System_ServiceLoop();
case0x04:
*P_IOA_Dir=0x00ff;
*P_IOA_Attrib=0x00ff;
*P_IOA_Data=0x0000;
default:
res=BSR_GetResult();
//进行识别,获取识别结果
if(res>
0)//识别成功
if(gActivated)//如果已经触发
{
timeCnt=0;
switch(res)
{
caseNAME_ID:
//用户名
PlayRespond(RSP_HERE);
break;
caseCOMMAND_ONE_ID:
//第一条命令
*P_IOA_Dir=0x0005;
//设置IOA3口为高电平输出
gActivated=0;
caseCOMMAND_TWO_ID:
//第二条命令
PlayRespond(RSP_READY);
caseCOMMAND_THREE_ID:
//第三条命令
PlayRespond(RSP_COMPUTER);
}
}
else//没有触发
if(res==NAME_ID)
gActivated=1;
timeCnt=0;
}
}
elseif(gActivated)
if(++timeCnt>
450)//如果已经触发,但没有命令识别出来
PlayRespond(RSP_NOVOICE);
gActivated=0;
附录
(二):
器件列表
凌阳61板;
8050三极管两个;
整流二极管IN4007两个
继电器一块;
小直流电动机1台;
蜂鸣器一个
电线若干条