stm32红外遥控

发布者:brian808090最新更新时间:2017-10-29 来源: eefocus关键字:stm32  红外遥控 手机看文章 扫描二维码
随时随地手机看文章

HS0038B

http://www.51hei.com/stm32/3589.html

我用的红外遥控是使用的NEC协议,即使用PWM来调制发送的信息  

  NEC协议,其特征如下:

 1、8位地址和8位指令长度;

 2、地址和命令2次传输(确保可靠性)

 3、PWM脉冲位置调制,以发射红外载波的占空比代表“0”和“1”;

 4、载波频率为38Khz;

 5、位时间为1.125ms或2.25ms;

NEC码的位定义:一个脉冲对应560us的连续载波,一个逻辑1传输需要2.25ms(560us脉冲+1680us低电平),一个逻辑0的传输需要1.125ms(560us脉冲+560us低电平)。而遥控接收头在收到脉冲的时候为低电平,在没有脉冲的时候为高电平,这样,我们在接收头端收到的信号为:逻辑1应该是560us低+1680us高,逻辑0应该是560us低+560us高。

NEC遥控指令的数据格式为:同步码头、地址码、地址反码、控制码、控制反码。同步码由一个9ms的低电平和一个4.5ms的高电平组成,地址码、地址反码、控制码、控制反码均是8位数据格式。按照低位在前,高位在后的顺序发送。采用反码是为了增加传输的可靠性(可用于校验)。

stm32红外遥控
红外接收头与stm32连接如上图所示,既然是PWM调制,很容易想到了stm32的通用定时器的输入捕获和输出比较功能,这里由于stm32是接收红外遥控发送的信息,所以与红外接收头连接的IO口要设置位输入模式,因为在空闲状态的时候输入始终要保持高电平,所以要配置成上拉输入。

              

RCC->APB2ENR|=1<<3;

       GPIOB->CRH&=0xffffff0f; 

       GPIOB->CRH|=0x00000080; 

       GPIOB->ODR|=1<<9;

因为PB.9是通用定时器的通道四,所以还要对定时器进行配置,额。。。好长时间没有用定时器了,都忘得差不多了,又得重新拾起来             

 void time4_init()

{

 RCC->APB1ENR|=1<<2;//开启定时器四的时钟

 TIM4->SR=0;//其实复位值就是0,多此一举了

 TIM4->DIER|=1<<4;//允许定时器四的捕获中断

 TIM4->PSC=71;//计数频率设置为1M CNT每增加一 时间为1us

 TIM4->ARR=10000;//计数器每隔10ms溢出一次

 TIM4->CCMR2|=1<<8;//CC4通道被配置为输入,IC4映射在TI4上;

 TIM4->CCER&=~(1<<13);//通道四配置为上升沿捕获

 TIM4->CCMR2|=3<<12;//进行滤波处理

 TIM4->CCER|=1<<12;//通道四捕获使能

  TIM4->CR1|=1<<0;//定时器四计数使能

}

因为红外接收头接收的信号第一个数据必然是同步码,首先低电平保持9ms,然后一个跳变,高电平保持4.5ms,而我们判断接收的数据是逻辑0还是逻辑1,或者是同步码,都是要根据高电平的持续时间来判定的,所以要关心高电平保持时间,故定时器四初始化时要配置为上升沿捕获,好了,定时器也设置好了,接下来该设置定时器四的中断处理函数啦

对啦,要先把NVIC中的TIM4中断打开

void nvic_init()

{

 NVIC->ISER[0]|=1<<30;//TIM4的中断编号为30

}

void TIM4_IRQHandler(void)

