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

📄 soundintel.c.bak

📁 一个完整的用用AVR单片机开发的电话交换机程序 希望对想学习AVR开发人有帮助
💻 BAK
📖 第 1 页 / 共 2 页
字号:
/***************************************************************************
//Actpro International (SZ) Ltd
//Project :
//File		:SoundInTel.c												Compiler:Keil
//Editor: LIUYI
//Data:		25-12-29										 				Ver:
//General Function


*/
#include <switch.h>

#define CD_1  0
#define CD_0  1

void 	SoundInTelInit();
void	ConnectTowPoint(UCHAR point_x,UCHAR point_y);
void	CutTowPoint(UCHAR point_x,UCHAR point_y);
void	DecordDTMF();
void  StarDecordDTMF(UCHAR	SingleAddress);
void	ReleaseDTMFRes(UCHAR originresID);
UCHAR GetDTMFResNum(UCHAR originresID);
void	ConnectTowPoint_CD22100(UCHAR x,UCHAR y);
void	CutTowPoint_CD22100(UCHAR x,UCHAR y);
void  DTMFSend();
void	WriteHintSound(UCHAR tel,UCHAR state,UCHAR num);
UCHAR	ReadHintSound(UCHAR tel,UCHAR state);
void	DealHintSound();
void  SetExtTelQuietSound(UCHAR telnum);
void  SetExtTelErrorSound(UCHAR telnum);
void  SetExtTelWaitSound(UCHAR telnum);
UCHAR	ReadHintSound(UCHAR tel,UCHAR item);
void	WriteHintSound(UCHAR tel,UCHAR item,UCHAR num);

xdata	UCHAR	EXTTelHintSound[ExtTelNum][4]									_at_  0x200;//存储提示音的类型 typ、state、timeh、timel
xdata	UCHAR	DTMF_Decord[DTMF_DecordResouceNum][15]				_at_	0x220;//DTMF解码资源
						//DTMF_DecordResouceNum=2; 5:State(1) SoundInput(1) length(1) data(12)	
xdata	UCHAR	soundway[16][8]																_at_	0x240;//8816语音通路状态
						//x(16)	y(8)						
UCHAR	ReadDTMF_Decord(UCHAR res,UCHAR item);
void	WriteDTMF_Decord(UCHAR res,UCHAR item,UCHAR num);
UCHAR	Readsoundway(UCHAR x,UCHAR y);
void	Writesoundway(UCHAR x,UCHAR y,UCHAR num);
void	SoundWayLoop(void);

idata	UCHAR	DTMFSendStep;
idata	UCHAR	DTMFData;
idata	UCHAR	DTMFStandingTime;						 
						
void SoundInTelInit()
{
	idata UCHAR i,j;
	
	//cut all connection
	for(i=0;i<16;i++)
		{
			for(j=0;j<8;j++)
				{
					Readsoundway(i,j);
					Writesoundway(i,j,0);
				}
		}		
		
	//cut all connection in CD22100
	for(i=1;i<5;i++)
		{
			for(j=1;j<5;j++)
				{
					CutTowPoint_CD22100(i,j);
				}
		}	
	
	//data init
	for(i=0;i<DTMF_DecordResouceNum;i++)
		{
			for(j=0;j<15;j++)
				{
					ReadDTMF_Decord(i,j);
					WriteDTMF_Decord(i,j,0);
				}
		}
	
	DTMFSendStep=0;	
	DTMFData=0;	
	DTMFStandingTime=0;	
}

void	Writesoundway(UCHAR x,UCHAR y,UCHAR num)
{
	PORT_STORE=PORT;
	RCON=RCON_Bank2;

	soundway[x][y]=num;
	
	RCON=RCON_Bank0;
	PORT=PORT_STORE;	
	return;
}
UCHAR	Readsoundway(UCHAR x,UCHAR y)
{
	idata UCHAR temp;
	
	PORT_STORE=PORT;
	RCON=RCON_Bank2;
	
	temp=soundway[x][y];
	
	RCON=RCON_Bank0;
	PORT=PORT_STORE;
	
	return(temp);
}

void	WriteDTMF_Decord(UCHAR res,UCHAR item,UCHAR num)
{
	PORT_STORE=PORT;
	RCON=RCON_Bank2;

	DTMF_Decord[res][item]=num;
	
	RCON=RCON_Bank0;
	PORT=PORT_STORE;	
	return;
}
UCHAR	ReadDTMF_Decord(UCHAR res,UCHAR item)
{
	idata UCHAR temp;
	
	PORT_STORE=PORT;
	RCON=RCON_Bank2;
	
	temp=DTMF_Decord[res][item];
	
	RCON=RCON_Bank0;
	PORT=PORT_STORE;
	
	return(temp);
}


void	WriteHintSound(UCHAR tel,UCHAR item,UCHAR num)
{
	PORT_STORE=PORT;
	RCON=RCON_Bank2;

	EXTTelHintSound[tel][item]=num;
	
	RCON=RCON_Bank0;
	PORT=PORT_STORE;	
	return;
}
UCHAR	ReadHintSound(UCHAR tel,UCHAR item)
{
	idata UCHAR temp;
	
	PORT_STORE=PORT;
	RCON=RCON_Bank2;
	
	temp=EXTTelHintSound[tel][item];
	
	RCON=RCON_Bank0;
	PORT=PORT_STORE;
	
	return(temp);
}

void SetExtTelWaitSound(UCHAR telnum)
{
	WriteHintSound(telnum,TYPE,HintSoundType_wait);
	WriteHintSound(telnum,STATE,STATE_ON);					//450提示音接通状态
	WriteHintSound(telnum,TIMEH,0);									//时间设置
	WriteHintSound(telnum,TIMEL,0);
	Writesoundway(telnum,HINTSOUND,ON);							//接通通道
		//将分机设置为等待提示音状态
}

void SetExtTelErrorSound(UCHAR telnum)
{
	WriteHintSound(telnum,TYPE,HintSoundType_error);
	WriteHintSound(telnum,STATE,STATE_ON);					//450提示音接通状态
	WriteHintSound(telnum,TIMEH,0);									//时间设置
	WriteHintSound(telnum,TIMEL,0);
	Writesoundway(telnum,HINTSOUND,ON);							//接通通道	
		//将分机设置为错误提示音状态		
}

void SetExtTelQuietSound(UCHAR telnum)
{
	WriteHintSound(telnum,TYPE,HintSoundType_quiet);
	WriteHintSound(telnum,STATE,STATE_OFF);							//450提示音关闭状态
	WriteHintSound(telnum,TIMEH,0);	
	WriteHintSound(telnum,TIMEL,0);
	Writesoundway(telnum,HINTSOUND,OFF);	
		//将分机设置为正常状态,无提示音
}

void	DealHintSound()	//每2MS调用一次
{	
	idata UCHAR i;
	idata	WORD	temp;
	
	for(i=0;i<ExtTelNum;i++)
		{
			if(ReadHintSound(i,TYPE)==HintSoundType_error)
				{//错误提示音
					temp=ReadHintSound(i,TIMEH);
					temp=(temp<<8)+ReadHintSound(i,TIMEL);
					if(temp<HintSound_350MS)
						{//时间还没有达到
							temp++;
							WriteHintSound(i,TIMEH,(temp>>8));
							WriteHintSound(i,TIMEL,(temp));
						}
					else
						{//时间已经达到
							WriteHintSound(i,TIMEH,0);	
							WriteHintSound(i,TIMEL,0);							
							if(ReadHintSound(i,STATE)==STATE_ON)	//状态翻转
								{//断开状态
									WriteHintSound(i,STATE,STATE_OFF);
									Writesoundway(i,HINTSOUND,ON);										
								}
							else
								{//接通状态
									WriteHintSound(i,STATE,STATE_ON);
									Writesoundway(i,HINTSOUND,OFF);
								}	
						}
				}
				
			if(ReadHintSound(i,TYPE)==HintSoundType_wait)
				{//等待提示音
					temp=ReadHintSound(i,TIMEH);
					temp=(temp<<8)+ReadHintSound(i,TIMEL);		
					if(ReadHintSound(i,STATE)==STATE_ON)	//状态翻转
						{//由 接通状态 到 断开状态
							if(temp<HintSound_1S)
								{//时间还没有达到
									temp++;
									WriteHintSound(i,TIMEH,(temp>>8));
									WriteHintSound(i,TIMEL,(temp));
								}
							else	
								{
									WriteHintSound(i,TIMEH,0);	
									WriteHintSound(i,TIMEL,0);
									WriteHintSound(i,STATE,STATE_OFF);
									Writesoundway(i,HINTSOUND,OFF);				
								}
						}		
					else
						{//由 断开状态 到 接通状态
							if(temp<HintSound_4S)
								{//时间还没有达到4S
									temp++;
									WriteHintSound(i,TIMEH,(temp>>8));
									WriteHintSound(i,TIMEL,(temp));
								}
							else	
								{
									WriteHintSound(i,TIMEH,0);	
									WriteHintSound(i,TIMEL,0);
									WriteHintSound(i,STATE,STATE_ON);
									Writesoundway(i,HINTSOUND,ON);				
								}							
						}		
				}				
		}
}

void	SoundWayLoop(void)
{
	idata UCHAR i,j;
	for(i=0;i<16;i++)
		{
			for(j=0;j<8;j++)
				{
					if(Readsoundway(i,j)==OFF)
						{CutTowPoint(i,j);}			//关断状态
					else if(Readsoundway(i,j)==ON)
						{ConnectTowPoint(i,j);}	//连通状态
					else
						{Writesoundway(i,j,OFF);}	//出错状态 ,关闭通道
				}
		}
}

void	ConnectTowPoint(UCHAR point_x,UCHAR point_y)
{
	idata	UCHAR	address,x,y;
	
	address=0x00;						
	x=point_x&0x0f;
	y=point_y&0x07;
	
	address=address<<3;
	address=address|y;
	address=address<<4;
	address=address|x;	
	address=address|0x80;		//connect

	PORT=address;
	SoundSwitchStorbe=0;	
	SoundSwitchStorbe=1;
	SoundSwitchStorbe=0;	

	PORT=0xff;
}


void	CutTowPoint(UCHAR point_x,UCHAR point_y)
{
	idata	UCHAR	address,x,y;

	address=0x00;						
	x=point_x&0x0f;
	y=point_y&0x07;
	
	address=address<<3;
	address=address|y;	
	address=address<<4;
	address=address|x;
	address=address&0x7f;		//cut

	PORT=address;
	SoundSwitchStorbe=0;	
	SoundSwitchStorbe=1;
	SoundSwitchStorbe=0;	
	
	PORT=0xff;	
}

void StarDecordDTMF(UCHAR	SingleAddress)
{
	idata UCHAR i,temp;
	//查找是否有解码资源
	for(i=0;i<DTMF_DecordResouceNum;i++)
		{
			if(ReadDTMF_Decord(i,dtmfdecord_state)==0)
				{//找到空闲的解码芯片		//连接输入信号			
					 switch(i)
						 	{

⌨️ 快捷键说明

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