已阅读5页,还剩23页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
.语音电子开关身份认证系统一、 设计要求: 1、功能语音电子你身份认证系统功能为:可以识别8个语音输入,语音识别正确后能自动开锁,且对8个语音输入给出8种不同的语音回答。系统在语言不能正确识别,比如感冒时,可以输入6位的密码开锁,6位密码也可以修改。 2、基本条件本课题主要是兴趣,再加上看书刚好看到,暂时没有板子,但是如果有条件的话,很想尝试着做一个模型出来;但是我们现在已经学习了单片机、嵌入式、数电模电及高频等等,这些足以帮助我们在实际的课题中解决相关问题。此外网络也给我们的学习提供了方便,我们可以通过网络查找我们需要的资料,比如本课题的语音识别芯片AP7003及语音回放芯片ISD4002-120芯片等等。二、原理性设计(含部分功能解释)框图:主控器话筒放大器滤波器ADCDAC滤波器放大器扬声器ISD4002不能独立进行录放工作,需要采用SPI总线的方式与单片机链接,应用电路如下。ISD4002的声音输出采用音频功率放大器调节声音。LM386是音频功率放大器,主要应用与低电压消费产品,在1脚和8脚之间增加一只外接电阻和电容,便可将电压增益调为任意值,可以调节范围为20200。ISD4002的通过数据端MOSI、MISO、时钟端SCLK、片选端SS、中断端INT与单片机相连,单片机的外围电路如下:录放音系统电路:在本系统中,采用由按键直接控制的AP7003-02芯片。AP7003-02可以单独使用,无需控制器,适合于用键盘直接控制。芯片有8键控制盒12键控制两种键盘操作模式。PIM1=1接高电平时,AP7003-02为12键控制模式,12键控制模式的典型电路如下:AP7003的12键模式:PIM1=0接低电平时,AP7003-02为8键控制模式,8键控制模式的典型电路如下:AP7003的8键模式:系统语音识别电路如下,电路采用AP7003-02的12键模式的标准电路,PIM1接高电平。系统可以识别8个1.5m语音长度的语音信号,识别标志信号在A端POA1-POA8输出,POSL接低电平,则A口低输出有效。通电后,先按1#键,LED1端的语音录音指示灯和POA1端的指示灯同时亮,此时可对着话筒讲话,POA1灭,LED1亮。再对着话筒“学习”,LED2语音识别指示灯和POA1同时亮,表示“学习”成功。接着再按2#键,LED1、POA2同时亮,另外一个家庭成员立刻对着话筒发话,以此类推,直到18键全部学习完毕,也可以对某一键或某几个键进行无序输入和学习,也可以一个家庭成员输入多个语音识别信息。在此把8路的输出POA1-POA8端接与8-3优先编码器74LS148芯片,74LS148的输入端07低电平有效,7段优先级较高,和AP7003的输出低电平有效正好对应,在此把AP7003的A端POA1-POA8与74LS148的输入端70端依次相连,则1号语音信息有效级较高。74LS148芯片的EI端为输入使能端,低电平有效,在此接一个开关,可以控制识别的输出信号是否送单片机,74LS148的A、B、C输出端为输入07的编码输出,也是低电平有效,GS端为芯片工作且有有效信号输入的输出端。A、B、C输出端接与单片机的P2.0P2.2端,GS端接单片机的中断0INT0端,有语音识别成功时可以产生中断,进入中断服务程序。第11键clear output为输出转换键,每转换控制一种电器都需按一下该键。语音识别正确或输入密码正确时,P2.4端输出高电平,三极管Q1导通,继电器得以动作,黄色指示灯DS12亮表示开锁。语音电子门锁系统:三、 程序 流程图: 1、系统主流程图: 2、电子密码锁修改密码子程序流程图 3、电子密码锁输入密码子程序流程图:源程序代码:1、语音识别:#include /语音识别程序#include #include #define uint unsigned int#define uchar unsigned charsbit ISD_SS = P10; /ISD4002片选sbit ISD_SCLK = P11; /ISD4002时钟sbit ISD_MOSI = P12; /ISD4002数据输入sbit ISD_MISO = P13; /ISD4002数据输出sbit ISD_INT = P33; /ISD4002溢出或放音结束中断sbit PR = P14; /PR=1录音 PR=0放音sbit RUN = P15; /执行录音或放音sbit STOP = P16; /复位sbit LED = P17; /指示灯sbit SDA=P31; /24c02数据端sbit SCL=P30; /24c02时钟端sbit error=P24; /闭锁指示端sbit right=P25; /开锁指示端 和开锁输出#define COM XBYTE 0x7fff /8279命令状态地址A11 A14#define DAT XBYTE 0x77fF /8279数据地址sbit clflag=ACC7; /记录状态字 最高位bit int0_flag=0; /中断0标志位uchar nmb_flag; /语音识别编号uchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, /0,1,2,3,4,5,6,70x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71 /8,9,A,B,C,D,E,F ; /共阳极数码管显示段码uchar idata diss8; /显示用数据暂存器 8位数据uchar idata mima6; /密码用数据暂存器 6位数据/* 函数声明 *void reply(void);/自动回答程序void ISD_PR(void);/手动对ISD录放音void ISD_WRITE(uchar isdx); /SPI串行发送一个字节子程序void ISD_STOP(void);/发送stop指令程序void ISD_PU(void);/发送上电指令程序void ISD_PD(void);/发送省电指令程序void ISD_PLAY(void);/发送play指令程序void ISD_REC(void);/发送rec指令程序void ISD_SETPLAY(uchar adl,uchar adh);/发送setplay指令程序void ISD_SETREC(uchar adl,uchar adh);/发送setrec指令程序uchar READ_ISD_OVF(void);/读溢出标志OVF程序void ISD_OVF(void);/LED闪烁程序void DELAY(uint n); /延迟n微秒void DELAYms(uint n); /延迟n毫秒uchar keyin(); /8279读键号子程序 uchar deky(); /8279监测有无按键按下子程序 void disp(uchar idata *d); /8279显示子程序void start_bit(void); /2402开始位void stop_bit(void); /2402停止位void mast_ack(void); /2402主答函数bit write_8bit(uchar ch); /2402写一个字节(8位)数据uchar page_wr(uint firstw_ad,uint counter,uchar *firstr_ad);/2402页面写函数uchar page_rd(uint firstrd_ad,uint count,uchar *firstwr_ad);/页面读函数void mimakey(void); /密码锁设置密码 输入密码子程序/*/主程序/功能:系统录音分成8段,可以提供8个提示语。 1.录音时,按住RUN键,LED点亮开始录音,松开RUN即可停止录音/ 再次按下RUN键,LED点亮开始录第二段音,依次类推,直到芯片溢出。/ 按stop键芯片复位/ 2.放音时,按一下RUN键,即播放一段语音。 按stop键芯片复位。/*void main(void)uchar i;P0=P1=P2=P3=0xff; /初始化IP=0x01; /INT0高优先级IE=0X81; /INT0开中断,CUP开中断COM=0xd1; /11010001 总清除命令doACC=COM; /读状态字 直到清除完成while(clflag=1); /读状态字 最高位COM=0x00; /键盘/显示器工作方式 左端送入88显示双键锁定编码扫描COM=0x34; /时钟分频 20分频right=0;error=1; /默认闭锁/*以下测试用*/for(i=0;i6;i+) mimai=i+2; /设置初始密码为234567 测试用 while(page_wr(0,6,&mima0)=0); /写入2402/测试用 当2402存好密码后 该部分程序可以撤除/*以上测试用*/while(1)ISD_PR();/手动对ISD录放音if(int0_flag=1)/有中断产生right=1;error=10; /开锁reply();/自动回答int0_flag=0;/标志位清mimakey(); /密码锁 设置密码、输入密码子程序void reply(void)/自动回答程序 uchar al,ah;/录放音的地址变量ISD_PU(); /RUN键按下为0,ISD上电并延迟50msISD_PD(); /停止本次操作并进入省电状态ISD_PU();/SD上电并延迟50msah=(nmb_flag+1)/2-1; /计算高两位地址 ahal=0x80*(1-nmb_flag%2); /计算低八位地址 alISD_SETPLAY(ah,al); /发送setplay指令,从指定地址地址开始放音ISD_PLAY(); /发送放音指令LED=0;/LED亮DELAY(20);while(ISD_INT=1) /等待放音完毕的EOM中断信号;LED=1;/LED熄灭ISD_STOP(); /放音完毕,发送stop指令ISD_PD();/停止本次操作并进入省电状态void service_int0() interrupt 0 using 2/外部中断0 用第二组寄存器 int0_flag=1;nmb_flag=P2&0x07;void ISD_PR(void) /手动对ISD录放音uchar k=1; /指示录放音段数的变量uchar al,ah;/录放音的地址变量while(RUN=0) /RUN键按下DELAYms(20); /按键防抖动if(RUN=1) /按键防抖动break;ISD_PU(); /RUN键按下为0,ISD上电并延迟50msISD_PD(); /停止本次操作并进入省电状态ISD_PU();/SD上电并延迟50msif (PR=1) /如果PR=1则转入录音部分DELAYms(500); /延迟录音 指定地址录音ISD_SETREC(0x00,0x00); /发送0x0000h地址的setplay指令 do ah=(k+1)/2-1; /计算高两位地址 ahal=0x80*(1-k%2); /计算低八位地址 alISD_SETREC(ah,al); /发送指定地址地址的setplay指令ISD_REC(); /发送rec指令 下一个地址开始录音 while(RUN=0) /键未松开 等待录音完毕 if (ISD_INT=0) /如果芯片溢出ISD_OVF(); /进行LED闪烁提示if (ISD_INT=0) /录音溢出,按键RUN释放 则退出录音。则芯片复位break;LED=1; /按键释放,未满,录音完毕,LED熄灭ISD_STOP(); /发送停止命令while(RUN=1) /如果RUN未按下 查询 RUN和STOP键if(STOP=0) /如果按下STOP按键,则芯片复位break;if (RUN=0)/如果RUN再次按下,开始录制下一段语音DELAYms(500);k+;/指向下一段录音while(RUN=0);else /如果PR=0则转入放音部分while(RUN=0);/未释放按键时等待ISD_SETPLAY(0x00,0x00); /发送setplay指令,从0x0000地址开始放音do ah=(k+1)/2-1; /计算高两位地址 ahal=0x80*(1-k%2); /计算低八位地址 alISD_SETPLAY(ah,al); /发送setplay指令,从指定地址地址开始放音ISD_PLAY(); /发送放音指令DELAY(20);while(ISD_INT=1) /等待放音完毕的EOM中断信号;LED=1;/LED熄灭ISD_STOP(); /放音完毕,发送stop指令if (READ_ISD_OVF()=1) /检查芯片是否溢出 ,如溢出则停止放音,芯片复位break;while(RUN=1) /等待RUN键再次按下 if (STOP=0) /如果按下STOP按键,则芯片复位break;if(RUN=0)/如果RUN再次按下,开始播放下一段语音DELAYms(20);k+;/指向下一段放音while(RUN=0); /RUN键再次按下,播放下一段语音ISD_STOP(); /发送stop指令ISD_PD();/停止本次操作并进入省电状态/*/ISD4002 SPI串行发送一个字节子程序,8位数据/*void ISD_WRITE(uchar isdx) /SPI串行发送一个字节子程序 uchar i;ISD_SS=0; /片选使能,打开SPI通信端ISD_SCLK=0;/时钟置0for(i=0;i1;/先发低位再发高位,依次发送ISD_SCLK=1;/时钟产生上升沿 锁存输入的数据DELAY(2);/延时使数据稳定ISD_SCLK=0;/回复时钟低电平DELAY(2);/*/发送stop指令/*void ISD_STOP(void)/发送stop指令程序 DELAY(10);ISD_WRITE(0x30);/停止录音或放音操作,指令代码0X11 0ISD_SS=1;DELAYms(50);/*/发送上电指令,并延迟50ms/*void ISD_PU(void)/发送上电指令程序 DELAY(10);ISD_SS=0;ISD_WRITE(0x20);/器件上电,指令代码0010 0ISD_SS=1;DELAYms(50);/*/发送省电指令,并延迟50ms/*void ISD_PD(void)/发送省电指令程序DELAY(10); ISD_WRITE(0x10);/停止本次操作并进入省电状态,指令代码0X01 XISD_SS=1;DELAYms(50);/*/发送play指令/*void ISD_PLAY(void)/发送play指令程序LED=0;/指示灯亮ISD_WRITE(0xf0);/在下一个地址开始放音,指令代码1111 1/0 ISD_SS=1;/*/发送rec指令/*void ISD_REC(void)/发送rec指令程序LED=0;/指示灯亮ISD_WRITE(0xb0);/从下一个地址开始录音ISD_SS=1;/*/发送setplay指令/*void ISD_SETPLAY(uchar adl,uchar adh) /发送setplay指令程序 ISD_WRITE(adl); /发送放音起始地址低位adh=adh|0xe0; /从地址开始放音ISD_WRITE(adh); /发送放音起始地址高位ISD_SS=1;/*/发送setrec指令/*void ISD_SETREC(uchar adl,uchar adh)/发送setrec指令程序 ISD_WRITE(adl); /发送录音起始地址低位adh=adh|0xa0; /从地址开始录音ISD_WRITE(adh); /发送录音起始地址高位ISD_SS=1;/*/检查芯片是否溢出(读OVF,并返回OVF值)/*uchar READ_ISD_OVF(void)/读溢出标志OVF程序 ISD_SS=0; /片选有效DELAY(2);ISD_SCLK=0;/先产生时钟上升沿DELAY(2);ISD_SCLK=1;ISD_SCLK=0; /时钟信号下降沿时输出数据DELAY(2);if (ISD_MISO=1) /只读第1位数据 ISD_SS =1; /关闭SPI通信端ISD_STOP(); /发送stop指令return 1; /OVF为1,返回1else ISD_SS =1; /关闭SPI通信端ISD_STOP(); /发送stop指令return 0; /OVF为0,返回0/*/芯片溢出,LED闪烁提醒停止录音/*void ISD_OVF(void)/LED闪烁程序while(RUN=0)/为0 表示键在按下 还未释放 LED=1; /指示灯灭DELAYms(300);/延时指示灯闪烁LED=0; /指示灯亮DELAYms(300);void DELAY(uint n) /延迟n微秒while(n!=0)n-;void DELAYms(uint n) /延迟n毫秒 TMOD=0x01; /T0 16位定时 while(n!=0) TH0=0xfc;/12MHZ晶振时 定时1msTL0=0x18;TR0=1;while(TF0!=1);TF0=0;TR0=0;n-;void mimakey(void) /密码锁 设置密码、输入密码子程序 uchar i,key; /i循环变量 key键号暂存器 bit keyok; /解锁标志位 for(i=0;i6;i+)dissi=i;/在“无输入和设置密码时”默认显示012345disp(diss); /送显示key=keyin(); /等待键按下 读键号/*以下为 输入密码状态*/if(key=0x0b)&(keyok=0) /在闭锁状态下,密码输入键按下时,进入输入密码状态for(i=0;i=0x0a) dokey=keyin();while(key=0x0a);/不是取消键且输入键号不是09的数字键时 等待1位数输入mimai=key; /密码数字存于mima暂存器中dissi=15; /每输入一位密码数码管显示“F”disp(diss); /送显示 if(key!=0x0d) /6位密码输入完成时 看是否要确认;未完成6位输入时 返回 key=keyin(); /等待按键输入if (key=0x0d); /是取消键时 输入密码取消else /不是取消键时 等待输入密码确认 if(key!=0x0c) while(keyin()!=0x0c);/等待确认键按下while(page_rd(0,6,&diss0)=0); /在2402中读取密码 keyok=1; /把解锁标志位设为1 解锁 for(i=0;i6;i+) /比较6位密码 /有1位密码不同时 密码错误 无需再比较 if(mimai!=dissi) keyok=0;break;/密码错误时 解锁状态位设为0 为闭锁状态if(keyok=1) right=1;error=0; /当密码正确时 开锁else right=0;error=1; /当密码错误时 闭锁 /*以上为 输入密码状态*/*以下为设置密码状态*/if(keyok=1) /在开锁状态下 可以设置密码或关锁 if(key=0x0d) /开锁状态时 按下取消键时 关锁keyok=0;right=0;error=1;/解锁状态位设为0 闭锁if(key=0x0a) /是设定键时 进入设置密码状态for(i=0;i=0x0a) dokey=keyin();while(key=0x0a);/不是取消键且输入键号不是09的数字键时 等待1位数字键输入mimai=key; /密码数字存于mima暂存器中dissi=14; /每输入一位密码数码管显示“E”disp(diss); /送显示 if(key!=0x0d) /6位密码输入完成时 看是否要确认;未完成6位输入时 返回key=keyin(); /读一位键if (key=0x0d);/是取消键时 设置密码取消else /不是取消键时 等待设置密码确认 if(key!=0x0c) while(keyin()!=0x0c); /等待确认键按下while(page_wr(0,6,&mima0)=0); /密码写入24lc02/*以上为设置密码状态*/void disp(uchar idata *d) /显示子程序 uchar j;COM=0x90; /写显示RAM 自动加1for(j=0;j=0x0e); /只读取09和AD键 不读取E和F键return(j); /返回键号uchar deky(void) /监测有无按键按下 uchar k;k=COM; /读状态return(k&0x03); /只监测2行按键 有键返回1 无键返回0/*-调用方式:void start_bit(void)函数说明:2402开始位在时钟端SCL为高电平时,数据端SDA发生由高到低的变化,为起始条件启动I2C总线-*/void start_bit(void) SCL=1;/_nop_(); SDA=1;/_nop_(); SDA=0;/_nop_(); SCL=0;/_nop_();/*-调用方式:void stop_bit(void)函数说明:2402停止位在时钟端SCL为高电平时,数据端SDA发生由低到高的变化,为停止条件停止I2C总线数据传输-*/void stop_bit(void) SDA=0;/_nop_(); SCL=1;/_nop_(); SDA=1;/_nop_();/*-调用方式:void mast_ack(void)函数说明:2402主答函数主器件在收发每一个字节后产生一个时钟应答脉冲,在这期间,发送器必须保证SDA为高,由接收器SDA拉低,称为应答信号(ACK)。-*/void mast_ack(void) SCL=0;_nop_(); SDA=0;_nop_(); SCL=1;_nop_(); SCL=0;_nop_(); SDA=1;_nop_();/*-调用方式:write_8bit(uchar ch)函数说明:2402写一个字节(8位)数据-*/bit write_8bit(uchar ch) uchar i=8; bit fan_w; SCL=0;_nop_(); while(i-) SDA=(bit)(ch&0x80); /取字节的最高位 _nop_(); ch=1; /字节左移一位 SCL=1;_nop_(); /上升沿锁存数据 SCL=0;_nop_() SDA=1;_nop_(); SCL=1;_nop_(); fan_w=SDA; /读应答信号 SCL=0;_nop_(); return(fan_w); /返回应答信号/*-调用方式:void page_wr(uint firstw_ad,uint counter,uint data *firstr_ad)函数说明:2402页面写函数,firstw_ad为写入字节单元的首地址, *firstr-ad为被写入数据所在首地址指针 counter为写入数据字节数-*/uchar page_wr(uint firstw_ad,uint counter,uchar *firstr_ad) uchar data *ufirstr_ad; ufirstr_ad=firstr_ad; start_bit(); /写开始位 if(write_8bit(0xA0)!=0)stop_bit();return(0); /写命令 if(write_8bit(firstw_ad)!=0)stop_bit();return(0);/写首地址 while(counter-) /写字节数减1 if(write_8bit(*ufirstr_ad)!=0)stop_bit();return(0);/写1字节 ufirstr_ad+; /地址加1 stop_bit(); /写停止位 return(1);/*-调用方式:void page_rd(uint firstrd_ad,uint count,uint firstwr_ad)函数说明:2402页面读函数,firstrd-ad为所读字节首地址,count为读字节数 *ufirstwr-ad为读出数据存储首地址指针-*/uchar page_rd(uint firstrd_ad,uint count,uchar *firstwr_ad) uchar j=8; uchar data *ufirstwr_ad; ufirstwr_ad=firstwr_ad; start_bit(); /写开始位 if(write_8bit(0xA0)!=0)stop_bit();return(0); /写命令 if(write_8bit(firstrd_ad)!=0)stop_bit();return(0);/写首地址 start_bit(); /写开始位 if(write_8bit(0xA1)!=0)stop_bit();return(0); /读命令 while(count-) /读字节数减1 uchar i=8; while(i-) (*ufirstwr_ad)=1; /读对应地址的数据左移 SCL=1;_nop_(); /上升沿 if(SDA) (*ufirstwr_ad)|=0x01; /数据端为1时 存1 SCL=0; _nop_(); ufirstwr_ad+; /地址加1 mast_ack(); /应答信号 while(j-) (*ufirstwr_ad)=1; SCL=0;_nop_();_nop_();SCL=1; if(SDA) (*ufirstwr_ad)|=0x01; stop_bit(); /写停止位 return(1);/24c02_在上面语音录放:#include #define uint unsigned int#define uc
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2026学年北京版(新教材)二年级上册第四单元“表内乘法(二)”达标试卷(附参考答案)
- 非诉讼类委托代理合同
- TSI校验与OPC试验详解
- 西游记相关考试题及答案
- 2025年商品卡片的测试题及答案
- 2025年综合水电气考试题及答案
- 2025 三年级语文上册人教版实心主题写作细节描写课件
- 2025年公益岗位考试试卷及答案
- DB1306T 280-2025 红岗山桃生产技术规程
- 2025年青神中考作文真题及答案
- 成都七中万达学校高一上化学半期考试试卷
- 2025医疗机构志愿者服务体系管理与社会责任履行报告
- 学堂在线 研究生学术与职业素养讲座 章节测试答案
- 磁生电说课稿公开课一等奖市赛课获奖课件
- 新初中七年级-上册语文课外阅读理解训练及答案
- 2023北京市第一次高中学业水平合格性考试数学试卷真题(含答案详解)
- 完整word版眼科高级职称答辩题及参考答案
- GB/T 9116-2010带颈平焊钢制管法兰
- 应急预案与演练培训课件
- DG-TJ 08-2362-2021 综合杆设施技术标准
- 英国FBA超重标签
评论
0/150
提交评论