语音信号处理

摘  要

语音信号处理属于信息科学的一个重要分支,大规模集成技术的高度发展和计算机技术的飞速前进,推动了这一技术的发展。在数字音频技术和多媒体技术迅速发展的今天,传统的磁带语音录放系统因体积大、使用不便、放音不清晰而受到了巨大挑战。本课题组提出的体积小巧,功耗低的数字化语音存储与回放系统,可以有效的解决传统的语音录放系统在电子与信息处理的使用中受到的限制。

本文提出了以SST89E554RC芯片为核心的单片机小系统,用它来实现整个数字化语音存储与回放系统的逻辑控制。单片机将通过模数转换器A/D转换的数字信号送入外部存储器中,在回放时,单片机再从存储器中读出,送到数模转换器D/A转换成模拟信号输出。系统采用了键盘选择压缩方式,在字符型显示器上显示,并可实现实时语音存储与回放,性能稳定,并且界面友好。多次的测试实验表明,本系统基本满足设计要求。

文中重点讨论了小系统的设计过程、硬件流程和软件的调试问题,研究了采用DPCM编码方式以解决因存储空间不够而引起的存储时间不够的问题。

关键字:单片机小系统;外部中断;A/D转换;D/A转换;IAP;DPCM

Abstract

Voice processing is an important branch of information science. The technology has improved a lot with the high development of the large scale integration technology and the computer science technology. As the rapid development of digital audio technology and multi-media technology, the traditional tape desk is facing challenge for it unclear replaying and inconvenient. Our design, digital voice storage and replay system, proposed the volume is exquisite, the power loss low. It can solve the limitation of the tradition voice system in electronic and information processing usage.

The article has presenting a single-chip system with SST89E554RC chip as it center processing .The MCU(microcontroller) system is used to control the logic of the digital voice storage and replay system. When the voice system is in it storage state, the MCU system will send the digital signal to the RAM from the ADC (Analog to Digital Converter). When in the state of replaying, the MCU system will read the signal from the RAM (Random Access Memory), and then, send the signals into DAC (Digital to Analog Converter). After this, the signals will change into analog signal. The system has designed the keyboard selecting compression method, LCD indicating. It can also realize the real-time storing and replaying, and the surface is very friendly. The local test indicates this system satisfied basically designing required.

The article emphasizes the designing process of the MCU system, the flow of the hardware and the debugging of software. Compression coding method, which is used to solve the limited room of the RAM, is also emphasized in it.

Keywords: MCU system; external interrupt; ADC; DAC; IAP; DPCM

目  录

  

Abstract

  

1  理论基础及系统要求

1.1 引言

1.2 语音系统构成

1.2.1  系统基本原理

1.2.2  系统组成和流程

1.2.3  语音系统的要求

1.3 控制系统任务

1.4 本章小结

2  控制系统硬件设计

2.1  引言

2.2  设计方案论证

2.2.1  采用可编程逻辑器件来实现控制

2.2.2  采用DSK来实现控制

2.2.3  采用单片机系统来实现控制

2.3  控制系统整体设计

2.4  本章小结

3  控制系统硬件的实现

3.1  引言

3.2  单片机芯片介绍

3.3  单片机外围电路

3.3.1  存储芯片RAM62256及译码芯片74LS138

3.3.2  锁存器74HC573和收发器74HC245

3.3.3  键盘中断电路

3.3.4  RS-232串口电路

3.4  控制系统与前后通道的连接

3.4.1  系统与前向通道的连接

3.4.2  系统与后向通道的连接

3.5  系统的时序

3.6  本章小结

4  控制系统软件调试

4.1  引言

4.2  调试软件的介绍

4.2.1  Keil软件简介

4.2.2  BSL软件简介

4.3  测试程序的调试及结果

4.3.1  控制系统的测试

4.3.2  测试程序的调试

4.4  语音系统软件的调试

4.4.1  控制系统软件流程

4.4.2  压缩编码方式

4.4.3  语音系统软件调试

4.5  本章小结

5  语音系统联调

5.1  引言

5.2  系统联调方法

5.2.1  电路连接

5.2.2  整机调试

5.3  联调结果及分析

5.4  本章小结

  

  

   

附录(一)系统硬件图

附录(二)测试程序

附录(三)语音系统程序

绪  论

1  选题背景

从磁带、录像带到CD、VCD、DVD;从黑白电视机、彩色电视机、高清晰度电视机(HDTV)到具有数字信号处理功能的电视机;从留声机、录音机到语音信箱;现在正处在模拟信息到数字信息的变革之中,传统的磁带语音录放系统因其体积大,使用不便,在电子与信息处理的使用中受到许多限制。

虽然,目前广播电视系统尚未实现真正的数字化,相信在不久的将来,真正的数字电视机、数字收音机、数字收录机将进入家庭。所以,研究音频信号的数字化存储、处理和回放系统有着很重要的现实意义。

2  课题任务

本实验任务所提出的数字化语音存储与回放系统,其基本原理是对语音的录音和放音进行数字化控制。其中,关键技术在于:为了增加语音存储时间,提高存储器的利用率,采用了非失真压缩算法对语音信号进行压缩后再存储,而在回放是再进行解压缩;同时,对输入语音信号进行数字滤波以抑制杂音和干扰,从而确保了语音回放的可靠质量。

本文提出的单片机小系统就是来完成这种数字化的控制的。通过比较多种控制系统的实现方案,最终决定采用单片机来实现。考虑到语音系统的存储时间要求的指标和存储容量有限的问题,在软件方面采用了DPCM编码方式对存储数据进行压缩以加长存储时间。采用键盘选择方式,来比较直通存储方式和DPCM压缩存储方式的语音效果和存储时长。

第1章  理论基础及系统要求

    1. 引言

目前,随着数字化信号处理技术的不断提高,单片机,数字信号处理器以及语音处理大规模集成电路的进步,语音合成,语音识别,语音存储和回放技术的应用越来越广泛。本文提出的体积小巧,功耗低的数字化语音存储与回放系统将完全可以替代传统的语音录放系统。

    1.  语音系统构成

1.2.1  系统基本原理

语音采集原理是,人耳能听到的声音是一种频率范围为20Hz—20kHz,而一般语音频率最高为3.4kHz。语音的采集是指语音声波信号经麦克风和高频放大器转换成有一定幅度的模拟量电信号,然后再转换成数字量的全过程。根据“奈奎斯特采样定理”,采样频率必须大于模拟信号最高频率的两倍,由于语音信号频率为300—3.4kHz,所以把语音采集的采样频率定为8kHz[1,17]。

语音生成原理是,单片机语音生成过程,可以看成是语音采集过程的逆过程,但又不是原封不动地恢复原来的语音,而是对原来语音的可控制、可重组的实时恢复。在放音时,只要依原先的采样值经D/A接口处理,便可以使原音重现。

1.2.2  系统组成和流程

整个语音系统是由话筒、语音信号阻抗匹配器、话音放大器、低通滤波器和A/D转换器组成的前向通道,与单片机小系统,再加上由D/A转换器、输出放大器、低通滤波器、功率放大器和喇叭组成的后向通道相连而成的。如图1-1所示:

     

                           

