找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3253|回复: 1
收起左侧

STM8单片机+EV1527无线315&433通用遥控解码程序

[复制链接]
ID:137590 发表于 2021-7-18 11:13 | 显示全部楼层 |阅读模式
STM8_无线315&433通用解码

单片机源程序如下:
  1. /*
  2. *********************************************************************************************************
  3. *
  4. *        模块名称 : EV1527遥控解码
  5. *
  6.                   上升沿触发 触发中断后延时一段时间后检测引脚电平从而判断0 1
  7. 采集上升沿触发后第6 10 14     个振荡周期时的引脚电平 RF98
  8. PT2262 连续触发是每个周期的间隔在15MS左右
  9. EV1527   宽电平时间 500US 窄 250us 同步码 5.7MS
  10. *********************************************************************************************************
  11. */
  12. #include "EV1527.h"
  13. #include "led.h"
  14. #include "tim1.h"
  15. u8  EV1527_Status=0;                 //接收处理状态
  16. u8  EV1527_Receive_Count=0;          //接收数据位计数
  17. Receive_Data  EV1527_Receive_Data[48];      //24位的脉冲
  18. u8  EV1527_receive_ok=0;             //接收完成标志
  19. //u8  EV1527_gather_count=3;           //每个码位采集3次
  20. //u8  EV1527_code[3];                  //用来暂时存储采集3次得到的值
  21. //u8  EV1527_repeat;                   //重复触发计数
  22. u8  EV1527_check_level_bit;          //外部中断触发(上升沿)标志。有外部中断触发后则开始检测引脚电平是否有变化。
  23. u16 Interval_tim_high=0;             //上升沿触发后高电平时间
  24. u16 Interval_tim_low=0;              //上升沿触发后低电平时间
  25. u8  EV1527_pin_state_buf;            //引脚定义缓存
  26. u16 EV1527_time_out_buf;             //定时器超时时间缓存
  27. u16 TongBuMa_low=0;
  28. u16 a_count=0;              
  29. bool  LearningModel=FALSE;           //学习模式
  30. bool  INT_bit=FALSE;
  31. // 定时器2配置函数
  32. void EV1527_TIM1_Config(void)
  33. {
  34.   TIM1_TimeBaseInit(8,TIM1_COUNTERMODE_UP,50000,0); //8分频,定时50MS,1uS的分辨率
  35.   TIM1_ARRPreloadConfig(ENABLE);
  36.   TIM1_ITConfig(TIM1_IT_UPDATE , ENABLE);
  37.   TIM1_Cmd(ENABLE);//DISABLE
  38. }
  39. /*
  40.     初始化
  41. */
  42. void EV1527_Init()
  43. {
  44.           /* 输入模式 */
  45.     GPIO_Init(GPIOC, GPIO_PIN_4, GPIO_MODE_IN_PU_IT);                 //配置浮空输入。
  46.         /* 将GPIOD端口设置为下降沿触发中断-*/
  47.     EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC, EXTI_SENSITIVITY_FALL_ONLY);//下降沿触发。
  48.     GPIO_Init(LED_PORTD, (LED_2|LED_3), GPIO_MODE_OUT_PP_HIGH_FAST );   
  49.     EV1527_TIM1_Config();
  50. }
  51. /*
  52. ********************************************************************************
  53.             定时器溢出中断内处理
  54. ********************************************************************************
  55. */
  56. void EV1527_TIM_IT_Updata_Handdle(void)
  57. {
  58.     TIM1_SetCounter(0);
  59.     EV1527_Status=0;
  60.     EV1527_Receive_Count=0;
  61.     //EV1527_repeat=0;
  62.     //EV1527_Receive_Data=0;
  63.     Interval_tim_low=0;   
  64.     EV1527_time_out_buf=0;   
  65.    // TIM1_Cmd(DISABLE);   
  66.     TIM1_ClearITPendingBit(TIM1_IT_UPDATE);   
  67.    
  68. }

  69. /*
  70.     外部中断触发函数
  71. 开始接收地址码跟数据码
  72. */
  73. void EV1527_ChuLi(void)
  74. {      
  75.    //for(EV1527_Receive_Count=0;EV1527_Receive_Count<48;EV1527_Receive_Count++)
  76.   EV1527_Receive_Count=0;
  77.   while(EV1527_Receive_Count<48)
  78.   {   
  79.     while((EV1527_port->IDR &EV1527_pin)&&(EV1527_Status==1));         //如果是高电平就等待  
  80.     Interval_tim_high=TIM1_GetCounter();                               //记录高电平时间     
  81.     TIM1_SetCounter(0);
  82.     EV1527_Receive_Data[EV1527_Receive_Count].Width=Interval_tim_high;
  83.     EV1527_Receive_Data[EV1527_Receive_Count].Level=1;                 //保存到数组中                  
  84.     EV1527_Receive_Count++;         
  85.     while(!(EV1527_port->IDR &EV1527_pin)&&(EV1527_Status==1));       //如果是低电平就等待   
  86.     Interval_tim_low=TIM1_GetCounter();                               //记录高电平时间  
  87.     TIM1_SetCounter(0);
  88.     EV1527_Receive_Data[EV1527_Receive_Count].Width=Interval_tim_low;
  89.     EV1527_Receive_Data[EV1527_Receive_Count].Level=0;                 //保存到数组中     
  90.     EV1527_Receive_Count++;
  91.     if(EV1527_Status==0)
  92.     {
  93.       EV1527_Receive_Count=49;//超时退出
  94.     }
  95.   }
  96.   if(EV1527_Status==0)
  97.   {
  98.     EV1527_receive_ok=0;
  99.     EV1527_Receive_Count=0;  
  100.     GPIO_Init(GPIOC, GPIO_PIN_4, GPIO_MODE_IN_PU_IT);//配置上啦输入。
  101.     EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC, EXTI_SENSITIVITY_FALL_ONLY);//下降沿触发。
  102.     TIM1_SetCounter(0);      
  103.   }
  104.   else
  105.   {
  106.     EV1527_receive_ok=1;
  107.   }
  108. }

  109. void EV1527_Receive_Handle(void)
  110. {   
  111.   if(INT_bit==TRUE)
  112.   {
  113.     INT_bit=FALSE;  
  114.     /* 开启定时器 0 记录低电平持续的时间,并检测是否为同步码 */     
  115.     a_count=0;
  116.     TongBuMa_low=0;
  117.     EV1527_Status=1;
  118.     while(!(EV1527_port->IDR &EV1527_pin)&&(EV1527_Status==1));   //如果是低电平就等待      
  119.     if(EV1527_Status==TRUE) TongBuMa_low=TIM1_GetCounter();       //记录低电平时间
  120.     TIM1_SetCounter(0);                                           //从新计时。
  121.     /* 检测是否为同步码*/
  122.     if((TongBuMa_low>=5000)&&(TongBuMa_low<=38000))               //检测前一个低电平时间,是否符合同步码标
  123.                                                                   //是同步码 关闭外部中断,并开始接收地址码跟数据码
  124.     {                                   
  125.       EV1527_ChuLi();     
  126.     }
  127.     else                                                         //不是,则重新打开中断,继续检测同步码
  128.     {
  129.       EV1527_Status=0;
  130.       EV1527_Receive_Count=0;  
  131.       GPIO_Init(GPIOC, GPIO_PIN_4, GPIO_MODE_IN_PU_IT);          //配置上啦输入。
  132.       EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC, EXTI_SENSITIVITY_FALL_ONLY);//下降沿触发。
  133.       TIM1_SetCounter(0);                                        //定时器计数值清零
  134.     }
  135.   }
  136.   
  137. }

  138. /*
  139.     数据处理
  140. */
  141. u8 EV1527_Process()
  142. {
  143.   u8 EV1527_Data=0;
  144.   
  145.   if(EV1527_receive_ok>=1)
  146.   {
  147.     u8 i=0;
  148.     u8 beishu=0;
  149.     u8 EV1527_DataTemp[24]={0};
  150.     u8 EV1527_addTemp_high=0;
  151.     u8 EV1527_addTemp_low=0;
  152. //    High_Low  Level_0,Level_1;        //电平   
  153.     u16       Width_0,Width_1;        //宽度

  154.     while(i<48)
  155.     {
  156.      // Level_0= EV1527_Receive_Data[i].Level;
  157.       Width_0=EV1527_Receive_Data[i].Width;
  158.       i++;
  159.     //  Level_1= EV1527_Receive_Data[i].Level;
  160.       Width_1=EV1527_Receive_Data[i].Width;      
  161.       beishu=(Width_0>Width_1)?(Width_0/Width_1):(Width_1/Width_0);
  162.       if(beishu>=2)//如果两个宽度的倍数大于等于2说明是有效电平
  163.       {
  164.         EV1527_DataTemp[i/2]= (Width_0>Width_1)?1:0;
  165.       }      
  166.       else
  167.       {
  168.         i=50;
  169.       }
  170.       i++;
  171. //      if(i>=46)
  172. //      {
  173. //        Level_0= EV1527_Receive_Data[i].Level;
  174. //      }
  175.     }
  176.     if(i<49)
  177.     {
  178.       //解析地址
  179.       for(i=0;i<20;i++)
  180.       {  
  181.         if(i<10)//解析高位  EV1527_address_high
  182.         {
  183.           if(EV1527_DataTemp[i]==1)        // 置一
  184.           {
  185.             EV1527_addTemp_high<<=1;
  186.             EV1527_addTemp_high=EV1527_addTemp_high|0x01;                          
  187.           }
  188.           else if(EV1527_DataTemp[i]==0)      //置零
  189.           {
  190.             EV1527_addTemp_high<<=1;
  191.           }   
  192.         }
  193.         else //解析低位
  194.         {
  195.           if(EV1527_DataTemp[i]==1)        // 置一
  196.           {
  197.             EV1527_addTemp_low<<=1;
  198.             EV1527_addTemp_low=EV1527_addTemp_low|0x01;                          
  199.           }
  200.           else if(EV1527_DataTemp[i]==0)      //置零
  201.           {
  202.             EV1527_addTemp_low<<=1;
  203.           }   
  204.         }
  205.       }
  206.       //解析数据
  207.       for(i=20;i<24;i++)
  208.       {                    
  209.         if(EV1527_DataTemp[i]==1)        // 置一
  210.         {
  211.           EV1527_Data<<=1;
  212.           EV1527_Data=EV1527_Data|0x01;                          
  213.         }
  214.         else if(EV1527_DataTemp[i]==0)      //置零
  215.         {
  216.           EV1527_Data<<=1;                     
  217.         }                     
  218.       }
  219.     }
  220.     EV1527_receive_ok=0;
  221.     EV1527_Status=0;
  222.     EV1527_Receive_Count=0;  
  223.     GPIO_Init(GPIOC, GPIO_PIN_4, GPIO_MODE_IN_PU_IT);//配置上啦输入。
  224.     EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC, EXTI_SENSITIVITY_FALL_ONLY);//下降沿触发。
  225.     TIM1_SetCounter(0);  
  226.   }
  227.     return EV1527_Data;
  228. }
  229. /*
  230.     解码处理后的执行函数
  231. */
  232. void EV1527_Action()
  233. {
  234.     EV1527_Receive_Handle();
  235.     u8 EV1527_buf=0;
  236.     EV1527_buf=EV1527_Process();
  237.     if(EV1527_buf)
  238.     {   
  239.         GPIO_WriteReverse(GPIOD, GPIO_PIN_2);
  240.         for(u8 i=0;i<EV1527_buf;i++)
  241.         {
  242.           LED_Operation(GPIO_PIN_3,ON );
  243.           Delay(6000);
  244.           Delay(6000);
  245.           Delay(6000);
  246.           Delay(6000);
  247.           Delay(6000);
  248.           LED_Operation(GPIO_PIN_3,OFF );
  249.           Delay(6000);
  250.           Delay(6000);
  251.           Delay(6000);
  252.           Delay(6000);
  253.           Delay(6000);
  254.               Delay(6000);
  255.               
  256.         }
  257.         //GPIO_WriteReverse(GPIOD, GPIO_PIN_3);
  258.         Delay(6000);
  259.           Delay(6000);
  260.           Delay(6000);
  261.           Delay(6000);
  262.           Delay(6000);
  263.               Delay(6000);
  264.               Delay(6000);
  265.           Delay(6000);
  266.           Delay(6000);
  267.           Delay(6000);
  268.           Delay(6000);
  269.               Delay(6000);
  270.               Delay(6000);
  271.           Delay(6000);
  272.           Delay(6000);
  273.           Delay(6000);
  274.           Delay(6000);
  275.               Delay(6000);
  276.               Delay(6000);
  277.           Delay(6000);
  278.           Delay(6000);
  279.           Delay(6000);
  280.           Delay(6000);
  281.               Delay(6000);
  282.               Delay(6000);
  283.           Delay(6000);
  284.           Delay(6000);
  285.           Delay(6000);
  286.           Delay(6000);
  287.               Delay(6000);
  288.               Delay(6000);
  289.           Delay(6000);
  290.           Delay(6000);
  291.           Delay(6000);
  292.           Delay(6000);
  293.               Delay(6000);
  294.     }            
  295. }
复制代码

所有资料51hei提供下载:
STM8解码EV1527.7z (397.25 KB, 下载次数: 67)
回复

使用道具 举报

ID:336378 发表于 2021-7-27 17:51 | 显示全部楼层
   这么多延时,感到会有误码。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表