基于单片机的语音存储和播放系统设计

上传人:痛*** 文档编号:102225407 上传时间:2022-06-06 格式:DOC 页数:29 大小:118KB
收藏 版权申诉 举报 下载
基于单片机的语音存储和播放系统设计_第1页
第1页 / 共29页
基于单片机的语音存储和播放系统设计_第2页
第2页 / 共29页
基于单片机的语音存储和播放系统设计_第3页
第3页 / 共29页
资源描述:

《基于单片机的语音存储和播放系统设计》由会员分享,可在线阅读,更多相关《基于单片机的语音存储和播放系统设计(29页珍藏版)》请在装配图网上搜索。

1、-基于单片机的语音存储和播放系统设计摘要在常见的电子产品或自动控制设备中,如果加入语音功能即能极大地提高人机界面的友好性,方便用户操作。在许多场合需要语音存储与语音播放技术和单片机结合在一起。常规的模拟化语音处理系统能实现语音的存储与回放功能,但效果不佳。本设计选用功能强大的单片机STC89C52作为主动器件,采用数码语音芯片ISD4004作为系统的语音存储和播放芯片,选用LCD1602作为系统的显示模块,并同时采用扫描按键的方式实现系统的各类参数的调整。从而实现了一个完整的基于单片机的语音存储和播放系统的设计。本文首先对系统中用到的单片机和语音芯片以及现实模块进行了方案分析论证,从而提出了系

2、统的整体功能框架,然后分别对系统的各个功能模块进行了硬件电路设计和软件设计,最后对本设计进行了总结与展望。关键词:STC89C52 ISD4004 语音存储 语音播放Design of Voice Storage and Playback System Based on MicrocontrollerAbstractIn mon electronic products or automatic control equipment, if adding voice capabilities that can greatly improve the friendly man-machine int

3、erface, user-friendly operation. On many occasions the need to store voice bined with voice playback technology and Microcontroller. Conventional analog of voice processing systems to achieve storage and playback of voice, but to little avail.The design features a powerful microcontroller STC89C52 c

4、hosen as the active devices, the use of digital voice chip ISD4004 chip as voice storage and playback system, as the system of choice LCD1602 display module, and also be achieved by scanning the keys to adjust the various parameters of the system. In order to achieve a plete Microcontroller design b

5、ased voice storage and playback system. Firstly, the system used in the Microcontroller and voice chip and realistic analysis module of the demonstration program, which made the overall framework of the system function, and then separately for each module systems hardware design and software design,

6、 the final design of the a summary and outlook.KEYWORDS:STC89C52 ISD4004 Voice StorageVoice playback目录第1章绪论4第2章系统总体方案论证52.1 系统设计方案选择52.1.1 主控模块的方案选择52.1.2 显示模块的方案选择62.1.3 语音模块的方案选择72.2 系统总体方案设计7第3章系统硬件电路设计83.1 主控模块电路设计83.1.1 STC89C52单片机简介83.1.2 STC89C52最小系统电路设计93.2 显示模块电路设计113.3 语音模块电路设计123.4 系统参数设置

7、电路设计153.5 系统电源电路设计16第4章系统软件设计174.1 主程序流程图设计174.2 子程序流程图设计184.2.1 录音子程序184.2.2 播放子程序19致谢20参考文献21附录22第1章 绪论在常见的电子产品或自动控制设备中,如果加入语音功能即能极大地提高人机界面的友好性,方便用户操作。目前语音服务行业越来越广泛,如电脑语音钟、语音型数字万用表、手机话费查询系统、排队机、监控系统语音报警以及公共汽车报站器等。在许多应用场合,设计者需要将语音系统和单片机结合在一起1。单片机具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点。现代人类生活中所有的几乎每件电子和机械产

