单片机录音笔的设计与实现 下载本文

目 录

第1章 录音笔设计方案与论证 .................................................................... 1

1.1 引言 .................................................................................................................. 1 1.2录音笔设计方案的提出 ................................................................................... 1 1.3 录音笔设计方案分析论证 .............................................................................. 2 1.4 录音笔设计方案的确定 .................................................................................. 3

第2章 凌阳单片机开发环境介绍 ............................................................... 4

2.1 系统硬件资源 .................................................................................................. 4 2.1.1 SPCE061A功能及其特点 ......................................................................... 4 2.1.2 应用领域 .................................................................................................. 5 2.2 软件开发环境IDE ........................................................................................... 5 2.2.1 μ'nSP? IDE 窗口 .................................................................................. 5 2.2.2 工程的操作 .............................................................................................. 8

第3章 硬件设计 ................................................................................................ 10

3.1 系统总体方案介绍 ........................................................................................ 10 3.2 系统电源电路 ................................................................................................ 10 3.3 SPCE061A最小系统设计 ............................................................................... 11 3.4 音频电路 ........................................................................................................ 12 3.4.1 音频输入电路 ........................................................................................ 13 3.4.2 A/D转换接口 ......................................................................................... 15 3.4.3 D/A转换模块 ......................................................................................... 16 3.4.4 音频输出电路 ........................................................................................ 17 3.5 SPR4096存储电路 ......................................................................................... 18 3.5.1 串行设备输入输出口(SIO) .................................................................. 19 3.6 按键控制电路 ................................................................................................ 20 3.7 液晶显示电路 ................................................................................................ 20 3.8 通用串行通信接口UART模块 ...................................................................... 21

第4章 软件设计 ................................................................................................ 22

4.1 软件设计流程图 ............................................................................................ 23 4.2 分模块软件设计 ............................................................................................ 24

4.2.1 主程序模块 ............................................................................................ 25 4.2.2 语音信号的采集 .................................................................................... 25 4.2.3 键盘扫描模块 ........................................................................................ 27 4.2.4 语音信号的存储 .................................................................................... 29 4.2.5 LVD低电压检测 ..................................................................................... 31 4.2.6 UART模块 ............................................................................................... 31 4.2.7 看门狗计数器(WatchDog) ................................................................ 33 4.2.8 系统调试与总结 .................................................................................... 33 结论 ........................................................................................................................... 35 参考文献 ................................................................................................................. 36 致谢 ........................................................................................................................... 37 附录 ........................................................................................................................... 38

第1章 录音笔设计方案与论证

1.1 引言

随着视听家电产品的不断丰富,已经有越来越多微小型化的产品走入了人们的日常生活,他们最突出的优点是体积小巧、非常薄,而且重量很轻,给人们带来方便,并增添了无穷乐趣。作为一种简单方便地获取和记录数字化声音文件的工具,数码录音笔从2000年开始风靡市场,成为学生、记者和商务人士购置录音设备的首选。不仅在校园里取代了复读机,也成为时间紧张的在职进修人员的掌上新宠。带FM 功能的数码录音笔,还可以便利地收听调频广播外语教学节目。

数码录音笔,实际上是一种采用数码录音技术的录制设备,通过对声音进行采集、压缩、存储到闪存(Flash Memory)进行记录,无需使用额外的录音磁带、话筒等设备,音质清晰逼真,即使反复播放其音质也毫无损失。

在设计中将说明怎样利用凌阳16位单片机SPCE061A来实现一个录音笔系统。SPCE061A该款单片机资源丰富,有强大的数字语音处理功能可应用与语音播放和语音识别领域,内置有2路DA转换,8路AD转换及在线仿真等丰富的功能,这些都为实现数码录音和播放提供了良好的方便条件。

1.2录音笔设计方案的提出

设计要求录音笔实现录音、播放、暂停、循环播放、重复播放、选择上一段、选择下一段以及与PC机进行数据传输的功能。可以看出本次设计的系统的主要部分应该是括录放音部分再附加上其他的功能部分。因此我们重点对录放音部分实现的方案做了探讨,方案比较的多,各有其优缺点。现具体分析如下:

方案一:采用处理器集成型可重构系统PICEX实现数码录音笔的核心处理部分,对每一个管理模块、功能实现模块都构建一个可重构模块。在系统完成各种任务时,可重构模块的运行是完全独立于内核的,在编程中使各模块处于并行运行状态。在录音状态时各部件采用流水线的方法,即每个部件的输入数据都取自其来源部件给出的上一个值,各部件几乎同时开始工作,使系统处于在线程级并运行的状态。

方案二:基于单片机、数字信号处理器DSP和FLASH存储器的数码录放音系统。在录音时,语音信号经过处理后送到A/D转换器,转换成数字信号,在把这些语音数据送到高速数字信号处理器(DSP)进行压缩,压缩后的语音数据与日期、时间一起存储到FLASH存储器中;回放时,从FLASH存储器中读取语音数据送到DSP解压,解压

后的数据经过D/A转换,还原成语音信号,最后经功放放大后从喇叭输出。

方案三:用ISP实现对ISD25120语音芯片的录放音控制。以ISP技术为手段,使用系统编程器件M4-32/32实现了对单片ISD25120语音芯片的录、放音控制。利用VantisPro设计软件系统,经过编译后再输入仿真文件,仿真通过后,对系统进行引脚锁定、熔丝生成、下载编程(IDCD软件下载编程)。[2]

方案四:基于凌阳16位单片机的简单开发系统SPCE061A精简开发板,利用SPCE061A的可编程音频处理功能,通过串行输入输出端口SIO与同样具有串行接口的FLASH(SPR4096)进行数据通讯来开发数码录音及播放系统。通过按键控制系统的录音、停止、放音等操作。

1.3 录音笔设计方案分析论证

方案一:虽然数据串行化输出、A/D和D/A器件的操作可在内核上实现,当其他可重构模块在工作时内核处于等待状态,则提高了系统的并行性,接省了系统资源。但是方案中使用Samsung公司的K9K1208U0A型Flash内存作为存储媒质,这型号内存为减少连线和封装大小需要有特殊的控制时序和逻辑。因此需要为Flash内存控制专门增加一个可重构部件。对滤波、压缩、解压、信道编码这些需要大量运算或长时间操作的过程也必须对这四项任务各设计一个可重构部件。这种方案对几个重要过程都需要单独设计一个可重构部件,设计烦琐工作量大,可重构部件多。同时,虽然元件级可重构系统在现有的FPGA上是可以实现的,但是由于现有FPGA体系结构上的种种限制,诸如最小配置单位过大配置结构复杂等,使这种系统在很多情况下执行效率反而不及传统的系统结构,大大减少了这类系统的应用范围。综上,故我们不采取这种方案。

方案二:人们在语音处理的研究中,已经研制出了很多语音编码算法,而有些编码算法已经被直接固化到DSP上,形成专用的基于DSP的语音处理芯片。但是在我们未选择DSP芯片主要是基于以下几个因素:(1)运算速度。本系统中,对运算速度的要求,主要是要满足每一个A/D变换后的数据都能及时地存入存储器,而通用单片机的处理能力已经可以满足需要。(2)运算精度。本数字录音系统没有复杂的数学计算,所以没有对运算精度的要求。(3)片内硬件资源。由于系统要求能进行录放音,所以A/D和D/A的功能是必需的,对DSP芯片,若外接A/D或D/A元件,增加了复杂度,也提高了成本。(4)功耗。DSP芯片实现的功能较多,所以它的功耗相对较高。因此我不采取这种方案。

方案三:ISP技术是在一个系统可编程器件上实现对语音芯片的控制。这种控制直接通过ISP器件的硬件电路实现,省去了软件接口程序,使用起来方便快捷。但是

