美文网首页
stm32---红外遥控

stm32---红外遥控

作者: 飞向深空 | 来源:发表于2019-08-13 01:53 被阅读0次

NEC协议
发送端发送1 :560us脉冲 + 1680us低电平
发送端发送0 :560us脉冲 + 560us低电平
连发码 : 9ms 低电平+2.5m 高电平+0.56ms 低电平 +97.94ms 高电平
引导码 :9ms 的低电平 + 4.5ms 的高电平

接收端接收1 :560us低电平 + 1680us高电平
接收端接收0 :560us低电平 + 560us高电平
接收端连发码 : 9ms 高电平+2.5m 低电平+0.56ms 高电平 +97.94ms 低电平
接收端引导码 :9ms 的高电平 + 4.5ms 的低电平


接收端的数据引脚接上拉电平,也可以让此脚连接的芯片引脚配置为上拉输出模拟上拉电阻的作用。
因为此上拉电阻的作用使接收端空闲时是高电平,从而电平状态与发送的相反。


对于接收端而言,数据1和数据0都是低电平变高电平,是个上升沿,于是可以使用上升沿触发中断。用高电平时间的不同来区分二者。


发送数据

发送一次共32位,每一位都可以触发升沿触发中断


hongwai.c

#include "hongwai.h"
#include "systick.h"

u32 Hong_Data;  //红外线接受的数据
u8 Hong_Flag; //接受是否完成

/*****************************************************************
函数名:Hongwai_Init() 
函数功能:红外初始化
输入:无
输出:无
****************************************************************/
void Hongwai_Init()
{
    GPIO_InitTypeDef GPIO_InitStructure;
    EXTI_InitTypeDef EXTI_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG|RCC_APB2Periph_AFIO,ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输出,端口模拟它没信号时高电平
    GPIO_InitStructure.GPIO_Speed  = GPIO_Speed_50MHz;
    GPIO_Init(GPIOG,&GPIO_InitStructure);
    
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOG, GPIO_PinSource15); //选择GPIO管脚用作外部中断线路,重映射
    EXTI_ClearITPendingBit(EXTI_Line15);
    
    EXTI_InitStructure.EXTI_Line = EXTI_Line15;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发,因为没信号是高电平信号来低电平造成下降沿,正好以此为条件表示信号来了
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;  //触发模式是中断
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);
    
    NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

/*****************************************************************
函数名:Hig_Cou() 
函数功能:高电平时间判别函数
输入:无
输出:8位的时间判别参数
****************************************************************/

u8 Hig_Cou()
{
    u8 t=0;
    if(GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_15)) //获取GPIOG_Pin_15的输入状态
    {
        t++;
        delay_us(20);
        if(t>=250) return t; //t每自加一次就延时20us
    }
    return t;
}

/*****************************************************************
函数名:EXTI15_10_IRQHandler()
函数功能:中断服务函数,进行解码并存储
输入:无
输出:无
****************************************************************/

void EXTI15_10_IRQHandler()
{
    u8 tim;  //高电平时间参数变量
    u8 ok;   //引导码有效变量
    u8 data; //接受高低电平
    u8 num;  //接受次数
    
    while(1)
    {
        if(GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_15)==1) //PG15输入是高电平
        {
            tim = Hig_Cou();  //获取高电平时间
            if(tim>=250) break;//超时错误
            if(tim<250&&tim>200) ok = 1;  //引导码有效
            if(tim<90&&tim>70) data = 1;  //接受是高电平
            else if(tim<40&&tim>15) data = 0;   //接收是低电平
            
            if(ok)  //引导码有效
            {
                Hong_Data <<=1;  //移位
                Hong_Data+=data; //把数据存入Hong_Data
            }
            
            if(num>=32)  //32位4字节都接受完
            {
                Hong_Flag = 1;  //传输完
                break;
            }
            num++;
        }
        EXTI_ClearITPendingBit(EXTI_Line15); //消除EXTI_Line15的中断标志位
    }
}

hongwai.h

#ifndef _hongwai_H
#define _hongwai_H

#include "system.h"

extern u32 Hong_Data;//全局变量
extern u8 Hong_Flag;
void Hongwai_Init(void);
u8 Hig_Cou(void);

    
#endif

main.c

#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "usart.h"
#include "hongwai.h"

int main()
{
    u8 i=0;
    
    SysTick_Init(72);
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中断优先级分组 分2组
    LED_Init();
    USART1_Init(9600);
    Hongwai_Init();
    while(1)
    {   
        if(Hong_Flag==1)//接受完成
        {
            Hong_Flag=0; //清空标志位,供下次使用
            printf("发红外接收码是:%.8X\r\n",Hong_Data);
            Hong_Data=0;//清空数据供下次使用
        }
        
        i++;
        if(i%20==0)
        {
            led1=!led1;
        }
        
        delay_ms(10);
            
    }
}

相关文章

  • stm32---红外遥控

    NEC协议发送端发送1 :560us脉冲 + 1680us低电平发送端发送0 :560us脉冲 + 560us低电...

  • 遥控器原理小知识

    遥控器原理小知识(附加程序) 1.红外遥控简介 主要器件:红外遥控器、红外接收头。 2.红外遥控器 Ht6221标...

  • 红外遥控及Android手机红外遥控器开发

    一、红外遥控 红外遥控技术是通过红外技术、红外通信技术和遥控技术的结合实现的一种无线控制技术。由于红外线的波长较短...

  • Android手机红外开发—点击和长按事件

    上一篇文章《红外技术及Android手机红外遥控器开发》中简单介绍了红外遥控技术和Android 手机红外遥控开发...

  • 「EE」 红外遥控器和射频遥控器

    红外遥控器与射频遥控器的区分,从外观上,红外遥控器由于使用红外光线发送信号,在遥控器的顶端可看到红外发射管或滤除可...

  • 红外遥控

    课前学习 单词含义infrared红外线的remote control遥控器 在生活中我们会接触到各式各样的遥控器...

  • 2017年11月28日学习总结

    今天上午老师有事,,只讲了半个小时昨天的项目关于温湿度测量 。下午助教老师讲解了红外遥控、红外接收头。 红外遥控器...

  • Arduino 红外遥控

    从左至右分别为OUT、GND、VCC 实验一 读取遥控器按键值通过串口发送值电脑。 接线 Nano功能接收头D9数...

  • 单片机小白学习之路(三十五)---红外遥控理解

    目标:红外遥控原理的理解 1.红外遥控简介 红外线是波长介于微波和可见光之间的电磁波,波长在760纳米到1毫米之间...

  • 03月13日长光培训嵌入式学习第三十八天

    今天围绕步进电机控制进行红外遥控器的学习。上午老师对红外遥控器NEC通信协议进行了讲解,由于红外接受装置只有一个P...

网友评论

      本文标题:stm32---红外遥控

      本文链接:https://www.haomeiwen.com/subject/shryjctx.html