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

📄 capture.c

📁 一个完整的用AVR写的电话交换机程序 希望对从事安防的开发者有用
💻 C
字号:
//************************************************
/*--------------- file information -------------*/
/*Date  : 2007-08-3
Author  : hou de ping                            
Company : FirstSun.  
Chip type            : ATmega88V
Clock frequency      : 8MHz
Function description : 无线电解码
result: 
*************************************************/

#include"main.h"
#include <avr/io.h>	  


void Capture_init(void)
{
 //  信号输入 PD3
 ClrBit(PORTD,PD3);	// Output Low				
 ClrBit(DDRD,DDD3); //Input,
 
 SetBit(PORTD,PD5);	// Output High			
 SetBit(DDRD,DDD5);
 
 // Time 2 Setting
 TCCR2A = _BV(WGM21);  //比较匹配发生时OC2A 清零
 TCCR2B = _BV(CS22); //clkT2S/64 ( 来自预分频器)
 OCR2A = 62;		// 64 * N = 4000
 TCNT2 =0;
 
}


void Start_Mark_Space(void)
{
  if(Start_Flag)            //检测数据
   { 
     
	  if(DataBit_Flag)      //检测DateBit_Mark
   	   { 
	     Data_Mark(); }
	  else                  //检测DateBit_Space
	   { Data_Space(); }

      
	  if(DateByte_counter==4) //接收完4 Byte 数据
      {        
         DateBite_counter=0;  //Bit计数清零
		 DateByte_counter=0;  //Byte计数清零
	     Start_Flag=0;        //下一次检测Start,
         DataBit_Flag=1;

		 if((DateBite[0]==(0xff-DateBite[1]))&&(DateBite[2]==(0xff-DateBite[3])))    //检测接收数据是否正确
		  {
		      fnConvertData();
		   
		 	  if (++mKeyPressFlag==5) //前4个数据丢弃
		 	  {
				mName[1]=0x00;
				fnTxdecode();          //数据发送到MNET
		 		Time_1s =0;      		 		
		 	   }	 
            }
	    }
	 
	  if (bit_is_set( TIFR2, OCF2A))   // 0.5 ms
         {
	        SetBit( TIFR2, OCF2A);
            if(++mRxIdleTm_200ms==1000)   //200ms未接收到数据则停止接收
		     {
			   mRxIdleTm_200ms=0;        
	           Start_Flag=0;           //下一次检测Start
			   DataBit_Flag=1;
             }
          }
     }
   else                   				//检测Start,
	{
  	  if (bit_is_set( TIFR2, OCF2A)) 	// 0.5 ms
        {
	        SetBit( TIFR2, OCF2A);
			
		    if(Mark_Flag)               //检测Start_Mark
   		      { Start_Mark(); }
			else					     //检测Start_Space
			  { Start_Space(); }

           
		    if(mKeyPressFlag>=5)             //数据正确则发送到MNET,连续按键每一秒发送一次                  
		     {
		       if(++mRxIdleTm_200ms>=500)   //200ms未接收到数据则为放手
		         {
				     mRxIdleTm_200ms=0;
					 mKeyPressFlag=0;
				     mName[1]=0x80;
				     fnTxdecode();          //数据发送到MNET
				  }
				if(++Time_1s>=1000)       //连续按键每一秒发送一次 
			      {
				    Time_1s=0;
				    mName[1]=0x01;
				    fnTxdecode();          //数据发送到MNET
				    }
               }
           }
	  }
}


void Start_Mark(void)        
{ 
  Mark_Pre=PIND&0x08;

/*	if(Mark_Rd != Mark_Pre )  //除抖动
	{
	    Mark_Pre=Mark_Rd;
		return;
     }
*/	
	if  ( Mark_Pre != Mark_Save )
	{		
		if ( Mark_Pre )          //jump to Mark          
		{
			Mark_Save = Mark_Pre;
			goto Jumpto_Mark;

		}else                    //Release_Mark
		{
            Mark_Save = Mark_Pre;
			goto Release_Mark;
		}
     	 
     }else
		{	
		    if ( Mark_Save )     //保持  ,Mark
			{	
			   goto Keep_Mark;
			}
		}
	return;


Release_Mark: //---------------------------------Release_Mark

	   if(12<=StartBit_counter && StartBit_counter<=24)   //检测StartMark时间是否为6ms--12ms
        { 
          Mark_Flag=0; 
	  	  Space_Rd=0x08;Space_Pre=0x08;Space_Save=0x08;
		  
	     }
		 else											  //未检测到StartMark
		  {
		    Mark_Flag=1;
			Mark_Rd=0; Mark_Pre=0;Mark_Save=0;
		   }

     
    StartBit_counter=0;
	return;

Jumpto_Mark: //-----------------------------------Mark  
     StartBit_counter=0; 

Keep_Mark: //------------------------------- //保持  ,Mark
     StartBit_counter++;
}


void Start_Space(void)        
{ 
  Space_Pre=PIND&0x08;

/*	if(Space_Rd != Space_Pre )  //除抖动
	{
		Space_Pre=Space_Rd;
		return;
     }
*/	
	if  ( Space_Pre != Space_Save )
	{		
		if ( !Space_Pre )           //jump to space          
		{
			Space_Save = Space_Pre;
			goto Jumpto_Space;

		}else                      //Release_Space
		{
            Space_Save = Space_Pre;
			goto Release_Space;
		}
     	 
     }else
		{	
		    if ( !Space_Save )      //保持  ,Space
			{	
			   goto Keep_Space;
			}
		}
	return;


Release_Space: //---------------------------------Release_Space
	     if(6<=StartBit_counter && StartBit_counter<=12)      //检测StartSpace时间是否为3ms--6ms
	      { 
            Mark_Flag=1;
	  	    Start_Flag=1;                                     //开始检测数据,标志位置位
            mRxIdleTm_200ms=0;

	        Mark_Rd=0; Mark_Pre=0;Mark_Save=0;  
		   }
         else  											      //未检测到StartSpace
	      {   
	        Mark_Flag=1;
			Space_Rd=0x08;Space_Pre=0x08;Space_Save=0x08;
           }
		 
	 StartBit_counter=0;
	 return;

Jumpto_Space: //-----------------------------------space  
    
	StartBit_counter=0;    	


Keep_Space: //-------------------------------//保持  ,Space
     StartBit_counter++;
}