ISD芯片的控制录放音的两种方式(引脚的边沿或电平触发控制和微控制器串行通信接口控制)这两种方式都不能用类似文件的方式进行控制,操作不方便,虽然它的存储器采用的是非易失数据的EEPROM但容量较小。因此在设计方案的选取中不选用这种方案。

1.4 录音笔设计方案的确定

我最后决定采用SPCE061A单片机来实现我的设计。SPCE061A是凌阳科技研发生产的一款高性价比十六位单片机,把各功能部件模块化地集成在一个芯片里,内部采用总线结构,减少了各功能部件之间的连线,提高了可靠性和抗干扰能力。片内带有高寻址能力的ROM、静态RAM和多功能的I/O口。芯片工作电压范围大,能在低电压供电时正常工作,且能用电池供电。其指令系统为其应用增添了DSP功能但是又比专用的DSP芯片廉价。对于我的设计来说SPCE061A可以非常方便灵活的实现语音的录放功能,该芯片拥有8路10位精度的ADC,其中一路为音频转换通道,并且内置有自动增益AGC电路。这为实现语音录入提供了方便的硬件条件。两路10精度的DAC,只需要外接功放(SPY0030A)即可完成语音的播放。另外凌阳十六位单片机具有易学易用、高效率的指令系统和集成开发环境。该开发环境支持标准C语言,可以实现C语言与凌阳汇编语言的互相调用,并且,提供了语音录放的库函数,只要了解库函数的使用,就会很容易完成语音录放,这些都为软件开发提供了方便的条件。同时还可根据设计要求在实现基本录放功能的基础上运用SPCE061A的多功能集成功能扩展录放系统的功能。比如,使用SPCE061A的通用异步串行接口UART来实现与PC机的通讯,或者使用其他的IO口来外挂USB器件实现与PC机的USB通讯;进行低电压检测;还可通过LCD显示字符、数字等图象,在录音笔设计系统中可用来显示按键功能等。这样可以制作更复杂的录、放音系统。

第2章 凌阳单片机开发环境介绍

2.1 系统硬件资源

2.1.1 SPCE061A功能及其特点

1)集成度高,易于扩展

凌阳16位单片机内部采用总线结构,把各功能部件模块化地集成在一个芯片里,有效地减少各功能部件之间的连线,提高了集成度,增强了芯片的可靠性和抗干扰能力。此单片机属于非总线型单片机,省去厂片外的地址、数据及控制并行总线,而外部封装引脚可明显减少,使芯片成本下降。它既可通过I/O端口与外设器件通信,也可采用串行扩展方式。目前,由于串行传输速度的不断提高,用串行口扩展外围器件,特别在SOC中,已得到了较多的应用。

凌阳16位单片机采用CMOS制造工艺,有较好的低功耗和功耗管理功能,它提供了软件激发的弱振方式、空闲方式和掉电方式三种低功耗工作方式,大大降低了芯片功耗。由于它工作电压范围大,可在低电压供电时正常工作,并可用电池供电,从而可大幅度地减少器件的功耗。低功耗是一切电子应用系统所追求的目标,特别是在野外作业、便携式仪器仪表的开发等方面具有特殊的意义。

2)较强的中断处理能力

凌阳16位单片机中断系统可支持三种类型的中断:异常中断、事件中断和软件中断。中断系统共有10个中断向量,可响应14个中断源的中断请求,由于对外界突发事件具有快速反应能力,使其适合用于实时控制领域。

3)高效的指令系统

凌阳16价单片机的指令系统以字为单位,从而格式紧凑、灵活,执行时间迅速,并提供了对高级语言和数字信号处理运算能力的良好支持,从而可有效缩短基于凌阳单片机的各种产品的研发周期。

同时,凌阳16位单片机片内还集成了大容量的ROM、静态RAM、全双工异步通信的串行接口、红外收发通信接口、A/D,D/A转换接口和多功能的I/O口。其指令系统提供的具有较高运算速度的16位×16位的乘法运算和内积运算指令。这就使凌阳16位单片机可方便地用于复杂的数字信号处理,却又比常用的DSP芯片便宜,因而具有较高的性能价格比。另外,在SPCE061及SPCE060单片机中还采用了F1ash ROM技术,有32K Flash ROM单元。F1ash ROM的使用使得基于SOC的单片机技术得到进

一步发展,极大地改变了单片机应用系统的结构模式、开发与测试手段以及运行条件。

2.1.2 应用领域

1) 学习Sunplus的16位SPCE061A单片机和各类外围器件,比如:串行Flash和SRAM器件SPR4096、RS232器件MAX3232、USB器件PDIUSBD12、LCD GPG12063YS以及语音录放、键盘显示等等。

2) 进行各类接口实验,设计接口转接器,如:USB-232转换器、232- USB转换器。

3) 完成基础实验以及毕业设计,也可作为产品设计的应用工具。

4) 通过CPU内部的ICE电路与IDE配合,可按单步、断点、连续等方式在线调试。

5) 实时操作系统的学习,凌阳专为SPCE061A单片机写了MINIOS,可以方便的学习实时操作系统,并提供强大的技术支持。

6) 进行语音数据压缩编码、解码以及存储的学习和开发。[8]

2.2 软件开发环境IDE

凌阳十六位单片机SPCE061A具有易学易用、高效率的指令系统和集成开发环境。该开发环境支持标准C语言,可以实现C语言与凌阳汇编语言的互相调用,并且,提供了语音录放的库函数,只要了解库函数的使用,就会很容易完成语音录放,这些都为软件开发提供了方便的条件:μ'nSP? IDE则是这个由凌阳科技提供的一个集成开发环境,它集程序的编辑、编译、链接、调试和仿真等功能为一体。具有友好的交互界面、下拉菜单、快捷键和快速访问命令列表等,使程序设计工作更加方便、高效。此外,它的软件仿真功能可以不连接仿真板,模拟硬件的部分功能来调试程序。本次设计中选用IDE184。

2.2.1 μ'nSP? IDE 窗口

工具界面:

μ'nSP?集成开发环境支持C和汇编混合编程,可以有效地利用这两种语言的优点进行在线编程,有利于更加充分地、直观地利用硬件资源。μ'nSP? IDE采用MFC MDI机制,因此,用户可以在主界面里同时打开多个窗口,如图2.1。

主界面包括三个主要窗口:工作区窗口(Workspace window)、编辑窗口(Edit window)和输出窗口(Output window)。只需在各窗口内单击鼠标左键即可把该窗口激活。此外,

在主界面上,还提供工具栏等一些方便用户操作的工具。

图2.1 IDE主界面

Workspace窗口:

在Workspace窗口内,用户可查看到当前工程所包括的全部文件。Workspace窗口由FileView和ResourceView两个视窗组成。单击FileView标签,用户可以方便浏览到工程内的各文件。FileView视窗用层次图排列出当前工程的所有文件的逻辑关系。Files文件夹包含了源程序、程序接口和说明硬件配置情况的文件。Resource文件夹包括了各种资源文件(rc)。Source Files文件夹用于保存源文件。Head Files文件夹用于保存头文件。External Dependencies文件夹用于保存对工程的一些标注信息。ResourceView视窗列出当前工程用到的所有资源。可以单击视窗内分支顶部旁边的+和-号展开和收缩层次图。(如图2.2)

Workspace窗口所体现的逻辑位置不是指文件在硬盘上的物理位置,而是指一种逻辑从属关系。用户可用拖曳的办法改变文件的逻辑位置。在Workspace窗口内,不同类型的文件有不同的图标表现。

图2.2 Workspace窗口

Output窗口:

Output窗口用于显示编译、调试和查找的结果。在窗口底部有几个视窗标签:Build、Debug和Find in Files等。用鼠标单击这些标签,可以激活相应的视窗。

