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

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

3天内不再提示

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

DS小龙哥-嵌入式技术 来源:DS小龙哥-嵌入式技术 作者:DS小龙哥-嵌入式技 2022-05-28 13:42 次阅读

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

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

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

下面两张图是红外线接收头的原理图:

image.pngimage.png

二、解码实现代码

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

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

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

  1. 通过定时器输入捕获方式
  2. 通过定时器+外部中断的方式

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

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%x\r\n",InfraredRxBuff[0]);
			 printf("KEY=0x%x\r\n",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

审核编辑:汤梓红

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

    关注

    14

    文章

    597

    浏览量

    55566
  • NEC
    NEC
    +关注

    关注

    0

    文章

    238

    浏览量

    98884
  • STM32F407
    +关注

    关注

    15

    文章

    187

    浏览量

    28968
收藏 人收藏

    评论

    相关推荐

    红外线通讯协议

    红外线通讯协议
    发表于 08-20 18:53

    arduino红外线库的问题

    我先搭一个红外线接收电路,然后摇控器对着按,得到解码后的值,然后再搭一个红外发射电路,把之前得到的值发出去。用这个办法,成功的控制了电视机,但是控制格力空调的时候,就是不鸟我,这是为什么啊?
    发表于 03-04 22:05

    NEC红外线

    NEC红外线协议的地址码代表什么意思?数据码代表什么意思?读取到一个码后如何知道这个码的具体功能(比如音量加)是什么?
    发表于 02-05 18:19

    蓝牙学习型红外线遥控器(NEC协议解码

    学习型红外线遥控器(NEC协议解码) 单片机:STC89C52RC晶振:11.0592M 波特率:9600编译环境:Keil uVision4
    发表于 02-26 10:34

    红外线遥控器解码程序

    红外线遥控器解码程序 红外线遥控是目前使用最广泛的一种通信和遥控手段。由于红外线遥控装置具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录像
    发表于 02-02 10:52 2809次阅读
    <b class='flag-5'>红外线</b>遥控器<b class='flag-5'>解码</b>程序

    NEC红外线设备又推新品“InfReC”

    NEC红外线设备又推新品“InfReC”  近日,NEC Avio红外线科技株式会社推出最新红外线设备系列“InfReC”。作为该系列的首
    发表于 02-09 11:01 936次阅读

    STM32F407开发板用户手册】第13章 STM32F407启动过程详解

    STM32F407开发板用户手册】第13章 STM32F407启动过程详解
    发表于 11-23 18:06 70次下载
    【<b class='flag-5'>STM32F407</b><b class='flag-5'>开发</b>板用户手册】第13章 <b class='flag-5'>STM32F407</b>启动过程详解

    STM32F407开发板用户手册】第14章 STM32F407的电源,复位和时钟系统

    STM32F407开发板用户手册】第14章 STM32F407的电源,复位和时钟系统
    发表于 12-02 16:21 39次下载
    【<b class='flag-5'>STM32F407</b><b class='flag-5'>开发</b>板用户手册】第14章 <b class='flag-5'>STM32F407</b>的电源,复位和时钟系统

    STM32F407开发板用户手册】第1章   初学STM32F407的准备工作

    STM32F407开发板用户手册】第1章   初学STM32F407的准备工作
    发表于 12-04 13:36 73次下载
    【<b class='flag-5'>STM32F407</b><b class='flag-5'>开发</b>板用户手册】第1章   初学<b class='flag-5'>STM32F407</b>的准备工作

    STM32F407开发板用户手册】第19章 STM32F407的GPIO应用之按键FIFO

    STM32F407开发板用户手册】第19章 STM32F407的GPIO应用之按键FIFO
    发表于 12-05 15:21 32次下载
    【<b class='flag-5'>STM32F407</b><b class='flag-5'>开发</b>板用户手册】第19章 <b class='flag-5'>STM32F407</b>的GPIO应用之按键FIFO

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

    一、环境介绍MCU: STM32F103ZET6编程软件环境: keil5红外线传输协议: NEC协议---38KHZ载波:。
    发表于 12-17 17:47 5次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>入门开发</b>: <b class='flag-5'>NEC</b><b class='flag-5'>红外线</b><b class='flag-5'>协议</b><b class='flag-5'>解码</b>(超低成本无线传输方案)

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

    这是NEC协议红外线遥控器: 如果自己手机没有红外线遥控器的功能,可以淘宝上买一个小遥控器来学习测试,成本不高,这个遥控器也可以自己做,能解码
    的头像 发表于 03-14 09:48 3754次阅读
    <b class='flag-5'>STM32</b>: <b class='flag-5'>NEC</b><b class='flag-5'>红外线</b><b class='flag-5'>协议</b><b class='flag-5'>解码</b>(超低成本无线传输方案)

    STM32F407入门开发: 串口配置

    STM32F407 的串口资源非常丰富,功能也很强劲。 STM32F407 最多可提供 6 路串口,有分数波特率发生器、支持同步单线通信和半双工单线通讯、支持 LIN、 支持调制解调器操作、 智能卡
    的头像 发表于 05-28 13:51 9183次阅读
    <b class='flag-5'>STM32F407</b><b class='flag-5'>入门开发</b>: 串口配置

    Linux驱动开发-编写NEC红外线协议解码驱动

    NEC协议是众多红外线协议中的一种,以前广泛用在电视机,投影仪设备里,很早之前经常说的万能电视遥控器就是NEC
    的头像 发表于 09-17 15:20 1362次阅读
    Linux驱动<b class='flag-5'>开发</b>-编写<b class='flag-5'>NEC</b><b class='flag-5'>红外线</b><b class='flag-5'>协议</b><b class='flag-5'>解码</b>驱动

    STM32F407开发红外线解码功能应用案例

    NEC红外线协议是一种常用的红外线通信协议,广泛应用于消费电子产品中,如电视、DVD播放器、空调遥控器等。该
    的头像 发表于 07-06 14:34 754次阅读
    <b class='flag-5'>STM32F407</b><b class='flag-5'>开发</b>板<b class='flag-5'>红外线</b><b class='flag-5'>解码</b>功能应用案例