当前位置:   article > 正文

STM32F407实现NEC协议红外线解码_红外解码

红外解码

【1】NEC红外线协议介绍

NEC红外线协议是一种常用的红外线通信协议,广泛应用于消费电子产品中,如电视、DVD播放器、空调遥控器等。该协议定义了红外线通信的物理层和数据链路层规范,以实现可靠的红外线数据传输。

下面是NEC红外线协议的详细介绍:

(1)载波频率:NEC红外线协议使用的载波频率为38kHz。发送方通过以38kHz频率调制红外线光信号,接收方则通过解调来接收数据。

(2)数据编码:NEC红外线协议使用脉冲宽度编码(Pulse Width Encoding)来表示二进制数据。每个数据位由一系列的脉冲组成,逻辑0和逻辑1分别由不同的脉冲宽度表示。

  • 逻辑0:发送方发射一个530μs的载波后,延迟时间为530μs。
  • 逻辑1:发送方发射一个530μs的载波后,延迟时间为1.69ms。

(3)帧结构:NEC红外线协议的一个完整帧由多个数据位组成,包括引导码、自定义码、数据码和反码。帧结构如下:

  • 引导码(Leader Code):由一系列的载波脉冲组成,用于同步接收方和发送方的时钟。
  • 自定义码(Custom Code):8位数据,用于识别设备类型。
  • 数据码(Data Code):8位数据,用于传输具体命令或数据。
  • 反码(Inverted Data Code):数据码的反码,用于校验数据的正确性。

(4)重复码:为了提高通信可靠性,NEC红外线协议还定义了重复码。当按键保持不松开时,发送方会周期性地发送重复码,以确保接收方正确接收到连续的按键数据。

(5)接收端工作原理:接收端使用红外线接收模块接收红外线信号,并通过解调将其转换为数字数据。接收端在接收到引导码后,开始解析自定义码和数据码,并进行校验。

NEC红外线协议的优点是简单、广泛应用,并且在消费电子产品中得到了广泛支持。提供了可靠的红外线数据传输方式,适用于远程控制和通信需求。

【2】硬件连接

38KHZ红外线接收头硬件连接图:

img

img

【3】源代码

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;
				 }
		}
}


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

Infread.c文件示例

#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; //标志红外线解码成功
}


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113

Infread.h文件示例

#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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

截图示例:

img

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/493077
推荐阅读
相关标签
  

闽ICP备14008679号