8、品中都会集成有单片机,单片机可以说是世界上数量最多的计算机2。手机、计算器、家用电器、电子玩具、掌上电脑以及鼠标等电脑配件中都配有单片机。而个人电脑中也会有为数不少的单片机在工作。可以说,单片机能够在语音功能的实现应用中发挥重大的作用。近年来,语音信号处理技术研究的突飞猛进,为数字语音存储和播放系统提供了新的发展空间。对语音的采集、处理从以前简单的波形编码转变为参数编码、压缩,从而大大减少了存储的数据3。目前比较典型的语音器件有美国的ISD公司生产的ISD系列语音芯片。ISD系列语音芯片采用模拟数据在半导体存储器直接存储的专利技术,即将模拟语音数据直接写入到单个存储单元,不需经过A/D或D/A

9、装换,因此能够较好的真实再现语音的自然效果,避免了一般固体语音电路因为量化和压缩所造成的量化噪声和失真现象4。本设计选用功能强大的单片机STC89C52作为主动器件,采用数码语音芯片ISD4004作为系统的语音存储和播放芯片,选用LCD1602作为系统的显示模块,并同时采用扫描按键的方式实现系统的各类参数的调整。从而实现了一个完整的基于单片机的语音存储和播放系统的设计。本文首先对系统中用到的单片机和语音芯片以及现实模块进行了方案分析论证,从而提出了系统的整体功能框架,然后分别对系统的各个功能模块进行了硬件电路设计和软件设计,最后对本设计进行了总结与展望。第2章 系统总体方案论证2.1 系统设计

10、方案选择根据设计要求可知,本系统的功能模块大致可分为主控模块、显示模块、语音模块、系统电源模块以及系统参数设置模块。显示模块实时的显示语音播报信息,语音模块实现语音的存储和播放功能,系统参数设置模块主要辅助上述模块实现各自功能,系统电源模块为系统提供工作电源,主控模块主要负责协调所有功能模块一起协同工作。各个模块的具体方案选择如下。2.1.1 主控模块的方案选择方案(一):选用AT89C52作为系统的主控芯片,AT89C52芯片内部集成了8K的Flash,外加8K的ROM存储空间,具有存储空间较大,且存取速度快的优点,同时兼容所有MCS-51系列单片机。但是AT89C52不能实现ISP在线编程

11、的功能,这样就使得整个开发调试过程显得繁琐,且开发效率低,同时在调试过程中需要对芯片多次的插拔,很容易对芯片造成损坏5。方案(二):选用STC89C52作为系统的主控芯片,STC89C52片内集成了64K的Flash存储空间,存储空间极大,且存储速度快。STC89C52具备AT89C52具备的所有功能。最为重要的是STC89C52提供ISP在线编程的功能,这样就使得整个开发过程变得高校便捷,在调试过程中不用多次的插拔芯片,对芯片也能起到很好的保护作用6。综上所述,再考虑到本系统设计的多功能万年历需要实现众多的功能,初步估计系统程序可达40K左右,且需要反复调试实现设计要求的所以功能。故选用方案

12、二,选用STC89C52作为系统的主控芯片。2.1.2 显示模块的方案选择方案(一):采用LED动态扫描的方式实现系统的显示功能,LED数码管价格低廉,特别适用于显示数字,LED数码管与单片机连接电路简单,但是随着LED数码管位数的增加,占用单片机IO端口资源也越来越多。方案(二):采用点阵式数码管的方式实现系统的显示功能,点阵式数码管采用8*8的发光二极管组成显示区域,特别适用于显示各类文字信息,且价格相对高昂,如果仅仅用来主要显示数字信息显得浪费。方案(三):选用LCD1602液晶模块实现系统的显示功能,LCD1602显示区域大,且能方便的显示各类数字,文字,图形信号,功能强大,且与单片机

13、接口电路简单。综上所述,考虑到本设计中显示部分主要用于显示数字信息,而且显示内容较多,故选用第三种方案作为系统的显示方案。2.1.3 语音模块的方案选择方案(一):采用单片机编写闹钟程序配合蜂鸣器的方式实现系统的语音报时功能。这种方式能减少系统芯片的使用,降低系统的整体功耗,但是因为系统内部的时间延迟问题,采用这种方式会对系统的整体效果产生严重的影响。方案(二):采用专用的语音芯片实现系统的语音报时功能。选用美国ISD公司出品的ISD4004,该芯片具有连接电路简单、功耗极低、抗干扰能力强等众多优点7。综上所述,本系统的语音模块选用第二种方案,采用专用的语音芯片ISD4004实现系统的语音报时

