语音录放源程序_第1页
语音录放源程序_第2页
语音录放源程序_第3页
语音录放源程序_第4页
语音录放源程序_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、/* SPI 操作ISD1760* SPI 操作ISD1760*/#include<SPI.H>uchar bdata SR0_L;uchar bdata SR0_H;uchar bdata SR1;uchar ID,APCL=0,APCH=0;/* 函数原型: void ISD_Init(void);* 功 能: 初始化*/void ISD_Init(void)ISD_Reset();doISD_PU();RdStatus();DogReset();while(SR0_L&0x01)|(!(SR1&0x01); /if(SR0_L0=1)system Err<

2、;CMD_Err=1>SBUF=RD_DevID();/读取芯片ID,1760 为0xa0ClrInt();ISD_WR_APC2(0xaf);RdAPC();/* 函数原型: void ISD_PU(void);* 功 能: 空间检查*/void ISD_CHK_MEM(void)ISD_SendData(CHK_MEM);ISD_SendData(0x00);SS=1;delay_ms(10);/* 函数原型: void ISD_PU(void);* 功 能: 上电 */void ISD_PU(void)ISD_SendData(PU);ISD_Sen

3、dData(0x00);SS=1;delay_ms(50);/* 函数原型: void ISD_Stop(void);* 功 能: 停止*/*void ISD_Stop(void)ISD_SendData(STOP);ISD_SendData(0x00);SS=1;delay_ms(50);/* 函数原型: void ISD_Reset(void);* 功 能: 复位*/void ISD_Reset(void)ISD_SendData(RESET);ISD_SendData(0x00);SS=1;delay_ms(50);/* 函数原型: void ISD_PD(void);* 功 能: 掉电

4、*/*void ISD_PD(void)ISD_SendData(PD);ISD_SendData(0x00);SS=1;/* 函数原型: void ISD_SendData(uchar BUF_ISD);* 功 能: 发送数据*/uchar ISD_SendData(uchar BUF_ISD)uchar i,dat=BUF_ISD;SCLK=1;SS=0;for(i=0;i<8;i+)SCLK=0;I_delay();if(dat&0x01)MOSI=1;elseMOSI=0;dat>>=1;if(MISO)dat|=0x80;SC

5、LK=1;I_delay();MOSI=0;/ SS=1;return(dat);/* 函数原型: void RdStatus(void);* 功 能: 读取状态*/void RdStatus(void)ISD_SendData(RD_STATUS);ISD_SendData(0x00);ISD_SendData(0x00);SS=1;delay_ms(10); /延迟10msSR0_L =ISD_SendData(RD_STATUS);SR0_H =ISD_SendData(0x00);SR1 =ISD_SendData(0x00);SS=1;delay_ms(10);/* 函数原型: vo

6、id RdStatus(void);* 功 能: 读取ID*/uchar RD_DevID(void)ISD_SendData(RD_DEVID);ISD_SendData(0x00);ISD_SendData(0x00);SS=1;delay_ms(10); /延迟10msSR0_L =ISD_SendData(RD_DEVID);SR0_H =ISD_SendData(0x00);ID =ISD_SendData(0x00);SS=1;delay_ms(10);return(ID);/* 函数原型: void RD_APC(void);* 功 能: 读取APC*/void RdAPC(vo

7、id)ISD_SendData(RD_APC);ISD_SendData(0x00);ISD_SendData(0x00);ISD_SendData(0x00);SS=1;delay_ms(10); /延迟10msSR0_L =ISD_SendData(RD_APC);SR0_H =ISD_SendData(0x00);APCL =ISD_SendData(0x00);APCH =ISD_SendData(0x00);SS=1;delay_ms(10); /延迟10ms/*SBUF=SR0_L;delay_ms(1);SBUF=SR0_H;delay_ms(1);SBUF=APCL;delay

8、_ms(1);SBUF=APCH;*/* 函数原型: void ClrInt(void);* 功 能: 清除中断*/void ClrInt(void)ISD_SendData(CLI_INT);ISD_SendData(0x00);SS=1;delay_ms(10); /延迟10ms/* 函数原型: void ISD_WR_APC2(uchar voiceValue);* 功 能: 设置APC2*/void ISD_WR_APC2(uchar voiceValue)ISD_SendData(WR_APC2);ISD_SendData(0xa8|voiceValue); /0xa8 声音最大,0