{

 if(TIM4->SR&0X10)//判断中断源是不是通道四捕获引起的

 {

  led1=~led1;//信号指示灯,能比较直观的判断定时器四是否产生捕获中断

  if(CS==1)//发生上升沿捕获 在头文件里定义 #define CS PBin(9)

  {

   TIM4->CNT=0;//计数器清零

   TIM4->CCER|=1<<13;//捕获中断触发方式改为下降沿

   TIM4->SR=0;状态标志位清零

   dcb=1;//一个数据位 要先发生上升沿中断再发生下降沿中断,才能记录高电平持续时间 所以一个数据位来说                    两个中断必须是成对出现的

  }

  if(CS==0)//发生下降沿捕获

  {

     if(dcb==1)  

       {

  dcb=0;//进门后要关门,不解释

  TIM4->CCER&=~(1<<13);//改为上升沿捕获

           temp=TIM4->CCR4;//发生下降沿中断时CNT的计数值

  if(3000

  {

    OK1=1;

  }

  if(1000

  {

data=data<<1;

data|=1<<0;

ray_flag++;

  }

  if(300

  {

data=data<<1;

data&=~(0<<0);

ray_flag++;

  }

   

 if(ray_flag>=32)//NEC协议 一次发送的数据位为32位

    OK2=1;

     TIM4->SR=0;

  }

   }

 }

 }

中断服务程序配置好了,接下来就是中程序啦

int main()

{

 Stm32_Clock_Init(9);

 delay_init(72);

 gpio_init();

 nvic_init();

 time4_init();

 usart1_init();

 while(1)

 {

  if(OK1==1&&OK2==1)

  {

   usart1_senddata(temp);

   OK1=0;

   OK2=0;

   ray_flag=0;

  }

 }

使用的是串口打印数据,串口配置程序就不写啦

 

}


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

上一篇:基于STM32的红外接收
下一篇:基于stm32的通用定时器详解

推荐阅读最新更新时间:2024-03-16 15:42

STM32使用FATFSW读写SD出现错误2的原因
最近在最项目时遇到使用STM32写入SD卡数据时,刚开始数据写入正常,过一会就回出现错误,错误代码2,查阅FATFS的官方文档,给出如下: 总共4种可能的情况,依次实验了上述问题的各种解决方法,都补管用,最后在写入数据前加入 设备正常运行,替换成延时函数也正常运行 由此推断可能是由于写入的速度过快造成。
[单片机]
<font color='red'>STM32</font>使用FATFSW读写SD出现错误2的原因
STM32单片机中FLASH空间的分配之bootloader
根据程序运行流程: 正常的程序启动流程:从FLASH启动时,首先从闪存的物理地址入口0x08000000进入,然后是复位中断跳转到复位中断服务程序;复位中断服务程序执行完成后,再跳转到main函数入口,main函数一般为死循环;当外部中断发生时,跳转到中断向量查找表,通过查找表找到对应的中断服务程序地址,跳转到对应的中断服务程序;中断服务程序结束后再次跳转到main函数,这样不断的循环,这是我们的应用程序段; 当需要进行系统升级的时候,则需要在这个过程中添加一个bootloader程序段; 那么bootloader程序段存在什么位置呢? 一般是低地址区域存放bootloader程序段,紧接着的高地址区域存放应用程序段; 那么b
[单片机]
数据中心能耗采集装置的设计
1 引言 随着数据中心的迅猛发展,数据中心的能耗问题也越来越突出,有关数据中心的能源管理和供配电设计已经成为热门问题,高效可靠的数据中心配电系统方案,是提 高数据中心电能使用效率,降低设备能耗的有效方式。要实现数据中心的节能,首先需要对每个用电负载实现精确的监测,而数据中心负载回路非常的多,传统的测 量仪表无法满足成本、体积、安装、施工等多方面的要求,因此需要采用适用于数据中心集中监控要求的多回路监控装置。 本文所要介绍的是一种适 用于数据中心精密电源配电柜使用需求的测量装置的设计方法,该装置适用于单路输入、单段输出、单点检测;双路输入、单段输出、单点检测;双路输入、单段输 出、双点检测的系统电源输入方式。能够精确地测量配电系统各项
[单片机]
数据中心能耗采集装置的设计
CAN_总线_STM32(2)
过滤器的理解 STM32 参考手册中提到:bxCAN 控制器为应用程序提供了 28个位宽可变的、可配置的过滤器组(0~28))(103只有14个)每个过滤器组的位宽都可以独立配置。可以配置成 16 位或者 32 位。过滤器组还可配置为屏蔽位模式(标识符掩码)或标识符列表模式。 每个过滤器组x由2个32位寄存器,CAN_FxR1和 CAN_FxR2组成 先看一个过滤器组:如图 这里的 ID 并不是发送数据帧里面的ID,此ID非彼ID,硬件上属于不同的 register,这里的 ID 就是你需要去设置来达到你想要过滤接收某个数据 ID 的一串标识符,然后过滤器会根据你所设置的标识符 ID 来决定是不
[单片机]
CAN_总线_<font color='red'>STM32</font>(2)
如何下载stm32系列单片机的固件库
第一步 进入st官网( ST官网 ),可选中文(建议多看英文,对看数据手册有很大用处,下面步骤以英文为主),如图1 第二步 选择tool & software(工具及软件) —- MCUS Embedded Software 第三步 选择product tree 第四步 展开product tree 第五步 以stm32L151为例,如图 点进去下载即可。
[单片机]
STM32 中断优先级(Cortex-M3)
一、概述 STM32(Cortex-M3)中有两个优先级的概念——抢占优先级和响应优先级,其属性编号越小,则优先级别越高。有人把响应优先级称作“亚优先级”或“副优先级”,每个中断源都需要被指定这两种优先级。 具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。 当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相
[单片机]
关于STM32 64引脚和48引脚VDDA电压值
在使用STM32进行ADC采集处理的时候,需要设计到参考电压的选取问题,关于模拟部分,牵扯到参考电压的引脚为: 1.100引脚以下的芯片,ADC参考电压引脚VREF+在单片机内部和VDDA引脚连接。 2.100引脚以上的芯片,ADC参考电压引脚VREF+和VDDA是分开的。 所以,在100引脚以上的芯片中,我们可以是采用单独供电,改变ADC的参考电压。但是在100引脚以下的芯片中,就必须是看VDDA的电压值范围。 查看数据手册,可以发现,VDDA为所有的模拟电路部分供电,包括:ADC模块,复位电路,PVD(可编程电压监测器),PLL,上电复位(POR)和掉电复位(PDR)模块,控制VBAT切换的开关等。即使不 使用A
[单片机]
利用STM32外部中断驱动四路数字触摸感应传感器模块
首先先介绍一下STM32的外部中断,当然这也不是我总结的,这是在那么多博客里找到的一篇个人认为总结不错的学习文档。先学到手再说吧! STM32中,每一个GPIO都可以触发一个外部中断,但是,GPIO的中断是以组位一个单位的,同组间的外部中断同一时间只能使用一个。比如说,PA0,PB0,PC0,PD0,PE0,PF0,PG0这些为1组,如果我们使用PA0作为外部中断源,那么别的就不能够再使用了,在此情况下,我们智能使用类似于PB1,PC2这种末端序号不同的外部中断源。每一组使用一个中断标志EXTIx。EXTI0 – EXTI4这5个外部中断有着自己的单独的中断响应函数,EXTI5-9共用一个中断响应函数,EXTI10-15共用一
[单片机]
利用<font color='red'>STM32</font>外部中断驱动四路数字触摸感应传感器模块
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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