一、简介

这是一款新型的超薄38K通用红外遥控器,采用的是NEC编码格式,主要用于车载MP3、足浴盆、灯光设配、数码相框、单片机开发板和学习板等场合。因其是基于无线遥控,因此人们在使用起来显得方便、有效,现在的应用领域也越来越宽,那么针对我们公司的这款产品我们将做如下的介绍。

二、技术参数红外遥控距离

大于8米发射管红外波长:940Nm

晶振频率:455KHZ的晶振

载波频率:38KHZ

编码:编码格式为NEC

尺寸:86* 40* 6mm

电源:CR2025/1600mAH

三、小板接口说明(3线制)

VCC 外接5V

GND 外接GND

DO 小板数字量输出接口

四、红外遥控器采用了NEC编码规则

NEC 载波频率为 38Khz

引导码:9ms 高电平 + 4.5ms 低电平

1 码 :0.56 ms 高电平 + 0.56 ms 低电平

0 码 : 0.56ms 高电平 + 1.68 ms 低电平

结束码 :0.56ms 高电平

数据帧格式:引导码 + 地址 + 地址反码 + 键值 + 键值反码 + 结束码

重复帧格式:9ms 高电平 + 2.25ms低电平 + 结束位 + 结束码

高位在前,即首先收到的是高位的数据

注:本文使用的接收头,电平极性与协议相反。所以,当捕获到一个 9ms 低电平 + 4.5ms 高电平时,即收到一个引导码。

红外线发送的每一帧数据,除了引导码以外,有32位有效数据

//HX1838.c

#define IRDA_ID 0
 //读取引脚的电平#define  IrDa_DATA_IN()       HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_7)
uint32_t frame_data=0;    /* 一帧数据缓存 */
uint8_t  frame_cnt=0;
uint8_t  frame_flag=0;    /* 一帧数据接收完成标志 */
/* 获取高电平的时间 */
uint8_t Get_Pulse_Time(void)
{
  uint8_t time = 0;
  while( IrDa_DATA_IN() )
  {
    time ++;
    Delay_us(2);     // 延时 20us
    if(time == 250)
      return time;   // 超时溢出   
  }
  return time;
}
/*
 * 帧数据有4个字节,第一个字节是遥控的ID,第二个字节是第一个字节的反码
 * 第三个数据是遥控的真正的键值,第四个字节是第三个字节的反码
 */
uint8_t IrDa_Process(void)
{
  uint8_t first_byte, sec_byte, tir_byte, fou_byte;  
  
  first_byte = frame_data >> 24;
  sec_byte = (frame_data>>16) & 0xff;
  tir_byte = frame_data >> 8;
  fou_byte = frame_data;
  
  /* 记得清标志位 */
  frame_flag = 0;
  
  if( (first_byte==(uint8_t)~sec_byte) && (first_byte==IRDA_ID) )
  {
    if( tir_byte == (uint8_t)~fou_byte )
      return tir_byte;
  }
  
  return 0;   /* 错误返回 */
}

//中断

void EXTI9_5_IRQHandler(void)
{
    uint8_t pulse_time = 0;
  uint8_t leader_code_flag = 0; /* 引导码标志位,当引导码出现时,表示一帧数据开始 */
  uint8_t irda_data = 0;        /* 数据暂存位 */
  EXTI_HandleTypeDef hext;
    hext.Line=EXTI_LINE_7;
  if(HAL_EXTI_GetPending(&hext, EXTI_TRIGGER_RISING_FALLING)!= RESET) /* 确保是否产生了EXTI Line中断 */
    {   
    while(1)
    {
      if( IrDa_DATA_IN()== SET )        /* 只测量高电平的时间 */
      {       
        pulse_time = Get_Pulse_Time();    
        /* >=5ms 不是有用信号 当出现干扰或者连发码时,也会break跳出while(1)循环 */
        if( pulse_time >= 250 )                
        {
          break; /* 跳出while(1)循环 */
        }        
        if(pulse_time>=200 && pulse_time<250)         /* 获得前导位 4ms~4.5ms */
        {
          leader_code_flag = 1;
        }
        else if(pulse_time>=10 && pulse_time<50)      /* 0.56ms: 0.2ms~1ms */
        {
          irda_data = 0;
        }
        else if(pulse_time>=50 && pulse_time<100)     /* 1.68ms:1ms~2ms */
        {
          irda_data =1 ; 
        }        
        else if( pulse_time>=100 && pulse_time<=200 ) /* 2.1ms:2ms~4ms */
        {/* 连发码,在第二次中断出现 */
          frame_flag = 1;               /* 一帧数据接收完成 */
          frame_cnt++;                  /* 按键次数加1 */
          isr_cnt ++;                   /* 进中断一次加1 */
          break;                        /* 跳出while(1)循环 */
        }        
        if( leader_code_flag == 1 )
        {/* 在第一次中断中完成 */
          frame_data <<= 1;
          frame_data += irda_data;
          frame_cnt = 0;
          isr_cnt = 1;
        }
      }      
    }// while(1)   
             //清除中断标志位                HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_7);
    //LED2_TOGGLE;
    }
}

不过有一款更加简单,只需操作GPIO就可以遥控了

