STM32F407入门开发: NEC红外线协议解码

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

一、NEC红外线协议与接收头介绍

红外线遥控是家电领域里很常见的一种遥控方式,常见的电视机、空调、投影机等设备基本都支持红外线遥控;这也主要是红外线遥控成本比较低,现在很多电视机也支持蓝牙遥控器了,穿透性、速度、比红外线遥控要好很多。


红外线遥控的原理: 就是通过红外光的闪烁传递数据,需要一对红外线发射管、一个红外线接收头。 这个红外线接收头对红外光很敏感,接收到红外光就输出低电平,相反就是高电平。所以可以通过这个原理就可以通过与遥控器端、接收端约定协议就能传递数据了。


二、解码实现代码

红外线协议有很多,下面就以NEC协议为例: NEC协议分为: 引导码、用户码、用户反码、按键码、按键反码组成。 引导码是9ms低电平+4.5毫秒高电平组成。 数据位一共32位。也就是个字节。对应上面说的后4个数据位。


数据1表示:0.56ms低电平+1.68ms高电平 数据0表示:0.56ms低电平+0.56ms低电平。


红外线解码思路在M4上面实现有两种方式(其实本质是一样的):


通过定时器输入捕获方式

通过定时器+外部中断的方式

下面的代码就是采用定时器捕获+外部中断方式实现解码。


2.1 main.c代码

#include 'stm32f4xx.h' // Device header

#include 'led.h'

#include 'delay.h'

#include 'key.h'

#include 'usart.h'

#include 'sys.h'

#include 'exti.h'

#include 'timer.h'

#include 'pwm.h'

#include 'ds18b20.h'

#include 'infrared.h'

extern u8 InfraredRxBuff[5];

int main(void)

{

LED_Init();

KEY_Init();

USART1_Init(84,115200);

KEY_EXTI_Init();

DS18B20_Init();

InfraredRxInit();             //红外线解码初始化

while(1)

{

  if(InfraredRxBuff[4])

{

InfraredRxBuff[4]=0; //清除接收成功标志

printf('USER=0x%xrn',InfraredRxBuff[0]);

printf('KEY=0x%xrn',InfraredRxBuff[2]);

LED0=0;

DelayMs(100);

LED0=1;

}

}

}

复制代码

2.2 解码核心代码

复制


#include 'infrared.h'

/*

函数功能:红外线解码初始化

硬件连接:PA8

定 时 器:使用TIM2

*/

void InfraredRxInit(void)

{

/*1. 开时钟*/

RCC->AHB1ENR|=1<<0;//使能PORTA时钟


/*2. 配置GPIO口模式*/

GPIOA->MODER&=~(0x3<<8*2); //清除模式

GPIOA->MODER|=0x0<<8*2;    //配置输入模式


/*3. 开启SYSCFG时钟 */

RCC->APB2ENR|=1<<14;


/*4. 开放来自线x上的中断请求*/

EXTI->IMR|=1<<8; //中断线8


/*3. 配置中断线触发边沿*/

EXTI->FTSR|=1<<8; //下降沿


/*4. 配置产生中断的对应IO口*/

SYSCFG->EXTICR[2]&=~(0xf<<0*4);

SYSCFG->EXTICR[2]|=0x0<<0*4;


/*5. 配置中断优先级*/

SetNVICPriorityGrouping(EXTI9_5_IRQn,1,1);


/*6. 初始化定时器*/

RCC->APB1ENR|=1<<0;     //开启定时器2的时钟

RCC->APB1RSTR|=1<<0;    //开启复位时钟  

RCC->APB1RSTR&=~(1<<0); //关闭  

TIM2->PSC=84;      //预分频

TIM2->ARR=65535;        //重装载寄存器

TIM2->CR1&=~(1<<0);     //开启计数器

}


/*

函数功能:获取高电平持续的时间

返 回 值:高电平持续的时间

*/

u32 GetInfraredRxH(void)

{

 TIM2->CR1|=1<<0;

 TIM2->CNT=0;

 while(INFRARED_RX){}

 TIM2->CR1&=~(1<<0);

 return TIM2->CNT;

}


