单片机
返回首页

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

2024-05-15 来源:elecfans

【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

',InfraredRxBuff[0]);

  printf('KEY=0x%x

',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

 


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

最新器件
精选电路图
  • CCD图像传感器在微光电视系统中的应用

  • 如何利用ESP8266制作一个简单的四轴飞行器

  • 非常简单的150W功放电路图

  • 如何使用LED驱动器LM3915制作振动计

  • 一个简单的立体声平衡指示器电路

  • 分享一个电网倾角计电路

    相关电子头条文章