9、xaf 声音最小ISD_SendData(0x0c); /D11=1,在SETPLAY 模式下,执行到EOM 自动结束。或者在连续两个SET_PLAY 命令后,执行到第一个EOM 自动跳到第二段开始SS=1;delay_ms(10); /延迟10msISD_WR_NVCFG(); /永久写入寄存器/* 函数原型: void ISD_WR_NVCFG(void);* 功 能: 永久写入寄存器*/void ISD_WR_NVCFG(void)ISD_SendData(WR_NVCFG);ISD_SendData(0x00);SS=1;delay_ms(10); /延迟10ms/* 函数原型: vo

10、id GetToneAdd(uchar cNum, Uint * ipStartAdd, Uint * ipEndAdd);* 功 能: 取出当前语音的首末地址*/*void GetToneAdd(uchar cNum, uint * ipStartAdd, uint * ipEndAdd)*ipStartAdd=caToneAddcNum*2;*ipEndAdd=caToneAddcNum*2+1;/* 函数原型: void SetPLAY(uchar cNum);* 功 能: 定点播放*/void SetPLAY(uchar cNum)uint Add_ST, Add_ED;uchar A

11、dd_ST_H, Add_ST_L, Add_ED_H, Add_ED_L;doRdStatus();DogReset();while(SR0_L&0x01)|(!(SR1&0x01); /if(SR0_L0=1)system Err<CMD_Err=1>ClrInt();GetToneAdd(cNum, &Add_ST, &Add_ED);Add_ST_L=(uchar)(Add_ST&0x00ff);Add_ST_H=(uchar)(Add_ST>>8)&0x00ff);Add_ED_L=(uchar)(Add_ED&

12、amp;0x00ff);Add_ED_H=(uchar)(Add_ST>>8)&0x00ff);/*delay_ms(1);SBUF=Add_ST_L;delay_ms(1);SBUF=Add_ST_H;delay_ms(1);SBUF=Add_ED_L;delay_ms(1);SBUF=Add_ED_H;delay_ms(1);*/ISD_SendData(SET_PLAY);ISD_SendData(0x00);ISD_SendData(Add_ST_L); /S7:S0 开始地址ISD_SendData(Add_ST_H); /S10:S8ISD_SendData(A

13、dd_ED_L); /E7:E0 结束地址ISD_SendData(Add_ED_H); /E10:E8ISD_SendData(0x00);SS=1;delay_ms(10); /延迟10msdoRdStatus();DogReset();while(SR0_L&0x01)|(SR1&0x04); /if(SR0_L0=1)system Err<CMD_Err=1>/* 函数原型: void SetREC(uchar cNum);* 功 能: 定点录音*/void SetREC(uchar cNum)uint Add_ST, Add_ED;uchar Add_ST

14、_H, Add_ST_L, Add_ED_H, Add_ED_L;doRdStatus();DogReset();while(SR0_L&0x01)|(!(SR1&0x01); /if(SR0_L0=1)system Err<CMD_Err=1>ClrInt();GetToneAdd(cNum, &Add_ST, &Add_ED);Add_ST_L=(uchar)(Add_ST&0x00ff);Add_ST_H=(uchar)(Add_ST>>8)&0x00ff);Add_ED_L=(uchar)(Add_ED&0

15、x00ff);Add_ED_H=(uchar)(Add_ST>>8)&0x00ff);ISD_SendData(SET_REC);ISD_SendData(0x00);ISD_SendData(Add_ST_L); /S7:S0 开始地址ISD_SendData(Add_ST_H); /S10:S8ISD_SendData(Add_ED_L); /E7:E0 结束地址ISD_SendData(Add_ED_H); /E10:E8ISD_SendData(0x00);SS=1;delay_ms(10); /延迟10msdoRdStatus();DogReset();/ whi

