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

发布者:JoyfulHarmony最新更新时间:2024-06-13 来源: elecfans关键字:STM32  NEC 手机看文章 扫描二维码
随时随地手机看文章

一、环境介绍

MCU: STM32F103ZET6


编程软件环境: keil5

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

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

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


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

2.1 采用的相关硬件

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

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png?imageView2/2/w/1000


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

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png?imageView2/2/w/1000


poYBAGDYdXCAWkKMAAAAK8RNs4s030.png?imageView2/2/w/1000



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

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png?imageView2/2/w/1000


2.2 红外线协议介绍

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

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

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


2.3 NEC协议介绍

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

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

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png?imageView2/2/w/1000


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?imageView2/2/w/1000


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

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png?imageView2/2/w/1000



单片机编写解码程序的时候,常见的方式就是采用外部中断+定时器的方式进行解析,中断可以设置为低电平触发,因为接收头没有感应到红外光默认是输出高电平,如果收到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?imageView2/2/w/1000


poYBAGDYdXCAWkKMAAAAK8RNs4s030.png?imageView2/2/w/1000



本程序的解码思路是: 将红外线接收模块的输出脚接到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?imageView2/2/w/1000

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%Xn',W25Q64_ReadID());

  

  Infrared_RecvInit();

  

while(1)

{

if(InfraredRecvState)

    {

        InfraredRecvState=0;

        printf('用户码:%d,按键码:%dn',InfraredRecvData[0],InfraredRecvData[2]);

        printf('user反码:%d,key反码:%dn',(~InfraredRecvData[1])&0xFF,(~InfraredRecvData[3])&0xFF);

        BEEP=!BEEP;

        LED0=!LED0;

    }

}

}


poYBAGDYdXCAWkKMAAAAK8RNs4s030.png?imageView2/2/w/1000

四、扩展提高

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


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


关键字:STM32  NEC 引用地址:STM32: NEC红外线协议解码(超低成本无线传输方案)

上一篇:STM32开发板+机智云IoT+智能楼宇照明灯控
下一篇:IC卡读写系统的单片机实现 STM32+MFRC522实现IC卡读写

推荐阅读最新更新时间:2026-03-20 11:18