图1-1  语音系统整体流程

1.2.3  语音系统的要求

为高保真处理语音信号,设计基本要求如下

(1)话音放大器的增益为40dB。

(2)扬声器负载为8,输出功率不小于0.5W。

(3)带通滤波器:通带为300Hz—3.4KHz。

(4)ADC:采样频率fs=8kHz,字长=8位。

(5)语音存储时间5s。

(6)DAC:变换频率fc=8kHz,字长=8位。

(7)回放语音质量好。

在保证语音质量的前提下,进一步提高系统性能,

(1)减少系统噪音电平,增加自动音量控制功能。

(2)语音存储时间增加到50s以上。

(3)提高存储器的利用率(在原有存储容量不变的前提下,提高语音存储时间)。

    1. 控制系统任务

数字化语音存储与回放系统的工作原理是语音的录音和放音的以微处理器芯片为核心,将模拟语音信号通过模数转换器A/D转换成数字信号,再通过单片机控制存储在存储器中,回放时,由单片机控制将数据从存储器中读出,通过数模转换器D/A输出。因此,单片机控制系统首先应该满足A/D和D/A转换器的接口要求,存储器应该满足采样频率为8kHz的语音存储时间不小于4s,同时应该具有键盘输入申请中断功能。

    1. 本章小结

本章首先简要介绍了数字化语音处理技术的基本原理,然后详细介绍了数字化语音存储与回放系统的系统构成,基本要求和扩展的要求。单片机控制系统是整个语音处理系统的核心,一个简单的单片机系统的开发也需要电路设计,单片机器件选择和程序编写3个步骤。因此,在接下来的章节,将详细介绍单片机控制系统的设计、实现、以及配套的软件调试。

第2章  控制系统硬件设计

2.1  引言

实现数字化语音存储与回放技术,可采用一些专门的语音处理芯片,但一般需要外接存储器,且不能对语音信号进行数字化处理。无法达到实验要求的语音质量。

语音系统的控制部分可以采用多种方法来实现,例如:可编程逻辑器件、DSK(DSP Starter Kit)或单片机等技术来实现。下面将对这些可行性方案进行论证,比较。

2.2  设计方案论证

2.2.1  采用可编程逻辑器件来实现控制

 设计选用Xilinx公司XC9500系列的CPLD(Complex Programmable Logic Device)芯片来实现。根据设计要求将该系统分为三个状态:待机状态、录音状态、放音状态,分别由三个输入信号控制进入这三个状态。系统主要由模数转换器ADC(Analog to Digital Converter)、              图 2—1  采用CPLD的系统设计

数模转换器DAC(Digital to Analog Converter)、静态存储器SRAM(Static Random Access Memory)和控制器等几个部分组成。

在电子设计技术中CPLD有多方面的优势:在系统编程,时延特性可预测,引脚锁定能力强等。使得用CPLD实现控制器的系统具有设计快速,调试方便,噪声低,语音回放效果好,PCB(Protected Circuit Board)板面积小等多方面的优点【2】。但同时,其实现起来较为复杂,而且不太容易作成友好的人机交互界面。

2.2.2  采用DSK来实现控制

DSK(DSP Starter Kit)是美国T1公司为初学DSP者开发的学习工具,以第三代DSP芯片TMS320C50 DSP为核心,配以必要的硬件电路和简化的开发软件,通过与PC机简单接口,就可以学习使用DSP,亲自体会实时处理的强大功能。它对用户是开放的,允许建立并运行自己的应用程序,还可以通过适当的硬件扩展,很容易构成一个小型实用系统。

DSK系统的最大的优越性在于,A/D和D/A转换频率通过编程可以调节,可以根据音质和存储时间权衡选择采样速率;由于DSP具有的增强型哈佛结构、流水线指令操作方式、独有的硬件乘法器以及高效的指令集和丰富的寻址方式等一系列优点,非常适合数字信号处理算法的实现【3】,所以,在压缩编码的同时,还可以进行增强、去噪等处理。但是,作为一个毕业设计性实验,还必须考虑系统的价格、体积等因素。同时,采用本方案,其采样率和字长还达不到要求,还必须扩展外部存储器[3]。

图  2—2  DSK结构框图

2.2.3  采用单片机系统来实现控制 

单片机是将中央处理器(CPU)、随机存储器(RAM)、只读存储器(ROM或EPROM)、定时器芯片和一些输入/输出接口电路集成在一个芯片上的微控制器(Microcontroller)。而对于一个典型的单片机系统而言,主要由单片机、晶振和复位电路、输入控制电路、输出显示电路以及外围功能器件组成。

在本语音系统中,对于语音信号(最高频率约为3.4kHz,8kHz采样频率),12MHz的8位单片机已足够胜任(每个采样周期125 ,相当于125个机器周期,平均执行62条指令),所以采用单片机来进行控制和人机交互的处理是相对更合理的方案。

初步设计的单片机系统通过外部中断1利用二极管的线于功能扩展了5个按键、一个复位键和三个中断。系统具有字符型LCD接口,用地址线来模拟控制信号。同时,系统具有RS232串行通信的接口,通过这个接口,可以下载程序和仿真,还可以作为开发板的接口开发用 [4,9]。

2.3  控制系统整体设计

    通过以上的比较论证,控制系统选用单片机小系统来实现。整个单片机系统,主要由单片机、晶振和复位电路、输入控制电路、输出显示电路以及外围功能器件5个部分组成。

     

图2-3  控制系统基本组成

  1. 晶振和复位电路:控制单片机的机器周期和功能复位。
  2. 输入控制:是指在一定要求下,采取何种形式的控制方法来实现单片机不同的功能的转换,以及控制指令以何种方式传送到单片机。本系统采用的输入控制方法有按键和串行通信两种方式。
  3. 输出显示:是指单片机将需要显示的数据发送到LCD模块,并控制LCD模块按照一定的格式显示的功能。
  4. 外围功能器件:单片机只是控制器件,对应于一定的设计要求,需要加入功能器件。本系统用到的外围器件需要有存储数据的外部存储器,用于增加驱动的锁存器和收发器和用于I/O口扩展的译码器。

2.4  本章小结

虽然在选题中就已规定了本系统的控制部分要用微处理器来完成,但在开始做实验之前,通过查阅了大量的文献资料,确定了三种可行的方案。通过上面的详细比较,可编程逻辑器件虽然具有速度快的特点,但实现较为复杂,不太容易做成友好的人机交互界面;DSK虽然运算速度快,信息处理量大体积和重量小,但开发成本很高;单片机的体积小,开发成本低,而且其信息处理良基本上能满足语音系统的需求。通过以上比较,选用单片机来实现整个系统的控制是最可取的。单片机容易作到友善的人机交互界面,并且具有一定的编程能力,实现控制相对可靠、容易。在本章的最后,对以单片机为核心的控制系统做了整体设计。

第3章  控制系统硬件的实现

