赞
踩
NEC红外线协议是一种常用的红外线通信协议,广泛应用于消费电子产品中,如电视、DVD播放器、空调遥控器等。该协议定义了红外线通信的物理层和数据链路层规范,以实现可靠的红外线数据传输。
下面是NEC红外线协议的详细介绍:
(1)载波频率:NEC红外线协议使用的载波频率为38kHz。发送方通过以38kHz频率调制红外线光信号,接收方则通过解调来接收数据。
(2)数据编码:NEC红外线协议使用脉冲宽度编码(Pulse Width Encoding)来表示二进制数据。每个数据位由一系列的脉冲组成,逻辑0和逻辑1分别由不同的脉冲宽度表示。
(3)帧结构:NEC红外线协议的一个完整帧由多个数据位组成,包括引导码、自定义码、数据码和反码。帧结构如下:
(4)重复码:为了提高通信可靠性,NEC红外线协议还定义了重复码。当按键保持不松开时,发送方会周期性地发送重复码,以确保接收方正确接收到连续的按键数据。
(5)接收端工作原理:接收端使用红外线接收模块接收红外线信号,并通过解调将其转换为数字数据。接收端在接收到引导码后,开始解析自定义码和数据码,并进行校验。
NEC红外线协议的优点是简单、广泛应用,并且在消费电子产品中得到了广泛支持。提供了可靠的红外线数据传输方式,适用于远程控制和通信需求。
38KHZ红外线接收头硬件连接图:
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; } } }
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; //标志红外线解码成功 }
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
截图示例:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。