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

📄 voice.c

📁 红外线控制媒体播放程序
💻 C
字号:
//******************************
//名称:音箱控制
//作者:田武平
//时间:08.4.27
//******************************
#include <at892051.h>
#include <I2C.H>
#include <LED.H>
//#include <infrared.h>
#include <intrins.h> 

#define uchar      unsigned char
#define uint       unsigned int
sbit MUTE = P3^2;

sbit INFR     = P1^1;	   //红外输入

uchar flag,flag2,count = 0,slave_count;
uchar  str1[4];

//infrared();				   //红外解码
lead();					   //起始码
void basic_unit();         //基本时钟单元		

uchar code volume[15] = {0x00,0x04,0x08,0x0c,0x10,0x14,0x18,0x1c,0x20,0x24,0x28,0x2c,0x30,0x34,0x38};	  //0,-5,-10,-15,-20,-25,-30,-35,-40,-45,-50,-55,-60,-65,-70
uchar code disvolume[15] = {0x00,0x05,0x0a,0x0f,0x14,0x19,0x1e,0x23,0x28,0x2d,0x32,0x37,0x3c,0x41,0x46};	  //0,-5,-10,-15,-20,-25,-30,-35,-40,-45,-50,-55,-60,-65,-70
uchar code treble[2] = {0x40,0x44};   //LOUDNESS开,LOUDNESS关
uchar code bassme[6] = {0x6f,0x6e,0x6d,0x6c,0x6b,0x6a};
uchar code disbassme[6] = {0x00,0x02,0x04,0x06,0x08,0x0a};
uchar code trebleme[11]	= {0x7f,0x7e,0x7d,0x7c,0x7b,0x7a};
uchar code distrebleme[6] = {0x00,0x02,0x04,0x06,0x08,0x0a};
uchar  strfull[4];

//uchar bassvol = 0;
//uchar treblevol = 0;
uchar voice = 8;		 //音量变量
uchar treblenum = 1;
uchar bassnum = 1;
uchar loudnessnum = 0;
  uchar temp = 0;
  uchar ledcove = 1;
  uchar twpnum = 0;
//uchar keycount0 = 0;
uchar keycount1 = 0;	 
uchar keycount2 = 0;
uchar keycount3 = 0;
uchar keycount4 = 0;
uchar readcode = 0 ;
//uchar keycount6 = 0;
uchar twp = 0;

void Init();               //初始化
void fun_ledshow(uchar n,uchar m);
void fun_lednum(uchar number);
void fun_send();
void work();
void keywork();
 void ledview(uchar t);


void WrToPT(uchar Data[],uchar Num);

void intime1(void) interrupt 3 using 0	  //当k=20时,延时0.2秒子程序
{
     TR1 =0;
  if ((leddisplay != 0) || (twp == 5))
  {
	 ledview(twp);
	 if (leddisplay)
	   leddisplay -= 1 ;
   }

  if ((leddisnum != 0) || (leddisplay == 0 && (twp == 1 || twp == 2 || twp == 3|| twp == 4 || twp == 15 || twp == 10
         || twp == 11 || twp == 12 || twp == 16 || twp == 17 || twp == 18 || twp == 19)))
  {
      if (leddisplay == 0 && (twp == 1 || twp == 2 || twp == 3))
		   twpnum = disvolume[8] ;
	  if (twp == 4 || twp == 15 || twp == 10|| twp == 11 || twp == 12)
	  		   twpnum = disvolume[voice] ;
	  if (twp == 16 || twp == 17 )
	  		   twpnum = disbassme[bassnum] ;
	  if (twp == 18 || twp == 19 )
	  		   twpnum = distrebleme[treblenum] ;

      fun_lednum(twpnum);
	   if (leddisnum) 
	    leddisnum -= 1;
   }

  TH1 = 0xf9;
  TL1 = 0x7d;
  TR1 = 1;
  ledcove += 1;
  if (ledcove == 4)
	  ledcove = 1;

}		 