14、功能。2.2 系统总体方案设计综上所述,本设计选用STC89C52单片机为核心控制器件。显示模块选用LCD1602,可一次性显示16*2个字符,完全能满足系统的需求。语音芯片选用美国ISD公司出品的ISD4002,该芯片具有连接电路简单、功耗极低、抗干扰能力强等众多优点。同时本设计采用按键实现系统参数调整的功能。系统总体功能框图如图2.1所示。图2.1 系统总体功能框图第3章 系统硬件电路设计3.1 主控模块电路设计3.1.1 STC89C52单片机简介本设计选用的主控芯片STC89C52是STC公司生产的一个基于51内核的8位单片机。STC89C52是一个低电压,高性能CMOS 8位单片机,

15、片内置通用8位中央处理器,同时在片内集成了Flash闪存存储器单元,正因为实现了上述的诸多功能部分,STC89C52单片机以其强大的功能优势,能较好的适用于各类复杂的控制应用场合。STC89C52系列单片机都采用40脚的封装形式,在其40个引脚中包含了32个通用的输入输出端口,能灵活配置在各种控制场合;还包含了2个外部中断端口,能实现各控制系统的中断处理过程;同时还包括了3个16位的定时器(计数器),能实现各种精确的定时计数功能;2个全双工通信端口,能实现全双工通信;以及包含了2个读写端口8。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本

16、。其引脚图如图3.1示。图3.1 STC89C52引脚分布图3.1.2 STC89C52最小系统电路设计能让单片机正常工作的最简单单元硬件电路,即称为单片机最小系统电路。一般来说,单片机最小系统包括晶振电路、电源电路、复位电路、程序下载(电平转换)电路等基本电路。3.1.2.1 晶振电路单片机都是在系统时钟脉冲的驱动下进行工作的,因此产生时钟脉冲的晶振电路是单片机最小系统中不可或缺的部分。51系列的单片机内部都集成了一个振荡电路,在搭建单片机晶振电路时,只需在单片机外部接入一个振荡晶体作为系统振荡源,此振荡源就能和单片机内部的振荡电路构成一个能够产生时钟脉冲信号的晶振电路,单片机的工作速率都是

17、由晶振电路的频率决定的。单片机晶振电路图如图3.2所示。图3.2 晶振电路图电路中的两个跨接在石英晶体两端的两个电容 C1,C2主要起到协助振荡器起振和微调振荡频率的作用,其取值*围一般为10-33pF,在本设计中电容C1、C2均取值33pF。本设计中的外部石英晶体选取频率为12MHZ,故系统时候周期为1/12s。3.1.2.2 复位电路如图3.1所示,51系列单片机的第9脚是单片机的复位端口,只要通过此复位端口向单片机内部连续输入4个机器周期的复位信号就可实现单片机的复位,单片在成功接收到复位信号后,即控制单片机的各个端口状态都回复到初始化状态。单片机复位电路图如图3.3所示。图3.3 复位

18、电路图电解电容C2、电阻R3构成复位电路。51系列单片机的复位电平均为高电平,因此只要在单片机的复位引脚加上高电平,单片机即处于复位状态。在系统上电后,电容C2开始其缓慢的充电过程,同时单片机的复位引脚的电平慢慢的由高电平向低电平转换,电容C2完成充电过程后,单片机的复位引脚则处于稳定的低电平状态,至此单片机的整个上电复位过程进行完毕,单片机上电复位的时间由电容容值与电阻阻值共同决定。3.2 显示模块电路设计液晶显示模块LCD1602已广泛应用在各类电子产品中,在电子产品中使用LCD1602主要用于显示特殊符号、各种类型的数字以及图形。LCD1602液晶显示模块具有超低功耗、较小体积、可显示各

