历史上的今天
返回首页

历史上的今天

今天是:2025年03月28日(星期五)

正在发生

2020年03月28日 | stm32---红外遥控

2020-03-28 来源:eefocus

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

            

    }

}

推荐阅读

史海拾趣

问答坊 | AI 解惑

模拟电子技术重点难点及典型题精解2

模拟电子技术重点难点及典型题精解2 [ 本帖最后由 linda_xia 于 2010-3-26 11:31 编辑 ]…

查看全部问答>

Keil C编译常见告警与错误信息的解释及排除方法

1. Warning 280:’i’:unreferenced local variable 说明 局部变量 i 在函数中未作任何的存取操作 解决方法 消除函数中 i变量的宣告 2 Warning 206:’Music3’:missing function-prototype 说明 Music3( )函数未作宣告 或未作外部宣告 ...…

查看全部问答>

关于lpc2132读写sd卡

开始写sd卡了,可一开始就遇到了不少问题,感觉相当吃力,有哪位以前用lpc2132写过的,希望给些帮助。 有谁写过或也正在写的希望能来交流交流。 能上传些源代码最好,谢谢了。  …

查看全部问答>

五种PWM反馈控制模式研究

五种PWM反馈控制模式研究…

查看全部问答>

无法解析的外部符号 CreateToolhelp32Snapshot

如题 高不明白为什么出现这个错误,请高手帮忙谢谢…

查看全部问答>

Bios Boot Loader的错误

按照PB帮助文档作的BLDR,NK.bin也可以通过网络或者在终端运行,PB是5.0的版本. 以下是错误信息: Microsoft Windows CE BIOS Bootloader Version 2.2 (Built Mar 13 2004) WARNING: code=0x7. WARNING: code=0x13. WARNING: code=0x7. WARNING: ...…

查看全部问答>

STM32待机模式IO口问题,请教

我现在程序启动定时器,定时器到达后进入待机模式,主程序在循环将一个LED闪烁。发现进入待机模式后,LED灯是亮的不再闪烁了,功耗确实降了下来。我是IO口接LED接R接地,设置的推挽方式。进入待机模式发现IO还是3.3V的高电平,而不是高阻状态 ...…

查看全部问答>

CycloneII特殊管脚的使用

1/1.I/O, ASDO 在AS 模式下是专用输出脚,在PS 和JTAG 模式下可以当I/O 脚来用。在AS 模式下,这个脚是CII 向串行配置芯片发送控制信号的脚。也是用来从配置芯片中读配置数据的脚。在AS 模式下,ASDO 有一个内部的上拉电阻,一直有效,配置完成后 ...…

查看全部问答>

Raw-os 在Mini STM32 V3.0开发板上的工程模板!!!

本帖最后由 fwjieok 于 2014-10-7 17:28 编辑        正点原子  Mini STM32 V3.0 开发板  RAW-OS 工程模板                   1. 移植好S ...…

查看全部问答>