void main()
 { 	
//   uchar ii;
   Init();
    while(1)
	{

                           
 
//    readcode = 0;
  lead();
/* if(flag == 1)					 //flag起始码标志位
   {  
	 readcode =1; //readcode是有红外输入标志
   }
   else
     readcode = 0;
 */
 //   infrared();
    if(flag == 1)	  //有红外数据输入
	  {
	    
        work();	  
	   }
	else
	 keywork();
     } 	   	
 }		
 void keywork()
 {
    key1 = 1;
	key2 = 1;
    if (!key1) {
	   str1[0] = 0x00;
	   str1[1] = 0xdf;
	   str1[2] = 0x10;
       work();	  
	   }
	if (!key2) {
	   str1[0] = 0x00;
	   str1[1] = 0xdf;
	   str1[2] = 0x30;
       work();	  
	   }
 } 					 
 void work()
 {
	if((str1[0] == 0x00)&&(str1[1] == 0xdf))	//0x00df表示系统码
	  {   // fun_lednum((voice*9),100);
                         twp = 0;
		  switch(str1[2])
	         {
			  case  0x00: 
			             {							//d1
                           leddisplay = 200;
                           twp = 1;
						   voice = 8;
                           strfull[0] = treble[1];
                           strfull[1] = volume[voice];
                  //         strfull[2] = bassme[bassnum];
                  //         strfull[3] = trebleme[treblenum];
                   
					       WrToPT(strfull,2);
						   break;
						 }           	 
			  case  0x20: 
			             {	
                           twp = 2;		              //d2
						   leddisplay = 200;
						   voice = 8;
                           strfull[0] = 0x45;
                           strfull[1] = volume[voice];
                  //         strfull[2] = bassme[bassnum];
                  //         strfull[3] = trebleme[treblenum];
					       WrToPT(strfull,2);
 						   break;
						 }
			  case  0x80: 
			             {	
                           twp = 4;						 //on
                           leddisplay = 200;
        //                   strfull[0] = treble[0];
		//			       WrToPT(strfull,1);
					       break;
						 }

			  case  0xa0: 
			             {		
                            twp = 3;				     //off
						    leddisplay = 200;
                            voice = 8;
                            strfull[0] = treble[1];
                            strfull[1] = volume[voice];
                            WrToPT(strfull,2);
							break;
						 }

			  case  0x40: 
			             {
                           twp = 5; 						//mute
                           keycount1 = ~keycount1 ;
						   if (keycount1)
     						   MUTE = 1;				        //静音
						    else
							 { 
							   twp = 10;
     						   MUTE = 0;				        //no 静音
							  }
//						   leddisplay = 200;
//                           strfull[0] = 0xff ;
//                           strfull[1] = 0xdf ;
//                           WrToPT(strfull,2);
                           break;
						 }          
			  case  0x60: 
			             {				                // loudness		 
                          twp = 15; 					
                          keycount2 = ~keycount2 ;
						  if (keycount2)
                              strfull[0] = treble[0];
						  else 
                              strfull[0] = treble[1];
					       WrToPT(strfull,1);
		//				  twpnum =  volume[voice] ;
          //                leddisnum = 200 ;
						  break;                  
						 }   		 
			  case  0x90: 
			             {							   //bass+
						   if (bassnum != 6)
						      bassnum++;
                           twp = 16	;
						   strfull[0] = bassme[bassnum] ;
                           WrToPT(strfull,1);
						  break;
						 }

			  case  0xb0: 
			             {							   //bass-
						   if (bassnum != 0)
    						  bassnum-- ;
                           twp = 17	;
						   strfull[0] = bassme[bassnum] ;
                           WrToPT(strfull,1);
						  break;
						 }
			  case  0x10: 
			             {				               //volu+
						   if (voice != 15)
						      voice++;
                           twp = 11	;
						   strfull[0] = volume[voice] ;
                           WrToPT(strfull,1);
						   break;
						}
			  case  0x30: 
			             {			                   //volu-
						  if(voice != 0)
    						  voice--;
                           twp = 12	;
						   strfull[0] = volume[voice] ;
                           WrToPT(strfull,1);
						   break; 					 
						 } 

			  case  0x50: 
			             {			             //tre +
						   if (treblenum != 6)
						      treblenum++;
                           twp = 18	;
						   strfull[0] = trebleme[treblenum] ;
                           WrToPT(strfull,1);
					
                           break;
						 }    	     
			  case  0x70: 		   				 //tre -
						  {
						  	if (treblenum != 0)
						   treblenum--;
                           twp = 19	;
						   strfull[0] = trebleme[treblenum] ;
                           WrToPT(strfull,1);
						
   		                  break;
				         }
		      default:   break;
			 }						  
     }				   
 }			  		