19、类不同的内容等优点。LCD1602液晶显示模块可以同时显示2行字符,每行包括16个字符,单片机可通过LCD1602的三个控制端口(RS、R/W、EN)实现对LCD1602的控制,LCD1602的工作电压为5V,同时具有字符对比度调节和背光功能。LCD1602液晶显示模块已广泛应用于测试仪表、计算器、家用电子产品中。LCD1602主要技术参数如下:l 显示容量为16*2个字符;l 芯片工作电压为1.4-5.5V;l 工作电流为2.0mA(5.0V);l 模块最佳工作电压为5.0V;l 字符尺寸为36.5*81mm。其引脚功能说明如表3.1所示:表3.1 LCD1602引脚接口说明表引脚序号引脚符

20、号引脚说明引脚序号引脚符号引脚说明1VSS电源地9D2数据2VDD电源正极10D3数据3VL偏压11D4数据4RS数据/命令选择12D5数据5R/W读/写选择13D6数据6E使能信号14D7数据7D0数据15BLA背光源正极8D1数据16BLK背光源负极LCD1602时序图如图3.4所示。图3.4 LCD1602读写时序图LCD1602液晶显示模块和单片机的连接电路图如图3.5所示。图3.5 LCD1602液晶显示模块连接电路图3.3 语音模块电路设计本设计的语音模块选用专用语音芯片ISD4004。ISD4004是美国ISD公司生产的采用直接模拟技术的语音芯片,该芯片采用EEPROM存储方法将

21、模拟语音数据直接写入半导体存储单元中,具有音质自然、可反复录放、抗干扰、低功耗等许多优点。ISD4004语音芯片的基本技术指标如下:l 工作电源:+5V;l 工作电流:15mA;l 待机电流:0.5uA;l 信噪比:S/N=43dB;l 录音时间长度:20s;l 可分段数:160段;l 每段时间长度:20s/160段=0.125s/段;l 录放次数:10万次以上ISD4004引脚分布图如图3.6所示。图3.6ISD4004引脚分布图ISD4004引脚功能描述表如表3.2所示。表3.2ISD4004引脚功能描述图引脚序号引脚名称引脚功能说明1-6、9、10A0-A7芯片地址端引脚12、13GND

22、D、GNDA电源地信号14、15SP+、SP-喇叭输出16、28VCCA、VCCD电源信号17MIC话筒输入18MIC REF话筒参考19AGC自动增益控制20ANAIN模拟输入21ANAOUT模拟输出23PLAYL电平触发放音24PLAYE边沿触发放音25RECLED录音指示26*CLK外部时钟27REC录音ISD4004与主控单片机STC89C52的连接电路图如图3.7所示。图3.7 ISD4004与STC89C52连接电路图如上图所示,主控单片机通过REC(录音)、PLAYL(电平触发录音)、PLAYE(边沿触发录音)三根控制信号实现对ISD4004的控制,可选择电平触发录音或者边沿触发

23、录音方式,通过向ISD4004的地址信号端口A0-A7输入操作模式选择信号,选择ISD4004的操作模式,ISD4004则通过MIC(话筒输入)和MIC REF(话筒参考)实现话筒的输入,通过SP+和SP-实现喇叭输出,从而实现系统语音报时的功能9。ISD4004内置了很多操作模式,如表3.3所示,这样使得用最少的外围器件可实现最多的功能。表3.3ISD4004的操作模式表A7A6A5A4A3A2A1A0模式功能可组合使用的模式11*00*01A0信息检索A411*00*10A1删除EOMA3、A411*01*00A3循环A111*10*00A4连续寻址A0、A1ISD4004的操作模式介绍如

24、下:A0(信息检索):快速跳过信息而不必知道其确切的地址。当控制器输入一个低脉冲,内部地址计数器就跳到下一条信息。此模式仅用于放音,通常与A4同时使用。A1(EOM删除):是分段信息变成一条信息,仅在信息最后留一个EOM标志。这个模式完成后,录入的所有信息就作为一条连续的信息。A3(信息循环):循环重放位于存储空间起始处的那条信息。如果一条信息完全占满存储空间,则循环就从头至尾进行。A4(连续寻址):正常操作中,重放遇到EOM标志时,地址计数器会复位。A4模式禁止地址计数器复位,使得信息可连续录入或重放。当芯片既不是录音也不是放音时,将A4短暂拉低可使地址计数器复位为0。A2、A5两种模式暂时

