基本信息
源码名称:STM8解码EV1527,过滤杂波处理
源码大小:1.47M
文件格式:.rar
开发语言:C/C++
更新时间:2021-07-29
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300

本次赞助数额为: 2 元 
   源码介绍
STM8解码EV1527,过滤杂波处理

*/
void EV1527_TIM_IT_Updata_Handdle(void)
{
    TIM1_SetCounter(0);
    EV1527_Status=0;
    EV1527_Receive_Count=0;
    //EV1527_repeat=0;
    //EV1527_Receive_Data=0;
    Interval_tim_low=0;    
    EV1527_time_out_buf=0;    
   // TIM1_Cmd(DISABLE);    
    TIM1_ClearITPendingBit(TIM1_IT_UPDATE);    
    
}

/*
    外部中断触发函数
开始接收地址码跟数据码
*/
void EV1527_ChuLi(void)
{      
   //for(EV1527_Receive_Count=0;EV1527_Receive_Count<48;EV1527_Receive_Count )
  EV1527_Receive_Count=0;
  while(EV1527_Receive_Count<48)
  {   
    while((EV1527_port->IDR &EV1527_pin)&&(EV1527_Status==1));         //如果是高电平就等待  
    Interval_tim_high=TIM1_GetCounter();                               //记录高电平时间     
    TIM1_SetCounter(0);
    EV1527_Receive_Data[EV1527_Receive_Count].Width=Interval_tim_high;
    EV1527_Receive_Data[EV1527_Receive_Count].Level=1;                 //保存到数组中                  
    EV1527_Receive_Count ;         
    while(!(EV1527_port->IDR &EV1527_pin)&&(EV1527_Status==1));       //如果是低电平就等待    
    Interval_tim_low=TIM1_GetCounter();                               //记录高电平时间  
    TIM1_SetCounter(0);
    EV1527_Receive_Data[EV1527_Receive_Count].Width=Interval_tim_low;
    EV1527_Receive_Data[EV1527_Receive_Count].Level=0;                 //保存到数组中     
    EV1527_Receive_Count ;
    if(EV1527_Status==0)
    { 
      EV1527_Receive_Count=49;//超时退出
    }
  }
  if(EV1527_Status==0)
  {
    EV1527_receive_ok=0;
    EV1527_Receive_Count=0;  
    GPIO_Init(GPIOC, GPIO_PIN_4, GPIO_MODE_IN_PU_IT);//配置上啦输入。
    EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC, EXTI_SENSITIVITY_FALL_ONLY);//下降沿触发。
    TIM1_SetCounter(0);      
  }
  else
  {
    EV1527_receive_ok=1;
  }
}

void EV1527_Receive_Handle(void)
{   
  if(INT_bit==TRUE)
  {
    INT_bit=FALSE;  
    /* 开启定时器 0 记录低电平持续的时间,并检测是否为同步码 */     
    a_count=0;
    TongBuMa_low=0;
    EV1527_Status=1;
    while(!(EV1527_port->IDR &EV1527_pin)&&(EV1527_Status==1));   //如果是低电平就等待      
    if(EV1527_Status==TRUE) TongBuMa_low=TIM1_GetCounter();       //记录低电平时间
    TIM1_SetCounter(0);                                           //从新计时。
    /* 检测是否为同步码*/
    if((TongBuMa_low>=5000)&&(TongBuMa_low<=38000))               //检测前一个低电平时间,是否符合同步码标
                                                                  //是同步码 关闭外部中断,并开始接收地址码跟数据码
    {                                   
      EV1527_ChuLi();     
    }
    else                                                         //不是,则重新打开中断,继续检测同步码
    {
      EV1527_Status=0;
      EV1527_Receive_Count=0;  
      GPIO_Init(GPIOC, GPIO_PIN_4, GPIO_MODE_IN_PU_IT);          //配置上啦输入。
      EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC, EXTI_SENSITIVITY_FALL_ONLY);//下降沿触发。
      TIM1_SetCounter(0);                                        //定时器计数值清零 
    }
  }
  
}

/*
    数据处理 
*/
u8 EV1527_Process()
{
  u8 EV1527_Data=0;
  
  if(EV1527_receive_ok>=1)
  {
    u8 i=0;
    u8 beishu=0;
    u8 EV1527_DataTemp[24]={0};
    u8 EV1527_addTemp_high=0;
    u8 EV1527_addTemp_low=0;
//    High_Low  Level_0,Level_1;        //电平   
    u16       Width_0,Width_1;        //宽度

    while(i<48)
    {
     // Level_0= EV1527_Receive_Data[i].Level;
      Width_0=EV1527_Receive_Data[i].Width;
      i ;
    //  Level_1= EV1527_Receive_Data[i].Level;
      Width_1=EV1527_Receive_Data[i].Width;      
      beishu=(Width_0>Width_1)?(Width_0/Width_1):(Width_1/Width_0);
      if(beishu>=2)//如果两个宽度的倍数大于等于2说明是有效电平
      {
        EV1527_DataTemp[i/2]= (Width_0>Width_1)?1:0;
      }      
      else
      {
        i=50;
      }
      i ;
//      if(i>=46)
//      {
//        Level_0= EV1527_Receive_Data[i].Level;
//      }
    }
    if(i<49)
    {
      //解析地址
      for(i=0;i<20;i )
      {  
        if(i<10)//解析高位  EV1527_address_high
        {
          if(EV1527_DataTemp[i]==1)        // 置一
          {
            EV1527_addTemp_high<<=1;
            EV1527_addTemp_high=EV1527_addTemp_high|0x01;                          
          }
          else if(EV1527_DataTemp[i]==0)      //置零
          {
            EV1527_addTemp_high<<=1; 
          }   
        }
        else //解析低位
        {
          if(EV1527_DataTemp[i]==1)        // 置一
          {
            EV1527_addTemp_low<<=1;
            EV1527_addTemp_low=EV1527_addTemp_low|0x01;                          
          }
          else if(EV1527_DataTemp[i]==0)      //置零
          {
            EV1527_addTemp_low<<=1;
          }   
        }
      }