【单片机】18-红外线遥控

一、红外遥控背景知识

1.人机界面

(1)当面操作:按键,旋转/触摸按键,触摸屏

(2)遥控操作:红外遥控,433M/2.4G无线通信【穿墙能力强】,蓝牙-WIFI-Zigbee-LoRa等无线网络

2.红外遥控相关知识

1.红外线基本知识

红外线和紫外线人眼看不到,人可以看到的红外线是其中的一部分

红外线传播不远

2.红外发射和接收

单向通信

一个发送器【供电发光,发送红外信号】对应一个接收器【光电传感器】

光【1】----》电【0】

没有反应的可能性:

1)发送和接收的频率不同

2)上层协议不同

万能遥控器:是包含多种协议

3.38KHz载波和数字信号,调制

载波:无线通信过程中,1和0无法在空气中传播,将1和0叠加在载波上

数字信号:1和0

调制:将1和0叠加在载波上

解调:将调制的数据反调制,将数据取出来

电话线上的猫:先将网络型号转换为电话线可以传播的信号然后进行传播

4.红外遥控器通信协议

遥控器和接收端的交互

二、原理图分析

1.原理图和接线

1.接收端原理图

2.IR1接收模块原理

发送(调制)和接收(解调)

(1)一体集成式接收头内部已经内置了红外载波解调功能,从IRD引脚出来的就是通信的二进制信号。所以单片机的IO可以直接接IRD引脚来读取红外信号中的通信信息。所以38KHz的载波的调制和解调过程对编程是透明的(可以忽视的)

(2)红外接收头内部本身是有个相反的,意思是:平时发送方无发送信号时接收到的是1,有发送载波时接受头IRD引脚输出的是0,意味着后面时序图是相反的。

2.红外遥控器全解析

https://www.cnblogs.com/zhugeanran/p/9334289.html

1.功能演示

2.拆解

3.芯片bingding工艺

3.红外遥控系统工作过程综述

1.发射端

一般是一个红外遥控器,内置一个芯片,检查按键,收集键值,调制到38kHz

2.传播

通过红外头传播

3.接收端

对载波进行解调,得到1和0的信号,解开键值

三、NEC协议讲解

红外协议之NEC协议_Linux教程_Linux公社-Linux系统门户网站

https://www.cnblogs.com/mylinux/p/5084264.html

第 16 章 红外通信实验

1.红外遥控协议原理

因为逻辑1和逻辑0在空气中传输过程中是不稳定的

1.红外遥控协议的作用

从二进制的层面上定义了如何传输一帧数据(传输逻辑1应该多长的时间周期,传输逻辑0应该多长时间周期)

数据是一帧一帧的传,不可以出现一帧没有传输完就传输下一帧。

2.红外遥控的特征

  • 8 位地址和 8 位命令长度
  • 为提高可靠性每次传输两遍地址(用户码)和命令(按键值)
  • 通过脉冲串之间的时间间隔来实现信号的调制
  • 38Khz 载波
  • 每位的周期为 1.12ms(逻辑0) 或者 2.25ms(逻辑1)

3.解析协议的关键点

时间周期【传输逻辑1和传输逻辑0的时间不同】

4.不同协议的差异

 时序的不同,调制的方式不同,但是低层还是按照38KHz发送

5.为什么需要协议?

只需要低层协议就足够

2.NEC协议的关键点

1.载波和信号

2.关键:1和0分别如何表示

3.数据是一帧一帧的帧传输

接收方无法预测什么时候可以接收完毕【异步:轮询或者中断】

4.NEC是串行协议

数据是一个bit一个bit的传输

5.时序中的时间仍然是关键点

四、官方示例代码

1.如何得到一段代码精确延时时间【软仿真】

涉及到延时时间问题时,一定要先确定频率

延时等级问题

注意点:每一次修改完后要记得重新运行一次

实际上耗费时间包括:

1)调用函数的时间

2)函数内部代码的执行

#include<reg51.h>
#include"ired.h"void DelayMs(unsigned int x)   //0.14ms误差 0us
{unsigned char i;while(x--){for (i = 0; i<13; i++){}}
}
void func(void){unsigned char a=1;
}void main(){unsigned char a=0,y=0;a=1;  //392usDelayMs(1); // 529us   实际上使用529-392=137usDelayMs(70); //8945    实际上使用8945-529=8416usfunc();y=a+4;a=2;

2.中断函数

void ReadIr() interrupt 0
{unsigned char j,k;unsigned int err;Time = 0;					 DelayMs(70);			// 8416us---软仿真测试//时序图中要持续9us的时间处于低电平(相反)if (IRIN == 0)		//确认是否真的接收到正确的信号{	 //检查是否超时		err = 1000;				//1000*10us=10ms,超过说明接收到错误的信号/*当两个条件都为真时循环,如果有一个条件为假的时候跳出循环,免得程序出错的时侯,程序死在这里*/	//每过136ms去检查是否变为高电平//IRIN==0:表示此时还是低电平,此时9ms还没有到//err>0:避免死循环【超时设置】while ((IRIN==0) && (err>0))	//等待前面9ms的低电平过去  		{			DelayMs(1);			// 136us【在8.4us后不断检查】err--;} //超过9us,进入4.5msif (IRIN == 1)			//如果正确等到9ms低电平{err = 500;//超时检查while ((IRIN==1) && (err>0))		 //等待4.5ms的起始高电平过去{DelayMs(1);err--;}//开始传输数据for (k=0; k<4; k++)		//共有4组数据{			for (j=0; j<8; j++)	//接收一组数据【从低位开始读】{err = 60;//这里是为了消耗每接受一个数据前面的560us的时间		while ((IRIN==0) && (err>0))//等待信号前面的560us低电平过去{DelayMs(1);//延时1表示延时136us【软仿真】err--;}err = 500;//开始区分逻辑1(1.69ms)和逻辑0(0.56ms)while ((IRIN==1) && (err>0))	 //计算高电平的时间长度。{DelayMs(1);//0.14ms//逻辑1(1.69ms)和逻辑0(0.56ms)//1690/136=12个//560/136=4个//如果time》12则表示为逻辑1,如果time《4则表示为逻辑0Time++;//计算,看有多少个136userr--;if (Time > 30)//136*30=4080us【超时机制】//{EX0 = 1;return;}}//循环结束后,判断此时time的大小,如果IrValue[k] >>= 1;	 //k表示第几组数据if (Time >= 8)			//如果高电平出现大于565us,那么是1{IrValue[k] |= 0x80;//将得到的数据放在高位}Time = 0;		//用完时间要重新赋值							}}}if (IrValue[2] == ~IrValue[3])//判断两个命令(键值)是否相同---》检验{return;}}			
}

3.初始化函数

void IrInit(void)
{IT0=1;//外部中断0中断源类型选择位:下降沿触发EX0=1;//外部中断0中断允许位EA=1;	//打开总中断IRIN=1;//初始化端口,平时电平为高电平【因为材料问题规定的】,所以才初始化为高电平
}

五、代码的移植

1.全局变量的定义

全局变量在哪个C文件中用就在哪个C文件中定义
不能放在头文件中定义
 如果在多个C文件中都要用到同一个全局变量,应该在一个主要的C文件中定义
然后其他C文件中extern声明即可

ired.c

// 全局变量在哪个C文件中用就在哪个C文件中定义
// 不能放在头文件中定义
// 如果在多个C文件中都要用到同一个全局变量,应该在一个主要的C文件中定义
// 然后其他C文件中extern声明即可
sbit IRIN = P3^2;
unsigned char IrValue[5];  // IrValue的0-3用来放原始数据,4用来放经过校验确认无误的键值
unsigned char Time;

main.c

extern unsigned char IrValue[6];//声明

2.红外遥控器上的键值

1.测试

2.结果

3.延时时间配合

结合上面的“如何得到一段代码精确延时时间【软仿真】”去验证一个延迟时间函数对应多长时间,然后要求这个地方不超过9ms即可。

4.屏蔽无效数据

将经过校验确认无误的键值输出

5.程序改良

原来我们将主程序写在中断中,实际上不能写在里面。

所以我们可以通过定时器来处理延时,因为在定时器在运行时,CPU还可以工作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/157107.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jupyter 切换虚拟环境

当前只有两个环kernel 我已经创建了很多虚拟环境&#xff0c;如何在notebook中使用这些虚拟环境呢&#xff1f;请看下面 比如说我要添加nlp 这个虚拟环境到notebook中 1. 切换到nlp环境 2. 安装如下模块 pip install ipykernel 3. 执行如下命令 python -m ipykernel install …

【IDEA项目个别类爆红,但是项目可以正常运行】

打开项目时发现idea个别类爆红,但是项目可以正常运行 问题原因&#xff1a;Idea本身的问题&#xff0c;可能是其缓存问题&#xff0c;导致爆红 解决方案&#xff1a;重置Idea 很多时候排查不出代码问题&#xff0c;就尝试一下此操作。 选择目录&#xff1a;File–>Invalida…

今日头条文章采集ChatGPT3.5/4.0驱动浏览器改写文章软件说明文档

大家好了&#xff0c;我是淘小白~ 今天给大家介绍的软件是一个款驱动浏览器改写文章的软件&#xff0c;下面给大家做一下介绍说明&#xff1a; 一、软件语言 Python编写的&#xff0c;使用的库是selenium库 二、具体逻辑 1、整理头条文章网址&#xff0c;需要自己整理&…

【广州华锐互动】钢厂铸锻部VR沉浸式实训系统

随着科技的不断进步&#xff0c;虚拟现实(VR)技术已成为当今最具潜力的技术之一。在钢铁行业中&#xff0c;VR虚拟仿真实训已经被广泛应用于培训和教育领域&#xff0c;特别是钢铁厂铸锻部&#xff0c;通过VR技术&#xff0c;可以大大提高培训效率&#xff0c;降低培训成本&…

多域名SSL数字证书是什么呢

多域名SSL数字证书是众多SSL数字证书中最灵活的一款SSL证书产品。一般一张SSL证书只能保护一个域名&#xff0c;即使能保护多个域名站点&#xff0c;证书保护的域名类型也有限制(通配符SSL数字证书)。多域名SSL数字证书既能用一张SSL证书保护多个域名网站&#xff0c;又不限制域…

CentOS 7 服务器上创建新用户及设置用户密码有效期

一、创建用户 1、以 root 用户身份登录到 CentOS 服务器 2、运行以下命令以创建新用户&#xff1a; useradd -m -s /bin/bash username其中&#xff0c;username 是您要创建的新用户的用户名。该命令将创建一个新用户并为其分配一个主目录。3、运行以下命令以设置新用户的密码…

XPath在数据采集中的应用:从XML和HTML中提取数据

目录 一、XPath简介 二、XPath的语法 三、XPath在数据采集中的应用 四、XPath和其他数据格式 总结 在当今的数据驱动时代&#xff0c;从各种数据源中提取有用的信息变得至关重要。其中&#xff0c;XML和HTML作为主流的数据源格式&#xff0c;常常出现在我们的数据提取任务…

正点原子嵌入式linux驱动开发——Busybox根文件系统构建

前面已经移植了TF-A、Uboot和Linux kernel&#xff0c;就剩最后一个 rootfs(根文件系统)了&#xff0c;本章就来学习一下根文件系统的组成以及如何构建根文件系统。这是Linux系统移植的最后一步&#xff0c;根文件系统构建好以后就意味着拥有了一个完整的、可以运行的最小系统 …

【运维笔记】VMWare 另一个程序已锁定文件的一部分,进程无法访问

情景再现 这里使用的是VMware 17 解决办法 进入设置 点击选项&#xff0c;全选复制里面内容 进入文件夹&#xff0c;删除所有包含.lck后缀的文件和文件夹 再启动虚拟机即可

【Vue基础-数字大屏】加载动漫效果

一、需求描述 当网页正在加载而处于空白页面状态时&#xff0c;可以在该页面上显示加载动画提示。 二、步骤代码 1、全局下载npm install -g json-server npm install -g json-server 2、在src目录下新建文件夹mock&#xff0c;新建文件data.json存放模拟数据 {"one&…

基于片段的分子生成网络 (FLAG)使用方法及案例测评

本文来源于中国科技大学计算机科学与技术学院刘淇教授课题组于2023年发表在ICLR2023上的文章《MOLECULE GENERATION FOR TARGET PROTEIN BINDING WITH STRUCTURAL MOTIFS》。 在本文中&#xff0c;作者提出了一个基于片段的分子生成网络&#xff0c;FLAG &#xff08;Fragment …

如何在虚幻引擎中渲染动画?

大家好&#xff0c;今天我将展示如何在虚幻引擎中渲染动画&#xff0c;以及虚幻引擎渲染动画怎么设置的方法步骤。 需要提前了解&#xff1a; 虚幻引擎本地运行慢、渲染慢、本地配置不够&#xff0c;如何解决&#xff1f; 渲云云渲染支持虚幻引擎离线渲染&#xff0c;可批量…

钢筋智能测径仪 光圆与带肋钢筋均可检测!

在一个大规模、高效、连续的工业生产中&#xff0c;制造业正朝着自动化方向快速优化发展&#xff0c;这种自动化的生产需要快速、准确地分析控制生产工艺中的参数&#xff0c;超差及时提示&#xff0c;为操作工对工厂的运行和自我调节做出快速反应&#xff0c;人工操作越来越不…

SpringBootCMS漏洞复现分析

SpringBootCMS&#xff0c;极速开发&#xff0c;动态添加字段&#xff0c;自定义标签&#xff0c;动态创建数据库表并crud数据&#xff0c;数据库备份、还原&#xff0c;动态添加站点(多站点功能)&#xff0c;一键生成模板代码&#xff0c;让您轻松打造自己的独立网站&#xff…

【html】利用生成器函数和video元素,取出指定时间的视频画面

简言 有的时候想截取视频某一秒的视频画面。 手动截取操作麻烦&#xff0c;还得时刻关注视频播放时间。 于是&#xff0c;我搞出来了一个根据视频自动截取特定时间描述的页面。 效果 实现步骤 获取视频对象根据视频时长生成时间选择表单根据表单选择的时间和视频地址&#x…

用手势识别来测试视力?试试用百度AI来实现想法

文章目录 ⭐ 前言⭐ 灵感来源⭐ 项目准备⭐ 项目实现⭐ 不足与展望 ⭐ 前言 10月17日&#xff0c;以“生成未来&#xff08;PROMPT THE WORLD&#xff09;”为主题的百度世界2023将在北京首钢园举办。百度创始人、董事长兼首席执行官李彦宏将带来以“手把手教你做AI原生应用”…

校招C#面试题整理—Unity客户端

前言 博客已经1年多没有更新了&#xff0c;这一年主要在实习并准备秋招和春招&#xff0c;目前已经上岸Unity客户端岗位&#xff0c;现将去年校招遇到的一些面试题的事后整理分享出来。答案是笔者自己整理的不一定保证准确&#xff0c;欢迎大家在评论区指出。 Unity客户端岗的…

LabVIEW将视觉生成器AI用作OPC服务器

LabVIEW将视觉生成器AI用作OPC服务器 介绍如何将视觉生成器AI配置为OPC服务器&#xff0c;并使用共享变量共享视觉生成器AI生成的结果。OPC是一系列标准规范&#xff0c;定义了来自不同制造商的控制设备之间的实时数据通信。OPC数据访问通信是基于客户端服务器的通信。 共享系…

设计模式 - 状态模式

目录 一. 前言 二. 实现 一. 前言 状态模式&#xff08;State Pattern&#xff09;&#xff1a;它主要用来解决对象在多种状态转换时&#xff0c;需要对外输出不同的行为的问题。状态和行为是一一对应的&#xff0c;状态之间可以相互转换。当一个对象的内在状态改变时&#x…

数学基础

线性代数 关键词&#xff1a;线性方程组、矩阵、增广矩阵&#xff08;系数矩阵、常数项矩阵&#xff09;、阶梯型矩阵、行最简矩阵、最简形矩阵、向量系统、向量加法、向量空间、基本单位向量、线性相关、线性无关、Span张成空间、 向量乘法&#xff08;点积、内积、外积、叉积…