25、未使用。3.4 系统参数设置电路设计本设计实现的语音存储和播放系统可以实现对存储和播放内容进行调整,以及对播放时间和速度等进行调整,在本次设计中,采用了11个按键来完成这些功能。其电路图如图3.8所示。图3.8系统参数设置电路图3.5 系统电源电路设计本系统中的各个功能模块的供电电源都是+5v,即系统的电源可直接由上位机的USB端口提供,并通过滤波电路,同时设置了系统的上电指示灯,系统电源电路图如图3.9所示。图3.9系统电源电路图第4章 系统软件设计4.1 主程序流程图设计本设计是基于单片机的语音存储和播放系统,其主要功能是通过单片机对语音芯片ISD4004的控制字的写入实现。本系统的主程序

26、流程图如图4.1所示。图4.1系统主程序流程图系统首先进行初始化,然后通过按键将系统状态设置为录音状态,接着扫描按键判断是否有录音键按下,若有录音键按下,则控制LCD1602显示系统状态,并延时去抖动,接着开始录用;若没有录音键按下,则接着判断是否有播放键按下,若有播放键按下,则控制LCD1602显示系统状态,并开始播放。4.2 子程序流程图设计4.2.1 录音子程序录音子程序流程图如图4.2所示。图4.2录音子程序流程图系统首先将ISD4004的CE端至零,则进入录音状态,然后扫描录音按键是否松开,若录音键松开,则表示录音结束,保存录音;若录音键没有松开,则表示录音没有结束,继续录音,继续录

27、音按键是否松开。4.2.2 播放子程序播放子程序流程图如图4.3所示。图4.3播放子程序流程图系统首先将ISD4004的CE端至零,则进入播放状态,然后判断播放结束信号EOM是否为零,若EOM为零,则表示播放结束,若EOM不为零,则表示播放未结束,继续判断EOM是否为零。致谢时光荏苒,仿佛为期四年的大学生涯在转眼间就消失了,刚刚进入大学校园报道的场景都还历历在目,大学四年的时间就在这样的不经意中溜走。回忆大学四年的学习生涯有太多的人和事值得回忆与感谢。四年前懵懵懂懂的我义无返顾的选择的电子相关的专业。在大学四年的学习期间在任课老师的悉心教导下学到了不少电子专业的基础知识,在增长了自身见识的同时

28、也丰富了自己的视野。但是“纸上得来终觉浅”,由于平时一心关注书本上的知识,不太注重平时实践动手能力的锻炼,使得在此次毕业设计中遇到了不少的麻烦,但都在指导老师的精心指导下以及同学们的帮助下成功的解决了所遇到的困难,并从中学到了不少专业知识。在此我要向我的毕业设计指导老师致以最诚挚的感谢,我的毕业设计都是在指导老师的精心指导和悉心关心下完成的,从课题的选择到最后论文的截稿,每一个过程都饱含了指导老师的辛勤汗水,指导老师不但教会了我一些我以前不曾掌握的专业知识,同时指导老师的严谨的治学态度,实事求是的处事态度,精益求精的科研精神都深深的感染了我,在完成毕业设计的同时,让我学会了很多做人做事的方式方

29、法。衷心的感谢我的毕业设计指导老师!其次在此我要感谢在大学四年默默帮过过我的同学、朋友和老师,在你们的帮助下,我才能顺顺利利的完成我的大学阶段的学习。最后,我要感谢一直培养我成人的父母,是你们无私的爱与包容才使我快乐的长大成人,感谢你们对我无私的爱与奉献!参考文献1*建光,金碧波,章皓.基于8051单片机语音控制系统的实现J.自动化与仪器仪表,2006(2):39-41、58.2王洪生.基于单片机的语音播放遥控嵌入式系统的实现J. 科技信息,2010(4):197.3李景,李慧.基于单片机的语音报价系统设计J.仪表技术,2010(10):37-39.4史先桂.单片机在公交车智能报站系统中的应用