STM32单片机以NEC协议实现红外遥控设计
红外的介绍、优点、缺点就不给大家说了,进入正题 一、红外遥控协议的的讲解 红外遥控的编码目前广泛使用的是:NEC Protocol的PWM(脉冲宽度调制)和Philips RC-5 Protocol的PPM(脉冲位置调制) 本文将以NEC协议实现红外遥控。 NEC协议的特征: 1、8位地址和8位指令长度; 2、地址和命令两次传输;(确保可靠性) 3、PWM脉冲宽度调制,以发射红外载波的占空比代表“0”和“1”; 4、载波频率为38KHz 5、位时间为1.125ms和2.25ms NEC码位的定义:一个脉冲对应560us的连续载波,一个逻辑1传输需要2.25ms(560us脉冲+1680us低电平),一个逻辑0的传输需要1.125m
[单片机]
<font color='red'>STM32</font>单片机以<font color='red'>NEC</font><font color='red'>协议</font>实现红外遥控设计
NEC宣布在印度建立了5G Open RAN实验室
NEC 14日宣布在印度建立Open RAN实验室。 NEC表示,该实验室将根据客户特定需求形成端到端商用解决方案,加快NEC 5G Open RAN生态系统的发展。NEC致力于开发高可靠、高质量的端到端解决方案,充分利用其在电信行业的长期经验积累的专业知识,以及在全球开发、交付和运营 运营商级别的商业产品和网络的能力。 NEC的目标是通过将上述能力与自己的先进产品和解决方案相结合,并与来自各合作伙伴的最前沿创新产品相结合,使其开放生态系统的价值最大化。最初的合作伙伴包括Altiostar、GigaTera和MTI, NEC计划与更多拥有尖端技术的合作伙伴扩展其生态系统,以加速运营商对Open RAN的商业应用。
[手机便携]
NEC和ADI开发5G O-RAN技术,有多重要?
本文编译自EETimes ADI与NEC正在合作为乐天移动提供5G O-RAN大规模MIMO无线电支持。ADI的第四代软件定义无线电旨在支持大规模MIMO和小型蜂窝系统等无线应用,从而简化设计并降低功耗。无线电单元具有一个5G开放式vRAN(虚拟RAN)接口,对应于乐天移动的虚拟化端到端本地云移动网络,该系统除了执行数字波束成形外,还可执行数字预失真。 ADI无线业务副总裁Joe Barry在接受EE Times采访时说:“无线部署的重点正在从覆盖范围发展到具有独立5G功能的容量部署,并且我们看到了网络虚拟化的潜力。这项工作正在建立5G应用的第一站——对移动用户的超高速移动数据访问。实现5G的全部潜力将来自在工业、交通运输
[网络通信]
<font color='red'>NEC</font>和ADI开发5G O-RAN技术,有多重要?
红外通信模块、NEC红外收发模块(1)——红外模块调试
写这篇文章之前先看一下模块长什么样子,如图: 这个模块淘宝上一搜一堆,请各位学习者可以网上下载。 现在我们要验证一下这个模块是怎么工作的,先看他的引脚 GND RXD TXD 5V 引脚很简单,现在我们使用USB-TTL与我们这个模块相连接,然后用PC上的串口调试助手来完成模块的验证。连接,如下表: NEC红外收发模块 USB-TTL GND GND RXD TXD TXD RXD 5V 5V 注意:这里我们只将模块与USB-TTL直接相连,并没有涉及单片机,请大家注意。 连接图: 打开串口调试助手,如图: 其它的调试助手都是可以的,我使用的这个。 在操作之前可以看一个视频:http://v.y
[单片机]
红外通信模块、<font color='red'>NEC</font>红外收发模块(1)——红外模块调试
STM32HAL----红外遥控(NEC
整理了一个NEC协议的红外程序,NEC协议,物理环境为F103原子战舰V3,使用STM32CubeMX生成初始程序。 定时器配置72分频,9999装载值(10MS) NEC协议: 数据格式: 同步码头 + 地址码 +地址反码 + 按键码 + 按键反码 (LSB先行) 同步码头:9ms低电平 + 4.5ms高电平 连发码 : 9ms低电平 + 2.5ms高电平 逻辑1: 560us + 1680us 逻辑0: 560us + 560us 程序: 头文件: #ifndef __Fun_Infrared_H #define __Fun_Infrared_H #inclu
[单片机]
STM32HAL----红外遥控(<font color='red'>NEC</font>)
抢先在日美韩发力,三星联手NEC合作5G基站研发
        集微网消息,据日经新闻报道,韩国三星电子和日本NEC将合作进行5G基站的研发与销售。预计将在本月达成基本共识。在中美贸易战与“芯片门”的辐射影响下,各国都对中国限制产品采购,三星由此希望与NEC合作,首先打开即将进行5G实用化的美日市场,以基站更新换代为契机,进一步扩大市占率。         报道进一步指出,5G速度将是4G的百倍,目前美国部分地区已开始提供5G服务,日本部分地区将在2019年提供5G服务,2020年以后预计扩大至世界各国。由于5G使用广泛频带,三星将负责高带宽,NEC则负责低带宽的5G基站研发并互相供应产品。NEC可借助三星重新征战海外市场。         三星电子网络事业部负责人金日
[手机便携]
NEC4度裁员 仍找不到出路
日本东洋经济(Toyoy Keizai)网站报导,日本代表性IT大厂NEC,进入21世纪后因找不到事业方向,营收减半,事业陆续切割结束,甚至在2018年1月底宣布第4次裁员,而到现在经营团队还难提出可靠愿景,相对于已经找到IT系统服务方向的同业富士通(Fujitsu),令人难对NEC前景乐观。   虽然NEC以脸部识别为核心的资安业务,在2017年底全球市场规模达500亿日圆(约4.6亿美元),且因技术独步全球,加上NEC购并英国同业Northgate Public Services,进一步扩大通路,预计2020年事业规模可成长3倍,达2,000亿日圆,被NEC认为是未来可望大力发展的重要事业。   年营收达2,000亿日圆、且3
[半导体设计/制造]
NEC购并失败 IoT事业转寻求GE合作
物联网(IoT)成为全球IT厂商发展重点,而与物联网事业有关的企业,在2017年多能受投资者青睐,但日本最大IT厂之一的NEC却成为例外,其原因在失败的海外购并;现在NEC转而强调与奇异电气(GE)的合作,强化奇异物联网平台Predix行销体制,希望带动事业成长。   NEC被看坏的原因,在于该厂2016~2018会计年度(2016/4~2019/3)的3年中期经营计划,明订要以对外购并发展事业,但2016会计年度便未能达成计划,2017会计年度又发生重要购并案失利,现在正在重订中期经营计划,外界正关注NEC是否会在2018年1月公布新的中期经营计划。   而对市场观感影响最大的事件,当属2017年夏季NEC对英国软件公司Civi
[网络通信]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved