STM32
直播中

硬件工程师1

9年用户 1515经验值
擅长:可编程逻辑
私信 关注
[问答]

STM32红外接收解码的知识点汇总,不看肯定后悔

STM32红外接收解码的知识点汇总,不看肯定后悔

回帖(1)

钟晶

2021-11-17 11:25:02
  1.硬件

  硬件:Nucleo-F103RBTx、红外接收管
注意事项:市面上红外接收管型号很多,引脚排序方式也不同,需注意引脚的排列方式,硬件不要接错了。

  

  

硬件连接:红外接收管与Nucleo-f103开发板用杜邦线按照下表进行连接

  

  

  2.软件

  CubeMX配置
PA8配置为外部中断模式,上/下沿方式触发,配置上拉电阻,使能中断,默认优先级。

  

  


  

  


  

  


代码编写:
根据正点原子库函数改写。


(1).hw.h


#ifndef _HW_H
#define _HW_H


#include "main.h"


//定义全局变量
extern uint32_t hw_code;
extern uint8_t  hw_flag;


void delay_us(uint32_t us);
uint8_t HW_time(void);


#endif


(2).hw.c


#include "hw.h"


uint32_t hw_code;          //定义一个32位数据变量,保存接收码
uint8_t  hw_flag;  //定义一个8位数据的变量,用于指示接收标志




//微秒级延时函数,系统时钟频率位64MHz
void delay_us(uint32_t us)
{
    uint32_t delay = (HAL_RCC_GetHCLKFreq() / 6000000 * us);
    while (delay--)
        {
                ;
        }
}


//判断是否接收到有效红外信号(高电平持续时间,将记录的时间保存在t中返回,其中一次大约20us)
uint8_t HW_time()
{
        uint8_t t=0;
        while(HAL_GPIO_ReadPin(HW1_GPIO_Port,HW1_Pin)==1)//高电平
        {
                t++;
                delay_us(20);
                if(t>=250)
                        return t;//超时溢出
        }
        return t;
}


//红外遥控外部中断服务函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
        uint8_t Tim=0,Ok=0,Data,Num=0;
   while(1)
   {
                   if(HAL_GPIO_ReadPin(HW1_GPIO_Port,HW1_Pin)==1)
                        {
                          Tim=HW_time();//获得此次高电平时间
                               
                          if(Tim>=250)
                                        break;//不是有用的信号
                               
                          if(Tim>=200 && Tim<250)
                          {
                                   Ok=1;//收到起始信号
                          }
                          else if(Tim>=60 && Tim<90)
                          {
                                   Data=1;//收到数据 1
                          }
                          else if(Tim>=10 && Tim<50)
                          {
                                  Data=0;//收到数据 0
                          }
                                else
                                        break;


                          if(Ok==1)
                          {
                                   hw_code<<=1;
                                  hw_code+=Data;


                                  if(Num>=32)
                                  {
                                          hw_flag=1;
                                          break;
                                  }
                          }
                          Num++;
                        }
   }
}


(3).main.c


while (1)
  {
  /* USER CODE BEGIN 3 */
                if(hw_flag==1)         //如果红外接收到有效信号
                {
                        hw_flag=0;           //清除接收标志
                        printf("红外接收码 %0.8Xrn",hw_code);        //打印
                        hw_code=0;                 //接收码清零
                }               
                HAL_Delay(10);
  }
  /* USER CODE END 3 */


如何实现串口发送功能此处省略。



  3.操作

  
  

  

连接串口助手,红外遥控器对着红外接收管任意按键,当检测到有信号输入,单片机对信号解码并串口打印出来。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分