⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 speech.c

📁 利用SPCE061A单片机、SPR4096模组
💻 C
字号:
//========================================================
//	文件名称:	Speech.c
//	功能描述:	busbroadcast.spj工程播放语音的文件
//	维护记录:	2005-12-07	v1.0
//========================================================

#include "spce061a.h"
#include "S480.h"
#include "a2000.h"
#include "spr4096_user.h"
#include "key.h"

#define BASE_START_ADDRESS				0x0012
#define BASE_END_ADDRESS				0x0016
#define S480_HEAD						0x0030

//========================================================
//	语法格式:	void Delay(unsigned int uitime)
//	实现功能:	延时
//	参数:		延时时间
//	返回值:	无
//========================================================

void Delay(unsigned int uitime)
{
	while(uitime > 0)
	{
		uitime--;
		*P_Watchdog_Clear = 0x0001;
		*P_Watchdog_Clear = 0x0001;
		*P_Watchdog_Clear = 0x0001;
		*P_Watchdog_Clear = 0x0001;
		*P_Watchdog_Clear = 0x0001;
		*P_Watchdog_Clear = 0x0001;
		*P_Watchdog_Clear = 0x0001;
		*P_Watchdog_Clear = 0x0001;
		*P_Watchdog_Clear = 0x0001;
	}
}

//========================================================
//	语法格式:	void PlaySnd_S480(unsigned int SndIndex,unsigned int DAC_Channal)
//	实现功能:	S480放音函数
//	参数:		SndIndex:语音放音序号
//				DAC_Channal:选择DA通道
//	返回值:	无
//========================================================

void PlaySnd_S480(unsigned int SndIndex,unsigned int DAC_Channal)
{
	unsigned int uiStatus;				//语音播放状态
	unsigned int uiRet;					//语音资源数据
	unsigned int uiKey;					//键盘值

	unsigned long ulCon_AddrHighest;
	unsigned long ulCon_AddrHigh;
	unsigned long ulCon_AddrLow;
	unsigned long ulCon_AddrLowest;
	
	unsigned long ulCon_StartAddr;		//语音地址
	unsigned long ulCon_EndAddr;
	
	ulCon_AddrHighest = SP_SIOReadAByte(BASE_START_ADDRESS + SndIndex*12);	//第一个播放文件地址
	ulCon_AddrHighest = ulCon_AddrHighest << 24;
	ulCon_AddrHigh = SP_SIOReadAByte(BASE_START_ADDRESS + SndIndex*12 + 1);
	ulCon_AddrHigh = ulCon_AddrHigh << 16;
	ulCon_AddrLow = SP_SIOReadAByte(BASE_START_ADDRESS + SndIndex*12 + 2);
	ulCon_AddrLow = ulCon_AddrLow << 8;
	ulCon_AddrLowest = SP_SIOReadAByte(BASE_START_ADDRESS + SndIndex*12 + 3);
	
	ulCon_StartAddr = ulCon_AddrHighest | ulCon_AddrHigh
						| ulCon_AddrLow | ulCon_AddrLowest;
	ulCon_StartAddr = ulCon_StartAddr + S480_HEAD;							//如果有文件头,将文件头去掉

	ulCon_AddrHighest = SP_SIOReadAByte(BASE_END_ADDRESS + SndIndex*12);		
	ulCon_AddrHighest = ulCon_AddrHighest << 24;
	ulCon_AddrHigh = SP_SIOReadAByte(BASE_END_ADDRESS + SndIndex*12 + 1);
	ulCon_AddrHigh = ulCon_AddrHigh << 16;
	ulCon_AddrLow = SP_SIOReadAByte(BASE_END_ADDRESS + SndIndex*12 + 2);
	ulCon_AddrLow = ulCon_AddrLow << 8;
	ulCon_AddrLowest = SP_SIOReadAByte(BASE_END_ADDRESS + SndIndex*12 + 3);
	
	ulCon_EndAddr = ulCon_AddrHighest | ulCon_AddrHigh
						| ulCon_AddrLow | ulCon_AddrLowest;
	ulCon_EndAddr += 0x005f;		//结束地址,加入余量将声音播完整

	SACM_S480_Initial(0);
	SACM_S480_InitQueue();
	SACM_S480_InitDecoder(DAC_Channal);
	
	uiStatus = 1;
	
	while(uiStatus)
	{
		while(SACM_S480_TestQueue() != 1)
		{
			if(ulCon_StartAddr >= ulCon_EndAddr)
			{
				uiStatus = 0;
				break;
			}
			uiRet = SP_SIOReadAWord(ulCon_StartAddr);
			SACM_S480_FillQueue(uiRet);
			ulCon_StartAddr++;
			ulCon_StartAddr++;
		}
		if(uiStatus)
		{
			SACM_S480_Decoder();
		}
		else
		{
			SACM_S480_Stop();
		}
		uiKey = Key_Get();
		if(uiKey != 0)
		{
			uiStatus = 0;
			SACM_S480_Stop();
		}
		*(unsigned int *)0x7012 = 0x0001;
	}
}

