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

📄 allsubfun.c

📁 用户可以在远端利用固定电话或移动电话发送DTMF双音多频信号,实现对近端电器设备的远程控制。
💻 C
字号:
#include <allseting.h>

/*******************全局变量*************************/

uint  count ;                                                 /*全局计数变量*/ 

uchar mimasave[5]   ={0,0,0,0,0};							 /*密码最大为10位*/
uchar mimain[5] ={0,0,0,0,0};
uchar mimatemp[5] = {0,0,0,0,0};

uchar lingcount ;											 /*铃声次数*/

static uchar isd[16] = {ISD0,ISD1,ISD2,ISD3,ISD4,ISD5,
ISD6,ISD7,ISD8,ISD9,ISD10,ISD11,ISD12,ISD13,ISD14,ISD15};   /*isd语音段*/

uint jiadian[3] = {0,0,0};									/*家电定时计数*/
uchar  flagding[3] = {0,0,0};

/****************中断设置***************************/

void intset()
{

	TMOD = 0x21 ;		   /*定时器0方式1  定时器1方式2*/

   	TH0 = 0x3C ;		   /*定时器0 50MS定时*/
	TL0 = 0xB0 ;
	
	TH1 = 0xF3 ;		   /*红外线载波*/
	TL1 = 0xF3 ;
	
		
	EA = 1  ;				/*开全局中断*/

	ET1 = 1 ;				/*开定时器1中断*/

	ET0 = 1 ;	       		/*开定时器0中断*/
	TR0 = 1 ;				/*启动T0  */
	
	EX1 = 1 ;				/*开外部中断1*/
	IT1 = 1 ;				/*下跳沿中断*/

	PT0 = 1 ;				/*定时0 高优先级*/
}

/********************delay**************************/

void delay(uint time)								   /*延时程序*/
{
  while(time--)
   _nop_();
}

/***********************红外发射********************/

void basesend(void) interrupt 3
{
	 REDSEND = ~REDSEND; 
}

void sendcode(uchar redcode)
{
   uchar i ;

   for (i = 0 ; i < 8 ; i++)
   {	
   		TH0 = 0 ;
		TL0 = 0 ;
		TR1 = 1 ;

		while(!(TH0 >= 0x02 && TL0 >= 0x30))	/*0.56ms*/
		;

		TR1 = 0 ;
		REDSEND = 0 ;
   		if( (redcode>>i) & 0x01 )
			{
				while(!(TH0 >= 0x08 && TL0 >=0xCA ));   /*再等到2.25ms*/	
			}
			else
			{
				while(!(TH0 >= 0x04 && TL0 >= 0x65));  /*再等到1.125ms*/	
			}
   }
}


void hongsend(uchar reddata)
{
	
	  
	   ET0 = 0 ;
	   EX1 = 0 ;

	   TH0 = 0 ;
	   TL0 = 0 ;
	   TR0 = 1 ;

	   TR1 = 1;

	   /************引导码**********************/
	   while(!(TH0 >=0x23 && TL0 >= 0x28)) ;	/*9ms*/
	   	
	   TR1 = 0 ;
	   REDSEND = 0 ;
	   while(!(TH0 >= 0x34 && TL0 >= 0xBC ));   /*再过4.5ms*/
	   
	   /*****************送码*******************/
	   sendcode(REDUSER);
	   sendcode(~REDUSER);
	   sendcode(reddata);
	   sendcode(~reddata);
	   
	   TH0 = 0 ;
	   TL0 = 0 ;
	   TR1 = 1 ;
	   	while(!(TH0 >= 0x02 && TL0 >= 0x30))	/*0.56ms结束脉冲*/
		;
	   TR1 = 0 ;
	   
	   TH0 = 0x3C ;		   /*定时器0 50MS定时*/
	   TL0 = 0xB0 ;
	   TR0 = 1;

	   ET0 = 1;
	   EX1 = 1;
	   REDSEND = 0 ;
	   delay(10000);	
	        
}



/******************* 全局时钟 **********************/


void resettime(void)
{
	EA = 1  ;				/*开全局中断*/
  	count = 0 ;
	
	TMOD = 0x21 ;		   /*定时器0方式1  定时器1方式2*/

   	TH0 = 0x3C ;		   /*定时器0 50MS定时*/
	TL0 = 0xB0 ;
	ET0 = 1 ;	       		/*开定时器0中断*/
	TR0 = 1 ;				/*启动T0  */
	PT0 = 1 ;				/*定时0 高优先级*/
}

void stoptime(void)
{
	TR0 = 0 ;
}

void int50ms(void) interrupt 1 
{
		uchar i ;
		TH0 = 0x3C ;
	    TL0 = 0xB0 ;
		count++ ;
		

	 for(i = 0 ; i < 3 ; i++)						/*检测家电定时时间到*/
	 {
	 	if(jiadian[i] == 0xffff ) continue;

		if(jiadian[i] == 0)
			{
				if(flagding[i] == 0 ) 	continue;
				 switch(i)
				 {
				 	case  0 : CONTROL0 = 0;
					hongsend(3);
					break;
					case  1 : CONTROL1 = 0;
					hongsend(4);
					break;
					case  2 : CONTROL2 = 0;
					hongsend(5);
					break;

				 }
			   flagding[i] = 0 ;
			}
		else jiadian[i] = jiadian[i] - 1 ;
	  }
}



/*******************系统初始化**********************/

void systeminit(void)
{

	GETCALL = 0 ;	  			/*挂机*/

	isdinit();		  			/*语音芯片初始化*/
	intset();		  			/*中断初始化*/

	MTTEST = 1 ;	   			/*等待8870输入*/
	KEYOK;			   			/*等待本地键盘*/


	LEDCON  = 0;	   			/*关LED*/

	REDSEND = 0 ;				/*关红外*/
	
	r24c01(0x06,&lingcount,1);	/*取振铃次数*/
	inithome();		  			/*家电初始化*/       
		          	
}

/******************* 铃声检测 **********************/

void waitring(void)				/*等待振铃*/
{	
	uchar ling ;

	ling = 0 ;
	RINGTEST = 1 ;
	resettime();

	while(ling < lingcount)					   /*n次铃声*/
	{
		while(RINGTEST == 1 )				   /*4s断*/
		{
		  if(count > 400 )					   /*未达到要求次数用户已挂机*/
		  {
		  	resettime();
			ling = 0 ;
		  }
		}	
					  
		delay(1000);

		if(RINGTEST == 0 )				   
			ling++;		
		while(RINGTEST == 0 );				   /*1s通*/
		
		resettime();							  
						   			
 	}

	   GETCALL = 1 ;	                       /*摘机*/
 		
}
/********************铃声次数*********************/

uchar lingchang(void)
{
	uchar temp;
	uchar temp2;
	temp2 = 0 ;

	while( (temp = get8870()) != MTJ )
	{
		if(temp == 16)
			return 3;

		if(temp == MT0)
			temp = 0 ;

		if(temp > 10)
			{
				 isdplay(14, 1);
				 return 0;
			}

		temp2 = temp2*10 + temp;

		if( temp2 > 20 )
		   {
		   	  isdplay(14, 1);
			  return 0 ;
		   }
	}

	lingcount =  temp2;
	w24c01(0x06,&lingcount,1);
	isdplay(13,1);
	return 1 ;
}			


/******************* 8870 捕获*********************/


uchar  get8870(void)
{	 
	bit flag ;
	flag = 0 ;

	MTTEST = 1 ;
	
	resettime();
						/*检测上升沿*/
	SETMTDATAPORT ;
	
	 
	while(MTTEST == 1 )				   
	;
	while(MTTEST == 0 )
	 	{	
			if(count > 400 )
				{	flag = 1  ;		 /*20s超时挂机*/
					break ;
				}
		}

	if(flag) return 16 ;
			
	return  MTDATA;
}

uchar isdwait8870()
{
	uchar temp ;
	temp = get8870();
	stopisd();
	return temp;
}			


/******************* ISD 2560 *********************/



void isdinit(void)
{
	ISDCE  = 1 ;
	ISDPR  = 1 ;
	ISDEOM = 1 ;
 	ISDPD  = 1  ;	   /*不启动*/
	
	return ;
}


void isdplay(uchar num,bit wait)
{	
	ISDPD = 0 ;
	ISDPR = 1 ;
	ISDCE = 1 ;
	ISDSEND(isd[num]);
	delay(5);
	ISDCE = 0 ;
	delay(50000);
	ISDCE = 1 ;					 
	ISDEOM = 1 ;

	if(wait)
	{
	while(ISDEOM == 1 ) 
	;
   
	while(ISDEOM == 0 )
	 ;					
	}
	return ;
}