30、J.电脑知识与技术,2011,11(7):8297-8300.5陈青.大容量可扩展语音播放系统设计J.电子世界,2013(2):136-138.6曾鹏,林躜,朱晓燕.16位单片机的语音信号处理技术的研究J.*工学院学报,2003,4(2):16-18.7章立文,王琦.基于SPCE061A 单片机的音乐播放系统J.产业与科技论坛,2011(10):98-99.8屠澄轶.基于凌阳单片机的通用型语音控制系统J.现代电子技术,2010(22):68-70.9陆炜,朱红.一种单片机语音录入和播放系统设计J.实验科学与技术,2008,4(4):154-156.附录1.系统原理图2C语言源程序/*= 160

31、2液晶显示驱动程序 = 参数定义示例: *define LCD_Data P1 sbit LCD_RW=P20; sbit LCD_RS=P21; sbit LCD_E=P22; 程序调用说明: 1) 使用前需先调用 LCD_Init() 对LCD进行初始化 2) 输出字符使用 LCD_PutStr(字符串,输出位置) 输出数字使用 LCD_PutNum(数字,输出位置) 注: 1) 输出位置为031间的整数,为-1时表示先清屏 2) 函数返回值为一整形数,表示当前光标所在位置 3) 此两个函数支持以下转义字符: n 换行 b 退格 输出 输出 输出 调用示例: =*/ *include *i

32、nclude LCD1602.H*include ISD4004.H*define uchar unsigned char*define uint unsigned intsbit KEY_REC=P24;sbit KEY_PLAY=P23;sbit KEY_STOP=P22;sbit KEY1=P10;sbit KEY2=P11;sbit KEY3=P12;sbit KEY4=P13;sbit KEY5=P14;sbit KEY6=P15;sbit KEY7=P16;sbit KEY8=P17;unsigned char i=0,sec_count=0,play_count=0;unsign

