stm32---用外部中断实现红外接收器

这篇具有很好参考价值的文章主要介绍了stm32---用外部中断实现红外接收器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、红外遥控的原理

红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传 输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是 家用电器广泛采用,并越来越多的应用到计算机系统中。 红外遥控通信系统一般由红外发射装置和红外接收设备两大部分组成
(1) 红外发射装置
红外发射装置,也就是通常我们说的红外遥控器是由键盘电路、红外编码电路、电源电路和红外发射电路组成。
通常红外遥控为了提高抗干扰性能和降低电源消耗,红外遥控器常用 载波的方式传送二进制编码,常用的载波频率为38kHz,这是由发射端所使用的455kHz晶振来决定的。在发射端要对晶振进行整数分频,分频系数一般取12,所以455kHz÷12≈37.9kHz≈38kHz。也有一些遥控系统采用36kHz、40 kHz、56 kHz等,一般由发射端晶振的振荡频率来决定。所以,通常的红外遥控器是将遥控信号(二进制脉冲码)调制在38KHz的载波上,经缓冲放大后送至红外发光二极管,转化为红外信号发射出去的
二进制脉冲码的形式有多种,其中最为常用的是NEC Protocol 的PWM码(脉冲宽度调制)和 Philips RC-5 Protocol 的 PPM码(脉冲位置调制码,脉冲串之间的时间间隔来实现信号调制)。如果要开发红外接收设备,一定要知道红外遥控器的编码方式和载波频率,我们才可以选取一体化红外接收头和制定解码方案。我们配套的红外遥控器使用的是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 高。所以可以通过计算高电平时间判断接收到的数据是0还是1。
NEC码位定义时序图如图:
stm32---用外部中断实现红外接收器,stm32,嵌入式硬件,单片机

简单来说就是,红外发送器这边,发送脉冲信号时是高电平,发送的不是脉冲信号就是低电平,红外接收器这边,接收脉冲信号是低电平,接收的不是脉冲信号就是高电平

由于红外接收头在没有脉冲的时候为高电平,当收到脉冲的时候为低电平,所以可以通过外部中断的下降沿触发中断,在中断内通过计算高 电平时间来判断接收到的数据是0还是1。
NEC 遥控指令的数据格式为:引导码、地址码、地址反码、控制码、控制反码。引导码由一9ms 的低电平和一个 4.5ms 的高电平组成,地址码、地址反码、控制码、控制反码均是8 位数据格式。按照低位在前,高位在后的顺序发送。采用反码是为了增加传输的可靠性(可用于校验)。数据格式如下:
stm32---用外部中断实现红外接收器,stm32,嵌入式硬件,单片机
NEC码还规定了连发码(由 9ms 低电平+2.5m 高电平+0.56ms 低电平 +97.94ms 高电平组成),如果在一帧数据发送完毕之后,红外遥控器按键仍然没有放开,则发射连发码,可以通过统计连发码的次数来标记按键按下的长短或次数。

代码实现:(这里使用的是stm32f103rct6单片机)文章来源地址https://www.toymoban.com/news/detail-691547.html

u32 inf_val;
u8 inf_flag;
void Infrared_Remote_Init(void)
{
	GPIO_InitTypeDef  GPIO_InitStruct;
	EXTI_InitTypeDef  EXTI_InitStruct;
	NVIC_InitTypeDef  NVIC_InitStruct;
	/*1、打开外设时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);

	/*2、配置GPIO*/
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_15;
	GPIO_Init(GPIOB, &GPIO_InitStruct);

	/*3、中断线的映射*/
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource15);

	/*4、配置EXTI*/
	EXTI_InitStruct.EXTI_Line = EXTI_Line15;
	EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;
	EXTI_InitStruct.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTI_InitStruct);

	/*5、配置NVIC*/
	NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStruct);
	
	EXTI_ClearITPendingBit(EXTI_Line15);
}

u8 Infrared_Remote_Delay(void)
{
	u8 tim = 0;
	while(PBin(15))
	{
		delay_us(50);
		tim++;
		if(tim == 255)
		{
			return tim;
		}
	}
	return tim;
}

void EXTI15_10_IRQHandler(void)
{
	u8 high_time,flag,data = 0,n = 0;
	while(1)
	{
		if(PBin(15))
		{
			high_time = Infrared_Remote_Delay();
			if(high_time == 255)
				break;
			if(high_time > 70 && high_time < 100)//收到引导码
			{
				flag = 1;
			}
			else if(high_time > 6 && high_time < 12)//收到0
			{
				data = 0;
			}
			else if(high_time > 30 && high_time < 36)//收到1
			{
				data = 1;
			}
			if(flag)//如果收到引导码
			{
				inf_val <<= 1;
				inf_val += data;
				
				if(n == 32)//因为inf_val是32位的
				{
					inf_flag = 1;
					break;
				}
			}
			n++;
		}
	}
	EXTI_ClearITPendingBit(EXTI_Line15);
}

到了这里,关于stm32---用外部中断实现红外接收器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 罗技鼠标接收器丢失或损坏后用另一个接收器配对的方法

      本文介绍 罗技鼠标 在丢失、损坏其 自身原有 的 接收器 后,将另一个 新的接收器 与 原有鼠标 相互配对的方法。   在开始之前,大家需要首先查看两个内容:首先是 原有的鼠标 ——大家需要查看自己的鼠标(罗技键盘也是同样的操作)底部,有没有一个 类似沃尔

    2024年02月08日
    浏览(30)
  • STM32学习笔记(三)丨中断系统丨EXTI外部中断(对射式红外传感器计次、旋转编码器计次)

    ​  本次课程采用单片机型号为STM32F103C8T6。 ​  课程链接:江科大自化协 STM32入门教程   往期笔记链接:   STM32学习笔记(一)丨建立工程丨GPIO 通用输入输出   STM32学习笔记(二)丨STM32程序调试丨OLED的使用   本篇文章的内容我愿称之为 史诗级副本 (感觉

    2024年02月16日
    浏览(29)
  • 安卓开发之广播接收器

    搞安全的,用到哪学到哪 1.发送广播的逻辑(需要先定义Intent方法,再进行send) 2.接收广播的逻辑(继承BroadcastReceiver方法) 3.开关控制广播,也就是注册广播的过程(对应的register方法) Notice:广播注册又有动态注册和静态注册 MainActicity 广播接收类 效果  有序广播 描述

    2024年02月10日
    浏览(27)
  • FlinkProtobuf源与接收器

    Apache Flink是一个流处理框架,用于处理大规模数据流。Flink可以处理实时数据流和批处理数据,并提供了一种高效、可扩展的方法来处理数据。Flink的核心组件是数据流图(DataStream Graph),它由数据源(Source)、数据接收器(Sink)和数据流操作(Transformation)组成。 Protobuf是一种轻量级的

    2024年02月20日
    浏览(21)
  • Android之 BroadcastReceiver广播接收器详解

    一 四大组件 1.1 Activity组件,它一个单独的窗口,程序流程都必须在Activity中运行。 1.2 service组件,用于在后台完成用户指定的操作。 1.3 content provider组件,会为所有的应用准备一个内容窗口,并且保留数据库、文件。 1.4 broadcast receiver组件,是程序之间传递信息时的一种机制

    2024年02月06日
    浏览(28)
  • 罗技鼠标使用接收器和电脑重新配对

    罗技的鼠标出厂的时候,默认的是将通道一设置为接收器配对,在后面如果把通道一改为了蓝牙配对,那之前的接收器配对的连接就断开了。如果后面再想改为接手机配对的话,就需要借助罗技官方的软件进行手动配对了 到这里下载Unifying软件 support.logi.com/hc/zh cn/articles/360

    2024年02月03日
    浏览(25)
  • 小技巧:罗技一个接收器连接多个鼠标或键盘

    安装Logitech Unifying™ 优联软件: 最多可以将六个罗技 Unifying™ 优联无线鼠标或键盘连接至一只小巧又节省空间的 Unifying 优联 USB 接收器。 Unifying Software – Logitech 支持 + 下载 Unifying Software More https://support.logi.com/hc/zh-cn/articles/360025297913

    2024年02月11日
    浏览(186)
  • STM32单片机(五)第二节:EXTI外部中断练习(对射式红外传感器计次和旋转编码器计次)

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月09日
    浏览(33)
  • ikbc键盘2.4G接收器丢失,重新对码

    我的键盘:ikbc W200 1.键盘关掉重开; 2.新接收器插在电脑上; 3.电脑上打开软件,点开始对码,一会就连接上了。 对码软件放在这里:  我用夸克网盘分享了「IKBC 对码.rar」,点击链接即可保存。打开「夸克APP」,无需下载在线播放视频,畅享原画5倍速,支持电视投屏。 链

    2024年02月16日
    浏览(132)
  • 罗技m330更换接收器(通过重新对码的方式)

    下载安装SetPoint驱动:https://support.logi.com/hc/zh-cn/articles/360025141274 在罗技setpoint驱动的安装目录里找到Connectutility.exe 将鼠标的开关关闭,再打开,完成配对。 本文方法来源: 无线鼠标更换接收器后怎样才能使用,需要对码吗?具体步骤是怎样的? - 知乎

    2024年02月11日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包