3.1  引言

控制系统的开发,在通过前一章的方案论证后,确定采用以单片机小系统来实现,同时给出了相应的单片机系统的整体设计。目前,单片机已经广泛应用到了日常生活的许多领域,成为测控技术现代化必不可少的重要工具,市场上的单片机种类很多,通过比较,最终选用了SST公司的单片机。其他外围电路选用了市场上最为常用的集成块来进行扩展。

3.2  单片机芯片介绍

本小系统的单片机采用SST公司的89E554RC芯片【6,14】,可直接与Keil软件通信,使用Keil软件提供的单步、过程单步、设置断点等调试手段。此芯片具有片内32K+8K FlashROM,1K字节RAM,4级8个中断源,双DPTR,内置WDT等功能。

SST89系列单片机为FlashFlex51系列单片机,本系统采用的是SST89E554RC。此单片机使用与8051完全相同的指令集,并与标准的8051器件对管脚兼容。

 SST89E554RC单片机的特点如下:

(1)片内程序空间(高可靠的SuperFlash  EEPROM)为32KB(Block0)+8KB(Block1)

作为72/40字节的SuperFlash EEPROM片的

图3—1  SST89E554RC管脚图     程序存储器的补充,该器件可以寻址到64K字节的外部程序存储器空间。作为1024*8位的片内RAM空间的补充,该器件可以寻址64K字节的外部RAM空间。

 (2)系统在线编程IAP(In Application Programming)模式或离线式用万用编程器编程。

  1. Flash 擦写次数达1万次以上,程序保存是可达到100年;
  2. 由于Flash具有掉电保持的特性而系统内可变成(IAP)功能提供了像RAM一样的带电状态,可随时改写的特性,可用做数据存储器和在线软件升级功能;

(3)可编程看门狗定时器(WDT);

(4)宽电源范围+2.7—5V电源;

(5)具有三种节点模式,使功耗降至最低;

(6)与8052系列单片机兼容,片内有RAM 1 K字节;

(7)3个16位定时计数器;

(8)4个8位I/O端口;

(9)器件有多种加密方式,独立的块密码;

程序和数据外部存储器空间地址支持范围为64K字节;

(10)全双工增强型UART:帧错误检测,自动地址识别;

(11)八个中断源,四个优先级;

(12)第二DPTR寄存器;

(13)SPI串行接口;

(14)标准的12时钟每系统周期,该期间可通过配置设置成6时钟每系统周期;

(15)TTL和CMOS兼容逻辑电平;

(16)有DIP-60,PLCC-44,TQFP-44三种封装形式等;

(17)高可靠性,数据能保持100年;

(18)每个块都是小扇区操作,每个扇区是128Byte;

(19)多达十万次的擦写次数,擦写时间快;

(20)低电压工作,5V或3V工作,无需外接12V高压;

利用SST单片机内部FLASH的特性,我们可以把现在广泛使用的MCU+EEPROM/FLASH/FRAM方式改成单个MCU执行程序运行和数据/参数记录。

利用内部FLASH做数据存储有许多的优点:

(1) 减少器件的数量,提高可靠性;

(2) 省下一个EEPROM等存储器,减低成本;

(3)提高数据的保密性。数据放在单片机内部,单片机加密后数据不能被读出来;

(4)省下I/O控制脚。省去EEPROM后,可以腾出两个I/O脚,做其它控制;

(5)SST单片机IAP指令简单、直观;

SST单片机较于现在通用的89S52的优势:

(1)超大容量程序存储器Flash;

(2)同时提供ISP和IAP功能,而89S52只提供ISP;

(3)独有的联机调试功能,在Keil环境下使用,可基本代替仿真器;

(4)串口IAP下载用户程序(Easy IAP),速度比Atmel的并口下载软件更快;

(5)SST单片机有两种使用状态,即ICE在电路仿真状态和IAP下载状态。这两种状态之间可通过Keil和Easy IAP转换;

(6)系统周期可以配置,可以设置为6时钟每周期。

3.3  单片机外围电路

3.3.1  存储芯片RAM62256及译码芯片74LS138

 单片机可以扩展16位的地址线,可以构成64K的寻址空间,寻址范围是0000H~FFFFH。

单片机的P0口通过锁存器进行数据和地址总线的分离,分离后的低8位地址线接到RAM62256的A0-A7引脚,P2口经74LS573(U5)与RAM62256的高8位地址线A8-A14相连【4】。P0口经74LS245出来的数据总线接到RAM62256的数据线D0-D7上。RAM62256的CS脚接A15作为片选信号。                                                  64KB的外部数据存储器空间的分配               图 3—2 存储器的连接               如下所示:

低32KB作为数据存储器,采用一片RAM62256(U9)来实现,高32KB的空间通过一片74LS138【5】来进行I/O接口扩展。具体的地址分配如下:

   0000H—7FFFH  外部数据存储器

   8000H—8FFFH  键盘的片选信号

    9000H—9FFFH   LCD的片选信号

 C000H—CFFFH  用户接口OUTIO0

D000H—DFFFH  用户接口OUTIO1           图 3—3 138译码器

3.3.2  锁存器74HC573和收发器74HC245

控制系统中的8位数据总线通过一片74HC245(U8)来增加驱动能力,16位的地址线通过两片74HC573(U7、U5)来驱动,通过一片74HC573(U6)来判断。

74HC573具有8个单独输入端的锁存器,3态驱动总线输出。当允许端(G)为高电平是,锁存器输出将随数据(D)输入端变化;当允许端为低电平是,输出端将被锁存在已经建立起的数据电平上。选通输出控制端可使8个输出端与锁存器的Q端相同【5,7】。如图3-4所示

图3-4 74HC573管脚图                  图3-5 74HC245管脚图

特别说明一下U7(573),利用它的锁存功能来实现P0口的地址/数据的复用。当其控制端LE是高电平时,输出端(Q0-Q7)和输入端(D0-D7)相连,因此,输出端的状态于输入端相同。

当控制端LE是低电平时,输出端与输入端断开连接,并保持原来的状态,或者说,当控制端LE时低电平时,即便输出端的状态发生变化,输出端的状态也不会随之变化。                                              

74HC245是三态反相的八总线收发器【5,8】,其结构如上面图 3-5所示:  

当DIR端为低电平时,工作方式为B数据至A总线;当DIR端为高电平时,工作方式为A数据至B总线。          

3.3.3  键盘中断电路

采用键盘中断方式:如图3-6所示。各个按键都是一端接地,另一端与一个二极管相连。二极管的正极接单片机的中断口(INT1)【9】。当有任何一个按键按下时,都会使INT1口为低电平,从而引起单片机的中断,它的好处是不用在主程序中不断地循环查询,如果有键按下,单片机再去做相应的处理。键盘通过了一个上拉电阻再与74HC573连接,                     图3—6  键盘中断电路   

这个上拉电阻主要是增加键盘的驱动能力。                                                                                                                                                                         