33、ed char num=0;unsigned int sec_addr=0,play_addr=0;uchar datasoute=0,m=0,n=0,sec=0,dis_number=0;uchar key_num=0*ff;uchar record_flag=0;uchar play_flag=0;uint code address=0,300,600,900,1200,1500,1800,2100;void record(unsigned int address)play4004(2398);/while(_int=1); /等待一段放音完毕的 EOM 中断信号/delayms(1000

34、); /放音到末尾不能马上再次操作语音芯片,否则芯片会掉电,这里延时等一下。/*/record4004(address); sec = 0;while(_int=1)&(KEY_STOP=1) /存储地址换行标志if(_rac = 0) /4004总共2400行,每行175Ms的高电平,25Ms的低电平delayms(30); datasoute+; if(datasoute = 5) /200ms一次,5次表示录音1Sdatasoute = 0;sec+;m = sec /10;n = sec %10;stopmode(); /停止powerdown(); /掉电 /记录本次录音所占的行数(

35、也就是本次录音有多大) void play(unsigned int address)play4004(address);delayms(1000); uchar Key_Scan(void)uchar key_num=0*ff;if(KEY_REC=0) /KEY_REC键按下delayms(10);/按键防抖动if(KEY_REC=0) while(KEY_REC = 0);record_flag=1;play_flag=0; if(KEY_PLAY=0) /KEY_REC键按下delayms(10);/按键防抖动if(KEY_PLAY=0) while(KEY_PLAY = 0);rec

36、ord_flag=0;play_flag=1; if(KEY_STOP=0) /STOP是停止复位功能delayms(10);if(KEY_STOP=0)while(KEY_STOP = 0); stopmode(); /停止powerdown(); /掉电m=0;n=0;if(KEY1=0) /STOP是停止复位功能delayms(10);if(KEY1=0)while(KEY1 = 0); key_num=1;if(KEY2=0) /STOP是停止复位功能delayms(10);if(KEY2=0)while(KEY2 = 0); key_num=2;if(KEY3=0) /STOP是停止

37、复位功能delayms(10);if(KEY3=0)while(KEY3 = 0); key_num=3;if(KEY4=0) /STOP是停止复位功能delayms(10);if(KEY4=0)while(KEY4= 0); key_num=4;if(KEY5=0) /STOP是停止复位功能delayms(10);if(KEY5=0)while(KEY5 = 0); key_num=5;if(KEY6=0) /STOP是停止复位功能delayms(10);if(KEY6=0)while(KEY6= 0); key_num=6;if(KEY7=0) /STOP是停止复位功能delayms(10

38、);if(KEY7=0)while(KEY7= 0); key_num=7;if(KEY8=0) /STOP是停止复位功能delayms(10);if(KEY8=0)while(KEY8= 0); key_num=8;return key_num;void main(void) int p; delay_lcd(400); LCD_Init(); p=LCD_PutStr(Wele use this,-1); stopmode(); /停止powerdown(); /掉电while(1)key_num=Key_Scan();if(play_flag=1)LCD_PutStr( play ,18

39、);switch(key_num)case 1:LCD_PutNum(1,26);play(address0);break;case 2:LCD_PutNum(2,26);play(address1);break;case 3:LCD_PutNum(3,26);play(address2);break;case 4:LCD_PutNum(4,26);play(address3);break;case 5:LCD_PutNum(5,26);play(address4);break;case 6:LCD_PutNum(6,26);play(address5);break;case 7:LCD_Pu

40、tNum(7,26);play(address6);break;case 8:LCD_PutNum(8,26);play(address7);break;default:break;if(record_flag=1)LCD_PutStr(record ,18);switch(key_num)case 1:LCD_PutNum(1,26);record(address0);break;case 2:LCD_PutNum(2,26);record(address1);break;case 3:LCD_PutNum(3,26);record(address2);break;case 4:LCD_Pu

41、tNum(4,26);record(address3);break;case 5:LCD_PutNum(5,26);record(address4);break;case 6:LCD_PutNum(6,26);record(address5);break;case 7:LCD_PutNum(7,26);record(address6);break;case 8:LCD_PutNum(8,26);record(address7);break;default:break; /ISD4004语音芯片C51驱动程序源代码*include reg51.h*include intrins.h*includ

42、e ISD4004.H*define uchar unsigned char*define uint unsigned int/*ISD4004驱动程序*void delay(unsigned int i) /延时程序while(i-);*/void delayms(unsigned int time) /延迟n毫秒 unsigned int i,j;for(i=time;i0;i-)for(j=125;j0;j-);void stopmode() /停止unsigned char m,i,j;_cs=1;_sclk=0;_cs=0;m=0*30;for(i=0;i8;i+)m=_cror_(

43、m,1);j=m1;_mosi=CY;_sclk=0;_sclk=1;_cs=1;void powerdown() /下电unsigned char m,i,j;_cs=1;_sclk=0;_cs=0;m=0*10;for(i=0;i8;i+)m=_cror_(m,1);j=m1;_mosi=CY;_sclk=0;_sclk=1;_cs=1;void powerup() unsigned char m,i,j;_cs=1;_sclk=0;_cs=0;m=0*20;for(i=0;i8;i+)m=_cror_(m,1);j=m1;_mosi=CY;_sclk=0;_sclk=1;_cs=1;vo

44、id record4004(unsigned int address) unsigned char i,m,j;unsigned int datasoute=0;powerup();delayms(50);powerup();delayms(50);delayms(50);_cs=1;_sclk=0;m=0*a0;_cs=0;for(i=0;i16;i+)address=_iror_(address,1);datasoute=address1;_mosi=CY;_sclk=0;_sclk=1;for(i=0;i8;i+)m=_cror_(m,1);j=m1;_mosi=CY;_sclk=0;_