/*

函数功能:获取低电平持续的时间

返 回 值:低电平持续的时间

*/

u32 GetInfraredRxL(void)

{

 TIM2->CR1|=1<<0;

 TIM2->CNT=0;

 while(!INFRARED_RX){}

 TIM2->CR1&=~(1<<0);

 return TIM2->CNT;

}



/*

函数功能:外部中断线0中断服务函数

NEC协议解码原理:

1. 先接收引导码:9ms低电平+4.5ms高电平

2. 引导码之后,是连续的32位数据。用户码+用户反码+按键码+按键反码

3. 数据‘0’ :560us低电平+560us高电平

4. 数据‘1’ :560us低电平+1680us高电平

*/

u8 InfraredRxBuff[5]={0}; //存放红外线接收的数据值,其中[4]表示标志位。=0失败,=1成功

void EXTI9_5_IRQHandler(void)

{

u32 time,j,i;

u8 data=0;

EXTI->PR|=1<<0;  //清除中断标志位

/*1. 判断引导码*/

time=GetInfraredRxL(); //获取低电平的时间

if(time<5000||time>11000)return;

time=GetInfraredRxH();

if(time<2500||time>5500)return;


/*2. 接收用户码和按键码*/

for(i=0;i<4;i++)

{

for(j=0;j<8;j++)

{

time=GetInfraredRxL(); //获取低电平的时间

if(time<360||time>660)return;


time=GetInfraredRxH(); //获取高电平的时间

//560us高电平  0  、 1680us高电平 1

if(time>360&&time<660)

{

data>>=1;

}

else if(time>1480&&time<1880)

{

data>>=1;

data|=0x80; //1000 0000

}

}

InfraredRxBuff[i]=data;

}

InfraredRxBuff[4]=1; //标志红外线解码成功

}


#ifndef _INFRARED_H

#define _INFRARED_H

#include 'stm32f4xx.h'

#include 'sys.h'

void InfraredRxInit(void);

u32 GetInfraredRxH(void);

u32 GetInfraredRxL(void);

#define INFRARED_RX PAin(8)  //红外线的接收口

#endif


关键字:STM32F407  NEC  解码 引用地址:STM32F407入门开发: NEC红外线协议解码

上一篇:总结STM32控制中常见的PID算法 理解万能的PID算法
下一篇:ESP8266应用案例 基于STM32核心板获取网络天气数据

推荐阅读最新更新时间:2026-03-25 10:55

STM32CUBEMX(5)--自定义红外NEC解码,定时器TIM捕获方式
概述 本篇文章主要介绍如何使用STM32CubeMX对红外波形进行解码,并通过串口打印。 硬件准备 首先需要准备一个开发板,这里我准备的是NUCLEO-F030R8的开发板: 选择芯片型号 配置时钟源 HSE与LSE分别为外部高速时钟和低速时钟,在本文中使用内置的时钟源,故都选择Disable选项,如下所示: 配置时钟树 STM32F0的最高主频到48M,所以配置48即可: 串口配置 本次实验使用的串口1进行串口通信,波特率配置为115200。 在这里插入图片描述 定时器配置 本次使用定时器1的通道2进行检测,配置入下。 红外接收管 这里使用VS838的接收管,如下所示: 红外编码 NEC协议载波:38k
[单片机]
STM32CUBEMX(5)--自定义红外<font color='red'>NEC</font><font color='red'>解码</font>,定时器TIM捕获方式
NEC制式红外线解码程序
此程序在STC89C52上实验通过! 晶振11.05926, 占用资源,外部中断1, LCD1602,显示解码! 串口通讯波特率4800KBS; 闫伟东,提示,在中端中不可以用while(p3_2); 否则,不能顺利跳出终端! #include AT89X52.H #include "LCD.h" #define uchar unsigned char #define uint unsigned int //void Delay(unsigned int i); void chuangkou(void); void unint0 (void); void senddata(unsigned char outdata); unsi
[单片机]
NEC推ARM Cortex-A9核心全高清解码芯片
  NEC电子日前发布了一款专门面向掌上媒体播放器等移动影音设备的专用高清解码芯片,名为EMMA Mobile/EV,支持1080p FullHD全高清视频播放,将从今年7月开始向客户厂商提供样品。      EMMA Mobile/EV搭载了目前高端智能手机中常见的ARM Cortex-A9核心,分为单核EMMA Mobile/EV1和双核EMMA Mobile/EV2两款,搭配专用高清视频解码电路,支持1920x1080分辨率30FPS帧率视频解码,支持视频格式包括MPEG-4 AVC/H.264、MPEG-4、MPEG-2、VC-1,音频格式支持MP3、AAC、WMA以及杜比数字5.1声道AC-3。      基于智能功耗控制
