標(biāo)題: 一個(gè)433 315 RF的STM32解碼程序 [打印本頁]

作者: boboxuexi    時(shí)間: 2020-10-23 13:04
標(biāo)題: 一個(gè)433 315 RF的STM32解碼程序
RF 協(xié)議 同步信號(hào) 300us高電平 10MS 低電平,數(shù)據(jù) “0” 300us 高電平 1ms 低電平。
                                                                  數(shù)據(jù) “1”  1ms 高電平 300us低電平。


只需要配置一個(gè)中斷,將這個(gè)函數(shù)放在中斷里調(diào)用,
void ir_interrupt_drives(void)//中斷50us中調(diào)用
在main 中 while(1)里面 調(diào)用    IR_Process(); 即可實(shí)現(xiàn)RF的解碼。

單片機(jī)源程序如下:

  1. // Copyright (c) all rights reserved
  2. //********************版權(quán)和版本的聲明**********************

  3. //************************項(xiàng)目信息**************************
  4. //項(xiàng)目名稱:
  5. //客戶名稱:
  6. //************************文件信息**************************
  7. //文件名稱:    hal_ir.c
  8. //文件頭文件:  hal_ir.h
  9. //作    者:zenghb
  10. //起止時(shí)間:2020年3月26日11:58:41
  11. //文件版本:V2.0
  12. //校 驗(yàn) 和:
  13. //************************硬件信息**************************
  14. //目標(biāo)器件:ob39s003
  15. //源 時(shí) 鐘:
  16. //PCBA型號(hào):
  17. //************************平臺(tái)信息**************************
  18. //開發(fā)環(huán)境:keil
  19. //燒錄環(huán)境:
  20. //配置內(nèi)容:
  21. //************************功能信息**************************
  22. //程序功能:
  23. //函數(shù)列表:
  24. //************************修改記錄**************************
  25. // <author>  <time>   <version> <desc>
  26. //1.zenghb    2020-03-26    V2.0   
  27. //2.
  28. //**********************************************************
  29. #include "hal_ir.h"


  30. #define INTERRUPT_INT4 2

  31. //-------------------------1-------------------------------------------------------------------
  32. IR_Typedef  IR1;


  33. #define IR1_DECODE_VALUE        0x87
  34. #define IR2_DECODE_VALUE        0x87
  35. #define IR3_DECODE_VALUE        0x87
  36. #define IR4_DECODE_VALUE        0x87
  37. #define IR5_DECODE_VALUE        0x87
  38. #define IR6_DECODE_VALUE        0x87

  39. //unsigned int ProcessTime;

  40. void ir_agreement_check(void)
  41. {
  42.         static unsigned char  i;             //接收紅外信號(hào)處理

  43.     IR1.IrTimeOutCnt = 20;
  44.    
  45.         IR1.Falg.bits.IrEndFlag = 0; //只要有下降沿,結(jié)束是不存在結(jié)束。
  46.        
  47.     if(IR1.Falg.bits.StartFlag)                        
  48.     {
  49.         if( IR1.IrTime < 220 && IR1.IrTime >= 180)//引導(dǎo)碼 TC9012的頭碼,10.0ms        
  50.                 {               
  51.                         i=0;
  52.                 }

  53.         if(!IR1.Falg.bits.IR_OK)  
  54.         {
  55.                         if(i>1)
  56.                         {
  57.                                 if(IR1.IrTime < 4 || IR1.IrTime > 23)
  58.                                 {
  59.                                          IR1.Falg.bits.StartFlag = 0;
  60.                                 }
  61.                         }
  62.                         IR1.IrData[i++] = (unsigned char)IR1.IrTime;//存儲(chǔ)每個(gè)電平的持續(xù)時(shí)間,用于以后判斷是0還是1
  63.                         IR1.IrTime = 0;
  64.         }
  65.         
  66.         if(i >= 24)
  67.         {
  68.             IR1.Falg.bits.IR_OK=1;
  69.             i=0;
  70.         }
  71.     }
  72.     else
  73.     {
  74.         IR1.IrTime = 0;
  75.         IR1.Falg.bits.StartFlag = 1;
  76.     }
  77. }

  78. void ir_decode(void)//紅外碼值處理函數(shù)
  79. {
  80.         unsigned char i,j, k,value;

  81.         k=1;
  82.         for(i=0;i<3;i++)
  83.         {
  84.                 for(j=1;j<=8;j++) //處理1個(gè)字節(jié)8位
  85.                 {
  86.                         value<<=1;
  87.                         if( IR1.IrData[k] > 17 && IR1.IrData[k] < 23)//大于某值為1,這個(gè)和晶振有絕對(duì)關(guān)系,這里使用12M計(jì)算,此值可以有一定誤差
  88.                         {
  89.                                 value|=0x01;
  90.                         }
  91.                         k++;
  92.                 }
  93.                 IR1.IrCode[i] = value;
  94.         }
  95.         value=0;
  96. }


  97. void IR_Process(void)
  98. {
  99.         if(IR1.Falg.bits.IR_OK)                        //如果接收好了進(jìn)行紅外處理
  100.         {   
  101.                 ir_decode1();
  102.                 if(IR1.ProcessTime>0)
  103.                 {
  104.                         IR1.IrCode[0]=0;
  105.                         IR1.IrCode[1]=0;
  106.                         IR1.IrCode[2]=0;
  107.                 }
  108.                 IR1.Falg.bits.IR_OK=0;
  109.                 if(IR1.IrCode[0]==0xaa && IR1.IrCode[1]==0xaa)
  110.                 {
  111.                         IR1.ProcessTime = 10000;
  112.                 }
  113.         }
  114. }

  115. void ir_interrupt_drives(void)//中斷100us中調(diào)用
  116. {
  117.         static unsigned char  CheckCnt,IRStatus=0;

  118.         if(IR1.ProcessTime>0)
  119.         {
  120.                 IR1.ProcessTime--;
  121.         }
  122.         if(PIN_IR1)
  123.         {       
  124.                 if(++CheckCnt > 2)//在中斷中調(diào)用 值為2即可,快速掃描,適當(dāng)加長可提高防抖效果。
  125.                 {
  126.                         CheckCnt = 2;
  127.                         if(IRStatus==0)
  128.                         {
  129.                                 ir_agreement_check1();//下降沿
  130.                         }
  131.                         IRStatus =1;
  132.                 }
  133.         }
  134.         else
  135.         {
  136.                 IR1.IrTime++;
  137.                 if(CheckCnt)
  138.                 {
  139.                         CheckCnt--;
  140.                 }
  141.                 else
  142.                 {
  143.                         if(IRStatus)
  144.                         {
  145.                                 IRStatus = 0;
  146.                         }
  147.                 }
  148.         }
  149. }
復(fù)制代碼


作者: aaa112    時(shí)間: 2021-8-1 15:08
不用中斷方式行嗎?




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1