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

📄 function.c

📁 AVR单片机初此化 设置 是用48芯片 希望对刚学习AVR的朋友有用
💻 C
字号:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/wdt.h>
#include "main.h"
#include <avr/eeprom.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 = 25;		// 64 * N = 1600
 TCNT2 =0;
  
  sei();
}


void Start_Mark_Space(void)
{
  if(Start_Flag)            //检测数据
   { 
     
	  if(DataBit_Flag)      //检测DateBit_Mark
   	   { 
	    Start_Mark(); }
	  else                  //检测DateBit_Space
	   { Start_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])))    
		  {
		    Uart_putc(DateBite[0]);      
		    Uart_putc(DateBite[1]);
		    Uart_putc(DateBite[2]);
		    Uart_putc(DateBite[3]);
		    
           }
		   Uart_putc(0xbb);              //发送结束标志位到Uart
	     
       }
	 
	  if (bit_is_set( TIFR2, OCF2A))   // 0.2 ms
        {
	        SetBit( TIFR2, OCF2A);
            if(++Time_Over40ms==250)   //50ms未接收到数据则停止接收
		     {
			   Time_Over40ms=0;        
	           Start_Flag=0;           //下一次检测Start,
			   DataBit_Flag=1;
             }
          }
     }
   else                   				//检测Start,
	{
  	  if (bit_is_set( TIFR2, OCF2A)) 	// 0.2 ms
        {
	       SetBit( TIFR2, OCF2A);
			
		   if(Mark_Flag)               //检测Start_Mark
   		    { 
    	      Start_Mark(); 
			 }
			 else					   //检测Start_Space
			 {
			  Start_Space(); 
			 }
          }
	  }
}


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(Start_Flag)
	 { 
	   
	   if(40<=StartBit_counter && StartBit_counter<=80)  //接收DateBit_Mark,400us--800us
	     { 
		  DataBit_Flag=0;
		  Time_Over40ms=0;
		  }
       else 
	     {  
		   DataBit_Flag=1;
		   Start_Flag=0;
		   Time_Over40ms=0;
		   }
	   }
	 else
	 {
	   if(30<=StartBit_counter && StartBit_counter<=60)   //检测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(Start_Flag)
	  {  
         if(40<=StartBit_counter && StartBit_counter<=80)     //接收DateBit1_Space,400us--800us
	      {   
		    DateBite[DateByte_counter] |= 0x01;               //接收到"1"
			
			if(++DateBite_counter>=8)
	        {
			  DateBite_counter=0;
              ++DateByte_counter;
            }
		     
			 DateBite[DateByte_counter]<<=1;
             Time_Over40ms=0;
			
		  }
         else if (120<=StartBit_counter && StartBit_counter<=240) //接收DateBit0_Space,1200us--2400us
	      {   
		    
			if(++DateBite_counter==8)
	         {
              DateBite_counter=0;
              ++DateByte_counter;
              }
		 
		     DateBite[DateByte_counter]<<= 1;                   //接收到"0"
			 Time_Over40ms=0;
			
		  }
         else                                 				   //接收出错
		  {  
		    DateBite_counter=0;
            DateByte_counter=0;
			
			DataBit_Flag=1;
			Start_Flag=0;
			Time_Over40ms=0;
		   }

	   }
	  else 
	   {
	     if(15<=StartBit_counter && StartBit_counter<=30)      //检测StartSpace时间是否为3ms--6ms
	      { 
            Mark_Flag=1;
	  	    Start_Flag=1;                                     //开始检测数据,标志位置位
	        Mark_Rd=0; Mark_Pre=0;Mark_Save=0;  
			Uart_putc(0xaa);                                  //发送开始检测数据标志位到Uart    
	       }
         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++;
}

⌨️ 快捷键说明

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