void Init()
 {
   strfull[0] = treble[1];
   strfull[1] = volume[voice];
   strfull[2] = bassme[bassnum];
   strfull[3] = trebleme[treblenum];

  MUTE = 0;
  key1 = 1;
  key2 = 1;
  INFR = 1;
  treblenum = 0;
  bassnum = 0;
  loudnessnum = 1;
  voice = 8;
  
  TMOD = 0x11 ;
  TH1 = 0xf9;
  TL1 = 0x7d;
  TR1 =1 ;
  EA =1 ;
  ET1 = 1;
  leddisplay = 250;
  twp = 6;

 // fun_ledfunction(6,80);     //延时使其显示1.5秒
//     fun_ledfunction(1,60);     //d1显示1秒
  while (twp == 6 && leddisplay != 0);
//  fun_ledfunction(1,60);     //d1显示1秒
       leddisplay = 200;
       twp = 1;

  WrToPT(strfull,4);		  //初始化数据  
 
 }

 void ledview(uchar t)
 {
    switch(t)
       {
	    case 1: 
		        {
    		   	  fun_ledshow(10,1);	//d1
		          break;
				}
		case 2: 
		        {
				  fun_ledshow(10,2);  //d2
				 break;
				}
		case 3: {
    	    	   fun_ledshow(0,12);	//of
	    	        break;
				 }
		case 4: {
				  fun_ledshow(0,11);	 //on
                  break;
				}	   
		case 5: {
				  fun_ledshow(15,15);	//--
                  break;
				}
		case 6: {
		         fun_ledshow(13,13);	//全亮
                 break;
				}
		case 7: {
				  fun_ledshow(14,14);   //全灭
                  break;
				}
		default: 
		        break;
	   }
  }

 void fun_ledshow(uchar n,uchar m)
 {
      if (ledcove == 1)
	  {
	   LED2 = 0;
       LED1 = 1;	
       senddata = str[n];
       fun_send();
	 }
      else if (ledcove == 3)
	 {
  	   LED2 = 1;
       LED1 = 0;	
       senddata = str[m];
       fun_send();
     }
	 else 
	 {
  	   LED2 = 0;
       LED1 = 0;	
	 }

 }

void fun_lednum(uchar number )	   //数字
 { 
   uchar lednum1,lednum2;
   lednum1 = number/10;
   lednum2 = number%10;
   fun_ledshow(lednum1,lednum2);
 }		 
void fun_send()	// 移位传送
{
     uchar i; 
	 STA_4094 = 1;
     for (i=0; i<=7; i++)
        {
			CLK_4094 = 1;
			if (senddata & 0x80)	
			    DATA_4094 = 1;
			else 
			    DATA_4094 = 0;
            _nop_ ();
            _nop_ ();
			senddata <<= 1;	    
	     	CLK_4094 = 0; 
            _nop_ ();
            _nop_ ();
            _nop_ ();
     	}
		STA_4094 = 0;
}
////////////////////////////////////////////
/*infrared( )	               //红外解码
{ 
 lead();
 if(flag == 1)					 //flag起始码标志位
   {  
	 readcode =1; //readcode是有红外输入标志
   }
   else
     readcode = 0;
}
*/
void basic_unit()	//0.5ms//24M时钟	 fc18
{
 // TMOD = 0x01;
  TH0 = 0xff;
  TL0 = 0x59;
  TR0 = 1;
}
void basic_unit2()	//0.1ms//4M时钟	 fc18
{
 // TMOD = 0x01;
  TH0 = 0xff;
  TL0 = 0xbd;
  TR0 = 1;
}

