stm32---红外遥控

发布者:真情相伴最新更新时间:2020-03-28 来源: eefocus关键字:stm32  红外遥控 手机看文章 扫描二维码
随时随地手机看文章

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("发红外接收码是:%.8Xrn",Hong_Data);

            Hong_Data=0;//清空数据供下次使用

        }

        

        i++;

        if(i%20==0)

        {

            led1=!led1;

        }

        

        delay_ms(10);

            

    }

}

关键字:stm32  红外遥控 引用地址:stm32---红外遥控

上一篇:stm32---RS485半双工通信
下一篇:stm32---DS18b20

推荐阅读最新更新时间:2024-11-12 23:03

stm32 can基础测试例程
include “stm32f10x_lib.h” include “stdio.h” /* 自定义同义关键字 ——————————————————–*/ /* 自定义参数宏 ——————————————————–*/ /* 自定义函数宏 ——————————————————–*/ /* 自定义全局变量 ——————————————————–*/ /* 自定义函数声明 ——————————————————–*/ void RCC_Configuration(void); void GPIO_Configuration(void); void CAN_Configuration(void); void US
[单片机]
STM32与SD卡通信分层思考
  最近做了一些 STM32 和SD卡通信的一些思考,一直以来SD的驱动和应用困扰了我很久,寒假的时候看到SD简化版物理层协议的时候就傻掉了,看到SD的驱动快3000行的代码也动摇了。这几天几种地看了一下SD卡的相关内容,总结了一些体会,感觉也没有那么恐怖了。我决定从分层上来讨论SD的驱动和应用,因为这样可以构建一个清晰的逻辑,且不知哪位计算机大师曾说过:一切计算机问题都可以用分层的方法来解决。   我自己把SD卡从驱动到应用共分为4层,从下至上依次为:驱动层、物理层、文件系统层、应用层。下面一一来介绍各层的一些重要的操作。   1)驱动层   驱动层,对应到ST的库,就是stm32f10x_sdio.c/.h这个两文件。其实使用任
[单片机]
STM32定时器映射及其通道
TIMx,通道x,无映射,部分映射,完全映射 定时器—通道 引脚 TIM1_CH1 PA8,PE9 TIM1_CH1 PA8,PE9 TIM1_CH3 PA10, PE13 TIM1_CH4 PA11, PE14 – – TIM2_CH1 PA15 TIM2_CH2 PA1, PB3 TIM2_CH3 PA2, PB10 TIM2_CH4 PA3, PB11 – – TIM3_CH1 PA6, PB4, PC6 TIM3_CH2 PA7, PB5, PC7 TIM3_CH3 PB0, PC8 TIM3_CH4 PB1, PC9 – – TIM4_CH1 PB6, PD12 TIM4_CH2 PB7, PD13 TIM4_CH3
[单片机]
STM32 KEIL软件设置程序烧写起始地址选择
STM32系列的mcu,这儿以cortex-M4为例,我们在线调试时,一般会设置程序烧写起始地址和大小。这个大小一般是0x08000000,也就是内部flash的映射地址。不过有些产品是从0x08020000开始的,这是为什么呢?是因为在0x08000000-0x08020000这段空间放的是引导程序,也就是引导程序是从0x08000000开始存放,一般而言,引导程序最终也是要跳转到主app执行的,对于我们这儿而言,就是引导程序会跳转到0x08020000继续执行,而主工程代码是从0x08020000开始存放的,所以就这样串联起来了。 这儿可以看到我们设置的程序烧写的地址和大小,这个的设置是要和use memory layou
[单片机]
<font color='red'>STM32</font> KEIL软件设置程序烧写起始地址选择
stm32 HardFault_Handler 异常的处理死机
在系统开发的时候,出现了HardFault_Handler硬件异常,也就是死机,尤其是对于调用了os的一系统,程序量大,检测堆栈溢出,以及数组溢出等,找了半天发现什么都没有的情况下,估计想死的心都有了。如果有些程序开始的时候一切没有问题,但是运行几个小时候,会发现死机了,搞个几天下来估计蛋都碎了一地吧。。。 一般来说运行操作系统 是以下几个问题 1.开始的时候给ucos分配的堆栈太小了,随着项目做多了,这类问题一般很容易解决 #define TASK_IO_SIZE 300 #define TASK_IO_PRIO 6 OS_STK TASK_IO_STK ; 比如修改300到 1000,做开发的时候 如果ram允许,尽量大些,免
[单片机]
STM32固件库的小结
储存器地址 由51引入   实际上,单片机对任何端口的控制都是通过操作内存实现的,说出这句话很抽象,我们可以以从51单片机类比来说明这是什么意思。 如下的电路图: 如果我们想点亮LED_G,在51中我们可能会如此编程 #include reg51.h #define PB = 0xfe 或者 #include reg51.h sbit LED_G = PB^5; void main() { LED_G = 0; } 其中第一种叫宏定义,第二种叫位定义。那么为什么我们使用这些操作后PB0就输出低电平了呢。我们可以从 reg51.h 这个文件中看出原因。 可以看见,在头文件中对类似P0的IO口进行
[单片机]
<font color='red'>STM32</font>固件库的小结
基于机智云物联网平台的停车场管理系统设计
本文介绍的智慧停车场系统是由安徽理工大学殷雨彤设计开发完成。该停车场管理系统是以STM32F103ZE作为系统核心控制器,融合窄带物联网技术(NB-IoT技术)、红外传感技术以及机智云物联网平台,实现数据实时监测及传输、用户端远程控制,车位管理更便捷高效,车位分配更快速和合理。 01引 言 窄带物联网(NB-IoT)技术适合在停车管理等场景中应用。由传感模块进行数据采集,STM32芯片进行数据处理,窄带物联网模块将参数上传至云端,即可实现用户远程监测停车场信息并进行有效调度。 02系统整体架构设计 由于智慧停车场管理系统需要对停车场的车位信息进行收集,并上传至云平台以实现大数据监控和车库管理系统与汽车调度,因此主要采用了三
[单片机]
基于机智云物联网平台的停车场管理系统设计
STM32待机模式唤醒测试以及独立看门狗测试
环境: 主机:WIN7 开发环境:MDK4.23 MCU:STM32F103CBT6 说明: 在上篇文章中http://blog.csdn.net/jdh99/article/details/7369844,进行了一些STM32待机模式的测试.其中关于如何在再次启动时判断是否是待机模式没有进行测试.另外上篇文章有个问题,闹钟中断在待机模式下是进入不了的. 本文进行了独立看门狗IWDG测试,以及待机模式更详细的测试. STM32中,复位分为3种: 1.系统复位:外部复位,WWDG,IWDG,SW复位,低功耗管理复位.除复位标志寄存器RCC_CSR不被复位,全部都被复位 2.电源复位:上电/掉电复位
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved