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

📄 main.c

📁 凌阳单片机A2000格式 语音播放程序
💻 C
字号:
#include "a2000.h"

#define		SPEECH_1		1
#define		DAC1			1
#define		DAC2			2
#define		Ramp_UpDn_Off	0
#define		Ramp_UpDn_On	3
#define		Manual			0
#define		Auto			1
#define		Full			1
#define		Empty			2



#include"bit.h"
#include"hardware.h"

#define P_INT_Ctrl_New          (volatile unsigned int *)0x702D 
#define P_INT_Ctrl         (volatile unsigned int *)0x7010 
#define P_INT_Clear         (volatile unsigned int *)0x7011 
#define P_IOA_RL         (volatile unsigned int *)0x7004 
#define P_SystemClock         (volatile unsigned int *)0x7013
#define P_Timebase_Setup         (volatile unsigned int *)0x700e

//声明子函数
void change(void);
void show(void);
void delay(void);
int music(void);
//定义全局变量
int hour;									//后台数据存储单元
int hourbcd1,hourbcd2;						//数码管编码
int shang,yushu;							//定义商,余数寄存器,及时保存结果,以避免重复做除法浪费资源。
int bianma[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};		//数码管编码

//主函数
//****************************************************************************************************************
int main()
	{
//	*P_SystemClock=0x98;
	*P_Timebase_Setup=0x04;	//		0x04_256hz							
	//初始化端口
	p1_dir_highbyte=0xff;				//数码管的片选端口初始化
	p1_attrib_highbyte=0xff;
	p1_highbyte=0x00;
	p1_dir_lowbyte=0xff;				//初始化数码管编码输出口,无数据反相器输出
	p1_attrib_lowbyte=0xff;
	p1_lowbyte=0x00;	

										//初始化数值	
	hour=0;
	change();	
	*P_INT_Ctrl=0x0005;
	__asm("irq on");

	music();
	*P_SystemClock=0x3;//恢复初始化
	
	*P_INT_Ctrl=0x0005;
	__asm("irq on");
	while(1)
		{
		watchdog_clear=1;
		}
	}




void IRQ5(void) __attribute__ ((ISR));     //计时
void IRQ5(void)
{
	__asm("irq off");
	if(*P_INT_Ctrl==0x0004)
	{*P_INT_Clear=0x0004;
	hour++;
	if(hour==100) hour=00;
	watchdog_clear=1;//
	change();
	watchdog_clear=1;
	}
	if(*P_INT_Ctrl==0x0008)
	{*P_INT_Clear=0x0008;
	}
	__asm("irq on");


}
void IRQ6(void) __attribute__ ((ISR));  
void IRQ6(void)
{
	__asm("irq off");
	if(*P_INT_Ctrl==0x0001)
	{*P_INT_Clear=0x0001;
	show();watchdog_clear=1;}
	if(*P_INT_Ctrl==0x0002)
	{*P_INT_Clear=0x0002;}
	__asm("irq on");
	

}


//**********************************子函数****************************************

void change()								//译码
	{
	watchdog_clear=1;	
	shang=hour/10,yushu=hour%10;
	hourbcd1=bianma[shang],hourbcd2=bianma[yushu];
	
	}

void show()
	{
		
		p1_highbyte=0x04;	//片选第3位数码管
		p1_lowbyte=hourbcd1;//扫描编码
			delay();			//延时
		p1_highbyte=0x08;	//片选第4位数码管
		p1_lowbyte=hourbcd2;//扫描编码
			delay();			//延时
		p1_lowbyte=0;		//清屏
	}

void delay()
	{int i;
	for(i=0;i<0x24;i++)
			watchdog_clear=1;	
	}




extern   RES_A32_16K_A20_SA;//首地址
extern   RES_A32_16K_A20_EA;
int music(){
	int iMode;
	int iAddr;
	int iRet;
	iMode =  Manual;
	iAddr = RES_A32_16K_A20_SA;             //送入语音队列的首址
	if(iMode == 	Manual)					//采用非自动方式播放
    {	
	   		    
	   SACM_A2000_Initial(iMode);			//非自动方式播放的初始化,来自sacmv25.lib
       SACM_A2000_InitDecoder(DAC1);		//开始对A2000的语音数据以非自动方式解码 ,来自sacmv25.lib	  
      while(1)
	  {
	  if(SACM_A2000_TestQueue()!=Full)      //测试并获取语音队列的状态,来自sacmv25.lib
		{
		iRet =SP_GetResource(iAddr);        //从资源文件里获取一个字型语音数据,来自sacmv25.lib
	    SACM_A2000_FillQueue(iRet);         //获取语音编码数据并填入语音队列等候解码,来自sacmv25.lib
	    iAddr++;
    	}
        if(iAddr< RES_A32_16K_A20_EA )	    //如果该段语音未播完,即未到达末地址时
            SACM_A2000_Decoder();			//获取资源并进行解码,再通过中断服务子程序送入DAC通道播放,来自sacmv25.lib
        else{
           SACM_A2000_InitDecoder(DAC1);	//否则,开始对A2000的语音数据以非自动方式解码 ,  来自sacmv25.lib
           iAddr = RES_A32_16K_A20_SA;      //送入语音队列的首址
        }
     }  
   }
}

⌨️ 快捷键说明

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