0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32: NEC红外线协议解码(超低成本无线传输方案)

DS小龙哥-嵌入式技术 来源:DS小龙哥-嵌入式技术 作者:DS小龙哥-嵌入式技 2022-03-14 09:48 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一、环境介绍

MCU: STM32F103ZET6

编程软件环境: keil5

红外线传输协议: NEC协议---38KHZ载波:。NEC协议是红外遥控协议中常见的一种。

解码思路: 外部中断 + 定时器方式

代码风格: 模块化编程,寄存器直接操作方式

二、NEC协议与解码思路介绍

2.1 采用的相关硬件

图1: 这是NEC协议的红外线遥控器: 如果自己手机没有红外线遥控器的功能,可以淘宝上买一个小遥控器来学习测试,成本不高,这个遥控器也可以自己做,能解码当然也可以编码发送,只需要一个红外光发射管即可。

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

图2: 这是红外线接收头模块。如果自己的开发板没有自带这个接收头,那就单独买一个接收头模块,使用杜邦线接到开发板的IO口上即可用来测试学习,接线很方便。

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

图3: 这是红外线发射管,如果自己想做遥控器的发射端,自己做遥控器,那么就可以直接购买这种模块即可。

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

2.2 红外线协议介绍

在光谱中波长自760nm至400um的电磁波称为红外线,它是一种不可见光。红外线通信的例子我们每个人应该都很熟悉,目前常用的家电设备几乎都可以通过红外遥控的方式进行遥控,比如电视机、空调、投影仪等,都可以见到红外遥控的影子。这种技术应用广泛,相应的应用器件都十分廉价,因此红外遥控是我们日常设备控制的理想方式。

红外线的通讯原理: 红外光是以特定的频率脉冲形式发射,接收端收到到信号后,按照约定的协议进行解码,完成数据传输,在消费类电子产品里,脉冲频率普遍采用 30KHz 到 60KHz 这个频段,NEC协议的频率就是38KHZ。 这个以特定的频率发射其实就可以理解为点灯,不要被复杂的词汇难住了,就是控制灯的闪烁频率(亮灭),和刚学单片机完成闪光灯一样的意思,只不过是灯换了一种类型,都是灯。 接收端的原理: 接收端的芯片对这个红外光比较敏感,可以根据有没有光输出高低电平,如果发送端的闪烁频率是有规律的,接收端收到后输出的高电平和低电平也是有规律对应的,这样发送端和接收端只要约定好,那就可以做数据传输了。

红外线传输协议可以说是所有无线传输协议里成本最低,最方便的传输协议了,但是也有缺点,距离不够长,速度不够快;当然,每个传输协议应用的环境不一样,定位不一样,好坏没法比较,具体要看自己的实际场景选择合适的通信方式。

2.3 NEC协议介绍

NEC协议是众多红外线协议中的一种(这里说的协议就是他们数据帧格式定义不一样,数据传输原理都是一样的),我们购买的外能遥控器、淘宝买的mini遥控器、电视机、投影仪几乎都是NEC协议。 像格力空调、美的空调这些设备使用的就是其他协议格式,不是NEC协议,但是只要学会一种协议解析方式,明白了红外线传输原理,其他遥控器协议都可以解出来。

下图是NEC协议传输一次数据的完整格式:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

NEC协议一次完整的传输包含: 引导码、8位用户码、8位用户反码、8位数据码、8位数据反码。

(注意:下面的解释都是站在红外线接收端的角度来进行说明的,就是解码端的角度)

引导码: 由9ms的高电平+4.5ms的低电平组成。

4个字节的数据: 用户码+用户反码+数据码+数据反码。 这里的反码可以用来校验数据是否传输正确,有没有丢包。

重点: NEC协议传输数据位的时候,0和1的区分是依靠收到的高、低电平的持续时间来进行区分的---这是解码关键。

标准间隔时间:0.56ms

收到数据位0: 0.56ms

收到位1: 1.68ms

所以,收到一个数据位的完整时间表示方法是这样的:

收到数据位0: 0.56m低电平+ 0.56ms的高电平

收到数据位1: 0.56ms低电平+1.68ms的高电平

红外线接收头模块输出电平的原理: 红外线接收头感应到有红外光就输出低电平,没有感应到红外光就输出高电平。

这是使用逻辑分析采集红外线接收头输出的信号:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

这是采集红外线遥控器上的LED灯输出电平时序图,刚好和接收端相反:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

单片机编写解码程序的时候,常见的方式就是采用外部中断+定时器的方式进行解析,中断可以设置为低电平触发,因为接收头没有感应到红外光默认是输出高电平,如果收到NEC引导码,就会输出低电平,进入到中断服务函数,完成解码,解码过程中开启定时器记录每一段的高电平、低电平的持续时间,按照NEC协议进行判断,完成最终解码。

STM32可以使用输入捕获方式完成解码,其实输入捕获就是外部中断+定时器的组合,只不过是STM32内部封装了一层。

完整keil工程源码下载(解压即可编译运行测试):

https://download.csdn.net/download/xiaolong1126626497/19863275

外部中断服务器里的解码程序如下(这个在其他单片机上思路是一样的):

/*
函数功能:  外部中断线9_5服务函数
*/
void EXTI9_5_IRQHandler(void)
{
    u32 time;
    u8 i,j,data=0;
  
    //清除中断线9上的中断请求
		EXTI->PR|=1<<9;
  
    time=Infrared_GetTime_L();       //得到低电平时间
    if(time<7000||time>10000)return; //标准时间: 9000us
    time=Infrared_GetTime_H();       //得到高电平时间
    if(time<3000||time>5500)return;  //标准时间4500us
    
    //正式解码NEC协议
    for(i=0;i<4;i++)
    {
        for(j=0;j<8;j++)
        {
             time=Infrared_GetTime_L();       //得到低电平时间
             if(time<400||time>700)return;    //标准时间: 560us
             
             time=Infrared_GetTime_H();       //得到高电平时间
             if(time>1400&&time<1800)         //数据1 1680us
             {
                data>>=1;
                data|=0x80;
             }
             else if(time>400&&time<700)   //数据0 560us
             {
                data>>=1;
             }
             else return;
        }
        InfraredRecvData[i]=data; //存放解码成功的值
      }
    
      //解码成功
      InfraredRecvState=1;
}
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

三、核心完整代码

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

本程序的解码思路是: 将红外线接收模块的输出脚接到STM32的PB9上,配置STM32的PB9为外部中断模式,下降沿电平触发;如果收到红外线信号就进入到中断服务函数里解码,如果解码过程中发现数据不符合要求就终止解码,如果数据全部符合要求就按照协议接收,直到解码完成,设置标志位,在main函数里打印解码得到的数据。

代码都是模块化编程,阅读起来也很方便。

3.1 红外线解码.c

#include "nec_Infrared.h"
u8 InfraredRecvData[4]; //存放红外线解码接收的数据
u8 InfraredRecvState=0; //0表示未接收到数据,1表示接收到数据 
/*
函数功能: 红外线解码初始化(接收)
*/
void Infrared_RecvInit(void)
{
    Infrared_Time6_Init(); //定时器初始化
    
    /*1. 配置GPIO口*/
    RCC->APB2ENR|=1<<3; //PB
    GPIOB->CRH&=0xFFFFFF0F;
    GPIOB->CRH|=0x00000080;
    GPIOB->ODR|=1<<9;
  
    /*2. 配置外部中断*/
    EXTI->IMR|=1<<9; //外部中断线9,开放中断线的中断请求功能
    EXTI->FTSR|=1<<9; //中断线9_下降沿
  
    RCC->APB2ENR|=1<<0; //开启AFIO时钟
    AFIO->EXTICR[2]&=~(0xF<<1*4);
    AFIO->EXTICR[2]|=0x1<<1*4;
    STM32_NVIC_SetPriority(EXTI9_5_IRQn,1,1);
}

/*
函数功能: 初始化定时器,用于红外线解码
*/
void Infrared_Time6_Init(void)
{
    RCC->APB1ENR|=1<<4;
		RCC->APB1RSTR|=1<<4;
		RCC->APB1RSTR&=~(1<<4);
    TIM6->PSC=72-1; //预分频器
    TIM6->ARR=65535;   //重装载寄存器
    TIM6->CR1|=1<<7; //开启缓存功能
	  //TIMx->CR1|=1<<0; //开启定时器
}

/*
函数功能: 测量高电平持续的时间
*/
u32 Infrared_GetTime_H(void)
{
    TIM6->CNT=0;
    TIM6->CR1|=1<<0;    //开启定时器
    while(NEC_IR){}     //等待高电平结束
    TIM6->CR1&=~(1<<0); //关闭定时器
    return TIM6->CNT;
}

/*
函数功能: 测量低电平持续的时间
*/
u32 Infrared_GetTime_L(void)
{
    TIM6->CNT=0;
    TIM6->CR1|=1<<0;    //开启定时器
    while(!NEC_IR){}     //等待低电平结束
    TIM6->CR1&=~(1<<0); //关闭定时器
    return TIM6->CNT;
}


/*
函数功能:  外部中断线9_5服务函数
*/
void EXTI9_5_IRQHandler(void)
{
    u32 time;
    u8 i,j,data=0;
  
    //清除中断线9上的中断请求
		EXTI->PR|=1<<9;
  
    time=Infrared_GetTime_L();       //得到低电平时间
    if(time<7000||time>10000)return; //标准时间: 9000us
    time=Infrared_GetTime_H();       //得到高电平时间
    if(time<3000||time>5500)return;  //标准时间4500us
    
    //正式解码NEC协议
    for(i=0;i<4;i++)
    {
        for(j=0;j<8;j++)
        {
             time=Infrared_GetTime_L();       //得到低电平时间
             if(time<400||time>700)return;    //标准时间: 560us
             
             time=Infrared_GetTime_H();       //得到高电平时间
             if(time>1400&&time<1800)         //数据1 1680us
             {
                data>>=1;
                data|=0x80;
             }
             else if(time>400&&time<700)   //数据0 560us
             {
                data>>=1;
             }
             else return;
        }
        InfraredRecvData[i]=data; //存放解码成功的值
      }
    
      //解码成功
      InfraredRecvState=1;
}
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

3.2 主函数.c

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "usart.h"
#include "at24c02.h"
#include "W25Q64.h"
#include "spi.h"
#include "nec_Infrared.h"

int main()
{
	LED_Init();
	BEEP_Init();
	KeyInit();
  USARTx_Init(USART1,72,115200);
  IIC_Init();
  
  W25Q64_Init();
  
  printf("芯片ID号:0x%X\n",W25Q64_ReadID());
  
  Infrared_RecvInit();
  
	while(1)
	{
		if(InfraredRecvState)
    {
        InfraredRecvState=0;
        printf("用户码:%d,按键码:%d\n",InfraredRecvData[0],InfraredRecvData[2]);
        printf("user反码:%d,key反码:%d\n",(~InfraredRecvData[1])&0xFF,(~InfraredRecvData[3])&0xFF);
        BEEP=!BEEP;
        LED0=!LED0;
    }
	}
}

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

四、扩展提高

如果上面的NEC的解码思路已经看到,程序已经可以自己编写,就可以试着使用STM32的输入捕获+定时器方式写一版解码代码,既能更加熟悉NEC协议、也可以学习STM32定时器捕获捕获的用法;也可以做一些小东西来锻炼,比如:红外线遥控小车、音乐播放器支持红外线遥控器切歌,电机的开关、灯的开关等等。

搞定协议解码之后,我们下一步就是完成自定义的NEC协议红外线制作,采用STM32模拟一个万能红外线遥控器。

审核编辑:汤梓红


在光谱中波长自760nm至400um的电磁波称为红外线,它是一种不可见光。目前几乎所有的视频和音频设备都可以通过红外遥控的方式进行遥控,比如电视机、空调、影碟机等,都可以见到红外遥控的影子。这种技术应用广泛,相应的应用器件都十分廉价,因此红外遥控是我们日常设备控制的理想方式。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    147

    文章

    19240

    浏览量

    405201
  • STM32
    +关注

    关注

    2313

    文章

    11210

    浏览量

    375279
  • 无线传输
    +关注

    关注

    3

    文章

    619

    浏览量

    42576
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    NISSHINBO日清纺微(RIOCH理光微+NJRC新日本无线合并)用于微波无线电力传输的双二极管器件

    NISSHINBO日清纺微(RIOCH理光微+NJRC新日本无线合并)用于微波无线电力传输的双二极管器件
    的头像 发表于 03-30 13:51 207次阅读
    NISSHINBO日清纺微(RIOCH理光微+NJRC新日<b class='flag-5'>本无线</b>合并)用于微波<b class='flag-5'>无线</b>电力<b class='flag-5'>传输</b>的双二极管器件

    红外遥控 NEC 解码终于搞懂了!看完直接抄作业

    从波形抓取到按键映射,手把手教你搞定NEC协议解码红外遥控解码的朋友,有没有过这种绝望:逻辑分析仪抓了一堆波形,看着像
    的头像 发表于 03-26 19:34 499次阅读
    <b class='flag-5'>红外</b>遥控 <b class='flag-5'>NEC</b> <b class='flag-5'>解码</b>终于搞懂了!看完直接抄作业

    低成本低功耗单声道音频编解码器AD74111:技术解析与应用展望

    低成本低功耗单声道音频编解码器AD74111:技术解析与应用展望 引言 在音频处理领域,对于低成本、低功耗且高性能的音频编解码器需求始终存在。ADI公司的AD74111就是这样一款出色
    的头像 发表于 02-27 15:50 654次阅读

    MCP2120红外编码器/解码器:特性、应用与设计要点

    MCP2120红外编码器/解码器:特性、应用与设计要点 在电子设计领域,红外通信技术凭借其低成本、高可靠性等优势,在众多应用场景中得到了广泛应用。Microchip的MCP2120
    的头像 发表于 02-04 16:05 623次阅读

    基于STM32F103C8T6对红外遥控信号解码 实现HX1838接收头接收数据

    红外遥控技术是一种广泛应用于电子设备的无线控制方案,具有抗干扰强、成本低等优点。本文介绍了红外遥控的基本原理,包括发射与接收端的波长匹配(9
    的头像 发表于 01-30 19:53 3526次阅读
    基于<b class='flag-5'>STM32</b>F103C8T6对<b class='flag-5'>红外</b>遥控信号<b class='flag-5'>解码</b> 实现HX1838接收头接收数据

    探索MAX931 - MAX934:超低功耗、低成本的比较器解决方案

    探索MAX931 - MAX934:超低功耗、低成本的比较器解决方案 在电子工程师的日常设计中,寻找高性能、低成本且低功耗的比较器是一项常见挑战。MAXIM推出的MAX931 - MA
    的头像 发表于 01-15 20:00 1429次阅读

    基于芯岭技术XL2417D芯片的2.4G无线遥控器解决方案

    无线2.4G遥控器是我们生活中常见的一种遥控器了,相比于传统的红外线式遥控器,无线2.4g遥控器摆脱了指向性的问题,我们可以在屋内任何位置以及任何角度来使用遥控器操作设备而不用担心设备无法接收到信号的问题。2.4G
    的头像 发表于 01-15 12:43 1008次阅读
    基于芯岭技术XL2417D芯片的2.4G<b class='flag-5'>无线</b>遥控器解决<b class='flag-5'>方案</b>

    STM32WBA52xx:面向下一代物联网设备的多协议无线MCU

    STMicroelectronics STM32WBA5多协议无线无线电MCU通过了蓝牙® 低功耗5.4协议认证,让非专家开发人员能够以经济
    的头像 发表于 10-25 17:32 2223次阅读
    <b class='flag-5'>STM32</b>WBA52xx:面向下一代物联网设备的多<b class='flag-5'>协议</b><b class='flag-5'>无线</b>MCU

    MEMS组合导航如何实现超低成本

    超低成本,同时保障核心性能的呢? 关键转变:从“硬件堆料”到“算法赋能” 传统方案依赖于本身价格极高的惯性器件来保证性能。而ER-GNSS/MINS-05的思路是: · 采用经过市场验证的低成本MEMS传感器作为基础。 · 通过
    的头像 发表于 10-23 15:30 578次阅读
    MEMS组合导航如何实现<b class='flag-5'>超低成本</b>?

    全智芯433MHz无线传输人体感应门铃方案概述

    全智芯433MHz无线传输人体感应门铃方案采用433.92MHz无线射频技术与人体红外感应技术结合实现一种
    的头像 发表于 08-27 16:14 1473次阅读

    应用在智能眼镜红外线感测领域中的光距感芯片-WH4530A

    接近光传感芯片是一种可以检测物体距离和位置的传感器。它的工作原理基于光电效应。当某个物体与接近光传感器靠近时,传感器会发出一束红外线
    的头像 发表于 08-05 09:26 1034次阅读
    应用在智能眼镜<b class='flag-5'>红外线</b>感测领域中的光距感芯片-WH4530A

    【选型】常见的遥控开关控制协议,看看哪种适合你?

    遥控开关,是一种通过无线信号非接触式远程控制电路通断的装置,今天我们一起聊一聊常见的无线信号类别,看看哪种更适合你?1.红外遥控红外型遥控,本质上就是通过
    的头像 发表于 07-17 19:34 2106次阅读
    【选型】常见的遥控开关控制<b class='flag-5'>协议</b>,看看哪种适合你?

    红外线水分测定仪XKCON-NIR-MA-FV采用近红外光谱技术(NIR)对棉纤维的含水率,进行又快又准的无损测量

    红外线水分测定仪XKCON-NIR-MA-FV将“看不见的棉纤维含水率”变为“可读的数字”,它在纺织企业的应用推动了棉纤维含水率大小的智能化控制。近年来,近红外线水分测定仪在纺织、造纸、食品、烟草、粮食等众多行业的各类场景中应用,为企业的智能化监管提供了精确的数据支持。
    的头像 发表于 07-08 15:47 840次阅读
    近<b class='flag-5'>红外线</b>水分测定仪XKCON-NIR-MA-FV采用近<b class='flag-5'>红外</b>光谱技术(NIR)对棉纤维的含水率,进行又快又准的无损测量

    cyw20829能不能使用红外线解码吗?

    cyw20829能不能使用红外线解码
    发表于 07-03 06:49

    单片机实例项目:NEC红外线协议编码与解码

    单片机实例项目:NEC红外线协议编码与解码,推荐下载!
    发表于 06-03 22:03