3.3.4  RS-232串口电路

   单片机的通信方式又两种:并行通信和串行通信。串行通信是指数据一位一位顺序发送或接收。单片机的串行接口是一个可编程的全双工串行通信接口,它可用作异步通信方式(UART),与串行传送信息的外部设备相连接。

串行通信接口标准以RS-232为主,RS-232是美国电子工业协会(EIA)制定的一种串行总线的物理接口标准,此标准规定了串行通信中,主控制模板和从属模板之间的物理连接线路的机械、电气、功能和过程特性,两端都必须遵守的共同约定[14]。RS-232标准总线为25根线,但实际应用中常用其简化了的9线接口。但本设计采用3线传送。

RS-232接口通过一片MAX232芯片进行电平转换,MAX232芯片功耗低、集成度高,采用单一的+5V供电,具有接收和发送通道。通过RS-232接口既下载程序和仿真,又可以作为开发板的接口开发用,但此时不能进行仿真。

图3-7  RS-232串口电路

    通过这个串口,可以直接将PC机内的程序下载到单片机中,而不需要用编程器烧录。同时不需要外加监控芯片,只是通过串行口下载升级,便可以很容易的做到硬件的更新。

3.4  控制系统与前后通道的连接

3.4.1  系统与前向通道的连接

前向通道采用的模数转换器是最常用的8位A/D转换器ADC0809,ADC0809是CMOS工艺逐次比较型A/D转换器。ADC0809片内集成了8路模拟多路开关、地址锁存器与译码、8位A/D转换器以及8位三态输出锁存器四部分组成。

其主要性能及技术指标为【5,10】:

  1. 为逐次比较型;
  2. 为单电源供电;
  3. 无需外部进行0点和满度调整;
  4. 可锁存3态输出,输出与TTL兼容;
  5. 具有锁存控制的8路模拟开关;
  6. 分辨率为8位;
  7. 功耗为15mW;
  8. 转换时间(f=500kHz);128 s;

  1. 转换精度:0.4%。

图  3—8 ADC0809管脚及内部结构

ADC0809的最大采样频率位11KHz,符合系统8kHz采样的要求,其典型时钟为640kHz,其中最大时钟可达1.28MHz,可以从单片机的ALE端经过四分频后引入1MHz的时钟,这样就可以是ADC0809的采样频率达到8kHz。

数据输出端直接联到系统的数据总线上,单片机的写信号WR和138出来的片选信号OUTIO0经过或非后送ADC0809的START(A/D转换启动信号输入端口)和ALE(地址锁存允许信号输入端),单片机的读信号RD与转换器的片选信号OUTIO0经或非后送OE(数字量输出允许控制信号输入端口)用于控制转换数据的输出。EOC经线与接单片机的中断口INT0。

与单片机的接口电路请参见附录图(一)

3.4.2  系统与后向通道的连接

后向通道采用的数模转换器是DAC0832。DAC0832由8位输入锁存器、8位DAC寄存器、8位D/A转换电路所构成。使用两个寄存器的好处是能简化某些应用中的硬件接口电路设计。

其主要性能及技术指标为【5】: 

  1. 分辨率为8位;
  2. 电流稳定时间为1 us;
  3. 可单缓冲、双缓冲或直接数字输入;
  4. 只需在满量程下调整其线性度;
  5. 单一电源供电;
  6. 低功耗,200mW。

图  3—9  DAC0832管脚和内部结构

单片机在连接后向通道时,只有一路输出,采用单缓冲方式。在这种方式下,将二级寄存器的控制信号并接即可。输入数据在控制信号的作用下,直接进入0832的控制寄存器。片选端CS直接接138译码起过来的OUTIO1。DAC0832为电流型输出,应用时要外接运算放大器使之成为电压型输出。

与单片机的接口电路请参见附录图(一)。

3.5  系统的时序

     单片机的时序就是CPU在执行指令所需控制信号的时间顺序。在执行指令时,CUP首先要到程序存储器中取出需要执行指令的指令码,然后对指令码译码,并由时序部件产生一系列控制信号去完成指令的执行。这些控制信号在时间上的相互关系就是CPU时序。

单片机系统采用5V的电源,24M的晶振。单片机的ALE(地址锁存允许)的输出频率为时钟振荡频率的1/6。单片机的ALE端的时钟信号经四个D触发器四分频,作为A/D转换的时钟(CLOCK)。ADC0809采样完成后,EOC(End of Convert)端将产生上跳脉冲。单片机通过INT0口检测到 EOC的上跳脉冲后,立即读取ADC0809输出的8位数据,并一次存入外部存储器中。ADC0809工作的典型的时钟

(CLOCK)频率为640kHz,其最大时钟可达1.28MHz。

图3-10 ADC0809时序图

3.6  本章小结

本章详细介绍了单片机小系统所采用的中央芯片SST89E554RC的结构和特点,仔细分析了外围器件的构成以及工作原理等。同时对连接前向通道的ADC转换器,连接后向通道的DAC转换器的构成及相连管脚做了详细介绍。再本章的最后,对单片机及ADC0809的工作时序作了详细的陈述。

第4章  控制系统软件调试

4.1  引言

单片机的开发中除必要的硬件以外,同样离不开软件,本系统的软件部分主要是为了实现人机控制、DPCM编码、A/D转换器量化数据的读入、D/A转换器模拟信号的输出等。C语言是一种通用的计算机程序设计语言,它既可以用来编写计算机的系统程序,也可用来编写一般的应用程序。采用汇编语言编写单片机应用程序的周期长,而且调试和排错也比较困难。本语音系统软件采用C语言来实现,同时采用相应的编译软件。

4.2  调试软件的介绍

4.2.1  Keil软件简介

Keil软件是目前最流行的开发单片机的软件,Keil Cx51是一种专为8051单片机设计的高效率的C语言编译器,符合ANSI标准,生成的程序代码运行速度极高,所需要的存储空间也极小。

Keil Cx51已被完全集成到一个功能强大的全新集成开发环境中μVision2了。其中包括项目(project)管理器、Cx51编译器、Ax51宏汇编器、BL51/Lx51连接定位器、RTX51实时操作系统、Simulator软件模拟器以及Monitor51硬件目标调试器,所有这些功能均可在μVision2提供的单一而灵活的开发环境中极为简便地进行操作。

μVision2提供了强大的项目管理功能,可以十分方便地进行结构化多模块程序设计。μVision2内部集成器件数据库存储了多种不同型号单片机的片上资源信息,通过它可以自动设置Cx51编译器、Ax51宏汇编器、BL51/Lx51连接定位器及调试及调试器的默认选项,充分满足用户利用特定单片机上集成外围功能要求。

μVision2支持软件模拟仿真(Simulator)和用户目标板调试(Monitor51)两种工作方式,在软件模拟仿真方式下不需要任何单片机硬件即可完成用户程序仿真调试,极大地提高了用户程序开发效率,在用户目标板调试方式下,利用硬件目标板中的监控程序可以直接调试目标硬件系统。

4.2.2  BSL软件简介

 SST89E554最大的特点是内部有两块独立的FLASH存储器,具有应用中在线编程(IAP)功能。BSL(EasyIAP11F Boot-Strap Loader)软件【11】是SST公司为用户提供的IAP工具,用户通过它可以下载程序到单片机Flash中,或是将Flash中的程序代码读出来,同时还可实现芯片的状态从IAP转换到ICE。

ISP(In-System Programming)在系统可编程,指电路板上的空白器件可以编程写入最终用户代码,而不需要从电路板上取下器件,已经编程的器件也可以用ISP方式擦除或再编程。ISP技术的优势是不需要编程器就可以进行单片机的实验和开发,单片机芯片可以直接焊接到电路板上,调试结果即成成品,免去了调试时由于频繁的插入取出芯片对芯片和电路板带来的不便。

IAP(In-Application Programming)指MCU可以在系统中获取新代码,并对自己重新编程,即可用程序来改变程序。IAP技术是从结构上将Flash存储器映射为两个存储体,当运行一个存储体上的用户程序是,可对另一个存储体重新编程,之后将程序从一个存储体转向另一个。

在实现IAP功能时,单片机内部一定要有两块存储区,一般一块被称为BOOT区,另外一块被称为存储区。单片机上电运行在BOOT区,如果有外部改写程序的条件满足,则对存储区的程序进行改写操作。如果没有外部改写程序的条件满足,程序指针跳到存储区,开始执行放在存储区的程序,这样便实现了IAP功能。

SST公司的单片机,其最大的特点是其内部有两块独立的FLASH存储器,具有IAP(应用中在线编程)功能,对于8052系列的其他公司的单片机(ATMEL、WINBOND、ISSI)可以直接代替,软硬件无须任何改动。

IAP的实现一般需要很少的外部电路辅助实现,而且实现起来非常灵活,通常可以利用单片机的串行口接到计算机的RS-232口上,来下载系统程序或是在线仿真。

4.3  测试程序的调试及结果

4.3.1  控制系统的测试

将单片机接到PC机上,首先进行芯片自检,先通过串口检测板上的SST系列芯片,从菜单Select Chip/RS-232,选择Detect Target MCU for Firmware1.1F and RS232 Config,然后根据当前的SST芯片选择芯片型号,Memory mode 选默认即可,按下OK进入下一步;下一步进行串口设置,选择和单片机通信的计算机串口,波特率可以选择为38400bps,晶震频率是24M,按Detect MCU进行芯片检测。(在按下Detect MCU后要马上把单片机进行复位一次,否则,因单片机正在执行程序而无法被探测到,出现timeout的错误)。

当芯片被检测到后,在窗口的右半部的Chip Information菜单功能区会显示芯片信息:芯片型号:SST89E554RC、闪存:8K、波特率:38400bps、晶振频率为:24M。

用户程序下载IAP在Easy IAP软件的右下角一个IAP Functions菜单功能区,点中Download即进入用户程序下载,可以忽略密码设置,然后直接进入文件选择,按OK即可。

IAP到Soft ICE 的状态转换,如果想从当前的IAP状态转换到硬件在线仿真状态,需要下载Soft ICE程序到单片机中。即,从软件的菜单栏中选择Soft ICE,然后选择Download Soft ICE,点击下载。

Soft ICE 到IAP状态的转换,在Keil software 软件调试环境下敲入命令include e:/ SST/Convert -to-BSLx554.txt,退出在线调试,打开EasyIAP11F Boot-Strap Loader软件即可实现状态转变【11】。

4.3.2  测试程序的调试

通过以上的系统测试,在IAP状态下,将通过Keil编译无错的测试程序载入到单片机中。(测试程序详见附录(二))此时单片机处于Soft ICE状态下。将状态转换成IAP后再次检测系统,当按下RESET时,系统显示“testing the LCD”“repeat”上下两个字符串,当按下按键JP7时,系统显示“1”,当按下按键JP6时,系统显示“2”,……当按下按键JP3时,系统显示“5”。在Keil的环境下进行硬件仿真,在Debug中设置好硬件仿真驱动,对编译程序设置断点,运行后可以观察到变量的寄存器地址的变化。

4.4  语音系统软件的调试

4.4.1  控制系统软件流程

单片机系统的控制分为三个状态:待机状态、录音状态、回放状态。下面详细介绍单片机系统在这三个状态时的硬件流程。

(1)  待机状态

当系统处于待机状态时,系统既不录音也不放音,处于加电后状态。按复位键(RESET),语音系统进入此状态。在此状态中时,单片机的外围电路均处于无效状态。此时程序还没有开始执行,系统处于等待状态。LCD显示器一直显示“please enter”。

(2)  录音状态

当按下JP7时,系统进入普通录音状态,当按下JP6时,系统进入DPCM录音状态。

当按下JP7(普通录音)键或者JP6(DPCM录音)键时,单片机的INT1口从键盘电路接收中断信号,收到信号后跳出等待。同时从地址线A12,A13,A14输出信号,利用74LS138从Y0(KEY)发出信号片选键盘电路的74HC573,单片机通过P0口接收从DB0~DB7传输过来的键盘信号,通过该信号调用中断程序,同时,通过74LS138译码器选通LCD,并将按键对应的功能提示(“recording”或”common record ”)送LCD显示。

与此同时,单片机的WR和经138译码的ADC0809的片选信号(OUTIO0)经过或非门送ADC0809的ALE和START端启动模数转换器,进行模数转换。当ADC每转换完一次后,EOC送一个中断信号给单片机,单片机的RD端口和模数转换器的片选信号经或非门之后,送ADC0809的输出控制端口。将转换后的数字信号经数据总线,送入外部存储器RAM62256进行存储。

(3)  回放状态

当按下JP5时,系统进入普通回放状态,当按下JP4时,系统进入DPCM回放状态。

当按下JP5(普通回放)键或者JP4(DPCM回放)时,INT1从键盘电路收到中断信号,收到信号后跳出等待。同时从地址线A12,A13,A14输出信号,利用74LS138从Y0(KEY)发出信号片选键盘电路的74HC573,单片机通过数据端口检测到从数据总线传输过来的键盘信号。再利用高位地址线经74LS138选通DAC0832的片选信号,同时经译码从Y1(LCD)发出信号片选LCD,通过数据总线接收从单片机的P0口传输过来的信号,此时ZLCD显示“replaying”或“dpcm replay”。

单片机通过高位地址线A15选通外部数据存储器,通过P2口选定地址,通过外部数据存储器的数据总线的端口传输到数模转换器。经转换后,通过DAC0832转换的模拟信号经运算放大后通过OUT端输出[16]。

4.4.2  压缩编码方式

本系统软件设计的基本思路是:利用定时产生中断,在中断服务程序中,对输入的音频信号进行采样,把得到的结果送存外扩存储器之后,把数字信号从RAM中读出,利用D/A转换使之恢复为模拟的音频信号,从而实现从模拟到数字,再有数字到模拟的过程。