16、le(SR0_L&0x01)|(SR1&0x08); /if(SR0_L0=1)system Err<CMD_Err=1>while(SR0_L&0x01)|(!(SR1&0x01); /if(SR0_L0=1)system Err<CMD_Err=1>/* 函数原型: void SetERASE(uchar cNum);* 功 能: 定点删除,容易破坏存储结构(CMA),所以不用*/*void SetERASE(uchar cNum)uchar Add_ST_H, Add_ST_L, Add_ED_H, Add_ED_L;Add_ST_

17、L=(uchar)(Add_ST&0xff);Add_ST_H=(uchar)(Add_ST>>8);Add_ED_L=(uchar)(Add_ED&0xff);Add_ED_H=(uchar)(Add_ED>>8);ISD_SendData(SET_ERASE);ISD_SendData(0x00);ISD_SendData(Add_ST_L); /S7:S0 开始地址ISD_SendData(Add_ST_H); /S10:S8ISD_SendData(Add_ED_L); /E7:E0 结束地址ISD_SendData(Add_ED_H); /E1

18、0:E8ISD_SendData(0x00);/ SS=1;/ delay_ms(120);/* 函数原型: void Erase_All(void);* 功 能: 全部删除*/void Erase_All(void)ISD_SendData(G_ERASE);ISD_SendData(0x00);SS=1;delay_ms(100); /延迟10ms/* END* END*/以下是SPI.H#ifndef _SPIEX_#define _SPIEX_#include<STC89C58.h>#include "typedef.h"#define PU 0x01#

19、define STOP 0x02#define RESET 0x03#define CLI_INT 0x04#define RD_STATUS 0x05#define RD_PLAY_PTR 0x06#define PD 0x07#define RD_REC_PTR 0x08#define RD_DEVID 0x09#define G_ERASE 0x43#define RD_APC 0x44#define WR_APC1 0x45#define WR_APC2 0x65#define WR_NVCFG 0x46#define CHK_MEM 0x49#define SET_PLAY 0x80

20、#define SET_REC 0x81#define SET_ERASE 0x82#define HIGH 1#define LOW 0/*#define RIGHT 1#define ERROR 0/#define SET_BIT(x,y) (x|=(1<<y) /x 的y 位置1/#define CLR_BIT(x,y) (x&=(1<<y) /清x 的y 位/#define GET_BIT(x,y) (x&(1<<y) /读x 的y 位/*/SR0_L 0 1 2 3 4 5 6 7/ CMD_Err FULL PU EOM INT

21、A0 A1 A2/SR0_H 8 9 10 11 12 13 14 15/ A3 A4 A5 A6 A7 A8 A9 A10/SR1 0 1 2 3 4 5 6 7/ RDY ERASE PLAY REC SE1 SE2 SE3 SE4/APC 0 1 2 3 4 5 6 7/ VOL0 VOL1 VOL2 MON_IN MIX_IN SE_EDIT SPI_FT AUD/AUX(AUD 线路输出,AUX 直接驱动喇叭)/APC 8 9 10 11/ PWM_SPK PU_AO VALERT EOM_EN(在SETPLAY 模式下,置1 遇到EOM 则结束,否则继续播放)*/*sbit INT

22、_1700 = SR0_L4;sbit EOM = SR0_L3;sbit PU_1700 = SR0_L2;sbit FULL = SR0_L1;sbit CMD_ERR = SR0_L0;sbit REC_1700 = SR13;sbit PLAY_1700 = SR12;sbit ERASE_1700 = SR11;sbit RDY = SR10;*/sbit SS = P43;sbit SCLK = P42;sbit MOSI = P41;sbit MISO = P40;extern void I_delay(void);extern void delay_ms(register ui

23、nt Count);extern void DogReset(void) reentrant;/* 函数原型: void GetToneAdd(uchar cNum, Uint * ipStartAdd, Uint * ipEndAdd);* 功 能: 取出当前语音的首末地址*/void GetToneAdd(uchar cNum, uint * ipStartAdd, uint * ipEndAdd);/* 函数原型: void ISD_Init(void);* 功 能: 初始化*/void ISD_Init(void);/* 函数原型: void ISD_PU(void);* 功 能: 上

24、电*/void ISD_CHK_MEM(void);/* 函数原型: void ISD_Up(void);* 功 能: 上电*/void ISD_PU(void);/* 函数原型: void ISD_Stop(void);* 功 能: 停止*/void ISD_Stop(void);/* 函数原型: void ISD_Reset(void);* 功 能: 复位*/void ISD_Reset(void);/* 函数原型: void ISD_PD(void);* 功 能: 掉电*/void ISD_PD(void);/* 函数原型: void ISD_SendData(uchar BUF_ISD

25、);* 功 能: 发送数据*/uchar ISD_SendData(uchar BUF_ISD);/* 函数原型: void RdStatus(void);* 功 能: 读取状态*/void RdStatus(void);/* 函数原型: void RdStatus(void);* 功 能: 读取ID*/uchar RD_DevID(void);/* 函数原型: void RD_APC(void);* 功 能: 读取APC*/void RdAPC(void);/* 函数原型: void ClrInt(void);* 功 能: 清除中断*/void ClrInt(void);/* 函数原型: v

26、oid ISD_WR_APC2(uchar voiceValue);* 功 能: WR_APC2*/void ISD_WR_APC2(uchar voiceValue);/* 函数原型: void ISD_WR_NVCFG(void);* 功 能: 永久写入寄存器*/void ISD_WR_NVCFG(void);/* 函数原型: void SetPLAY(uchar cNum);* 功 能: 定点播放*/void SetPLAY(uchar cNum);/* 函数原型: void SetREC(uchar cNum);* 功 能: 定点录音*/void SetREC(uchar cNum);

27、/* 函数原型: void SetERASE(uchar cNum);* 功 能: 定点删除*/*void SetERASE(uchar cNum);/* 函数原型: void Erase_All(void);* 功 能: 全部删除*/void Erase_All(void);/* END* END*/#endif 李佳旭,丁鹏飞 (西安电子科技大学电子工程学院,陕西 西安 )0 引言语音费额显示器是用于普通和高速公路收费车道向应缴费车辆和人员显示车型及收费金额等信息的一种机电设备。通常安装于收费车道出入口的侧部,可显示车型、金额、余额及汉字信息等,同时具有通行指示、语音提示等功能。本文以SS

28、T89V58单片机和语音芯片ISD1760为核心,给出了一种语音费额显示器的设计方法。1 语音芯片ISDl760简介ISDl760是华邦公司新推出的单片优质语音录放电路ISDl700系列芯片中的一款。该芯片可用来替代已经停产的ISD2560芯片。用户可利用振荡电阻来自已设定芯片的采样频率,从而决定芯片的录放时间(40120 s)和录放音质(412kHz)。相比过去的ISD2560芯片,ISDl760在功能上集成了录放功能,并增加了一些更加人性化的提示功能以及对存储空间的精确操作功能,而且音质也有了明显的提高。ISDl760芯片提供的多项新功能包括内置多信息管理系统、新信息提示(vAlert)、

29、双运作模式(独立模式和SPI模式)以及可定制的信息操作指示音效等。芯片内部包含有自动增益控制、麦克风前置扩大器、扬声器驱动线路、振荡器与内存等全方位整合系统功能。此外,该芯片还具有专利技术的模拟处理存储方式,且录放音质极佳,背景噪音很小,语音内容保存时间长且不易丢失。非常适用于公路收费站和公交车等场合进行语音播报。ISDl760有独立模式和SPI模式两种工作模式。本系统采用SPI工作模式,其中单片机为主机,ISDl760作为从机。主控单片机主要通过四线(SCLK,MOSI,MISO,SS)SPI协议来与ISDl760挂行串行通信,而且几乎所有的操作都可以通过SPI协议来完成。2 语音费额显示器

30、的硬件设计一个语音费额显示系统可由主控制模块、存储模块、语音模块、功放模块,串口通信模块、驱动模块和显示模块等模块组成,其主控系统框图如图1所示。费额显示器的通信命令来源于收费系统的车道控制计算机。计算机可将根据车型、轴载重量、行驶公里数、计费标准等数学计算公式得到的最终数据,通过串口发送给费额显示器的RS-232通信芯片,再由RS-232通信芯片将数据输入单片机进行处理。单片机处理后的数据可分两路输出,其中一路输出至解码、驱动芯片,以用于驱动数码管的费额显示;另一路则输出奎语音芯片,以用于进行同步语音报价。由于本系统采用的是2MB的串行FLASH芯片SST25LF020A来存储字库内容,故可

31、采用带有SPI接口的SST89V58单片机作为主控制芯片,并使用模拟SPI方式与ISD1760进行串行通信。单片机上具有IO功能的四个管脚可分别与ISDl760上的SCLK、MOSI、MISO和SS连接;ISDl760的ROSC端可用一个80 k的电阻接地,即设置的采样频率为8 kHz。该采样率下的最大录放音时间为60 s;SP+、SP-端外接TDA2009A组成的功率放大电路可实现播报语音的音量控制。TDA2009A是双路音频功率放大器,它具有过热保护电路,而且外接元件少,安装简单。费额显示器的语音播报内容主要包括播报欢迎词、车型、收费金额、车重、警报音等。本系统使用ISD1700语音编程拷

32、贝机将录制好的语音分段录制到语音芯片中。另外,通过语音编程拷贝机也可以很方便地读取每段语音信息的开始和结束地址,并可进行多片芯片语音信息的拷贝。在语音录制过程中,需要注意的问题首先是在烧录语音前应检查电脑声卡驱动,应保证有驱动并且最新,最好将声卡声音输出设置中的喇叭组态设置为耳机,输出音量大小设置到三分之二的状态;其次是在烧录语音时,电脑除了运行烧录语音的程序外,将其它的应用软件(如杀毒软件等)关闭,以保证没有噪音混入;最后,在烧录语音芯片结束后,可循环播放试听一下,如果对音质不满意,可使用Goldwave或者Adobe Audition等音频编辑软件再对语音文件进行编辑,已达到满意的效果。3 软件程序设计语音费额显示器的系统软件要实现的任务是处理收费亭中收费计算机发送的串行通信数据,完成相应的显示功能并进行语音播报。其中的语音处理程序主要判断是否需要播报语音信息,以及找到相应语音信息的存储地址,播报制定段语音。其系统程序流程图如图2所示。下面是模拟SPI发送数据子程序和播放

温馨提示

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

评论

0/150

提交评论