ame初始化

/*AMBE-1000 AMBE-1000 Serial Interrupt Programming (C语言)
Author: 			tsp语音芯片 
The openning date:	2006.10.20日 
The closing date:	2006.11.16日 
Function: 没有串口传输握手协议,串口中断接收,编码好之后马上串口发送,串口发送波特率19200
*/
//****************************************************************************//
//             the Area of Header                                             //
//********************************************************//
#include <at89x51.h>				/*关于寄存器、位的定义*/
#include <absacc.h>				/*绝对地址访问,如XBYTE[0x0fff0]*/
#include <intrins.h>					/*内部函数调用,如_nop_() 、_crol_()、cror();*/
#include <defnum.h>							/*自定义的数据类型,如uchar 、uint */
//******************************************//
//              the Definition of Constant                                         //
//***************************************************************//
//帧格式ID号
#define VOICE_DATA     0x00 //语音帧
#define RATE_CONFIG    0x01 //码率设置帧
#define VOLUME_CONFIG  0x02 //音量设置帧
#define SPECIAL_CONFIG 0x03 //特殊功能设置帧
#define POWER_CONFIG   0x04 //电源模式设置帧
#define DUAL_TONE      0x06 //双音频信号产生帧
#define WAKE_UP	       0xFE //唤醒帧
//帧头位置定义

#define HEADER_H   0	//第零字节帧头标志
#define HEADER_L   1	//第一字节
#define ID 	   2		//帧ID号	
#define CONTROL_0  3	//控制字0
#define CONTROL_1H 4    //控制字1低位
#define CONTROL_1L 5    //控制字1高位
#define CONTROL_2H 6	//控制字2低位
#define CONTROL_2L 7	//控制字2高位
#define CONTROL_3H 8	//控制字3低位
#define CONTROL_3L 9	//控制字3高位
#define OFF        0	//LED灯熄灭

sbit AMBE_BPSSEL0 = P0^0;		//码率选择BPS_SEL
sbit AMBE_BPSSEL1 = P0^1;
sbit AMBE_BPSSEL2 = P0^2;
sbit AMBE_BPSSEL3 = P0^3;
sbit AMBE_H_STOPN  	= P0^4;		
sbit AMBE_CSEL2  	= P0^5;			//AD/DA选择 CSEL
sbit AMBE_SLEEP_EN  = P0^6;
sbit AMBE_SLIP_EN   = P0^7;		

sbit AMBE_READ_STRB  = P2^0;		//输出选通信号-- 下降沿可以输出第一个数据
sbit AMBE_WRITE_STRB = P2^1;		//输入选通信号-- 下降沿可以输入第一个数据
sbit AMBE_DPE        = P2^2;		//解码包空指示--  单片机可以开始发送数据!
sbit AMBE_EPR        = P2^3;		//编码包准备好指示--  单片机可以开始取数据!

sbit MC5480_UASEL 	= P2^5;			//5480uA选择,1为u律,0为A律
sbit AMBE_VAD_EN   	= P2^6;
sbit AMBE_ECHO_EN  	= P2^7;			//特殊功能选择

sbit AMBE_RESET   = P3^7;			//AMBE复位端

sbit LED1 = P3^3;					//指示灯
sbit LED2 = P3^4;
sbit LED3 = P3^5;

sfr ALE=0x8e;                       //关闭ALE端口
//*************************************************************//
//	          the Definition of Globality                                      //
//*******************************************************************//
uchar bdata flag2=0;
sbit  serial_ok=flag2^0;
sbit  sync=flag2^1;

uchar  data   count;
uchar  data   data_send_buffer[34]; //串口数据发送缓冲区
uchar  data   data_rec_buffer[34];  //串口数据接收缓冲区
//*********************************************************************//
//		the Program of Delay                                            //
//********************************************//
void delay(uchar i)  //延时子程序
{
	uchar j;
	while(i--)
	{
		for(j=0;j<2;j++)
		{;
		}//4us*2=8us
	}
}
//	the Initializtion of System                                         //
//***************************************//
void MCU_Serial_Init(void)//MCU串口初始化
{
    SCON  = 0x50;       //SCON: serail mode 1, 8-bit UART, enable ucvr 
    TMOD  = 0x20;       //TMOD: timer 1, mode 2, 8-bit reload 
    PCON  = SMOD_;      //SMOD=1;波特率翻倍 
    TH1   = 0xfd;       //Baud:19200  fosc=11.0592MHz 
    TL1   = 0xfd;
    IE   |= 0x90;       //Enable Serial Interrupt 
    TR1   = 1;          // timer 1 run 
}
/********************************************************************/
/*	  系统初始化程序 函数原型:void system_ini(void) 	    		*/
/*	  功能:完成中断、定时器、外设等硬软件的初始化     	    		*/
/********************************************************************/
void System_Init(void)
{
	/*--------开机自检------*/
	delay(10);
	P0  = 0x0FF;
	P1  = 0x0FF;
	P2  = 0x0FF;
	P3  = 0x0FF;
	ALE = 0x0FF;	
	LED1 = LED2 = LED3 = OFF;  
	count=0;
	serial_ok=0;
	MCU_Serial_Init();  
}
void AMBE_1000_Init(void)
{
	/*     =====  A/D D/A 选择配置表  ======
	       	u律   A律  16位线性
	C_SEL2   0     1      1
	C_SEL1	 0     0      1
	C_SEL0   0     0      1
	*/
	AMBE_CSEL2 = 0;			//AMBE_CSEL1,0硬件电路固定为0 
 	MC5480_UASEL = 1;		//MC5480 u/A律选择
	delay(10);
	/* 	       =====   信道接口配置表   ========
	帧格式: 并行被动  并行主动   串行主动	串行被动
	CH_SEL2     0         0  	 	0         0
	CH_SEL1     0	      0		 	1	   	  1
	CH_SEL0     0	      1         0         1 
	非帧格式:串行被动1 串行被动2 串行被动3  串行被动4 
	CH_SEL2     1          1  	      1          1
	CH_SEL1     0	       0		  1	         1
	CH_SEL0     0	       1          0          1 
	硬件电路固定设为:并行被动 帧模式	*/
	/*		======  码率设置配置表 (单位bps) ========
			     2400bps	 |     3600bps     | 4000bps |            4800bps
2400(0)  2350(50)|3600(0) 3350(250)|3750(250)|4800(0) 4550(250) 3600(1200) 2550(2250)
	BP_SEL3    0     0  |  0      1     |   1     |  0     0       0       1
	BP_SEL2    0	  1  |  0      0     |   1     |  0     1       0		  0 
	BP_SEL1    0	  0  |  0      0     |   1     |  1     1       1		  0	 
	BP_SEL0    0	  1  |  1      1     |   0     |  1	  1        0      0			 6400bps  |  7200bps  |       8000bps       |   9600bps
			4150(2250)| 4400(2800)|7750(250) 4650(3350) | 9600(0) 4850(4750) 
	BP_SEL3	   1	  |     1     |  1         1        |    0      0       
	BP_SEL2	   0	  |     0     |  1         1        |    1      1       
	BP_SEL1	   1	  |     0     |  0         0        |    0      1      
	BP_SEL0	   0	  |     1     |  0         1        |    0      0 	 
	*/
	AMBE_BPSSEL0 = 0;		//码率选择为2400bps
	AMBE_BPSSEL1 = 0;
	AMBE_BPSSEL2 = 0;
	AMBE_BPSSEL3 = 0;
	
	/*      ======     特殊功能配置表  ========
	                功能		    使能     禁止
	SLEEP_EN     标准睡眠     	     1        0
	SLIP_EN     时钟滑动控制     	 1        0
	VAD_EN      语音活动检测      	 1        0
	ECHO_EN      回波消除     	     1        0
	*/
	AMBE_SLEEP_EN  	= 0;
	AMBE_SLIP_EN   	= 0;		
	AMBE_VAD_EN   	= 0;
	AMBE_ECHO_EN  	= 0;		
	AMBE_H_STOPN	= 1;//硬件睡眠关
	delay(5);

	AMBE_RESET = 1;	//AMBE复位
	delay(100);
	AMBE_RESET = 0;
	delay(255);	delay(255);	delay(255);
	AMBE_RESET = 1;
	AMBE_READ_STRB  = 1;	//读写选通复位
	AMBE_WRITE_STRB = 1;
}
//******************************************//
//	the T1 Interruption Handle Programming                               //
//*******************************************//
void SerialInterruptHandle(void) interrupt 4 using 3 
{
	if(RI)
    {	
		uchar ch;
        RI = 0;
        ch=SBUF;
			switch(count)
			{
				case 0:
						if(ch==0x13)
						{
							data_rec_buffer[count]=ch;
							count++;			
						}
						else	count=0;
				break;
				case 1:
						if(ch==0xec)
						{
							data_rec_buffer[count]=ch;
							count++;			
						}
						else	count=0;
				break;
				default:
						data_rec_buffer[count+8]=ch;
						count++;
				break;
			}
			if(count>=8)
			{
				count=0;
			}
	}
}
//**************************************************************//
//		the Program of Parallel Input and Output                                //
//**********************************************************//
void parellel_read(uchar input_data[])
{
	uchar i;
	for(i=0;i<34;i++)
	{
		AMBE_READ_STRB = 0; 	//开始读入数据
		input_data[i] = P1;		//从AMBE1000读入数据到缓冲区
		AMBE_READ_STRB = 1;		
	}
	delay(10);
}	
void parellel_write(uchar output_data[])
{		
	uchar i;
	for(i=0;i<34;i++)
	{
		AMBE_WRITE_STRB = 0; 		//开始写入数据
		P1 = output_data[i];		//从缓冲区写数据到AMBE1000
		AMBE_WRITE_STRB = 1;		
	}
	delay(10);
}     
//**********************************************************//
//		the Program of MAIN                                            //
//********************************************//
void main(void)		/*---   main函数 ----  */
{
	uchar  data  i=0;
	System_Init();			// 调用系统初始化程序
	AMBE_1000_Init();		//AMBE1000初始化程序
	while(1)		
	{
		if(AMBE_EPR==1)   	//编码包准备好,AMBE可以向外发送数据
		{
			parellel_read( data_send_buffer );
	    	for(i=0; i<2; i++ )			//=======发送帧头数据到另一单片机====
	       	{
	        	SBUF = data_send_buffer[i];   	//发送一个数据
	        	while(TI == 0 );
	        	TI = 0;				
	        }
	    	for(i=10; i<16; i++ )	//=======发送语音数据到另一单片机====
	       	{//2.4Kbps码率时,编码后只有2400bps/50帧=6个字节的有效数据
	        	SBUF = data_send_buffer[i];   	//发送一个数据
	        	while(TI == 0 );
	        	TI = 0;				
	        }
	       	LED1 =~LED1;						//指示编码,传输成功
		}
		if(AMBE_DPE==1)							
		{
			parellel_write( data_rec_buffer );	
			LED2 =~LED2;						//指示解码成功
		}
	}//while end
}//main end

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值