[手机便携]
NEC MPEG解码器EMMA2SL/P用于机顶盒
NEC电子公司近日发布用于机顶盒(STB)与集成数字电视(iDTV)应用的新型低成本、单芯片MPEG解码器EMMA2SL/P。新解码器集成了全球一流的有条件接入供应商所需的最新片上硬件安全功能,有助于付费电视STB与iDTV制造商开发入门级系统,包括有高性能的功能及安全特性,以确保成本敏感型市场所需的音频-视频内容完整性。 模拟NEC电子公司的高度成功的EMMMA2LL(型号uPD6111x),EMMA2SL/P支持双CPU核,每个性能高达285 MIPS以及处理高达32位/像素的增强图形引擎,从而提供了更高的处理能力。这些基于EMMA2LL的经过业内验证的可靠性架构允许客户快速、便捷的设计新产品。 EMMA
[嵌入式]
STM32F407 ------ 使用定时器实现精确延时
测试环境:主频168M #include delay.h void delay_init() { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); TIM_TimeBaseStructure.TIM_Period = 83; TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.
[单片机]
SPI 串行Flash闪存W25Q128FV 的使用(STM32F407)_基础篇
SPI是串行外设接口(Seria l Peripheral Interface)的缩写。是 Motorola 公司推出的一 种同步串行接口技术,是一种高速的,全双工,同步的通信总线。SPI接口没有指定的流控制,没有应答机制确认是否接收到数据。通常有以下4条通讯线。 同I2C接口相比,SPI器件支持更高的时钟频率。 时钟(SPI CLK, SCLK) 片选(CS) 主机输出、从机输入(MOSI) 主机输入、从机输出(MISO) MOSI和MISO是数据线。MOSI将数据从主机发送到从机,MISO将数据从从机发送到主机。 数据传输 主从设备之间通过SPI进行通讯,主机必须发
[单片机]
SPI 串行Flash闪存W25Q128FV 的使用(<font color='red'>STM32F407</font>)_基础篇
基于STM32F407和OV7670的低端视频监控系统
引言 本系统着眼于经济型视频监控系统,可应用于工业自动化设备、汽车安全驾驶、医疗设施或大楼供水、供电等系统的监控,应用前景广阔、成本低廉、系统简洁。 1 芯片简介 1.1 STM32F407简介 本系统采用的处理器是意法半导体公司的STM32F407,该处理器以32位Cortex—M4为内核,具有浮点运算功能的低端高速ARM,其内部集成了大量可供立即使用的资源,如TFT液晶显示器接口(Flexible Stactie Memory Control,FSMC)、摄像头接口(Camera Inter face)、DMA控制器等,方便且实用。 1.2 OV7670简介 OV7670是OmniVision公司基于CMOS VGA的图像
[单片机]
基于<font color='red'>STM32F407</font>和OV7670的低端视频监控系统
使用MicroPython开发STM32F407的CAN总线
首先烧录 .dfu 固件到你自己的开发板上,之后把串口 0 的两个引脚上拉。 // A9 is used for USB VBUS detect, and A10 is used for USB_FS_ID. 不然连接电脑后不会识别。 然后就可以尝试使用 CAN 总线了。我这里使用的是 CAN2(PB12 - CAN2_RX, PB13- CAN2_TX)。发送器使用 TJA1050,据说 1050 配合 STM32 使用的时候 1050 的供电需要使用 5V。 代码也很简单。三行就能发送出去了。默认的波特率是 28K。 from pyb import CAN can = CAN(2, CAN.NORMAL)can.sen
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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