stm32 无线遥控HX1838或8路低电平解码接收模块Hal库代码程序相关推荐

  1. STM32 0.96寸4针IOLED显示器驱动IIC(HAL库)

    OLED显示屏驱动HAL库 一.简介: SSD1306 是一个单片 CMOS OLED/PLED 驱动芯片可以驱动有机/聚合发光二极管点阵图形显示系统.由 128 segments 和 64 Comm ...

  2. STM32串口通信原理及HAL库代码stm32f1xx_hal_uart.c阅读分析

    原理性说明: //参考网址:https://blog.csdn.net/u010561799/article/details/89526266 在USART的发送端有2个寄存器,一个是程序可以看到的U ...

  3. stm32中空的I/O管脚是高电平还是低电平

    STM32中空的I/O管脚是高电平还是低电平取决于具体情况. 1.IO端口复位后处于浮空状态,也就是其电平状态由外围电路决定. 2.STM32上电复位瞬间I/O口的电平状态默认是浮空输入,因此是高阻. ...

  4. 正点原子STM32(基于HAL库)3

    目录 高级定时器实验 高级定时器简介 高级定时器输出指定个数PWM 实验 高级定时器输出指定个数PWM原理 TIM1/TIM8 寄存器 硬件设计 课堂源码(输出指定个数PWM灯就闪几次) 程序设计 下 ...

  5. 从代码层面分析STM32 标准库和HAL库的差异

      如果用过STM32系列单片机的朋友会比较清楚,一般在开发STM32单片机程序的时候首先要考虑选用那种方式来写代码.常见的有三种方式,寄存器版.标准库版.HAL库版.现在选用后两种的比较多,选择寄存 ...

  6. 正点原子STM32(基于HAL库)0

    目录 开发环境搭建与使用 常用开发工具简介 MDK 安装 仿真器驱动安装 CH340 USB 虚拟串口驱动安装 使用MDK5 编译例程 使用串口下载程序 使用DAP 下载与调试程序 使用DAP 下载程 ...

  7. HAL库版STM32双轮自平衡车(二) ——— CubeMX的配置、原理图接线、物料准备

    系列文章目录 编码电机测速 HAL库版 0.96'OLED的使用 HAL库版STM32双轮自平衡车(一) ---代码思路和PID的简单介绍 HAL库版STM32双轮自平衡车(二) --- CubeMX ...

  8. HAL库版STM32双轮自平衡车(三) ———代码精讲

    系列文章目录 编码电机测速 HAL库OLED的使用 HAL库版STM32双轮自平衡车(一) ---代码思路和PID基础精讲 HAL库版STM32双轮自平衡车(二) --- CubeMX的配置.原理图接 ...

  9. STM32+RS485+Modbus-RTU(主机模式+从机模式)-标准库/HAL库开发

    modbus协议 完成modbus协议的编程之后,设备可以分别作为modbus协议的主机或者从机进行测试,使用模拟软件测试完毕后,完整代码以三个版本的形式进行介绍 1.版本一:使用串口接收数据超时完成 ...

最新文章

  1. Android 占位符 %1$s %1$d
  2. pandas使用extract函数根据正则表达式从dataframe指定数据列的字符串中抽取出数字(设置expand=false之后返回的为series)、将series转化为dataframe
  3. Linux 中复制文件到多个目录中
  4. 【GAN的应用】基于对抗学习的图像美学增强方法
  5. mysql搜索_查询mysql的搜索引擎
  6. php 获取刚插入的一条,php获得刚插入数据的id 的几种方法
  7. 科多大数据_redis缓存的简单使用—科多大数据
  8. 水晶报表加载本地图片 【BY阿泰】
  9. matlab改变直方图数量级,histogram equalization-MATLAB
  10. 领导合影站位图_领导主席台座次安排图解:政务礼仪
  11. nginx模块之split_clients
  12. 计算机存储单位 t后面的单位,字节后面的存储单位是什么
  13. 主流各云平台主机性能对比
  14. kafka重新分配partition
  15. python 使用图形化界面tkinter显示图片 规定大小!
  16. 5240: C++实验:矩形面积
  17. X86_Intel_汇编语法
  18. Matlab自带排序函数sort用法
  19. 元件封装知识(转载)
  20. 对AttributeSet和defStyle的理解

热门文章

  1. 2023年highway-env更新之后的使用记录(含DDQN,DuelingDQN,DDQN+OtherChanges) 入门到入土,再踩坑就不玩原神了
  2. 电表4G无线红外抄表器使用说明和技术指南
  3. [置顶] Fedora使用入门与基本配置
  4. 深度学习应用篇-计算机视觉-语义分割综述[5]:FCN、SegNet、Deeplab等分割算法、常用二维三维半立体数据集汇总、前景展望等
  5. 读书百客:《圆圆曲》鉴赏
  6. 声学模型学习笔记(一) HMM
  7. 用python编写程序、判断某一年是否是闰年_用C语言编写判断某一年是否是闰年...
  8. 极速数据api 全国违章查询api
  9. Dooc 文档下载器 -- 支持【百度文库】、【豆丁】、【MBALib】直接下载,无需登录积分
  10. 巴金批判力作:《孔老二罪恶的一生》