历史上的今天
返回首页

历史上的今天

今天是:2024年11月12日(星期二)

正在发生

2021年11月12日 | STM8单片机+EV1527无线315&433通用遥控解码

2021-11-12 来源:eefocus

STM8_无线315&433通用解码


单片机源程序如下:

/*

*********************************************************************************************************

*

*模块名称 : EV1527遥控解码

*上升沿触发 触发中断后延时一段时间后检测引脚电平从而判断0 1

采集上升沿触发后第6 10 14     个振荡周期时的引脚电平 RF98

PT2262 连续触发是每个周期的间隔在15MS左右

EV1527   宽电平时间 500US 窄 250us 同步码 5.7MS

*********************************************************************************************************

*/

#include "EV1527.h"

#include "led.h"

#include "tim1.h"

u8  EV1527_Status=0;                 //接收处理状态

u8  EV1527_Receive_Count=0;          //接收数据位计数

Receive_Data  EV1527_Receive_Data[48];      //24位的脉冲

u8  EV1527_receive_ok=0;             //接收完成标志

//u8  EV1527_gather_count=3;           //每个码位采集3次

//u8  EV1527_code[3];                  //用来暂时存储采集3次得到的值

//u8  EV1527_repeat;                   //重复触发计数

u8  EV1527_check_level_bit;          //外部中断触发(上升沿)标志。有外部中断触发后则开始检测引脚电平是否有变化。

u16 Interval_tim_high=0;             //上升沿触发后高电平时间

u16 Interval_tim_low=0;              //上升沿触发后低电平时间

u8  EV1527_pin_state_buf;            //引脚定义缓存

u16 EV1527_time_out_buf;             //定时器超时时间缓存

u16 TongBuMa_low=0;

u16 a_count=0;              

bool  LearningModel=FALSE;           //学习模式

bool  INT_bit=FALSE;

// 定时器2配置函数

void EV1527_TIM1_Config(void)

{

  TIM1_TimeBaseInit(8,TIM1_COUNTERMODE_UP,50000,0); //8分频,定时50MS,1uS的分辨率

  TIM1_ARRPreloadConfig(ENABLE);

  TIM1_ITConfig(TIM1_IT_UPDATE , ENABLE);

  TIM1_Cmd(ENABLE);//DISABLE

}

/*

    初始化

*/

void EV1527_Init()

{

          /* 输入模式 */

    GPIO_Init(GPIOC, GPIO_PIN_4, GPIO_MODE_IN_PU_IT);                 //配置浮空输入。

        /* 将GPIOD端口设置为下降沿触发中断-*/

    EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC, EXTI_SENSITIVITY_FALL_ONLY);//下降沿触发。

    GPIO_Init(LED_PORTD, (LED_2|LED_3), GPIO_MODE_OUT_PP_HIGH_FAST );   

    EV1527_TIM1_Config();

}

/*

********************************************************************************

            定时器溢出中断内处理

********************************************************************************

*/

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;

推荐阅读

史海拾趣

Eby Electro Inc公司的发展小趣事

Eby Electro Inc公司的创始人李明,是一位对电子技术充满热情的工程师。在20世纪90年代初,他看到了电子行业的巨大潜力和未来发展趋势,于是决定创立自己的公司。起初,公司只有几名员工,主要业务是设计和制造电子零部件。李明凭借其过硬的技术能力和对市场的敏锐洞察,带领公司逐步打开了市场。他坚持质量第一的原则,赢得了客户的信任。随着业务的拓展,Eby Electro Inc逐渐在电子行业中崭露头角。

AIC [Analog Intergrations Corporation]公司的发展小趣事

Eby Electro Inc在发展壮大的同时,始终关注社会责任的履行。公司积极参与环保和公益活动,推广绿色电子产品,减少生产过程中的环境污染。此外,公司还设立了奖学金和助学金,支持教育事业的发展。这些举措不仅提升了公司的社会形象,也为公司赢得了更多的社会支持和认可。

Densitron公司的发展小趣事

随着电子行业的快速发展,新技术、新产品层出不穷,给传统企业带来了巨大的挑战。面对这种情况,Densitron公司积极应对变革,不断调整自身的战略和业务模式。公司加大了对新技术、新产品的研发投入,紧跟行业趋势。同时,通过优化生产流程、提高生产效率、降低生产成本等手段,不断提升自身的竞争力。这些努力使得Densitron公司能够在变革中保持领先地位。

Adam Tech公司的发展小趣事

Adam Tech公司成立于1987年,总部位于美国新泽西州。创业初期,公司面临着资金短缺、市场竞争激烈等诸多困难。然而,创始人凭借对电子连接器行业的深刻理解和执着追求,带领团队克服重重困难,逐渐在市场上站稳脚跟。公司最初的产品线相对单一,但凭借着高品质和可靠的性能,逐渐赢得了客户的信任。

Custom Electronics Inc公司的发展小趣事

在市场竞争日益激烈的背景下,CEI意识到品牌建设的重要性。公司加大了对品牌形象的宣传力度,通过广告、展览、研讨会等多种方式,提高了品牌知名度和美誉度。同时,CEI还注重产品质量的提升和售后服务的完善,赢得了广大客户的信赖和支持。

博众电气(BOZHONG ELECTRIC)公司的发展小趣事

博众电气始终坚信,品质是企业生存和发展的根本。因此,公司始终将品质管理放在首位,并严格执行ISO9001等国际质量管理体系标准。

为了进一步提升产品品质和管理水平,博众电气还积极申请并通过了多项国际认证。这些认证不仅证明了博众电气的产品品质和管理水平达到了国际先进水平,还为公司的国际化发展提供了有力保障。

问答坊 | AI 解惑

新手遇到的问题

这几天我有重新再论坛里瞎转悠了,发现以前很好很老的帖子有浮出水面了,但是当我看到下面好几十楼的回复我蒙了,我不知道里面是否有别人回复的资料,所以我就一口气翻了几十楼。这一点感觉很不方便,希望管理员可以吧那些精华和置顶的帖子里的较好 ...…

查看全部问答>

RFIC和RFID 完全不同吧?

百度的答案,还请大家深入说说: RFIC是RF System 里的Block做成IC ,,基本上成品就是IC ; 而RFID是Radio-frequency identification 是一个系统,有特定的规范。 二者是否有确定的包含与被包含的关系呢?…

查看全部问答>

欢迎s3c6410爱好者加入超级群67958848

欢迎s3c6410爱好者加入超级群67958848…

查看全部问答>

I2C_IOControl 传一个数组出来,老不成功,郁闷死了

BOOL I2C_IOControl(         DWORD context, DWORD code, BYTE *pInBuffer, DWORD inSize, BYTE *pOutBuffer,         DWORD outSize, DWORD *pOutSize ) 里面定义了一个BYTE *str;然后给他空间,也 ...…

查看全部问答>

访问允许异常(section permission fault)

Hi,Dear all, 我在使用Hms30c7202过程中遇到一个难题,我使用的内核是2.6.13.4,大多数能够正常启动运行,个别出现不能启动情况。打印DEBUG信息,非正常设备启动失败,打印: Kernel panic - not syncing: No init found.  Try passi ...…

查看全部问答>

安装CE6的SP1出错toolMsmCA(Error):Setup package issue or CoreCon。。。

安装CE6的SP1是出错 “ToolMsmCA(Error):Setup package issue or CoreCon DataStore corrupted:CDeviceSDKInstallShin Add/Remove failed.HR=0x80004005. 我之前装了VS2005。 这几天才装这个,不知怎么出错,安装进度停在Installing the Gene ...…

查看全部问答>

DDK下重载new/delete的问题

各位,最近在开发一个驱动的时候需要检测内存泄漏,于是自己重载了new/delete,在win32下测了一下没问题,于是决定将其加入到当前的驱动下。可是,问题来了,总是出现LNK2005的错误,我查了一下这个错,应该是连接顺序的问题,出错信息显示在DDK中 ...…

查看全部问答>

急!需要开发条码打印机。不知道如何设计及开发?

市场有一款是uc/os 8 位的代码打印机。 可以接扫描枪,扫入条码,然后按键。打印出一个新条码。 现在想开发这样的东东。谁做过啊? 着急啊。请求指点,合作都可以…

查看全部问答>

STM32F207的固件库有没有出来?

                                 在ST网站上资料很少, 找不到固件库…

查看全部问答>

ASM eagle60 W/B BSOB

近来老板搞了点垃圾产品,在生产时用的是BSOB,但第二点不是翘线就是打不上,很多参数都用过了,不知还有哪里没想到的。求教怎样可以使ASM eagle60 W/B 的BSOB达到最佳。…

查看全部问答>