Build:显示编译和链接过程里产生的信息,包括文件编辑过程里的错误和警告信息等。

Debug:显示程序调试过程里出现的信息。 Find in Files:显示在文件中查找字符的结果。

Edit 窗口:在Edit窗口里,文件的打开格式有两种:用户可用文本格式打开文件,也可以用二进制代码格式打开文件。如图2.3

图2.3 Output窗口

1)文件编辑器(图2.4)

文本编辑器可以用来打开汇编语言程序和C语言程序。

图2.4 文件编辑器

2)二进制代码编辑器(图2.5)

二进制代码编辑器让用户在Edit窗口里以十六进制数/ASCII字符的形式来编辑二进制代码的资源文件。

图2.5二进制代码编辑器

2.2.2 工程的操作

2.2.2.1 创建工程过程

1) 选择[File]→[New],打开New对话框如图2.6,选择Project标签; 2) 在File文本框内输入工程名称;

3) 在Location文本框内输入工程文件的路径; 4) 在Select Body Here区域内选择Probe;

5) 单击[OK],创建工程。

图2.6 创建工程对话窗口

2.2.2.2 开发操作过程

1) 从[开始]菜单内启动工具;

2) 选择[File]→[Open Project],在‘打开’对话框内选择所要打开的工程; 3) 窗口(工作区窗口)显示在工具的左半边,在这个窗口内,用户可以看到当前工程所包含的所有文件;

4) 选择[Build]→[Rebuild All],进行源文件的编译和链接。 编译过程里的语法错误显示在Output窗口内;

5) 选择[Build]→[Start Debug]→[Download],把程序加载到RAM,然后,用户可以用Debug菜单内所提供的调试命令来优化和运行程序。选择6、[Build]→[Start Debug]→[Go],在调试器内运行程序。

第3章 硬件设计

根据系统设计的要求和凌阳十六位单片机(SPCE061A)所包括的功能,我可以利用其所具有的特性完成设计所需要达到的各项功能要求。

3.1 系统总体方案介绍

系统结构框图如图3.1:

图3.1 系统结构框图

按键 MIC SPEAKER SPCE061A LCD 凌阳十六位单片机 SPR4096 UART 因此在设计中需要使系统具有如下模块:

1) 一路0-3.3V可调模拟电压,可方便地完成AD的数据采集。 2) 采用1×8键盘使各功能通过按键控制。

3) SIO接口扩展存储芯片SPR4096,扩展4M Bits Flash的扩展存储空间存储所录语音数据。

4) MIC输入电路,配合SPCE061A内置的AGC和OPI电路,获得语音数据。 5) 两路音频输出电路,采用凌阳功放芯片SPY0030A,通过它完成语音的播放。 6) 利用带背光的128×64点阵液晶LCD显示出个按键功能。

7) 使用SPCE061A的通用异步串行接口UART来实现与PC机的通讯。[5] 下面对各功能模块进行具体描述。

3.2 系统电源电路

系统采用的是开关电源,该电源提供5V电压,用于SPCE061A端口电压和用户实验电路供电。实验箱的供电电源系统采用多种输入,用户有多种选择方式:

(1)220V交流电压供电:用户可以选择220V交流电压供电,系统已将其经过变压、稳压处理成5V,再经过一个三端稳压器提供3.3V,供系统工作。

(2)DC5V供电:用户可以直接提供直流5V电压和3.3V电压为实验箱进行供电。如图3.2所示为电源系统图,包括电源开关,低电压检测供电端子和指示灯,5V供电端子和电源指示灯。

我所设计的录音笔系统中硬件设备采用由220V交流电压供电。由于在系统中要运用到LCD和SPR4096,他们的接口逻辑电压为3.3V,并且我选用了SPR4096内部存储空间较大的4M Bit FLASH存储语音数据,而电源输入端VDDI是给内部FLASH和控制逻辑供电的,VDDI:2.25V-2.75V。因此系统电压选择了采用220V交流电压供电。

图3.2 电源电路

3.3 SPCE061A最小系统设计

前面已经提到我所设计的录音笔系统的核心采用SPCE061A。SPCE061A内置的7

路10bitAD转换器和2路音频输出电路使得设计电路简单了很多。SPCE061A最小系统如图3.3。

图3.3 SPCE061A最小系统

芯片提供两个16位通用的并行I/O口:IOA0-IOA15,IOB0-IOB15。这两个口的每一位都可以通过编程单独定义为输入或输出口。其中A口的IOA0-IOA7用作输入口时具有触键唤醒功能,可以应用于低功耗的场合。

鉴于所要求功能,我将IOA0-IOA7与1×8键盘连接,A0-A7做输入口。SPCE061A的并行I/O口可以通过编程设置为上拉输入、下拉输入、悬浮输入或同相输出、反相输出的状态。要求按键执行程序所定义功能因此设置为下拉输入。

3.4 音频电路

音频电路由音频输入电路以及音频输出电路两部分组成。

3.4.1 音频输入电路

音频输入电路包括MIC录音输入和AGC电路。

人的声音频率在300Hz-3400Hz范围之内,因此所设计的录音笔只需要记录这样一个范围的声音信号即可。

在这里把要记录的语音信号最高频率定为4KHz,根据公式:f采样=2f低通规定系统的采样频率为8KHz。当录入的语音信号有高于4KHz的部分时,则把高于4KHz频率的信号认为是噪声。噪声是不需要记录的,所以应该把高于4KHz的声音频率排除在记录范围外,因此需在ADC电路前加一个截止频率为4KHz的前置低通滤波器用来滤除噪声。前置低通滤波器电路如图3.4,滤波器的频谱图如图3.5。[9]

MIC

图3.4 MIC输入驱动电路与前置低通滤波器图

jwH(e )fφf 图3.5 前置低通滤波器频谱图

SPCE061A内置的AGC电路,它的作用是当输入信号较强时使放大器增益自动降低;当信号较弱时,又使其增益。因此,从MIC输入的音频信号经过SPCE061A内置的AGC电路将语音信号的放大值控制在一定范围内,便可进行AD转换。

输入信号有两个通道:一个由LINE_In通道输入;另一个由MIC_In通道输入。MIC_In一般用于麦克风通道插入,专门用于对语音信号进行采样。语音信号经MIC转换成电信号,由隔直电容隔掉直流成分,然后输入至SPCE061A内部前置放大器。在MIC_In前端有两级OP放大器,因此对信号的放大有两种选择,一是在关闭SPCE061A内部自动增益控制电路AGC时,MIC_In前端的OP放大器使信号放大。二是启用AGC自动调整增益的值,以防止信号饱和。AGC能随时跟踪、监视前置放大器输出的音频信号电平,当输入信号增大时,AGC电路自动减小放大器的增益;当输入信号减小时,AGC电路自动增大放大器的增益,以便使进入A/D的信号保持在最佳电平,又可使削波减至最小。当OPAMP2的输出>0.9AVdd时,AGC自动降低OPAMP1的增益,以防止被放大的信号饱和。因此为了能更好的控制系统所获取的信号选择启用AGC。其输入接口电路如图3.6。

图3.6 ADC输入接口的结构

3.4.2 A/D转换接口

模/数转换器ADC是外界与计算机进行信息传递的通道。它是一种信号转换接口,可以把模拟量信号转换成数字量信号以便输入给计算机对其进行各种处理。芯片采用逐次逼近式原理实现A/D转换。ADC的结构及工作原理是:由10位数/模转换器DAC0、10位缓存器DAR0、逐次逼近寄存器SAR以及比较器COMP组成逐次逼近式的ADC,如图3.7中虚线框内所示。图中的ADC有两种工作方式:手动方式和自动方式。