//========================================================
//	语法格式:	void NextStation(unsigned int Num)
//	实现功能:	语音提示下一站
//	参数:		SndIndex:语音放音序号
//	返回值:	无
//========================================================

void NextStation(unsigned int Num)
{
	PlaySnd_S480(16,3);			//下一站
	if((Num == 16)||(Num == 0))
	{
		PlaySnd_S480(20,3);		//终点站
	}
	Delay(0xffff);				//延时,语句间的停顿
	PlaySnd_S480(Num + 25,3);	//站名
	Delay(0xffff);
	PlaySnd_S480(17,3);			//请下车的乘客带好物品
}

//========================================================
//	语法格式:	void ComingStation(unsigned int uiNum)
//	实现功能:	语音提示下一站
//	参数:		SndIndex:语音放音序号
//	返回值:	无
//========================================================

void ComingStation(unsigned int uiNum)
{
	PlaySnd_S480(69,3);
	Delay(0xffff);
	PlaySnd_S480(18,3);
	Delay(0xffff);
	PlaySnd_S480(uiNum + 25,3);
	PlaySnd_S480(19,3);
	Delay(0xffff);
	if((uiNum == 16)||(uiNum == 0))
	{
		PlaySnd_S480(21,3);			//再见
	}
}

//========================================================
//	语法格式:	void PlaySnd_A2000(unsigned int SndIndex,unsigned int DAC_Channal)
//	实现功能:	A2000放音函数
//	参数:		SndIndex:语音放音序号
//				DAC_Channal:选择DA通道
//	返回值:	无
//========================================================

void PlaySnd_A2000(unsigned int SndIndex,unsigned int DAC_Channal)
{
	unsigned int uiStatus;				// 语音播放状态
	unsigned int uiRet;					// 存储语音资源

	unsigned long ulCon_AddrHighest;	// 语音资源的最高字节地址
	unsigned long ulCon_AddrHigh;		// 语音资源的高字节地址
	unsigned long ulCon_AddrLow;		// 语音资源的低字节地址
	unsigned long ulCon_AddrLowest;		// 语音资源的最低字节地址
	unsigned long ulCon_EndAddr;		// 语音资源的末地址
	
	unsigned long ulCon_StartAddr;
	unsigned int uiKey;

	ulCon_AddrHighest = SP_SIOReadAByte(BASE_START_ADDRESS + SndIndex*12);	// 第一个播放文件地址
	ulCon_AddrHighest = ulCon_AddrHighest << 24;
	ulCon_AddrHigh = SP_SIOReadAByte(BASE_START_ADDRESS + SndIndex*12+1);
	ulCon_AddrHigh = ulCon_AddrHigh << 16;
	ulCon_AddrLow = SP_SIOReadAByte(BASE_START_ADDRESS + SndIndex*12+2);
	ulCon_AddrLow = ulCon_AddrLow << 8;
	ulCon_AddrLowest = SP_SIOReadAByte(BASE_START_ADDRESS + SndIndex*12+3);
	
	ulCon_StartAddr = ulCon_AddrHighest | ulCon_AddrHigh					// 开始地址
						| ulCon_AddrLow | ulCon_AddrLowest;

	ulCon_AddrHighest = SP_SIOReadAByte(BASE_END_ADDRESS + SndIndex*12);		
	ulCon_AddrHighest = ulCon_AddrHighest << 24;
	ulCon_AddrHigh = SP_SIOReadAByte(BASE_END_ADDRESS + SndIndex*12+1);
	ulCon_AddrHigh = ulCon_AddrHigh << 16;
	ulCon_AddrLow = SP_SIOReadAByte(BASE_END_ADDRESS + SndIndex*12+2);
	ulCon_AddrLow = ulCon_AddrLow << 8;
	ulCon_AddrLowest = SP_SIOReadAByte(BASE_END_ADDRESS + SndIndex*12+3);
	
	ulCon_EndAddr = ulCon_AddrHighest | ulCon_AddrHigh						// 结束地址
						| ulCon_AddrLow | ulCon_AddrLowest;
		
	SACM_A2000_Initial(0);							//初始化放音
	SACM_A2000_InitQueue();							//初始化队列
	SACM_A2000_InitDecoder(DAC_Channal);			//初始化解码

	uiStatus = 1;									//初始化放音状态
	
	while(uiStatus)
	{
		while(SACM_A2000_TestQueue() != 1)			//解码队列是否为空
		{
			if(ulCon_StartAddr >= ulCon_EndAddr)	//文件结束?
			{
				uiStatus = 0;						//如果文件结束,结束放音
				break;	
			}
			uiRet = SP_SIOReadAWord(ulCon_StartAddr);//取得语音资源
			SACM_A2000_FillQueue(uiRet);			//填充解码队列
			ulCon_StartAddr++;						//移动资源指针
			ulCon_StartAddr++;
		}
		if(uiStatus)								//解码
		{
			SACM_A2000_Decoder();
		}
		else										//停止放音
		{
			SACM_A2000_Stop();
		}
		uiKey = Key_Get();
		if(uiKey != 0)
			uiStatus = 0;
		*(unsigned int *)0x7012 = 0x0001;
		
	}
}

//========================================================
//	语法格式:	void Broadcast(unsigned int Num)
//	实现功能:	播放公交车整体线路
//	参数:		公交线路,本例只有一条
//	返回值:	无
//========================================================

void Broadcast(unsigned int Num)
{
	if(Num == 52)
	{
		PlaySnd_S480(22,3);		//欢迎乘坐52路公共汽车,本车沿途停靠
		Delay(0xffff);
		Delay(0xffff);
		Delay(0xffff);
		PlaySnd_S480(25,3);
		Delay(0xffff);
		Delay(0xffff);
		Delay(0xffff);
		PlaySnd_S480(26,3);
		Delay(0xffff);
		Delay(0xffff);
		Delay(0xffff);
		PlaySnd_S480(27,3);
		Delay(0xffff);
		Delay(0xffff);
		Delay(0xffff);
		PlaySnd_S480(28,3);
		Delay(0xffff);
		Delay(0xffff);
		Delay(0xffff);
		PlaySnd_S480(29,3);
		Delay(0xffff);
		Delay(0xffff);
		Delay(0xffff);
		PlaySnd_S480(30,3);
		Delay(0xffff);
		Delay(0xffff);
		Delay(0xffff);
		PlaySnd_S480(31,3);
		Delay(0xffff);
		Delay(0xffff);
		Delay(0xffff);
		PlaySnd_S480(32,3);
		Delay(0xffff);
		Delay(0xffff);
		Delay(0xffff);
		PlaySnd_S480(33,3);
		Delay(0xffff);
		Delay(0xffff);
		Delay(0xffff);
		PlaySnd_S480(34,3);
		Delay(0xffff);
		Delay(0xffff);
		Delay(0xffff);
		PlaySnd_S480(35,3);
		Delay(0xffff);
		Delay(0xffff);
		Delay(0xffff);
		PlaySnd_S480(36,3);
		Delay(0xffff);
		Delay(0xffff);
		Delay(0xffff);
		PlaySnd_S480(37,3);
		Delay(0xffff);
		Delay(0xffff);
		Delay(0xffff);
		PlaySnd_S480(38,3);
		Delay(0xffff);
		Delay(0xffff);
		Delay(0xffff);
		PlaySnd_S480(39,3);
		Delay(0xffff);
		Delay(0xffff);
		Delay(0xffff);
		PlaySnd_S480(40,3);
		Delay(0xffff);
		Delay(0xffff);
		Delay(0xffff);
		PlaySnd_S480(41,3);
		Delay(0xffff);
		Delay(0xffff);
		Delay(0xffff);
		PlaySnd_S480(23,3);
		PlaySnd_S480(24,3);
		PlaySnd_S480(67,3);
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -