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

📄 dtmf.c

📁 单片机音频通信9170和9200接收发送源程序
💻 C
字号:
//*****************************************************************
//
//dtmf信号检测
//输入:Dv,P0低四位
//输出:FDataUserReceived,CommandUser
//*****************************************************************
sbit Dv	    =P2^5;
sbit D0	    =P2^0;
sbit D1	    =P2^1;
sbit D2	    =P2^2;
sbit D3	    =P2^3;

sbit Clk	 =P3^4;
sbit Data	 =P2^5;
sbit Cs9200	 =P3^3;

bit FDataUserReceived;
bit DataRxFlag1;
bit RxTempOkFlag;
bit RxSucessFlag;
bit AllowReadFlag;

uint RxOkTime;
uint RxfirstToSecondTime;
uint DvErrorCount;
uint  ReceiveTimes;

uchar RxfirstData;
uchar RxSecondData;
uchar RxThirdData;
uchar RxTempData;
uchar FDataUserTran;
uchar FDataUserTraning;
uchar DataUserTrang;
uchar FDataUserTraningDelay;
uchar DataUserTraningDelay;
uchar FDataBusUserBusy=0;
uchar DataUserTraningDelay;

union Command
{
  uint u16;
  struct{uchar hi;uchar lo;}u8;
};

union Command CommandUser;

union Command CommandUserTran;


void ReceiveData(void) using 2
{	
   unsigned char TxTempData1;	
   unsigned char i;
   P2=0xff;
   i=P2&0x10; 
   CommandUser.u8.hi=0xff;
   CommandUser.u8.lo=0xff;
   TxTempData1=P2;
   if(FDataUserReceived) return;
	if(i)
	{   
		i=0;						   
		DvErrorCount=0; 
		TxTempData1=P2;      
		if(RxTempData==(TxTempData1&0x0f))
		{	 
			RxTempData=(TxTempData1&0x0f);				
			if(++RxOkTime>50)RxOkTime=20;
			if((RxOkTime>6)&&AllowReadFlag)		//时间都大于30ms
			{						
				RxOkTime=1;	
				AllowReadFlag=0;		 			//保持时间
				if(RxTempOkFlag)
				{
					ReceiveTimes=0;
                    			CommandUser.u8.hi=(RxfirstData<<4)&0xf0;
					CommandUser.u8.hi=CommandUser.u8.hi|(RxSecondData&0x0f);
					CommandUser.u8.lo=(RxThirdData<<4)&0xf0;
					CommandUser.u8.lo=CommandUser.u8.lo|(RxTempData&0x0f);
					RxTempOkFlag=0;
					RxSucessFlag=1;	
					FDataUserReceived=1;	
				}
				else
				{	
					if(ReceiveTimes==2)
					{
						RxThirdData=RxTempData;
						RxfirstToSecondTime=0;						
						RxTempOkFlag=1;
						RxOkTime=0;
						DataRxFlag1=1; 							
					}

					if(ReceiveTimes==1)
					{
						RxSecondData=RxTempData;
						ReceiveTimes++;
						RxfirstToSecondTime=0;
						RxOkTime=0;
						DataRxFlag1=1;	
					}
					if(ReceiveTimes==0)
					{
						RxfirstData=RxTempData;
						RxfirstToSecondTime=0;
						ReceiveTimes++;
						RxOkTime=0;
						DataRxFlag1=1;											
					}
				}
			} 
		}
		else
		{	
	     		RxTempData=(TxTempData1&0x0f);
		 	RxOkTime=0;	
		}
	}
	else
	{	
	    if(DvErrorCount>4)
		{
		 AllowReadFlag=1;
		}
		if(DvErrorCount>80)
		{
		 DvErrorCount=0;
		 DataRxFlag1=0;
		 RxOkTime=0;
		 RxTempData=0;
		 ReceiveTimes=0;
		}
		else
		{
		 DvErrorCount++;
		}		
	}
	if(RxTempOkFlag)
	{	
		if(RxfirstToSecondTime++>500)
		{
			RxTempOkFlag=0;
			DvErrorCount=0;
			ReceiveTimes=0;
		}		
	}	
}



//*****************************************************************
//
//向用户发送命令
//输入:FDataUserTran,CommandUserTran
//
//*****************************************************************

void DataUserTran(void)
{
	uchar x;
	if(FDataUserTran)
	{ 
	  if((!FDataUserTraning)&(!FDataBusUserBusy))
		{   
		   	EA=0;	
            Delay(10);  
			FDataUserTran=0;
			FDataUserTraning=1;
            Cs9200=1;	//sent
			Delay(100);
			x=(CommandUserTran.u8.hi>>4)&0x0f;
			DtmfGenerater(x);
			Delay(120);
			Cs9200=0;
			Delay(30);
			Cs9200=1;	//sent
			Delay(80);
			x=(CommandUserTran.u8.hi&0x0f);
			DtmfGenerater(x);
			Delay(120);
			Cs9200=0;
			Delay(30);
			Cs9200=1;	//sent
			Delay(80);
			x=(CommandUserTran.u8.lo>>4)&0x0f; 
			DtmfGenerater(x);
			Delay(120);
			Cs9200=0;
			Delay(30);
			Cs9200=1;
			Delay(80);
			x=(CommandUserTran.u8.lo&0x0f);
			DtmfGenerater(x);
			Delay(100);
			Cs9200=0;
        	Delay(50);
            EA=1;
            Delay(100);
			DataUserTraningDelay=10;
			FDataUserTraningDelay=1;
			
		}
	}
}

//*****************************************************************
//
//双音频信号发送
//
//*****************************************************************	

void DtmfGenerater(uchar a)
{
	uchar i;
	for(i=5;i!=0;i--)
	{
		Data=(bit)(a&0x01);
		Clk=1;
		_nop_();
		_nop_();
		_nop_();
		Clk=0;
		a=a>>1;
		Clk=1;
	}
}

//*****************************************************************
//
//延时
//
//*****************************************************************	
void Delay(uint number)
{
	uchar temp;
	for(;number!=0;number--,WatchDog=!WatchDog)
	{	for(temp=112;temp!=0;temp--) {;}	}
}

⌨️ 快捷键说明

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