语音系统要求实现数字语音存储与回放,以8kHz采样频率对语音信号进行采样,采样信号存于存储器中,考虑到单片机小系统的存储器容量的限制,因此采用数据压缩编码。又由于系统的扩展要求在不增加存储容量的前提下,提高语音的存储时间,因此,也必须进行数据压缩。

数字存储的关键技术是数据的压缩编码与物理存储空间的扩展。本设计利用单片机最小系统上固定的32K RAM数据存储空间。常用的语音压缩编码方式有PCM(脉冲编码调制)和DPCM(差分脉冲编码调制)两种[1,17]。

PCM模式的语音速率为64kbit/s,将ADC采样量化值不经过压缩编码处理,直接存储在数据存储器中;回放时,经过简单的处理DAC回放。这种模式的特点是:采样速率较高,回放失真度小,容易实现;但是由于没有对采样数据进行压缩处理,存储时间短,而且对小信号来说,其量化噪声干扰太大。

DPCM编码方式是对信号抽样值与信号预测值的差值进行量化、编码,是增量调制的一种改进。它适当的降低了增量调制的数据压缩比,可以压缩码率,可以把数码率由64kbit/s压缩到32kbit/s,提高了存储空间利用律。DPCM能压缩比特率的实质是由于信号相邻值之间存在明显的相关性,减少了信号间的冗余信息,所以其抗噪的能力不如PCM编码,可能造成较大的累计噪声输出【1,17】。

4.4.3  语音系统软件调试

按照前面所述的方法,将小组负责软件的同学提供的软件经调试无误后下载到芯片中。之后同测试程序一样,在Keil环境下进行硬件仿真。观察变量地址的变化和内存的变化。(系统程序详见附录(三))系统当在IAP状态下测试时,当按下RESET时,系统显示字符串“please enter”,当按下按键JP7时,系统显示“recording”,当按下按键JP6时,系统显示“dpcm record”,当按下按键JP5时,系统显示“common replay”,当按下按键JP4时,系统显示“dpcm replay”。

4.5  本章小结

系统采用的是SST89E554RC芯片,结合SST单片机独特的内部结构和在线仿真功能,通过配套的软件来对系统进行调试,可以检测系统设计的好坏,也可以进一步认识系统的流程和单片机的功用。本章重点阐述基于硬件系统的软件设计流程,以及压缩编码的方式。最后,对整个语音系统的调试结果做了详细的说明。

第5章  语音系统联调

5.1  引言

系统的调试分为纯硬件调试、硬软件联合调试、系统软件调试三个阶段。电路模块调试时主要是纯硬件调试,涉及软件的则需要软硬件联合调试,如单片机小系统,A/D、D/A转换电路等。接着进行系统级联调试,软硬件必须结合,主要排除逻辑故障。硬件调试完成以后,结合软件进行调试。系统软件的主要任务有人机控制,DPCM编解码的实现、A/D转换器量化数据的读入、D/A转换器模拟信号的输出等。

5.2  系统联调方法

5.2.1  电路连接

连接电路时,从单片机出发,分前向通道和后向通道两个方向逐一安装。

单片机在连接前向通道时,ADC0809的数据输出端用40芯排线直接联到单片机系统的数据总线上,单片机的写信号WR和138译码器出来的片选信号OUTIO0经过或非后送ADC0809的START(A/D转换启动信号输入端口)和ALE(地址锁存允许信号输入端),单片机的读信号RD与转换器的片选信号OUTIO0经或非后送OE(数字量输出允许控制信号输入端口)用于控制转换数据的输出。EOC经反相后接单片机的中断口INT0。

单片机在连接后向通道时,只有一路输出,采用单缓冲方式。在这种方式下,将二级寄存器的控制信号并接即可。模拟信号在控制信号的作用下,也经40芯的排线直接进入DAC0832的控制寄存器。片选端CS直接接138译码器过来的OUTIO1。

5.2.2  整机调试

先将单片机小系统复位,将语音信号从麦克风输入,按下录音键,待存储器存满后,按放音键回放语音信号并调整放大器增益,使语音信号不失真的输出,实现系统功能。输出信号可以接到示波器上,通过观察输出的波形来进行判断。

5.3  联调结果及分析

初步完成的系统在放音过程中夹杂着明显的噪声,实验观察和分析表明:这些噪声源于数字系统的干扰和外界窜入的音频电信号干扰。据此采取以下降噪措施[15]:

·模拟地和数字地分开,在电源处一点接地;

·正负电源与地之间采用10uF和103电容做高频退藕;

·单片机小系统的电源接入端接0.01uF电容;

以上措施提高回放语音的清晰度和可懂度,使回放噪声较小[16]。

系统在各种工作模式下回放试听效果如下:

·直通方式:声音清晰,没有听到噪声,录音时间少于3秒,

·DPCM模式:声音清晰,有轻度噪声,录音时间为10~11秒。

5.4  本章小结

前面的设计和调试,都是为了整个数字化语音存储与回放系统的功能的实现。通过整机联调,检验到单片机小系统能成功的实现前面所描述的控制功能,并且整个电路能够实现设计所要求的性能指标。通过实践,实现了对采样值的DPCM压缩编码,提高了存储空间的利用率。这对于今后在有限存储空间内存储较多数据是有参考意义的。本章对整个小组的设计成果做了详细的说明。

总  结

本论文对于单片机小系统的设计和实现过程主要集中在以下几点:

在系统设计过程中考虑了多种实现方案,通过比较,论证了采用单片机是合理、而又易于实现的;在系统实现阶段,详细论述了整个控制系统的流程;在系统调试阶段,详细介绍了与单片机配套的调试软件;在整机联调阶段,参数匹配方面发现了很多问题。

在整个设计期间,我接触了各种不同的问题,并提出了各种解决方案,获得了很多有价值的心得体会:要想成功的实现一个系统,必须在设计之前,对相关理论和工具要有充分的认识,还要有详细周到的设计,尽量完善全面的考虑问题;开发调试过程中,一定要严格按照调试规范操作。

系统的一些特色与创新:

系统芯片选用了具有超大容量程序存储器Flash的SST芯片,在开发中,不需要编程器就可以做单片机烧录,程序通过串口下载到单片机,这给系统软件的调试带来了极大的方便。

键盘采用了选择性压缩方式,可以自由选择压缩编码的方式,因此可以很清楚的对比两种编码方式的录音效果以及各自的优缺点。

系统需要的改进:

在存储容量上可以进一步扩展,增加存储器的块数,可以采用分页寻址的方式,由此增加存储的时间。

同时,可以根据语音系统提出的扩展思路来进一步改进电路。

致  谢

首先,我要感谢我的导师赵云娣老师在毕业设计中对我给予的悉心指导和严格要求,感谢孙义明老师在毕业设计其间对我的耐心帮助和实验器材的支持。同时感谢通信实验室得程老师,惠老师在毕业设计期间所给予我得帮助。在我毕业论文写作期间,各位老师给我提供了种种专业知识上的指导和日常生活上的关怀,没有您们这样的帮助和关怀,我不会这么顺利的完成毕业设计,借此机会,向您们表示由衷的感激。同时还要感谢系实验室在毕业设计期间提供给我们优越的实验条件。

接着,我要感谢课题组的各位同学,傅佳莉、李澄、余军和海洋。在毕业设计的短短3个月里,你们给我提出很多宝贵的意见,给了我不少帮助还有工作上的支持,在此也真诚的谢谢你们。

同时,我还要感谢我的寝室同学和身边的朋友,正是在这样一个团结友爱,相互促进的环境中,在和他们的相互帮助和启发中,才有我今天的小小收获。

最后我要深深地感谢我的家人,正是他们含辛茹苦地把我养育成人,在生活和学习上给予我无尽的爱、理解和支持,才使我时刻充满信心和勇气,克服成长路上的种种困难,顺利的完成大学学习。

还有许许多多给予我学业上鼓励和帮助的师长、朋友,在此无法一一列举,在此也一并表示忠心地感谢!

                                                     

参 考 文 献

 [1]  樊昌信,徐炳祥,吴成柯 通信原理,第五版,国防科技大学出版社,2003:206--217

[2]  王金明,杨吉斌 数字系统设计与Verilog HDL,电子工业出版社,2002:47—50

[3]  王军宁,吴成柯,数字信号处理器技术原理与开发应用,高等教育出版社,2003:207-253

[4]  第四届全国大学生设计竞赛获奖作品选编,北京理工大学出版社,2001

[5]  李朝青,单片机与DSP外围数字IC技术手册,北京航空航天大学出版社,2003

[6]  SST89E554RC Date Sheet , www.sst.com, 2004

[7]  74HC573 User’s Guide,www.icbase.com, 2003

[8]  74HC245 User’s Guide,www.icbase.com, 2003

[9]  余锡存,曹国华,单片机原理及接口技术,西安电子科技大学出版社,2001年

[10]  梁延贵,积分式A/D转换器其他专用集成电路分册,科学技术文献出版社,2002

[11]  BSL User’s Guide,www.sst.com, 2004

[12]  Keil Software Cx51 User’s Guide,www.mcustudy.com, 2003

[13]  徐爱均,彭秀华,Keil Cx51 V7.0单片机高级语言编程与uVision2应用实践,电子工业出版社,2004;6-15

[14]  求是科技,单片机典型模块设计实例导航,人民邮电出版社,2004:65-67

[15]  谢自美,电子线路设计实验测试,第二版,华中科技大学出版社,2002

[16]  沙占友,单片机外围电路设计,电子工业出版社,2003:105-187

[17]  姚天任,江太辉,数字信号处理第二版,华中科技大学出版社,2000

[18]  朱定华,戴汝平,单片微机原理与应用,清华大学出版社,2003:85-90

[19]  张伟,王力,赵晶,Protel DXP 入门与提高,人民邮电出版社,2003

[20]   赵亮,单片机C语言编程与时例,人民邮电出版社,2004  

附录(一)系统硬件图

附录(二)测试程序

#include "reg51.h"

#include "stdlib.h"

#include "absacc.h"

#define uchar unsigned char

#define uint unsigned int

sbit Beep = P3^4;

#define LCDNO XBYTE[0x9338]

#define LLCD1R XBYTE[0x9378]

#define LLCD1W XBYTE[0x9358]

#define LLCD0R XBYTE[0x9368]

#define LLCD0W XBYTE[0x9348]

#define RLCD1R XBYTE[0x93b8]

#define RLCD1W XBYTE[0x9398]

#define RLCD0R XBYTE[0x93a8]

#define RLCD0W XBYTE[0x9388]

#define LCD1R XBYTE[0x9308]

#define LCD1W XBYTE[0x9108]

#define LCD0R XBYTE[0x9208]

#define LCD0W XBYTE[0x9008]

#define KEY XBYTE[0x8008]

data uchar column; //定义列变量

bdata uchar read_dat,page;

sbit busy = read_dat^7;

sbit page_4 = page^4;

char code lcd_data0[16] = "testing the LCD!";

char code lcd_data1[16] = "     repeat   ";

uint count,value = 0;

uchar ref = 0;

uchar keyvalue;

void clear();

void DLCDInit();

void hanzi_disp();

void BeepOn(void);

void BeepOff(void);

void Cls(void);

void LCDInit(void);

void LCDDisp(char, char);

void delay(void);

/************************延时子程序********************/

void delay (void)

{

unsigned char i;

for(i = 2000 ; i > 0; i --);

}

void BeepOn(void)

{

Beep = 0;

}

void BeepOff(void)

{

Beep = 1;

}

/********************字符LCD 驱动**********************/

void Cls(void)

{

uint i;

LCD0W = 0x01;

for (i = 0; i < 500; i++);

}

void LCDInit(void)

{

int i;

LCD0W = 0x3C;

for (i = 0;i < 40; i++);

LCD0W = 0x06;

for (i = 0;i < 40; i++);

LCD0W = 0x0F;

for (i = 0;i < 40; i++);

LCD0W = 0x01;

for (i = 0;i < 500; i++);

}

void LCDDisp(char position, char c)

{

int i;

if ((position > 0) & (position < 33))

{

if (position > 16)

{

position += (0x40 - 17);

}

else

{

position--;

}

LCD0W = (position | 0x80);

for (i = 0;i < 40; i++);

LCD1W = c;

for (i = 0;i < 40; i++);

}

}

/*********************键盘驱动***********************/

void int1() interrupt 2

{

uint i;

uchar key_value;

key_value = KEY;

P1 = key_value;

switch(key_value)

{

case 0xfe:

key_value = 1;

break;

case 0xfd:

key_value = 2;

break;

case 0xfb:

key_value = 3;

break;

case 0xf7:

key_value = 4;

break;

case 0xef:

key_value = 5;

break;

default:

key_value = 0;

}

key_value = 0x30 + key_value;

Cls();

LCDDisp(1,key_value);

for(i = 0;i < 60000;i ++);

}

void InitSys(void)

{

EA = 1;

EX1 = 1;

IT1 = 1;

EX0 = 1;

IT0 = 1;

ET0 = 1;

TMOD = 0x11;

TR1 = 0;

TH1 = 0;

TL1 = 0;

}

void main(void)

{

uint i,j;

j = 0;

value = 0;

InitSys();

/* DLCDInit();

clear();

hanzi_disp();*/

LCDInit();

for(i = 0;i < 16;i ++)

{

LCDDisp(i+1,lcd_data0[i]);

}

for(i = 0;i < 16;i ++)

{

LCDDisp(i+17,lcd_data1[i]);

}

for(i = 0;i < 60000;i ++);

for(i = 0;i < 60000;i ++);

for(i = 0;i < 60000;i ++);

Cls();

while(1);

{

inquire_busy_left();          //起始行设置

send_dat_left(0xc0+j);

inquire_busy_right();

send_dat_right(0xc0+j);

j ++;

if(j == 64)

j = 0;

Cls();

LCDDisp(1,lcd_data0[1]);

P1 = 0x55;

for(i = 0;i < 30000;i ++);

P1 = 0xaa;

for(i = 0;i < 30000;i ++);

}

}

附录(三)语音系统程序

#include "reg51.h"

#include "stdlib.h"

#include "absacc.h"

#define uchar unsigned char

#define uint unsigned int

sbit Beep=P3^4;                      //设置T0为蜂鸣器的通道口

   sbit adc_busy=P3^5;                   //设置T1为ADC0809启动通道口

#define LCD1R XBYTE[0x9308]        //字符型LCD指令的读地址

#define LCD1W XBYTE[0x9108]       //字符型LCD数据的写地址

#define LCD0R XBYTE[0x9208]

#define LCD0W XBYTE[0x9008]

#define ADC0809  0xC008            //模数转换芯片ADC0809的端口地址

#define DAC0832  0xD008            //数模转换芯片DAC0832的端口地址

#define data62256 0x0000              //片外数据存储器芯片62256的端口地址

#define KEY XBYTE[0x8008]          //键盘的端口地址

char lcd_data_enter[18]=  "   please enter!";    //工作状态的选择     

char lcd_data_record1[16]="     recording!";    //正常录音提示字符

char lcd_data_record2[17]="   dpcm record!";    //录音后,对数据进行压缩存储提示字符

char lcd_data_play1[18]=  " common replay!";    //正常放音提示字符

char lcd_data_play2[18]=  "   dpcm replay!";    //解码后,放音提示字符

uchar key_value;

uint q;

uchar n;

void InitSys(void);                        //键盘驱动程序声明

void Cls(void);                           //清屏子程序声明

void LCDInit(void);                       //字符型LCD液晶显示驱动程序声明

void LCDDisp(char, char);                  //数据显示程序声明

// void delay(void);                        //延时子程序声明

/*

ADC0809_record1();                       //录音方式一

ADC0809_record2();                       //录音方式二,对采集的数据进行压缩编码

DAC0832_play1();                         //直接播放

DAC0832_play2();                         //对数据进行解码后播放

*/

/************************延时子程序********************/

/*

void delay (void)

{

unsigned char i;

for(i = 20 ; i > 0; i --);

}

void BeepOn(void)

{

Beep = 0;

}

void BeepOff(void)

{

Beep = 1;

}

*/

//**************************测试dac0832************************************

   void delay(uchar t)

{ while(t--);

}

//******************************清屏子程序**********************************

void Cls(void)  

{

uint i;

LCD0W = 0x01;                                // 清屏指令   将DB0位置1  

for(i=0;i<300;i++);             

}

// ***************************字符LCD驱动********************************

void LCDInit(void)

{

int i;

LCD0W = 0x3C;      //工作方式设置  DL=1表示8位数据接口, N=1表示两行显示 F=1表示5*10的点阵字符

for (i = 0;i <40; i++);       // 延时

LCD0W = 0x06;         //设置光标画面,移动方式  I/D=1表示数据读写操作后,AC自动增一,S=0表示数据读写操作后,画面不动  

for (i = 0;i <40; i++);   

LCD0W = 0x0F;         //设置显示,光标及闪烁开关

for (i = 0;i <40; i++);

LCD0W = 0x01;         //清屏

for (i = 0;i <40; i++);

}

// ************************************显示数据*******************************

void LCDDisp(char position, char c)     // position表示显示位置  c表示显示的字符串名

{

int i;

if ((position > 0) & (position < 33))      

{

if (position > 16)

{

position += (0x40 - 17);

}

else

{

position--;

}

LCD0W = (position | 0x80);       //读指令

for (i = 0;i < 40; i++);

LCD1W = c;                 //将待显示的数据存入LCD的DDRAM中,以便显示出来

for (i = 0;i <40; i++);

}

}

//键盘驱动程序

void InitSys(void)

{

EA = 1;                     //开中断

EX1 = 1;                    //允许INT1产生中断

IT1 = 1;                     //设置INT1的触发方式,IT1=1表示下降沿触发

}

//***************数字化语音存储与回放系统 主程序**************************

void main(void)

{ uint i,j;

  uchar n=1;                      //设置通道数 n=1表示对一个通道采?

  j=0;

  LCDInit();                      //启动字符型LCD液晶显示器

  Cls() ;

  for(i = 0;i <18;i ++)               //显示选择工作方式提示字符

  { 

  LCDDisp(i+14,lcd_data_enter[i]);   //显示提示符 please enter!

  for(j=0;j<2;j++);

  }

 // TMOD=0x01;

  InitSys();                       //启动键盘

   while(1)

  {}

}                       

void int1_jianpan() interrupt 2

{

uint i,j;

uchar temp;

key_value=KEY;

P1=key_value;

switch(key_value)

{  case 0xfe:                     //启动字符型LCD液晶显示器

Cls();                           //清屏

for(i = 0;i < 16;i ++)               // 提示选择录音方式一

  {

    LCDDisp(i+17,lcd_data_record1[i]);     //显示提示符 recording!

for(j=0;j<2;j++);

    }

                                      //启动ADC0809进行模数转换

    for(j=0;j<100;j++);

for(q=0;q<32797;q++)

   {

XBYTE[ADC0809]=n;                   //启动AD转换

  for(j=0;j<20;j++);

temp=XBYTE[ADC0809];

for(j=0;j<20;j++);

XBYTE[q]=temp;

  for(j=0;j<10;j++);

//如果n减为零,表示通道一已经采样完毕,返回

     ADC0809_record1();   */

 }

  break;

   case 0xfd:

  LCDInit();                             //启动字符型LCD液晶显示器

Cls();

for(i = 0;i < 17;i ++)                       //提示选择录音方式二,同时对数据进行压缩

  {

   LCDDisp(i+14,lcd_data_record2[i]);       //显示提示符 dpcm recording!

for(j=0;j<2;j++);

}

                               //启动ADC0809进行模数转换,然后进行数据压缩存储

for(j=0;j<100;j++);

ADC0809_record2();

  break;

case 0xfb:

Cls();

for(i = 0;i < 18;i ++)              // 提示选择直接进行播放

{

LCDDisp(i+14,lcd_data_play1[i]);  //显示提示符 common playing!

}

  for(j=0;j<100;j++);

i=j=30000;

  while(i--){

  saw();

  }

//启动DAC0832进行数模转换输出

  for(q=0;q<32767;q++)

  {  

    uchar temp;

   temp=XBYTE[q];            //将数据从片外RAM取出

   for(j=0;j<20;j++);

  XBYTE[DAC0832]=temp;      //送入DAC0832进行数模转换

    for(j=0;j<20;j++);    

//   DAC0832_play1();  

}    

break;

   case 0xf7:

LCDInit();                    //启动字符型LCD液晶显示器

Cls();

for(i = 0;i < 18;i ++)            //提示选择解码播放方式

{

LCDDisp(i+14,lcd_data_play2[i]);  //显示提示字符  dpcm playing!

for(j=0;j<2;j++);

}

for(j=0;j<100;j++);

                             //对数据进行解码后,启动DAC0832进行数模转换输出

DAC0832_play2();

  break;

}

}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

等天晴i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值