45、sclk=1;_cs=1;/*从此地址+1继续录音,能充分利用储存空间/缺点是不按你地址来录了,所以此时我把它屏蔽_sclk=0;m=0*b0;_cs=0;for(i=0;i8;i+)m=_cror_(m,1);j=m1;_mosi=CY;_sclk=0;_sclk=1;_cs=1;datasoute=0; */*while(_int=1) /存储地址换行标志if(_rac) delay(20000); datasoute+; /记录本次录音所占的行数(也就是本次录音有多大)/ 在这里应该加上自己的程序,就是录音退出程序*/while end;void play4004(unsigned in

46、t address) /放音程序unsigned char i,m,j;unsigned int datasoute;uchar play_count=0;uchar sec_count=0;powerup();_cs=1;_sclk=0;_cs=0;m=0*e0;for(i=0;i16;i+)address=_iror_(address,1);datasoute=address1;_sclk=0;_mosi=CY;_sclk=1;for(i=0;i8;i+)m=_cror_(m,1);j=m1;_sclk=0;_mosi=CY;_sclk=1;_cs=1;/*从下个地址继续放音/加此就不能从

47、指定地址放音了,所以此次我把它屏蔽_sclk=0;m=0*f0;_cs=0;for(i=0;i8;i+)m=_cror_(m,1);j=m1; _sclk=0; _mosi=CY; _sclk=1;_cs=1;*/*include *include LCD1602.H*include /delay_lcd(延迟毫秒数) void delay_lcd(unsigned int ms) unsigned int Temp; while(ms-)Temp=82;while(Temp-); /写数据 void WriteDataLCD(unsigned char WDLCD) ReadStatusLC

48、D(); /检测忙 LCD_Data = WDLCD; LCD_RS = 1; LCD_RW = 0; LCD_E = 0; /若晶振速度太高可以在这后加小的延时 LCD_E = 0; /延时 LCD_E = 1; /写指令 void WritemandLCD(unsigned char WCLCD,BuysC) /BuysC为0时忽略忙检测 if (BuysC) ReadStatusLCD(); /根据需要检测忙 LCD_Data = WCLCD; LCD_RS = 0; LCD_RW = 0; LCD_E = 0; LCD_E = 0; LCD_E = 1; /读状态 unsigned c

49、har ReadStatusLCD(void) LCD_Data = 0*FF; LCD_RS = 0; LCD_RW = 1; LCD_E = 0; LCD_E = 0; LCD_E = 1; _nop_(); _nop_(); _nop_(); _nop_(); while (LCD_Data & 0*80); /检测忙信号 return(LCD_Data); /按指定位置显示一个字符 void DisplayOneChar(unsigned char *, unsigned char Y, unsigned char DData) if(Y2) Y &= 0*1; * &= 0*F; /

50、限制*不能大于15,Y不能大于1 if (Y) * |= 0*40; /当要显示第二行时地址码+0*40; * |= 0*80; /算出指令码 WritemandLCD(*, 0); /这里不检测忙信号,发送地址码 WriteDataLCD(DData); /LCD初始化 void LCD_Init(void) LCD_Data = 0; WritemandLCD(0*38,0); /三次显示模式设置,不检测忙信号 delay_lcd(5);WritemandLCD(0*38,0); delay_lcd(5); WritemandLCD(0*38,0); delay_lcd(5); Write

51、mandLCD(0*38,1); /显示模式设置,开始要求每次检测忙信号 WritemandLCD(0*08,1); /关闭显示 WritemandLCD(0*01,1); /显示清屏 WritemandLCD(0*06,1); / 显示光标移动设置 WritemandLCD(0*0C,1); / 显示开及光标设置 delay_lcd(200); int LCD_PutStr(unsigned char *DData,int pos) unsigned char i; if(pos=-1) WritemandLCD(0*01,1); pos=0; while(*DData)!=0) switc

52、h(*DData) case n: /如果是n,则换行 if(pos17) for(i=pos;i16;i+)DisplayOneChar(i%16, i/16, ); pos=16; else for(i=pos;i0)pos-; DisplayOneChar(pos%16, pos/16, ); break; default: if(*DData)0*20)*DData= ; DisplayOneChar(pos%16, pos/16, *DData); pos+; break; DData+; return(pos); int LCD_PutNum(long num,int pos) l

53、ong tmp=0; unsigned char numbits=0; if(pos=-1) WritemandLCD(0*01,1); pos=0; if(num=0) DisplayOneChar(pos%16, pos/16, 0); pos+; else if(num0) DisplayOneChar(pos%16, pos/16, -); num*=(-1); pos+; while(num) tmp=tmp*10+(num%10); num=num/10; numbits+; while(tmp) DisplayOneChar(pos%16, pos/16, (tmp%10)+48); tmp=tmp/10; pos+; numbits-; while(numbits-) DisplayOneChar(pos%16, pos/16, 0); pos+; return(pos); . z.

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!