在ADC自动方式被启用后,会产生出一个启动信号,此时,DAC0的电压模拟量输出值与外部的电压模拟量输入值进行比较,.逐次逼近式控制首先将SAR中数据的最高有效位试设为'1',而其它位则全设为'0',即10 0000 0000B.这时,DAC0输出电压VDAC0(1/2满量程)就会与输入电压VIN进行比较.如果VIN>VDAC0,则保持原先设置为'1'的位(最高有效位)仍为'1';否则,该位会被清'0'.接着,逐次逼近式控制又将下一位试设为'1',其余低位依旧设为'0',即110000 0000B,VDAC0与Vin进行比较的结果若Vin>VDAC0,则仍保持原先设置位的值,否则便清'0'该位.这个逐次逼近的过程一直会延续到10位中的所有位都被测试之后, A/D转换的结果保存在SAR内.

图3.7 逐次逼近式的ADC结构

ADC在手动方式下取消了自动方式的逐次逼近寄存器SAR的功能,取而代之的是内部比较器COMP和缓存器DAR0,以模拟SAR的作用。换言之,手动方式是指须用软件程序来控制模拟信号的输入采样或保持,通过写入A/D数据单元来控制比较器基准电压值VDAC0,以及通过读比较器的比较结果来推测模拟输入电压值VIN。当外部2V的电压模拟信号输入到ADC的输入端上,可试着写入A/D数据单元一个数字量值1000000000B,它实际对应于1.8V电压模拟量。由于2V>1.8 V,故COMP第一次比较输出的结果为?1 ?,则ADC的转换结果暂为1000000000B。接着写入A/D数据单元下一个数字量值。 [7] 在对系统硬件设计中,我根据设计要求将ADC设计为手动方式。

3.4.3 D/A转换模块

单片机内部D/A转换电路的使用与其它内部接口的使用相同,都是可编程控制的接口,通过程序设置其工作方式、工作状态等。SPCE061A单片机内部有DAC1和DAC2两路10位的DAC转换器,可以形成双通道的音频输出,也可以作为其它的模拟输出信号。转换输出是以模拟电流信号的方式分别通过AUD1和AUD2管脚输出。DAC与SPCE061A连接图如图3.8。

DAC1_PIN21 DAC2_PIN22 SPCE061A D A C SPY0030 图3.8 DAC与SPCE061A连接图

3.4.4 音频输出电路

音频输出电路采用凌阳功放芯片SPY0030,SPY0030音频输出大于700mw,而供电电压仅需2.4V。电路中SPY0030的放大倍数被固定为20倍,音量的大小可以通过电位器调整。喇叭直流阻抗8欧,左右两个通道音量分立调节并备有两个外部音频信号放大输入端。录入后的语音信号经MIC转换成电信号,由隔直电容隔掉直流成分,然后输入至SPCE061A内部前置放大器,经过2路10位精度的DA转换后,通过功放SPY0030A即可完成语音的播放。音频输出扬声器驱动电路图,如图3.9。[7]

图3.9 音频输出扬声器驱动电路

SPCE061A的音频输出有两种方式,一种是音调输出方式(Tone Mode),另一种则为语音输出方式(Speech Mode),如图3.10所示。二者的区别在于其输出的控制机理不同。前者是通过控制Timer溢出所产生的不同频率来决定声波振动次数的多寡,从而决定发出的声音音调的高低,譬如好听的乐音;后者则是用与声音(不论是音乐还是语音)数据采样率相同的速率将声音数据通过数/模转换(D/A)通道还原成音频电压或电流输出,其中声音数据采样率可决定声音音质的好坏,并决定了声音数据所需占据的存储空间。在本系统设计中我采用语音输出方式,数据采样率采用相同的8KHz。音频输出波形参见图3.11。[12]

DA C

Speech Mode 音频输出

Tone Mode Timer方波输出

乘法器

图3.10 音频输出方式硬件实现图 v

t

3.5 SPR4096存储电路

SPR4096为自带SIO接口的FLASH/SRAM存储芯片,SIO是一种串行输入输出接口,它可以与其它设备进行数据通讯,在SPCE061A内通过IOB0和IOB1端口复用实现与设备进行串行数据交换,SPR4096与SPCE061的硬件连接如图3.12,SPR4096的SCK接SPCE061A的IOB0,SDA接SPCE061A的IOB1。SPR4096与SPCE061A之间的通讯采用SIO协议来实现的。使整个系统扩展了4M BitFLASH/32K BitSRAM,这同语音录放相配合会产生很好的效果。

图3.12 SPR4096和SPCE061A的连接图

在所设计的系统中SPR4096串行接口运行时的工作频率可达5MHz。SPR4096有两个电源输入端VDDI和VDDQ。VDDI是给内部FLASH和控制逻辑供电的;VDDQ是专门为I/O供电的。供电电压为VDDQ:2.25V-3.6V,VDDI:2.25V-2.75V。SPR4096电路与SPCE061的IO接口为:IOB0_SCK,IOB1_SDA,IOB2_CS_FLASH,其中IOB2_CS_FLASH口用于控制SPR4096内FLASH与SRAM的选择,当IOB2_CS_FLASH为低电平的时候选择FLASH,当为高电平的时候用于选择SRAM。

如图3.13为FLASH部分电路原理图,SDA为数据传输位、SCK为同步时钟输入位。

IOB_SDAJDH1NC VSSCF3 NCCF4 SCKVSSQ CF7 SDAVSSREST_N_4096VDDQVDD1VSSIOB_SDAIOB0_SCKVSS

图3.13 FLASH部分电路原理图

3.5.1 串行设备输入输出口(SIO)

SIO的电路连接原理图如3.14:

IOB0IOB1IOB21 23 45 6SCKSDASVSS SCKVSSQ SDAVDDCF0 SPCE061ACF1CF2CF7VDD1SCKSDA

图3.14 SIO电路原理图

SIO 的读写操作时序如图3.15:

写操作时序SCKSDASDA读操作时序SCKSDASDAAx+1AxAx-1A0Dx+1DxD0Dx+1DxD0STOPAx+1AxAx-1A0Dx+1DxD0Dx+1DxD0STOP

图3.15 SIO读写操作时序

串行输出入端口SIO提供了一个1位的串行接口,用于与其它设备进行数据通讯。在SPCE061A内通过IOB0和IOB1这2个口来实现与设备进行串行交换数据的功能。其中,IOB0用来作为时钟口(SCK),IOB1则用来作为数据端口(SDA),用于串行数据的接收或发送。SIO传输速率最快可设为CPUCLK/4,默认值为CPUCLK/16。SPCE061A的SIO速率最快可达12288KHz。SIO可根据外设的差别来选择不同的寻址模式,有8/16/24位三种寻址模式可选择。

3.6 按键控制电路

1×8键盘的8列分别定义为COL1、COL2、COL3、COL4、COL5、COL6、COL7、COL8,行定义为ROW。在系统设计中将IOA0-IOA7分别与COL1-COL8连接,IOA8与ROW连接。用户可自行选择ROW接至DGND或VDDIO。设置相应的控制口为下拉输入,如果某个按键按下,表示该按键对应的输出端变为高,便可检测出是哪个按键被按下。设计所设置的按键功能如表3.16。

1键 录音 2键 停止 3键 放音 4键 5键 6键 7键 8键 播放上一段 播放下一段 删除全部 单首循环 低电压检测 表3.16 按键功能

3.7 液晶显示电路

我在设计中所选用的LCD液晶模组是128×64的点阵LCD,SPLC501是凌阳的LCD驱动芯片,采用最新的COG技术使驱动和液晶合二为一,这使得外围电路非常简单,编程同样也很简单。在系统设计要求的基础上我加入LCD模组完成所要求的显示实验,使得在系统运行按键时LCD会有相应的显示,可以读出相关的信息。LCD与SPCE061A

的连接图,如图3.18所示。在LCD旁边会有一个HEADER16×2芯片,如果将其与LCD短接,则为默认I/O接法,我们还可以用排线自选I/O进行连接,芯片的各个排针的具体含义请参见表3.17。LCD与IO口的连接方式是:DB0-DB7接到IOA8-IOA15;CS具体连接方式视实际情况而定。若端口复用,则CS可连接至IOB9,若无需端口复用,CS可简化连接至DGND;RESET接到系统的RESET,A0接到IOB4,R/W接到IOB5,EP接到IOB6,这是默认连接方式,也可以通过排线根据需要进行连接。在设计中我用A0-A7连接了1×8键盘,因此需用端口复用CS连接至B9。

表3.17 HEADER16×2芯片针脚含义

CS R/W EP I I I 片选(低有效) 读/写信号 全能端(低有效) DB0-DB7 RESET A0 I/O I I 双向数据口 复位(低有效) 数据/使命字控制位 引脚符号 类型 说明 B4B6 SPCE061AB5 B9 A8-A15SWITCHGNDCS D0-D7SWITCHA0 L C D C86EP SPG12063YS2R/WV3GND

图3.18 LCD与SPCE061A的连接图

3.8 通用串行通信接口UART模块

为了能使所设计的系统能与PC机进行通讯,我选择了UART模块来实现这一功能。UART模块为系统提供了一个全双工标准接口,用于完成SPCE061A与外设之间的串行通讯。UART的接收信号Rx发送信号Tx分别是芯片的并行I/ O口IOB7和IOB10共用,属于B口的特殊功能。借助于IOB口的特殊功能和UART IRQ中断,可以同时完成UART接口的接收发送数据的过程。此外,UART还可以通过缓冲来接收数据。也就是说,它可以在寄存器数据被读取之前就开始接收新的数据。但是,如果新接收的数据被送进寄存器之前,寄存器内的旧数据还未被读走,就会发生数据遗失。

UART的硬件电路中需用一个串口线将SPCE061A在线调试器的232接口与PC机端的232接口连接起来,如图3.19。在设计中需要SPCE061A通过UART接口与PC进行通讯,因此需要对拨码开关S19进行设置,需要将Rx、Tx都拨到高端才能正常通讯(Rx:PC接收数据,Tx:PC发送数据)。扩展RS232接口可直接与计算机进行通信,或者进行单片机之间的双机通信。

SPCE061A B10 B7 U A R T TX MAX3232 CPERX 图3.19 SPCE061A与串口通信原理图

凌阳的SPCE061A的波特率=Fosc/2/Scale,其中Fosc是系统时钟频率,Scale为存储单元中的10进制的整数,所以系统时钟频率越高,传输的波特率越高。常用的UART的传输速率在115200B/s,而SPCE061A的系统时钟频率最高可以到40.96MHz,使其传输速率已超过常用的传输速率。 UART 波特率的计算公式如下:

当Fosc=49.152MHz,40.960MHz或32.768MHz

波特率=(Fosc/4 )/Scale (3.8-1) 当Fosc=24.576MHz或20.480MHz

波特率=(Fosc/2)/Scale (3.8-2) 由此可得出Scale的值(Scale为7024H单元和7025H单元组成的十进制整数)。

第4章 软件设计

4.1 软件设计流程图

在软件设计上,由于语音资源存放在外扩存储器SPR4096上,只能采用手动的方式播放语音。在主函数中首先初始化SIO,这样可以获得存储在SPR4096上的语音资源的起始地址与结束地址,这样便于语音控制。另外,需要对图片的显示,在播放语音的同时需要刷新图片,这样采用在中断中填充语音队列的方法来实现。根据设计要求写出了如下的系统软件流程图,如图4.1:

图4.1 系统软件流程图

录放音部分流程图如图4.2:

图4.2 录放音流程图

4.2 分模块软件设计

录放音的编解码是靠调用库函数完成,不需要设计硬件电路。凌阳公司提供了丰富的库函数,只要了解库函数的使用,就能轻松完成语音录放。本系统采用的是凌阳公司提供的音频格式SACM_A2000,它的压缩编码率是16Kbit/s,因此可以计算出1Mbit的存储器可以存放播放1M/16K = 64秒的语音数据。

本系统底层驱动程序包括IO口初始化、LCD初始化、SPR4096的读写、擦除、按键处理等使用的是汇编语言编写的。上层程序包括语音的录放采用C语言编写。程序以函数的形式封装对SPR4096芯片的操作,上层程序可以轻松调用这些函数,实现对SPR4096读写、擦除操作。这些主要源于凌阳十六位单片机具有易学易用的效率较高的一套指令系统和集成开发环境。在此环境中,支持标准C语言,可以实现C语言与凌阳汇编语言的互相调用。

下面根据所分具体功能模块以及它们之间的相互调用关系进行程序设计。[5]

4.2.1 主程序模块

主程序模块结构如图4.1。此主程序应与SPCE061A单片机外加的录/放功能键接口相配合,不断的执行键扫描、键译码及功能键设定的动作、清看门狗计数器等循环程序。其中数据的定时采集处理或输出,即声音的录制与播放,则在中断程序中靠调用IDE中的源程序模块来自动完成的。根据主程序模块我们可以进行主程序代码编辑。根据流程图所写具体程序见附录1。

4.2.2 语音信号的采集

在软件设计中,系统语音信号的采集是通过设置中断来实现的。中断的引发一般是有片内定时器、计数器定时产生。在中断服务程序中定时的从A/D口获取声音数据,根据语音模块类型进行压缩编码并储存;或者定时取出声音数据,进行编码后向音频输出端播放。我采用在SPCE系列芯片中常采用的FIQ和IRQ中断源,中断服务流程图如图4.3。FIQ中断服务程序程序可用于各种压缩/解压算法模块。根据流程图所写具体程序见附录2。

中断入口清中断标志位关中断现场恢复现场保护开中断中断源判断中断返回进入相应中断处理 图4.3 中断服务流程图

部分程序如下:

//======================================================= // 函数名称:FIQ() // 功能描述:DVR服务 // 语法格式:void FIQ(void);

//======================================================= void FIQ(void) __attribute__ ((ISR)); void FIQ(void) {

if(*P_INT_Ctrl&C_FIQ_TMA) { }

else if(*P_INT_Ctrl&C_FIQ_TMB) }

//======================================================= // 函数名称:IRQ5() // 功能描述:清看门狗

*P_INT_Clear=C_FIQ_TMB;

//PWM中断

*P_INT_Clear=C_FIQ_PWM; else

//定时器B中断

*P_INT_Clear=C_FIQ_TMA;

__asm(\//调用DVR中断服务函数

//定时器A中断

// 语法格式:void IRQ5(void);

//======================================================= void IRQ5(void) __attribute__ ((ISR)); void IRQ5(void) {

*P_Watchdog_Clear = 0x1; // WatchDog计数器 *P_INT_Clear = C_IRQ5_2Hz; }

4.2.3 键盘扫描模块

程序首先进行键盘扫描初始化,通过不断进行键盘扫描,通过去抖最后获取键值,再根据不同的键值,做出语音播放的不同处理。下面是系统进行各步骤的具体流程。根据流程图所写具体程序见附录3。 (1) 键盘扫描初始化流程如图4.4; (2) 键盘扫描流程如图4.5; (3) 按键去抖流程如图4.6; (4) 取键值流程如图4.7;

开始读键口值取上一次保存的键值开始上一次保存键值的缓冲区清零本次保存键值的缓冲区清零去抖计数器赋值结束两值是否相等?YN去抖计数器是否为零?Y去抖计数器赋初值保存可靠键值N去抖计数器赋初值

结束

图4.4 键盘扫描初始化程序流程图图 图4.5 键盘扫描函数流程图

开始Y开始取可靠键值清可靠键值缓冲区去抖计数器是否为零?N去抖计数器减1结束

结束 图4.6 按键去抖程序流程 图4.7 取键值程序流程

部分程序如下: 图4.5程序:

F _Key_Scan_ServiceLoop:

F_Key_Scan_Initial: //键盘扫描初始化

图4.6程序:

F_Key_Scan_ServiceLoop: //键盘扫描流程

r1 = [P_IOA_Data];

//读键口值

// //

//取上一次保存的键值 // // // //

//去抖计数器赋初值 //比较两次键值是否相同

r1 = r1 and 0xff;

r1 = 0x0000;

//

//

//保存键值缓冲区清零 //

//

//去抖计数器赋值

[R_DebounceReg] = r1; [R_KeyBuf] = r1; [R_KeyStrobe] = r1; r1 = C_DebounceCnt; retf;

[R_DebounceCnt] = r1;

r2 = [R_DebounceReg]; [R_DebounceReg] = r1;

cmp r2,[R_DebounceReg]; je L_KS_StableTwoSample; r1 = C_DebounceCnt; [R_DebounceCnt] = r1; retf;

L_KS_StableTwoSample:

r1 = [R_DebounceCnt];

jz L_KS_StableOverDebounce; //去抖是否完成 retf;

[R_DebounceCnt] = r1; r2 = [R_DebounceReg]; r1 = [R_KeyBuf]; [R_KeyBuf] = r2; r1 = r1 xor 0x00ff;

//

//保存可靠键值到R_KeyStrobe //去抖计数器赋初值 // // //

//保证获取可靠键值 // //

L_KS_StableOverDebounce:

r1 = r1 and [R_KeyBuf]; r1 = r1 and 0x00ff; [R_KeyStrobe] = r1; retf;

r1 = r1 or [R_KeyStrobe];

图4.7程序:

F_Key_DebounceCnt_Down: //按键去抖子程序

图4.8程序:

F_SP_GetCh:

r1 = [R_DebounceCnt]; jz L_DebounceCntZero; r1 -= 0x0001;

[R_DebounceCnt] = r1; retf;

//

//去抖计数器是否为零 //去抖计数器减1 //

//

//去抖计数器为零后则跳出

L_DebounceCntZero:

//取键值程序

// 获取可靠键值 //清可靠键值缓冲区 //

r1 = [R_KeyStrobe]; r2 = 0x0000;

[R_KeyStrobe] = r2; retf;

4.2.4 语音信号的存储

SPCE061A对SPR4096进行操作。先把SPR4096格式化,然后往其中写入M_NUMBER个Byte的数据(M_NUMBE的大小由用户自己定义),接着把这些数据读出来放在数组uiByteBuffer中;下一步是对刚才写入数据所在的扇区进行扇区擦除,往其中写入M_NUMBER个Word的数据,接着把这些数据读出来放在数组uiWordBuffer中。程序运行后,可以在IDE的Watch窗口查看uiByteBuffer和uiWordBuffer的值。其执行流程图如图4.8。根据流程所写具体程序见附录4。

开始系统初始化擦除SPR4096全部扇区按Byte写入数据按Byte读出数据存放到uiByteBuffer中擦除SPR4096一个扇区按Word写入数据按Word读出数据存放到uiWordBuffer中死循环 图4.8 SPR4096模块流程图

部分程序如下:

//====================================================== // 函数名称:_SP_SIOInitial // 实现功能:SIO初始化

//====================================================== .PUBLIC

_SP_SIOInitial;

//系统时钟设定,Fosc = 49MHz //IOB0:SCK,IOB1:SDA,IOB11:CF7

_SP_SIOInitial: .PROC

r1 = 0x0098;

r1 = 0x803;

[P_SystemClock] = r1;

[P_IOB_Dir] = r1; [P_IOB_Attrib] = r1; [P_IOB_Buffer] = r1;

retf

.ENDP

4.2.5 LVD低电压检测

为了通过对系统的电源电压进行监控,而使系统运行在一个正常、可靠的工作环境,并在一旦出现电源异常的情况下能立即采取相应的措施,使系统及时恢复正常。利用了SPCE061A所具有的低电压复位功能,通过编程设置低电压监测。 低电压监测功能可以提供系统内电源电压的使用情况。如果系统电压Vcc低于用户设定的电压监测低限电压VLVD,P_LVD_Ctrl单元的第15位(LVD监测标志位)将被置为“1”;反之,当Vcc>VLVD时,该位被置为“0”。SPCE061A具有4级电压监测低限,系统默认的电压检测低限是2.4V。

程序中通过对P_LVD_Ctrl单元编程进行控制,设置电压检测低限为3.2V。当电源电压低于LVD电压时,LED被点亮。在编程中将IOB口于LED连接,并将B口设置为无数据反相功能的低电平输出。程序流程如图4.9。

开始初始化B口点亮LED设置LVD为3.2V监测电压电源电压低于LVD电压?Y点亮LEDN熄灭LED 图4.9 LVD低电压检测程序流程

4.2.6 UART模块

为与PC传输数据而采用的UART模块提供了一个全双工标准接口。P_UART_Data(7023H)(读/写)单元可以用于接收和发送缓冲数据,向该单元写入数据,可以将要发送的数据送入寄存器;从该单元读取,可以从寄存器读出数据字节。使用UART模块进行通讯时,必须事先将Rx(IOB7)引脚设置为输入状态、Tx(IOB10)引脚设置为输出状态。然后,通过设置P_UART_BaudScalarLow(7024H)、

P_UART_BaudScalarHigh(7025H)单元指定所需的波特率。同时,设P_UART_Command1(7021H)和P_UART_Command2(7022H)单元以启用UART通讯功能。以上设置完成后,UART将处于启用状态。设置P_UART_Command1单元的第6、7位可以启用UART IRQ中断,并决定中断是由TxRDY或RxRDY信号触发,或是由二者共同触发。设置P_UART_Command2单元的第6、7 位可以启用UART Tx、Rx引脚功能。当SPCE061A接收或发送一个字节数据时,P_UART_Command2(7022H)单元的第6、7 位会被置为“1”,且同时触发UART IRQ。无论UART IRQ中断是否被启用,UART收发功能都可以由P_UART_Command2(7022H)单元的第6、7位来控制。在任何时刻读取P_UART_Command2(7022H)单元,将会清除UART IRQ的中断标志。UART接收通道结构图,如图4.10。UART发送组成原理结构图,如图4.11。

b2(RXEN)UARTRxIOB7(Rx)1:IR接收关闭b1(IRRxENB)RXIRUART0:IR接收使能

图4.10 UART接收通道结构图

UART1、设置Tx端口允通2、设置波特率TXTimerA3、设置TimerA的PWM输出脉冲IRTxEn=1TAON=1IRTxEn=0IOB8(IRTx)(反向输出)设置IOB8位反向输出模式,用做IRTxTxPinEn=1IRTxEn

图4.11 UART发送组成原理结构图

程序中所应用到的主要命令:

P_UART_Command1(写)($7021H):P_UART_Command1单元为UART控制端口。设置该单元的第2、3位可以控制数据奇偶校验功能。第6、7位控制着UART IRQ中断

P_UART_Command2(写)($7022H):该单元写入时为UART数据发送/接收控制端口,第6、7位分别控制着数据发送和接收管脚的允通/禁止。P_UART_Command2(写)($7022H)单元的缺省值为$00。

P_UART_Data(读/写)($7023H):P_UART_Data用于存放发送或接收到的数据,

8bit。

P_UART_BaudScalarLow(读/写)($7024H)和P_UART_BaudScalarHigh (读/写)($7025):P_UART_BaudScalarHigh ($7025)和P_UART_BaudScalarLow($7024H)单元的组合控制数据的传输速率(波特率)。UART波特率的计算公式如下:

波特率=(Fosc/2)/Scale。 (4.2-1)

4.2.7 看门狗计数器(WatchDog)

WatchDog是用来监视系统是否正常运作,并在异常时自动采取恢复措施。当系统正常运行时,每隔一定的周期就必须清除WatchDog计数器。如果在限定的时间内,WatchDog计数器没有被清除,CPU就会认为系统已经无法正常工作,将会进行系统复位(reset)。

SPCE061A的WatchDog的清除时间周期为0.75秒。因为WatchDog的溢出复位信号WatchDog_Reset是由4Hz时基信号经4分频之后产生的,即每4个4Hz时基信号(1秒)将会产生一个WatchDog_Reset信号。

SPCE061A分成两种版本:有WatchDog功能,以及无WatchDog功能的版本。对于有WatchDog的版本,WatchDog功能是上电时自动启动,不能被关闭。因此我在进行程序设计时,注意了在0.75秒内,进行清除WatchDog的操作。

4.2.8 系统调试与总结

在以上设计的程序通过编译并且生成可以用来下载配置的文件后、在硬件电路已经完成好以后,就可以进行下面的系统调试运行过程。

首先进行硬件连接:将下载的排线连接电脑的打印机并口和硬件的系统下载接口;用排线将IOA0-IOA7与1×8键盘连接;SPR4096模块中将JP10的三个短路线接好,注意CF7选择B11。用排线把J26和J16接上;LCD采用默认连接;将UART的Tx、Rx都拨到高端。硬件连接好后运行IDE,将程序编译后下载进SPCE061A芯片,然后点击运行程序。按键实现系统功能:K1录音、K2停止、K3播放、K4播放下一段、K5播放上一段、K6删除全部、K7单首循环、K8低电压检测。

通过对系统的使用调试,我对设计做了如下的总结:充分利用了手中的资源,运用了凌阳16位单片机作为集成开发环境。选用高低电平按键电路作为按键功能的控制,而放弃选用键数更多的4×4矩阵键盘,是由于它的程序设计更为简单,使用起来更为方便;选用更低功耗的LCD作为人机界面,使操作更加直观、方便;用通用串行口UART作为于PC机通讯的通道比使用USB更加易懂,更容易掌握,同时使系统程

序简单;合理利用了单片机中断系统所支持的中断,操作更加的快捷。这是我这次系统设计的特点和优点。

但是设计过程还存在着很多的不足之处,比如对于在设计中所遇到的由于功能多于所选用的键数的问题,以后可以采用键盘复用的方法或者采用程序中设置标志位的方法。在设计中选用SPR4096内置的FLASH存储语音数据,虽然有4M的存储空间但是对于要存储大量的语音数据来说还是不够的,因此在以后的设计中可以扩充外存储器。

结论

这次毕业设计是对四年本科学习知识的综合应用,通过做毕业设计,我不但对以前所学的知识加深了理解,而且提高了自己的动手实践能力、分析问题和解决问题的能力以及创新能力,在具体应用当中还培养了自己科学的设计思维和严谨的工作作风。从确定任务开始,我认真学习了相关理论,学习了他人的经验。并具体分析了所选用方案的市场价值和应用价值,同时还考虑到系统中一些设备成本以及学校资源方面的因素,以此确定了设计方案。

毕业设计对于我们这些即将走向工作岗位的毕业生,可以说是一次极好的锻炼机会,它能为我们今后走入社会更好地工作打下良好的基础。这次毕业设计能够取得成功是老师的精心指导和小组成员共同努力的结果。“遇到困难毫不放弃,团结、合作、坚持不懈是成功之本”是我的深切体会。

参考文献

[1] 姜志玲.用凌阳单片机实现多路数据采集与传输系统[J]. 西华大学学报.2005 [2] 王素珍,田振清.用ISP实现对ISD25120语音芯片的录放音控制[J].电声技术.2002 [3] 林阳.凌阳16位单片机与其它主流单片机的比较[J]. 电子世界. 2003 [4] 王竹便.录音技术及技巧浅议[J].科技情报开发与经济.2005 [5] 孟宪超. 数码录音笔原理及应用[J].信息时代导刊.2004

[6] 薛驹义,张彦斌等.凌阳16位单片机原理及应用[M].北京:北京航空航天大学出版社,2005

[7] 罗亚非 等编.凌阳16位单片机应用基础[M].北京:北京航空航天大学出版社,2005 [8] 张福学.传感器应用及其电路精选[M].北京:电子工业出版社,1995 [9] John Markus.电子电路大全[M].北京:计量出版社,1995 [10] 邓元庆.数字电路与逻辑设计[M].北京:电子工业出版社,2001

[11] 胡隆,许静波.录音、调音与音响技术[M].北京:北京工业大学出版社,第1版 [12] 黄瀚,王宏民.录音与调音[M].北京:中国广播电视出版社,第1版 [13] 杨行峻,迟惠生.语音信号数字处理[M].北京:电子工业出版社,第1版 [14] 阎石.数字电子技术基础[M].北京:高等教育出版社,1998.12,第4版

[15] 周常森,范爱平等.数字电子技术基础[M].济南:山东科学技术出版社,2002.3,第1版

致谢

在这次毕业设计中,史德嘉老师给了我很大的帮助。从查阅文献到课题分析,从设计仿真到论文撰写,邱老师都不厌其烦地解答我提出的各种问题,并给予我很多指导。在邱老师的指导下,我学会了如何快速地适应一个新的领域、掌握它的知识并灵活地运用它,懂得了学习要讲究方法,对于做设计和研究更是如此。在此,我衷心感谢邱老师对我的帮助。

同时我也要感谢我的同组成员李延年和焦鹏。在设计过程中,我们互相讨论遇到的问题,收获很多。

学生签名:

日 期:

附录

附录1:主程序

//============================================================ // 文件名称:main.c

// 实现功能: 按键控制的录音笔

//============================================================ #include \#include #include

\\

#include \

#include \

//============================================================= // 函数名称: int main() // 功能描述: 按键控制的录音笔 // 语法格式: int main() //入口参数: 无 // 出口参数: 无

// 注意事项: 仅为用户模型

//============================================================= int main(void) {

unsigned int unsigned int unsigned int enum

uiKeyCode, l; uiSegment; uiStatus;

// 键值 // 录音段值 // 系统状态标志

uiStatus{Stop=0,Record,Play}; //系统状态 uiRet,uiTemp,i;

// 串行Flash 地址

unsigned int

unsigned long int ulAddr;

unsigned long int ulBuffer[21]; // 录音索引表

SP_SIOInitial(); Init_sys();

// SIO初始化 // LCD初始化

FG_InitGraphic();

System_Initial(); // 系统初始化 SP_SIOMassErase();

//对SPR4096的所有扇区进行擦除

//DVR 初始化为手动模式

SACM_DVR_Initial(Manual);

uiTemp = *P_INT_Mask;

*P_INT_Ctrl = uiTemp|C_IRQ5_2Hz; INT_FIQ_IRQ(); uiStatus = Stop; uiSegment = 1;

//开2Hz中断,用来定时清看门狗

// 变量初始化

ulAddr = 0;

uiKeyCode = 0x0000; for(i=0;i<21;i++)

ulBuffer[i] = 0; while(1)

{

uiKeyCode = SP_GetCh();

//按键扫描取键值

if(uiKeyCode!=0x0000) //如果有键按下(uiKeyCode!=0xff),则响应按键事件 {

SACM_DVR_Stop(); if(uiStatus == Record) {

while(SACM_DVR_TestQueue() != Empty) //存储语音队列中的剩余数据 { }

uiRet = SACM_DVR_FetchQueue(); SP_SIOSendAWord(ulAddr,uiRet); ulAddr += 2;

ulBuffer[0]+=1; // 修改索引表

uiRet=ulBuffer[0]*2; ulBuffer[uiRet]=ulAddr; uiTemp=0;

for(i=1;(i<256)&&((uiTemp

uiTemp=2048*i;

ulBuffer[uiRet+1]=uiTemp;

}

switch(uiKeyCode) {

// 录音

case 0x0001:

l=0x0000;

ulAddr = ulBuffer[ulBuffer[0]*2+1]; SACM_DVR_InitQueue();

SACM_DVR_InitEncoder(RceMonitorOff); uiStatus = Record;

ShowLcd();

FG_Rectangle(112,48,128,62);

break; case 0x0002:

l=0x0000; uiStatus = Stop; ShowLcd();

FG_Rectangle(46,34,62,48);

// 停止录音或停止播放

break;

// 播放当前段

case 0x0004: l=0x0000;

ulAddr=ulBuffer[uiSegment*2-1];

SACM_DVR_InitQueue();

// 语音队列初始化

while(SACM_DVR_TestQueue() != Full) { }

SACM_DVR_InitDecoder(DAC1+DAC2); uiStatus = Play; ShowLcd();

FG_Rectangle(112,34,128,48);

//把语音队列填满

uiRet=SP_SIOReadAWord(ulAddr); // 从SPR4096取数据 SACM_DVR_FillQueue(uiRet); ulAddr += 2;

// 填充到语音队列

break;

case 0x0008:

l=0x0000;

if(uiSegment

SACM_DVR_InitQueue();

// 语音队列初始化

//把语音队列填满

uiSegment=1; ulAddr=ulBuffer[1]; uiSegment++;

ulAddr=ulBuffer[uiSegment*2-1];

// 播放下一段

while(SACM_DVR_TestQueue() != Full) {

uiRet=SP_SIOReadAWord(ulAddr);// SACM_DVR_FillQueue(uiRet); ulAddr += 2;

从SPR4096取数据

// 填充到语音队列

}

SACM_DVR_InitDecoder(DAC1+DAC2); uiStatus = Play; ShowLcd();

FG_Rectangle(112,34,128,48);

break;

// 播放上一段

case 0x0010:

l=0x0000;

if(uiSegment!=1) { } else { }

// 语音队列初始化

//把语音队列填满

uiSegment=ulBuffer[0];

ulAddr=ulBuffer[uiSegment*2-1]; uiSegment--;

ulAddr=ulBuffer[uiSegment*2-1];

SACM_DVR_InitQueue();

while(SACM_DVR_TestQueue() != Full) { }

SACM_DVR_InitDecoder(DAC1+DAC2); uiStatus = Play; ShowLcd();

uiRet=SP_SIOReadAWord(ulAddr); SACM_DVR_FillQueue(uiRet); ulAddr += 2;

// 从SPR4096取数据

// 填充到语音队列

FG_Rectangle(112,34,128,48);

break;

// 删除

case 0x0020:

l=0x0000;

SP_SIOMassErase(); for(i=0;i<21;i++)

ulBuffer[i]=0;

// 变量初始化

uiSegment = 1; ulAddr = 0; uiStatus = Stop; ShowLcd();

FG_Rectangle(112, 20,128, 34);

break;

case 0x0040: l=uiKeyCode;

ulAddr=ulBuffer[uiSegment*2-1];

SACM_DVR_InitQueue();

// 语音队列初始化

while(SACM_DVR_TestQueue() != Full) // 把语音队列填满 { }

SACM_DVR_InitDecoder(DAC1+DAC2); uiStatus = Play; ShowLcd();

uiRet=SP_SIOReadAWord(ulAddr); // 从SPR4096取数据 SACM_DVR_FillQueue(uiRet); ulAddr += 2;

// 填充到语音队列

FG_Rectangle(112,34,128,48);

break;

case 0x0080: check();

ShowLcd();

FG_Rectangle(46,34,62,48);

break;

default: }

break;

}

switch(uiStatus) {

case Record:

// 录音

if(ulAddr < C_SflashSize) { } else {

SACM_DVR_Stop();

SACM_DVR_Encode(); //如果SPR4096未满,则继续往里存放数据 if(SACM_DVR_TestQueue() != Empty) { }

uiRet = SACM_DVR_FetchQueue(); SP_SIOSendAWord(ulAddr,uiRet); ulAddr += 2;

// 否则,停止录音

while(SACM_DVR_TestQueue() != Empty) //存储语音队列中的剩余数据

{ }

uiRet = SACM_DVR_FetchQueue(); SP_SIOSendAWord(ulAddr,uiRet); ulAddr += 2;

ulBuffer[0]+=1; // 修改索引表

uiRet=ulBuffer[0]*2; ulBuffer[uiRet]=ulAddr; uiTemp=0;

for(i=1;(i<256)&&((uiTemp

uiTemp=2048*i;

ulBuffer[uiRet+1]=uiTemp; uiStatus = Stop;

}

break;

//

播放

case Play:

if(SACM_DVR_Status()&0x01) // 检查是否还在播放 {

if(SACM_DVR_TestQueue() != Full) {

uiRet = SP_SIOReadAWord(ulAddr);

SACM_DVR_FillQueue(uiRet); ulAddr += 2;

// 填充语音队列

}

SACM_DVR_Decode();

} else {

SACM_DVR_Stop(); if(l==0x0040) {

ulAddr=ulBuffer[uiSegment*2-1]; SACM_DVR_InitQueue();

//语音队列初始化

while(SACM_DVR_TestQueue() != Full)// 把语音队列填满

}

{ }

SACM_DVR_InitDecoder(DAC1+DAC2); uiStatus = Play; } else

uiStatus = Stop;

uiRet=SP_SIOReadAWord(ulAddr); //从SPR4096取数据 SACM_DVR_FillQueue(uiRet); // 填充到语音队列 ulAddr += 2;

} break;

case Stop: default:

break;

System_ServiceLoop(); 键盘扫描 }

附录2:中断程序:

//====================================================== // 文件名称: ISR.C

// 功能描述: 清看门狗、接收UART数据

//====================================================== #include

\

F_FIQ_Service_SACM_DVR\

} return 0;

__asm(\

extern void SP_SIOSendAByte(unsigned long int g_ulAddr,unsigned int g_uiData); extern unsigned long g_ulAddr;

extern unsigned int g_uiData,g_uiFlag,g_uiTimeOutCnt;

//============================================================= // 函数名称: FIQ() // 功能描述: DVR服务

// 语法格式: void FIQ(void);

//============================================================= void FIQ(void) __attribute__ ((ISR)); void FIQ(void) { }

//============================================================= // 函数名称: IRQ5() // 功能描述: 清看门狗

// 语法格式: void IRQ5(void);

//============================================================= void IRQ5(void) __attribute__ ((ISR)); void IRQ5(void) {

*P_Watchdog_Clear = 0x1; if(*P_INT_Ctrl&C_FIQ_TMA) { }

else if(*P_INT_Ctrl&C_FIQ_TMB)

*P_INT_Clear=C_FIQ_TMB;

//PWM中断

//定时器B中断

//定时器A中断

*P_INT_Clear=C_FIQ_TMA;

__asm(\

//调用DVR中断服务函数

else

*P_INT_Clear=C_FIQ_PWM;

// g_uiHalfSecondCnt++;

}

*P_INT_Clear = C_IRQ5_2Hz;

附录3:键盘扫描程序:

////////////////////////////////////////////////////////////////// // Function: Initialization for F_Key_Scan_ServiceLoop

////////////////////////////////////////////////////////////////// _Key_Scan_ServiceLoop: F_Key_Scan_Initial:

r1 = 0x0000;

// // // // //

[R_DebounceReg] = r1; [R_KeyBuf] = r1; [R_KeyStrobe] = r1; r1 = C_DebounceCnt;