void isdrecord(void)
{	
	bit over;
	over = 0 ;
	ISDPD = 1 ;
	delay(10000);               /*10ms复位*/
	ISDPD = 0 ;

	ISDCE = 1 ;
	ISDSEND(ISD15);
	ISDPR = 0 ;
	delay(5);
	ISDCE = 0 ;

	resettime();
	SETMTDATAPORT;

	for(;;)							  /*按0#结束录音*/
	{
		if(MTDATA == MT0 )
			{
				while(MTDATA == MT0 )
					{
						if(count > 300)
							goto end;
					 }

				 if( count > 40 || count < 3 )
				 {
					break;
				 }
				 else 
				 {
				 	if(MTDATA == MTJ)
						goto end;
				 }
			}

		if(count > 300)
			break;
	}


end:ISDCE = 1 ;
	ISDPR = 1 ;
	
	ISDPD = 1 ;
	delay(10000);               /*10ms复位*/
	ISDPD = 0 ;
}

void stoprecord()
{
	ISDCE = 1 ;
	ISDPR = 1 ;
}
void stopisd(void)
{
 	ISDPD = 1 ;
	delay(1000);               /*1ms*/
}

/******************* 24C01读写**********************/

void w24c01(uchar adress,uchar * byte,uchar num)   /*写入多个字节*/
{
	while(num--)
	{
		Start_I2c();
		SendByte(AT24C01A);
		SendByte(adress);
		SendByte(*byte);
		Stop_I2c();
		delay(10000);
		byte++;
		adress++ ;
	}	
}

void r24c01(uchar adress,uchar * byte,uchar num)   /*读入多个字节*/
{
	while(num--)
	{
		Start_I2c();
		SendByte(AT24C01A);
		SendByte(adress);

		Start_I2c();
		SendByte(AT24C01A+1);
		*(byte) = RcvByte();
		Ack_I2c(1);		
		Stop_I2c();
		byte++ ;
		adress++ ;
	}		
}
/************************密码检查***********************/

bit getmima(uchar * where)						   /*获取密码输入*/
{
	uchar i,j,temp;
	bit flag ;

	flag = 1 ;
	i = 10 ;
	j = 0 ;
	temp =0 ;
	where[0] = 0;
	where[1] = 0;
	where[2] = 0;
	where[3] = 0;
	where[4] = 0;

	
	while(  ( (temp = get8870()) != MTJ ) && (i != 0) )
	{
		if(temp == 16) 
		return 0 ;

		if(flag) 
		   {
		   		where[j]   =  (temp << 4) & 0xf0 ;
				flag = 0 ;	
			}
		 else
		   {
		  	 where[j] = ( where[j] & 0xf0 ) | ( temp & 0x0f) ;
		  	 flag = 1 ;
			  j++ ;
		   }

		 i-- ;
	}
	return 1 ;	
}





uchar  mimatest(void)						/*密码检查*/		
{
	uchar j ;

	if(getmima(mimain) == 0) 
	return 3;
		
	r24c01(0x00,mimasave,5);	
	for(j = 0 ; j < 5; j++)
	{
		if(mimain[j] != mimasave[j])
			return 0 ;
	}
	
	return 1 ;

}

uchar  mimachang(void)						  /*密码输入两次确认*/
{
	uchar j;

	
	if( getmima(mimatemp) == 0 )
		return 3;

	isdplay(10,1); 

	if(getmima(mimain) == 0	 )
		return 3;
	
	for(j = 0 ; j < 5 ; j++ )
	{
		if(mimatemp[j] != mimain[j])
				{
					return 0 ;
				}
	}
	w24c01(0x00,mimain,5);
	return 1 ;

}




/******************* 远程菜单 **************************/
    
