EV1527解码函数,看网上人家写的不好使,贡献一下,定时器中断形式解码!

1.先上1527波形图

EV1527解码函数,看网上人家写的不好使,贡献一下,定时器中断形式解码!_第1张图片

2.普及基础知识

(1)引导码:一般由一个窄电平(300~500us)+一个低电平(9~10ms);

(2)窄电平(300~500us)+宽电平(800~1000us)为数据0;

(3)宽电平(800~1000ms)+窄电平(300~500us)为数据1;

(4)其实就是20个地址码,加4个按键码;

(5)上图,解码效果!"01 05 F"是十六进制的20位地址码,“C”是4位按键码;

 

3.再上代码,注释应该写的非常清楚了,有不懂的再问!

/******************************************************************************
1.定时器中断的方式解码,请使用80us一次的定时器,直接放中断服务函数就可以,适用于所有单片机。
2.本段代码基于stm8s003F3单片机。
3.不同单片机的配置输入模式不一样,自行修改。
4.2262解码也是一样的道理,稍微改改即可。
5.解码效率很高!推荐使用。
*******************************************************************************/



#include "EV1527.h"
//#include "stm8_sys.h"


//#define Rx PAout(3);			//红外接收引脚
unsigned int Rf_Cnt = 0;
unsigned int Lo_Cnt;
unsigned int Hi_Cnt;
unsigned int led_time;

unsigned int Count_Lead;
unsigned int Count_Data_Hi;
unsigned int Count_Data_Lo;

unsigned int Recv_Bit_Cnt;
unsigned int Recv_Byte_Cnt;
unsigned int Recv_Data_Buf;
unsigned int Rf_Data[3];
u8 Rf_Control_Data;
//static char Rf_Control_Data[100]={0};

/**----------------------------------------------------------------------------------------------**
 **函数名  :EV1527端口配置
 **功能说明:
 **----------------------------------------------------------------------------------------------**/  
void EV1527_Init()
{
  	/* 输入模式 */
    GPIO_Init(GPIOA, GPIO_PIN_3, GPIO_MODE_IN_PU_NO_IT);                 //配置上拉输入。
	/* 将GPIOD端口设置为下降沿触发中断-*/
    //EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOA, EXTI_SENSITIVITY_FALL_ONLY);//下降沿触发。
}


/**----------------------------------------------------------------------------------------------**
 **函数名  :解码函数
 **功能说明:
 **调用说明:80us调用一次
 **----------------------------------------------------------------------------------------------**/  
void soft_decode()//接受码处理函数
{
     switch(Rf_Cnt)
    { 
        case 0 :                                                //12ms引导码
                                                                //低电平累积次数
        if(GPIO_ReadInputPin(GPIOA, GPIO_PIN_3)==0)	        //低电平
      { 
        Count_Lead++;
        
      }
        else                                                    //高电平判断范围
      {
        if((Count_Lead >= 70) && (Count_Lead <= 200))           //5.6ms - 16ms
	{
          Count_Lead=0;
          Recv_Data_Buf = 0x00;                                 //初始化参数
          Count_Data_Hi = 0;
          Count_Data_Lo = 0;
          Recv_Bit_Cnt  = 0;
          Recv_Byte_Cnt = 0;
          Rf_Cnt=1; 
          }
        
          else                                                 //范围不对退出
          {
          Count_Lead=0;
          Rf_Cnt=0;
          }
      }	
      break;

      case 1 :
        //数据位高电平部分判断
       if(GPIO_ReadInputPin(GPIOA, GPIO_PIN_3)!=0)                                          //高电平累积次数
      {
          Count_Data_Hi++;
      }
       else                                                   //低电平判断范围
          if((Count_Data_Hi >= 1) && (Count_Data_Hi <= 30))   // 80us - 2.4ms
          {		    
          Hi_Cnt = Count_Data_Hi;                          //存储计数,区分0跟1数据用的
          Count_Data_Hi = 0;
          Rf_Cnt=2;	
          }
          else
          {		
          Rf_Cnt=0;
          }
	}	  	
      break;

      case 2:  
        //数据位低电平部分判断
          if(GPIO_ReadInputPin(GPIOA, GPIO_PIN_3)==0)                                                   //低电平累积次数
          {
            Count_Data_Lo++;
          }
          else                                                        //高电平判断范围
          {
            if((Count_Data_Lo >= 1) && (Count_Data_Lo <= 30))       // 80us - 2.4ms
          { 
            Lo_Cnt = Count_Data_Lo;                          //存储计数,区分0跟1数据用的
            Count_Data_Lo = 0;	   
            Rf_Cnt=3;
          }
          else
          {		
            Rf_Cnt=0;
          }
          }	  	
          break;

      case 3 :	
          Recv_Data_Buf <<= 1;                                      //数据移位
          if(Hi_Cnt>Lo_Cnt)                                         //0跟1的区分,判断高低电平哪个长
          {
            Recv_Data_Buf|=0x01;
          }
          else

            Recv_Data_Buf&=0xFE;
          }
            Recv_Bit_Cnt ++;	

          if(Recv_Bit_Cnt>7)                                        //每8bit整理出一个byte
          {
            Rf_Data[Recv_Byte_Cnt]=Recv_Data_Buf;                  //存到数组里面
            Recv_Bit_Cnt = 0;
            Recv_Byte_Cnt++;
            Recv_Data_Buf = 0x00;
          }

          if(Recv_Byte_Cnt>2)                                     //整理出三个byte
          {	
            Rf_Control_Data=Rf_Data[2]&0x0F;                      //提取4bit控制数据,0X0F即1111
            Rf_Cnt = 4;                                           //进入到功能判断
          }
          else
          {
            Rf_Cnt = 1;                                           //不够3byte,继续去解码数据
          }			   
          break;

      case 4 :     
                                                    //功能判断
        switch(Rf_Control_Data)
      {
          case 0x08 :
                          //可以添加功能函数
                          break;

          case 0x04 :
                          //可以添加功能函数
                          break;

          case 0x02 :
                          //可以添加功能函数
                          break;

          case 0x01 :
                          //可以添加功能函数
                          break;

          default:
                          break;
        }
          Rf_Cnt = 0;                                                     //做完操作状态回零
          break;
        break;
        


       default:
          Rf_Cnt = 0;
          led_time = 0;
          
          break;
           }
     
}

 

你可能感兴趣的:(c语言,单片机)