lead()
{
  uchar flag1;
  uchar BitCounter ;
  uchar i=0;
  count = 0;
  flag1 = 0;
  flag = 0;	
  ET1 = 0; 
  begain:
	//	   while(INFR);
		   if((INFR == 0) && (flag1 == 0))
		     {  
			   again1:  
			           basic_unit();
			           while(TF0 != 1);
					   TF0 = 0;
			           count++;
				       if(INFR == 1)
				         {	
						    slave_count = count; 
						      count = 0;
						   if((slave_count>14)&&(slave_count<20))
						     {
						        flag1 = 1; 
							  }	
						   else 
						   goto begain;
						 }
				       else
					     goto again1;			 
			 }
		   if(flag1 == 1)
		     {

			  again2: basic_unit();
			          while(TF0 != 1);
					  TF0 = 0;
			          count++;
			          if(INFR == 0)
			            {  
						   slave_count = count;
						   
							count = 0;
					     if(slave_count>6 && slave_count<10)
					       { flag = 1;
							 flag1 = 0;	  
							}
					     else
						 { 	flag1 = 0;
						    flag = 0;
					        goto begain;
						  }
				       }
				     else
				       goto again2;
			 }
			 if (flag == 1)	{

			 for (i = 0; i<4; i++ )
			 {
               for(BitCounter =8;BitCounter>0;BitCounter--)
               {
                 count = 0;
	             while(INFR == 0);
	             while(INFR == 1)
	             {
	               basic_unit2();
	               while(TF0 != 1);
			       TF0 = 0;
			       TR0 = 0;
		           count++;
		           if(INFR == 0)
		           { 
			          slave_count = count;
		              count = 0;
 		              if(slave_count>1 && slave_count < 6)
						 flag2 = 0;	
					  else if(slave_count > 5 && slave_count < 10) 
						 flag2 = 1;
				    }
			     }
                 if(flag2)             //如果flag2=1
 	               temp=temp|0x01;     //temp的最低位置1
 	             else
                   temp=temp&0xfe;     //否则temp的最低位清0
	             if(BitCounter-1)
                   temp=temp<<1;
                }
                str1[i] = temp;
			 }
			 }
  ET1 = 1; 

}

/*				 
void delay_bit()
{  uchar i;
 for(i=0;i<44;i++)
  {
   _nop_();
   _nop_();
   _nop_();
   _nop_();
  }
}
	  

*/
void Start(void)              /*起始条件*/
 {
    Sda=1;
    _nop_();
    Scl=1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    Sda=0;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
 } 
void Send(uchar Data)           /*发送数据子程序,Data为要求发送的数据*/
{
   uchar BitCounter=8;             /*位数控制*/
   uchar temp;                     /*中间变量控制*/
   temp=Data;
   do
    {
      Scl=0;
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      if((temp&0x80)==0x80)             /* 如果最高位是1*/
         Sda=1;
      else
          Sda=0;
      _nop_();
      _nop_();
      Scl=1;
      temp=temp<<1;                    /*RLC*/
 //     Data=temp;
      BitCounter--;
    }
   while(BitCounter);
      Scl=0;
}

void WrToPT(uchar Data[],uchar Num)
{
  uchar i;
  uchar *PData;
  PData=Data;
  Start();             /*发送启动信号*/
  Send(Address);       /*发送SLA+W*/ /*发送地址*/
  Ack();
  for(i=0;i<Num;i++)
     {
      Send(*(PData+i));
      Ack();
     }
  Stop();
      _nop_ ();
      _nop_ ();
      _nop_ ();
//  mDelay(80);
}


⌨️ 快捷键说明

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