void telnetmenu(void)
{	
	uchar what;
	uchar temp;

	for(;;)
	{
		isdplay(3,0);
		switch(isdwait8870())
		{

		/*************家电控制**********************************/
				case MT1 :
					isdplay(4,0);

					switch(isdwait8870())
						{	
						    case  MT1: what = 0 ;
									break ;
							case  MT2: what = 1 ;
									break ;
							case  MT3: what = 2 ;
									break; 
						    case  16 :return; 
						    default : goto error;											
						}

					isdplay(5,0);
					
					switch(isdwait8870())
						{
							case  MT1:sethome(what,0xffff);
									 goto show;
							case  MT2:sethome(what, 0);
							         goto show;
							case  MT3: if( dingshi(what) == 3)
										   return;
							case  MT4:  
						  show: 	if( jiadian[what] == 0 )
											isdplay(7,1);
										else if( jiadian[what] == 0xffff )
												isdplay(6,1);
										else isdplay(8,1);
									 	break;
							case  16: return;
							default : goto error;	  
						}
						
						delay(10000);
					break ;

			/***************留言 听留言*******************************/
			
				case MT2:
				isdplay(12,1);
				isdrecord();
				break ; 

				case MT3:
				isdplay(15,1);
				break ;


			/**************系统设置*************************************/
				case MT4:

					isdplay(9,0);
					switch(isdwait8870())
						{
							case MT1 :
								isdplay(11,1);

								if(lingchang() == 3)
										return;
								break;

							case MT2:
								isdplay(1,1);
								temp = mimachang();

				   				if( temp == 1)
				   		 			isdplay(13,1);
								else if(temp == 0 )
									isdplay(14,1);
								else return ;
								break;
						    case 16 :
									return ;		
							default : goto error;	
						}
					
				
					break ;
			/**************退出系统***********************************/
				case MT5:
				return ;
			/**************重新提示***********************************/
				case MTJ:
				break ;
			/**************超时退出**********************************/
				case 16 :
		 		 return;

			    default: 
			error:	isdplay(14,1);
					break;
					
		 	}
	}
  
}




/*******************家电设置 **********************/
void inithome(void)
{	
   	CONTROL0 = 0 ; 	  /*全关 暂时用高电平开*/
	CONTROL1 = 0 ;
	CONTROL2 = 0 ;	 

	jiadian[0] = 0 ;
	jiadian[1] = 0 ;
	jiadian[2] = 0 ;
	flagding[0] = 0 ;
	flagding[1] = 0 ;
	flagding[2] = 0 ;
    hongsend(3);
	hongsend(4);
	hongsend(5);

}
void sethome(uchar what, uint time)
{
	  jiadian[what] = time ;
	  if(time != 0)
	  		{
				switch(what)
				 {
				 	case  0 : CONTROL0 = 1;
					hongsend(0);
					break;
					case  1 : CONTROL1 = 1;
					hongsend(1);
					break;
					case  2 : CONTROL2 = 1;
					hongsend(2);
					break;

				 }	
			}
			else
			{
			   	switch(what)
				 {
				 	case  0 : CONTROL0 = 0;
					hongsend(3);
					break;
					case  1 : CONTROL1 = 0;
					hongsend(4);
					break;
					case  2 : CONTROL2 = 0;
					hongsend(5);
					break;
				  }
			}
}


uchar dingshi(uchar what)						 /*定时设置*/
{
	uint time;
	uchar temp ;

	time = 0 ;
	isdplay(11,0);

	while( (temp = isdwait8870()) != MTJ )
	{
		if(temp == 16)
			return 3;

		if(temp == MT0)
			temp = 0 ;

		if(temp > 10)
			{
				 isdplay(14, 1);
				 sethome(what,0);
				 return 0;
			}

		time = time*10 + temp;

		if( time > 50 )
		   {
		   	  isdplay(14, 1);
			  sethome(what,0);
			  return 0 ;
		   }
	}
	

	 time = time * 1200;

	 	if(time == 0 )
			{
				 isdplay(14, 1);
				 sethome(what,0);
				 return 0;
			}

	 sethome(what,time);
	 flagding[what] = 1 ;
	return 1;

}


/*********************本地键盘 *********************/

void keyuse(void) interrupt 2
{
	uchar temp ;

	stoprecord();
	stopisd();

	temp = KEYDATA ;
	delay(10000);
	if(temp == KEYDATA)
		{
			GETCALL = 1 ;
			switch(temp)
			{
				case 0x0E:							/*本地菜单*/
						
						telnetmenu();
					break;

				case 0x0D:							/*重设密码*/
					 
					 	resettime();

						while(KEYDATA == 0x0D)
						{
							if(count > 30)				   /*按键1.5S设置密码及振铃次数*/
							{
									mimasave[0] = 0x12;
									mimasave[1] = 0x34;
									mimasave[2]	= 0x56;
									mimasave[3] = 0;
									mimasave[4]	= 0;
						
									lingcount = 6 ;
					  				w24c01(0x00,mimasave,5);
									w24c01(0x06,&lingcount,1); 
					  				isdplay(13,1);

							}
						}

					  	break;

				case 0x0B:
						isdplay(15,1);				 /*播放留言*/
						break;
				case 0x07:
						isdplay(12,1);				 /*本地留言*/
						isdrecord();
						isdplay(13,1);
						break;
			}
				GETCALL	= 0 ;
		}
}

⌨️ 快捷键说明

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