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

📄 demo232.c

📁 用AMBE-1000语音压缩芯片来做窄带无线语音传输的源码
💻 C
字号:
/*

#define LOOPBACK	如果想本地回放,不能注释掉此定义
#define PARALLEL  0
南京梧桐 11:27:06
这个定义,放开是并行工作方式
南京梧桐 11:27:17
注释掉是串行工作方式

*/














#include "Demo232.h"
#define PARALLEL
#define LOOPBACK								//如果想本地回放,不能注释掉此定义

HIBYTE pFrameData[34];

BYTE nRXD_STATE = STATE_RXD_IDLE;
BYTE pRXBUF[8];
BYTE nRxByteCnt;
BOOL bReceived = 0;

main()
{
	BYTE nI;

	DISABLE;

#ifdef PARALLEL

	PS1_SDO = 0;
	PS2_SOCK = 0;	
#else
	PS2_SOCK = 0;
	PS1_SDO = 1;
	PRD_SOSTRB = 1;
	P0 = 0;
#endif

	//Reset AMBE1000
	_AMBERST = 0;
	for(nI = 0; nI < 100; nI++)	Delay15uS();
	_AMBERST = 1;

	pFrameData[0] = 0x13;
	pFrameData[1] = 0xec;
	for(nI = 2; nI < 34; nI++)
	{
		pFrameData[nI] = 0;
	}

	Uart_Initial();

	ES = 1;
	ENABLE;

	
#ifdef PARALLEL
	while(1)
	{
		while(!EPR);
		AMBEReadParallel();

		TXData();

		while(!DPE);

		AMBEWriteParallel();
	}
#else
	while(1)
	{
		while(!EPR);
		//if(EPR)
		AMBEReadSerial();

		while(!DPE);
		//if(DPE)
		AMBEWriteSerial();
	}
#endif

}

void AMBEReadParallel(void)
{
	BYTE nI;
	P0 = 0xFF;	
	for(nI = 0; nI < 34; nI++)
	{
		PRD_SOSTRB = 0;
		pFrameData[nI]= P0;
		PRD_SOSTRB = 1;
		Delay15uS();//大于350个AMBE1000的时钟周期
	}
}

void AMBEWriteParallel(void)
{
	BYTE nI;
	P0 = 0x00;
	#ifdef LOOPBACK

	for(nI = 0; nI < 34; nI++)
	{
		P0 = pFrameData[nI];
		PWR_SISTRB = 0;
		PWR_SISTRB = 1;
		Delay15uS();//大于350个AMBE1000的时钟周期
	}

	#else

	if(bReceived)
	{
		DISABLE;
		for(nI = 0; nI < 6; nI++)
		pFrameData[nI+10] = pRXBUF[nI];
		bReceived =0;
	
		ENABLE;

		for(nI = 0; nI < 34; nI++)
		{
			P0 = pFrameData[nI];
			PWR_SISTRB = 0;
			PWR_SISTRB = 1;
			Delay15uS();//大于350个AMBE1000的时钟周期
		}
	}
	#endif
}


void AMBEReadSerial(void)
{
	BYTE nI, nK ,nTemp;
	for(nI = 0; nI < 17; nI ++)
	{
		PRD_SOSTRB = 0;
		nTemp = 0;//xFF;
		for(nK = 0; nK < 8; nK ++)
		{
			PS2_SOCK = 1;
			if(PS1_SDO == 1) Sfr_Bit_Set(nTemp,7-nK);
			PS2_SOCK = 0;
		}
		pFrameData[2*nI] = nTemp;
		PRD_SOSTRB = 1;
		nTemp = 0;
		for(nK = 0; nK < 8; nK ++)
		{
			PS2_SOCK = 1;
			if(PS1_SDO == 1) Sfr_Bit_Set(nTemp,7-nK);
			PS2_SOCK = 0;
		}
		pFrameData[2*nI+1] = nTemp;
		Delay15uS();//大于350个AMBE1000的时钟周期
	}
}


void AMBEWriteSerial(void)
{
	BYTE nI, nK ,nTemp;
	for(nI = 0; nI < 17; nI++)
 	{
		PWR_SISTRB = 0;
		//Delay();
		SICK = 0;
		SICK = 1;
		nTemp = pFrameData[2*nI];
		for(nK = 0; nK <=7; nK++)
		{
			SICK = 0;
			SDI = Sfr_Bit_Test_True(nTemp ,7-nK);
			SICK = 1;
		}
		PWR_SISTRB = 1;
		nTemp = pFrameData[2*nI+1];
		for(nK = 0; nK <=7; nK++)
		{
			SICK = 0;
			SDI = Sfr_Bit_Test_True(nTemp ,7-nK);
			SICK = 1;
		}
		Delay15uS();//大于350个AMBE1000的时钟周期
	}	
}


//P89C51  24Mhz
void Delay15uS(void)
{
	_nop_();_nop_();_nop_();_nop_();_nop_();
	_nop_();_nop_();_nop_();_nop_();_nop_();
	_nop_();_nop_();_nop_();_nop_();_nop_();
	_nop_();_nop_();_nop_();_nop_();_nop_();
	_nop_();_nop_();_nop_();_nop_();_nop_();
	_nop_();_nop_();_nop_();_nop_();_nop_();

}	

void Uart_Initial(void)
{
	//Mode 1 ,Receive Enable
	SCON = 0x50;
	//Mode 3 ,Receive Enable

//	SCON = 0xD0;
	//SMOD = 1
	PCON = 0x80;
	//T0 T1 Mode 2(8bit auto reload Timer)
	TMOD = 0x22;
	
//	PCON = 0x00;//9600BPS
//	SM2 = 1;
//	TB8 = 1;
	
	//19200BPS 22.1184MHz Crystal
	TL1 = 0xFA;
	TH1 = 0xFA;
	
//	TL1 = 0xFB;
//	TH1 = 0xFB;	
	bReceived = 0;

	TR1 = 1;
}

void TXData(void)
{
	BYTE nI;
	SBUF = 0x13;
	while(!TI);
	TI = 0;
	SBUF = 0xEC;
	while(!TI);
	TI = 0;

	for(nI = 0; nI < 6; nI++)
	{
		SBUF = pFrameData[nI+10];
		while(!TI);
		TI = 0;
	}

}

//AMBE1000:2.4kbps 
//Head:0x13ec
//Packet:Head + 6 Bytes Voice Data

void Uart_INTService(void) interrupt INTERRUPT_UART
{

	BYTE nRxData;
	//if(TI == 1) return;

	if(RI == 1)
	{
		RI = 0;
		if(bReceived) return;

		nRxData = SBUF;

		switch(nRXD_STATE)
		{	
			case STATE_RXD_IDLE:
			{
				if (nRxData == 0x13) //Head
				{
					nRXD_STATE = STATE_RXD_HEAD; 
					nRxByteCnt = 0;		
				}
				break;
			}
			case STATE_RXD_HEAD:
			{
				if (nRxData == 0xEC) //Head
				{
					nRXD_STATE = STATE_RXD_DATA; 
					nRxByteCnt = 0;		
				}
				else
				{
					nRXD_STATE = STATE_RXD_IDLE; 
					nRxByteCnt = 0;		
				}
				break;
			}

			case STATE_RXD_DATA: //Voice Data
			{		
			
				pRXBUF[nRxByteCnt] = nRxData;	
				nRxByteCnt ++;
				if(nRxByteCnt == 6)
				{
					nRxByteCnt = 0;
					bReceived = 1;
					nRXD_STATE = STATE_RXD_IDLE;
				}
			break;
			}
			default: break;
		}
	}
}

⌨️ 快捷键说明

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