void Data_Mark(void)        
{ 
  Mark_Pre=PIND&0x08;

/*	if(Mark_Rd != Mark_Pre )  //除抖动
	{
	    Mark_Pre=Mark_Rd;
		return;
     }
*/	
	if  ( Mark_Pre != Mark_Save )
	{		
		if ( Mark_Pre )          //jump to Mark          
		{
			Mark_Save = Mark_Pre;
			goto Jumpto_Mark;

		}else                    //Release_Mark
		{
            Mark_Save = Mark_Pre;
			goto Release_Mark;
		}
     	 
     }else
		{	
		    if ( Mark_Save )     //保持  ,Mark
			{	
			   goto Keep_Mark;
			}
		}
	return;


Release_Mark: //---------------------------------Release_Mark
	   
	   
	   if(40<=StartBit_counter && StartBit_counter<=80)  //接收DateBit_Mark,400us--800us
	     { 
		  DataBit_Flag=0;
		  }
       else 
	     {  
		   Start_Flag=0;
		   Mark_Flag=1;
		   }

    StartBit_counter=0;
	return;

Jumpto_Mark: //-----------------------------------Mark  
     StartBit_counter=0; 

Keep_Mark: //------------------------------- //保持  ,Mark
     StartBit_counter++;
}


void Data_Space(void)        
{ 
  Space_Pre=PIND&0x08;

/*	if(Space_Rd != Space_Pre )  //除抖动
	{
		Space_Pre=Space_Rd;
		return;
     }
*/	
	if  ( Space_Pre != Space_Save )
	{		
		if ( !Space_Pre )           //jump to space          
		{
			Space_Save = Space_Pre;
			goto Jumpto_Space;

		}else                      //Release_Space
		{
            Space_Save = Space_Pre;
			goto Release_Space;
		}
     	 
     }else
		{	
		    if ( !Space_Save )      //保持  ,Space
			{	
			   goto Keep_Space;
			}
		}
	return;


Release_Space: //---------------------------------Release_Space
         
		 if(40<=StartBit_counter && StartBit_counter<=80)     //接收DateBit1_Space,400us--800us
	      {   
		     DateBite[DateByte_counter]<<=1;
			 DateBite[DateByte_counter] |= 0x01;               //接收到"1"
			   
             if(++DateBite_counter>=8)
	         {
			  DateBite_counter=0;
              ++DateByte_counter;
              }
		  }
         else if (120<=StartBit_counter && StartBit_counter<=240) //接收DateBit0_Space,1200us--2400us
	      {   
		    
			 DateBite[DateByte_counter]<<=1;                     //接收到"0"
			
			if(++DateBite_counter==8)
	         {
              DateBite_counter=0;
              ++DateByte_counter;
              }
		  }
         else                                 				   //接收出错
		  {  
		    DateBite_counter=0;
            DateByte_counter=0;
			Start_Flag=0;
		   }

     DataBit_Flag=1;
	 StartBit_counter=0;
	 return;

Jumpto_Space: //-----------------------------------space  
    
	StartBit_counter=0;    	


Keep_Space: //-------------------------------//保持  ,Space
     StartBit_counter++;
}


void fnConvertData(void)
{
			 if(DateBite[0]&0x04)         
			   {
			     KeyName[0]=8-((DateBite[2]&0x40)/16+(DateBite[2]&0x10)/16+(DateBite[2]&0x08)/4); //1--8按键代码
 			    }
             else
			   {
			     KeyName[0]=16-((DateBite[2]&0x40)/16+(DateBite[2]&0x10)/16+(DateBite[2]&0x08)/4);//9--16按键代码
				 }

		 	 
			 mID[0]=(DateBite[0]&0xf0)+(KeyName[0]&0x0f);//高4位为地址,低4位为按键代码
			 if((DateBite[2]&0xff)==0x6f)         //Allon
			  {
				 KeyName[0]=0x80;
				 mName[0]=0x04;
				 mID[0]=(DateBite[0]&0xf0)+0x01;
               }
			 else if((DateBite[2]&0xff)==0x7f)   //Alloff
			  {
			    KeyName[0]=0x80;
				 mName[0]=0x05;
				 mID[0]=(DateBite[0]&0xf0)+0x01;
			   }
			 else                          
			 {
			      if((DateBite[2]&0x80)==0x80)     //On, Off
			       {
			          KeyName[0]=0x81;
					  mID[1]=mID[0];
				      if((DateBite[2]&0x20)==0x20)  //On
				      {
				       mName[0]=0x04;
				       }
                      else                          //Off
				      {
				        mName[0]=0x05;
 					   }
                    }
			      else	                           //Brt, Dim
				   { 
					  KeyName[0]=0x82;
					  mID[0]=mID[1];
					  if((DateBite[2]&0x10)==0x10)  //Brt
				       {
				        mName[0]=0x04;
				        }
				      else                         //Dim
				       {
				        mName[0]=0x05;
 					    }
					}
               }
}

⌨️ 快捷键说明

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