51单片机学习笔记(十二) - 红外遥控

2023-11-03


前言

随着科技的发展,红外遥控器逐渐被WIFI、蓝牙等所取代。但是并不意味着红外遥控就无用武之地。万物皆有相通之处,学习红外遥控可以有助于后期学习WIFI、蓝牙等通信。


一、红外遥控的背景知识

1、人机交互

  1. 当面操作的:按键、旋钮、触摸系列的设备;
  2. 遥控操作的:红外遥控、433M/2.4G无线通信、蓝牙-WIFI-Zigbee-LoRa-4G-5G等无线通信。

2、红外遥控的相关知识

  1. 红外的基本知识
    遥控器由红外接收及发射电路、信号调理电路、中央控制器、程序及数据存储器、键盘及状态指示电路组成。利用红外线进行通信,一般有红外发射和红外接收两部分电路。
  2. 红外发射和接收
    1)红外发射:红外发光二级管是发射的关键部件。它实际上是一种特殊的发光二次管。由于其内部材料与普通发光二次管不同,当两端增加相应的工作电压时,它会发出红外而不是可见光。
    2)红外接收:红外接收电路通常由制造商集成在一个元件中,成为一个集成的红外接收头。内部电路包括红外监测二极管、放大器、限副器、滤波器、积分电路、比较器等。红外监测二极管监测红外信号,然后将信号发送到放大器和限幅器,将脉冲范围调整到一定水平,无论红外发射器和接收器之间的距离如何。
    3)38KHz载波和数字信号、调制。
    4)红外遥控器通信协议:NEC协议。
    5)红外接收头内部本身是有个反相的,意思就是:平时发送方无发送信号时接收到的是1,发送方有发送载波时接收头IRD引脚输出的是0,这对我们写代码有影响,后面在看协议时序图时刚好是反的,这样可以提高接收灵敏度。

二、原理图电路分析

接收端原理图

在这里插入图片描述
J11与51单片机的P3.2连接,使用外部中断来解析协议


三、NEC协议讲解

1、逻辑1与逻辑0的表示

在这里插入图片描述

  1. 逻辑1为2.25ms,脉冲时间560us,脉冲频率38KHz;
  2. 逻辑0为1.12ms,脉冲时间560us,脉冲频率38KHz;

2、NEC协议格式

  1. 单次按
    在这里插入图片描述
    NEC协议中,首次是9ms的高电平脉冲,其后是4.5ms的低电平(起始信号),接下来就是8bit的地址码(从低有效位开始发),而后是8bit的地址码的反码(主要是用于校验是否出错)。然后是8bit 的命令码(也是从低有效位开始发),而后也是8bit 的命令码的反码。

  2. 长按
    在这里插入图片描述
    发完一个指令码的序列,但当你长时间按住遥控按钮,在这这种情况下,使用NEC协议的红外遥控器将会发射一个以110ms为周期的重复码。也就是说,每一次用户按下遥控器按钮,遥控器在发送一次指令码后,就不会再发送指令码了,而是发送一段重复码。

重复码由9ms高电平和2.25ms的低电平以及560us的高电平组成

在这里插入图片描述
注意:红外接收器为了提高接受灵敏度。输入高电平,其输出的是相反的低电平。

3、NEC协议的关键点

  1. 学会看协议格式:载波和信号;
  2. 1和0分别是如何表示的;
  3. 数据是一帧一帧的整帧传递的;
  4. 红外收发是个串行协议;
  5. 写代码时时序中的 <时间> 仍然是关键点。

四、代码实现

1、变量定义

sbit IRED = P3^2;               //接收引脚接外部中断0
unsigned char gired_data[4];    //存储4个字节接收码(地址码+地址反码+控制码+控制反码)
unsigned char ired_flag = 0;    //接收数据完毕

2、延时函数

void delay_10us(unsigned int ten_us)     //延时函数,ten_us=1时,大约延时10us
{
	while(ten_us--);	
}

3、初始化函数

void Ired_Init(void)
{
	IT0  = 1;	       //下降沿触发
	EX0  = 1;	       //打开中断0允许
	EA   = 1;	       //打开总中断
	IRED = 1;    	   //初始化端口
}

4、中断服务函数,在中断里面解码数据

void Ired() interrupt 0	                       //外部中断0服务函数
{
	unsigned char ired_high_time = 0;
	unsigned int  time_cnt = 0;
	unsigned char i = 0,j = 0;

	if(IRED == 0)
	{
		time_cnt = 1000;
		while((!IRED)&&(time_cnt))               //等待引导信号9ms低电平结束,若超过10ms强制退出
		{
			delay_10us(1);                      //延时约10us
			time_cnt--;
			if(time_cnt == 0)return;		
		}
		if(IRED)                                 //引导信号9ms低电平已过,进入4.5ms高电平
		{
			time_cnt = 500;
			while(IRED&&time_cnt)               //等待引导信号4.5ms高电平结束,若超过5ms强制退出
			{
				delay_10us(1);
				time_cnt--;
				if(time_cnt == 0) return;	
			}
			for(i = 0; i < 4; i++)               //循环4次,读取4个字节数据
			{
				for(j = 0 ; j < 8; j++)         //循环8次读取每位数据即一个字节
				{
					time_cnt = 600;
					while((IRED == 0)&&time_cnt)//等待数据1或0前面的0.56ms结束,若超过6ms强制退出
					{
						delay_10us(1);
						time_cnt--;
						if(time_cnt == 0) return;	
					}
					time_cnt = 20;
					while(IRED)                 //等待数据1或0后面的高电平结束,若超过2ms强制退出
					{
						delay_10us(10);        //约0.1ms
						ired_high_time++;
						if(ired_high_time > 20) return;	
					}
					gired_data[i] >>= 1;       //先读取的为低位,然后是高位
					if(ired_high_time >= 8)    //如果高电平时间大于0.8ms,数据则为1,否则为0
						gired_data[i] |= 0x80;
					ired_high_time = 0;        //重新清零,等待下一次计算时间
				}
			}
		}
		if(gired_data[2] != ~gired_data[3])   //校验控制码与反码,错误则返回
		{
			for(i = 0;i < 4; i++)
				gired_data[i] = 0;           //数组清零
			return;	
		}
		else
			ired_flag = 1;                 //接收正确数据标志位
	}		
}

总结

本节主要介绍了NEC协议,以及代码实现的过程,内容比较简单。需要注意的有以下两点:

  1. 解析数据’0‘和’1‘时,特别注意时间长度;
  2. 红外发送的时脉冲时,接收到的是低电平,发送的是低电平时接收的是高电平;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

