久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4573|回復: 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, 下載次數: 68)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:336378 發表于 2021-7-27 17:51 | 只看該作者
   這么多延時,感到會有誤碼。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 青青久久久 | 国产日产久久高清欧美一区 | 91久久| 亚洲男人网| 99久久国产综合精品麻豆 | 精品欧美乱码久久久久久1区2区 | 国产午夜精品福利 | 欧美一级毛片免费观看 | 欧美国产精品一区二区三区 | 美女激情av| 成人免费网站 | 国产91精品久久久久久久网曝门 | 久夜精品| 欧美日韩在线观看一区 | 中国三级黄色录像 | 中文在线播放 | 蜜桃av鲁一鲁一鲁一鲁 | 国产精品视频一 | 国产高清一二三区 | 欧美一区二区三区视频 | 夜夜艹| 欧美电影在线 | 久久久久国产一区二区 | 国产精品一区在线观看 | 密桃av| 日本成人福利视频 | 一区二区三区四区在线视频 | 亚洲网站在线 | 日韩看片 | 天天搞天天操 | 偷拍亚洲色图 | 久久精品亚洲国产 | 亚洲夜射 | 亚洲日日操 | 91精品一区 | 羞羞涩涩在线观看 | 综合第一页| 黄视频在线网站 | 国产a区 | 精品自拍视频在线观看 | 一区二区不卡视频 |