找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2994|回复: 1
打印 上一主题 下一主题
收起左侧

一个433 315 RF的STM32解码程序

  [复制链接]
跳转到指定楼层
楼主
ID:450849 发表于 2020-10-23 13:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
RF 协议 同步信号 300us高电平 10MS 低电平,数据 “0” 300us 高电平 1ms 低电平。
                                                                  数据 “1”  1ms 高电平 300us低电平。


只需要配置一个中断,将这个函数放在中断里调用,
void ir_interrupt_drives(void)//中断50us中调用
在main 中 while(1)里面 调用    IR_Process(); 即可实现RF的解码。

单片机源程序如下:

  1. // Copyright (c) all rights reserved
  2. //********************版权和版本的声明**********************

  3. //************************项目信息**************************
  4. //项目名称:
  5. //客户名称:
  6. //************************文件信息**************************
  7. //文件名称:    hal_ir.c
  8. //文件头文件:  hal_ir.h
  9. //作    者:zenghb
  10. //起止时间:2020年3月26日11:58:41
  11. //文件版本:V2.0
  12. //校 验 和:
  13. //************************硬件信息**************************
  14. //目标器件:ob39s003
  15. //源 时 钟:
  16. //PCBA型号:
  17. //************************平台信息**************************
  18. //开发环境:keil
  19. //烧录环境:
  20. //配置内容:
  21. //************************功能信息**************************
  22. //程序功能:
  23. //函数列表:
  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;             //接收红外信号处理

  43.     IR1.IrTimeOutCnt = 20;
  44.    
  45.         IR1.Falg.bits.IrEndFlag = 0; //只要有下降沿,结束是不存在结束。
  46.        
  47.     if(IR1.Falg.bits.StartFlag)                        
  48.     {
  49.         if( IR1.IrTime < 220 && IR1.IrTime >= 180)//引导码 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;//存储每个电平的持续时间,用于以后判断是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)//红外码值处理函数
  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个字节8位
  85.                 {
  86.                         value<<=1;
  87.                         if( IR1.IrData[k] > 17 && IR1.IrData[k] < 23)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差
  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)                        //如果接收好了进行红外处理
  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中调用
  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)//在中断中调用 值为2即可,快速扫描,适当加长可提高防抖效果。
  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. }
复制代码

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏8 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:957696 发表于 2021-8-1 15:08 来自手机 | 只看该作者
不用中断方式行吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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