51单片机学习笔记(十二) - 红外遥控 的相关文章

  • [网络工程师]-网络规划与设计-需求分析

    1 建网目标分析 建网目标的分析内容包括最终目标分析和近期目标分析 1 1最终目标分析 最终目标分析内容包括 网络建设到怎样的规模 如何满足用户需求 采用的是否是TCP IP 体系结构是Intranet还是非Intranet 即是否为企业网
  • Oracle19c ORA-00904: “WMSYS“.“WM_CONCAT“: 标识符无效

    错误描述 oracle19c ORA 24344 成功 但出现编译错误 ORA 00904 WMSYS WM CONCAT 标识符无效 解决办法 设置实例 export ORACLE SID test1 首先使用dba账号登录oracle数
  • Java06-MyBatis如何实现多表查询(一对一、一对多)

    前提 总结这个文章的前提是要会基本的SQL语句 我用的MySQL 和JDBC的基本实现 在这个基础上 我们可以通过一些标签或者注解去实现对数据库的多表联查基于一对一和一对多的关系 第二点 我们在制作数据库时一定要考虑不同的表之间的关系 这种
  • openstack装配置 Neutron( 控制节点

    在控制节点 controller 安装 Neutron 服务 同时配置支持 vxlan 1 登录数据库创建 neutron 数据库 MariaDB none gt CREATE DATABASE neutron default charac

随机推荐

  • 【大数据】美团 DB 数据同步到数据仓库的架构与实践

    美团 DB 数据同步到数据仓库的架构与实践 1 背景 2 整体架构 3 Binlog 实时采集 4 离线还原 MySQL 数据 5 Kafka2Hive 6 对 Camus 的二次开发 7 Checkdone 的检测逻辑 8 Merge 9
  • linux下应用开发之按键信号结束线程

    linux应用层经常使用线程 在线程中while循环等待 或者应用中也会有while 那么如果自己写demo或者使用命令行运行 经常用到使用Ctrl C键结束应用 比如main函数中加入signal信号处理 Stop就是信号处理回调函数 主
  • FSA-Net 模型运行——代码调试

    文章目录 一 代码连接 一 代码调试 一 环境配置 二 运行环境 二 参数设置 一 模型训练 二 模型测试 三 demo运行 三 报错汇总 一 代码连接 提示 跑了三天终于把代码跑通了 谢谢各路神仙菩萨 可以先看主要参考博客里大神的博客 讲
  • D3dcompiler_43.dll缺失怎么修复?快速修复方法分享

    D3dcompiler 43 dll缺失怎么修复 在使用Windows系统的过程中 您可能会遇到 D3dcompiler 43 dll缺失 的问题 这个问题通常会导致应用程序无法正常运行 因为它是Direct3D编译器的一部分 而Direc
  • 2020-08-13

    AlertDialog You need to use a Theme AppCompat theme or descendant with this activity 解决方案 将 super context 修改为 super cont
  • kingsoft的服务器信息,Win10系统kingsoft是什么文件夹?可以删除吗?

    在使用Win10系统的过程中 有很多人在盘符里面发现了一个kingsoft文件夹 于是就想问Win10系统kingsoft是什么文件夹 可以删除吗 其实这个问题很简单 但是如果你不知道的话 那就赶紧看看小编整理的以下文章内容吧 Win10系
  • shell脚本实战-while循环语句

    前言 上文我们讨论了for循环的使用 在有限循环里 我们使用for循环是很方便的一件事情 今天我们来探讨下while循环 while循环语句的语法分析 语法格式一 while 条件 do 操作 done 语法格式二 while read l
  • 生成随机小数的函数python_哪个选项是random库中用于生成随机小数的函数?

    其它 一个整数 它加上100后是一个完全平方数 再加上168又是一个完全平方数 试编写代码输出该整数 要求 1 粘贴代码图片 图片需包括行号 代码不可超过6行 争取4行 2 粘贴结果图片 符合条件的整数有四个 单选题 哪个选项不能正确引用t
  • PD16 for Mac(支持M1芯片)v16.3.2(50531)中文版介绍

    PD16虚拟机中文版是mac上最强大也是最好用的虚拟机软件 Parallels Desktop Mac 16 可以显着降低磁盘 内存和CPU使用率 而且针对Windows 10更新进行了优化 更新了超过50个新功能 可以让您更充分地利用你的
  • Out-Of-Vocabulary(OOV)的理解

    OOV 问题是NLP中常见的一个问题 其全称是Out Of Vocabulary 下面简要的说了一下OOV 怎么解决 下面说一下Bert中是怎么解决OOV问题 如果一个单词不在词表中 则按照subword的方式逐个拆分token 如果连逐个
  • 汉字简/繁体转换

  • C语言:删除字符

    本题要求实现一个删除字符串中的指定字符的简单函数 函数接口定义 void delchar char str char c 其中char str是传入的字符串 c是待删除的字符 函数delchar的功能是将字符串str中出现的所有c字符删除
  • 【kernel envirment】config tiny X86 kernel with vfs

    Automatically generated file DO NOT EDIT Linux x86 4 19 0 Kernel Configuration Compiler gcc Ubuntu 7 3 0 27ubuntu1 18 04
  • cocos creator 血条跟随3d convertToUINode导致的问题,使用worldToScreen解决跟随偏离问题

    cocos creator3 3 2 实现血条跟随 一开始使用的camera的converToUINode 也是按照麒麟子大师的博客操作 结果最终的效果 在屏幕中间 血条显示正常 在屏幕边缘就开始出现偏差 x和y都有的偏差 最终也没有解决方
  • 择后自动上传html代码,GitLab + Jenkins + Webhook 实现Push代码后自动更新

    一 介绍 通常是开发后的代码先推到Gitlab上管理 然后在Jenkins里通过脚本构建代码发布 这种方式每次在发版的时候 需要人工去执行jenkins上的构建动作 有时显得过于繁琐 Gitlab的Webhook功能 通过Webhook的相
  • 九月份参加OPPO和腾讯Android面试:技术一面+二面+三面+HR四面,我的面经总结!

    之前很多时候我是拒绝说我的面试经验的 因为我们简历经历不一样问的问题也会不一样 且大厂面试光靠背几个面试题就想过还是比较难的 因此在这里提醒一下大家不要临时抱佛脚 你花几天能背下的东西 别人花几天一定能超过你的 但我们花几年沉淀的东西 人家
  • 公司企业微信小程序创建步骤

    随着新一代互联网的发展 小程序已经成为当今社会不可或缺的重要部分 它的简单易用 公司企业小程序是一种基于微信平台构建的应用程序 旨在为企业提供灵活便捷的营销服务 关于公司企业微信小程序创建步骤 可分为以下几个部分 一 申请微信公众号并创建小
  • 2022年,软件测试还能学吗?别学了,软件测试岗位饱和了...

    8年前 我懵懂的选择了软件测试这个行业 穷困潦倒的时候 爸妈给我付了2万块钱进入了一家培训机构 我怀着感激和破釜沉舟的情绪开始学习软件测试 3个月的学习时间 住群租宿舍 吃盒饭 平时上课认真听讲 周末就跑自习室 在学了基础课程之后 找工作的
  • vue中纯JS调用自定义组件

    案例以vant为例 1 首先创建index vue index js文件 2 index vue跟我们平常写的组件是一样的
  • 51单片机学习笔记(十二) - 红外遥控

    文章目录 前言 一 红外遥控的背景知识 1 人机交互 2 红外遥控的相关知识 二 原理图电路分析 三 NEC协议讲解 1 逻辑1与逻辑0的表示 2 NEC协议格式 3 NEC协议的关键点 四 代码实现 总结 前言 随着科技的发展 红外遥控器