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

news2024/9/24 19:23:13

一、红外遥控背景知识

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协议讲解

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;  //392us
	DelayMs(1); // 529us   实际上使用529-392=137us
	
	DelayMs(70); //8945    实际上使用8945-529=8416us
	func();
	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.5ms
		if (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则表示为逻辑0
						Time++;//计算,看有多少个136us
						err--;
						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;
		}
	}			
}

五、代码的移植

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.coloradmin.cn/o/1074718.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WPFdatagrid结合comboBox

在WPF的DataGrid中希望结合使用ComboBox下拉框&#xff0c;达到下拉选择绑定的效果&#xff0c;在实现的过程中&#xff0c;遇到了一些奇怪的问题&#xff0c;因此记录下来。 网上能够查询到的解决方案&#xff1a; 总共有三种ItemSource常见绑定实现方式&#xff1a; 1.ItemS…

【bug日记】spring项目使用配置类和测试类操作数据库

最近学校课程要求使用spring操作数据库&#xff0c;时间有点久了&#xff0c;操作都不太熟悉了&#xff0c;遇到了很多坑&#xff0c;特此记录一下。 导入依赖 <!-- Spring Framework --> <dependency><groupId>org.springframework</groupId><ar…

用Nginx搭建一个可用的静态资源Web服务器

sudo wget http://dlib.net/files/dlib-19.24.tar.bz2下载需要的文件。 sudo tar jxf dlib-19.24.tar.bz2进行解压。 sudo mkdir /nginx/dlib在nginx安装目录/nginx创建一个新的目录dlib。 配置文件里边的内容如下&#xff1a; worker_processes 1; events {worker_con…

如何批量获取1688商品详情数据接口,1688商品详情数据接口

批量获取1688商品详情数据接口的步骤如下&#xff1a; 获取API接口权限。编写API请求代码。应用爬取下来的数据。 1688商品详情数据接口步骤如下&#xff1a; 注册成为1688开放平台的开发者&#xff0c;并创建一个应用&#xff0c;获取到所需的App Key和App Secret等信息。使…

SpringBoot 如何使用 Prometheus 进行监控

在当今的软件开发世界中&#xff0c;监控是至关重要的一部分。它允许开发人员和运维团队实时跟踪应用程序的性能、可用性和健康状况。Spring Boot是一个流行的Java框架&#xff0c;用于构建微服务和Web应用程序&#xff0c;而Prometheus是一个开源的监控和警报工具。本文将介绍…

数据结构和算法——线性结构

文章目录 前言线性表顺序表链表合并有序链表反转链表 队列循环队列双端队列资源分配问题 栈共享栈表达式求值递归处理迷宫问题 串串的模式匹配BF算法KMP算法next数组的求解next数组的优化 前言 本文所有代码均在仓库中&#xff0c;这是一个完整的由纯C语言实现的可以存储任意类…

spark-08

学习视频&#xff1a; 黑马程序员Spark全套视频教程&#xff0c;4天spark3.2快速入门到精通&#xff0c;基于Python语言的spark教程_哔哩哔哩_bilibili

增强LLM:使用搜索引擎缓解大模型幻觉问题

论文题目&#xff1a;FRESHLLMS:REFRESHING LARGE LANGUAGE MODELS WITH SEARCH ENGINE AUGMENTATION 论文地址&#xff1a;https://arxiv.org/pdf/2310.03214.pdf 论文由Google、University of Massachusetts Amherst、OpenAI联合发布。 大部分大语言模型只会训练一次&#…

Spring Data Redis使用方式

1.导入Spring Data Redis的maven坐标 pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 2. 配置Redis数据源 2.1application.yml文件…

idea compile项目正常,启动项目的时候build失败,报“找不到符号”等问题

1、首先往上找&#xff0c;看能不能找到如下报错信息 You aren’t using a compiler supported by lombok, so lombok will not work and has been disabled. 2、这种问题属于lombok编译失败导致&#xff0c;可能原因是依赖jar包没有更新到最新版本 3、解决方案 1&#xff09…

C语言编程实现只有一个未知数的两个多项式合并的程序

背景&#xff1a; 直接看题目把&#xff01;就是C语言写两个多项式多项式合并 题目要求&#xff1a; 1. 题目&#xff1a; 编程实现只有一个未知数的两个多项式合并的程序。如&#xff1a; 3x^26x7 和 5x^2-2x9合并结果为8x^24x16。 2. 设计要求 &#xff08;1&#xff09…

有哪些值得推荐的Java 练手项目?

大家好&#xff0c;我是 jonssonyan 我是一名 Java 后端程序员&#xff0c;偶尔也会写一写前端&#xff0c;主要的技术栈是 JavaSpringBootMySQLRedisVue.js&#xff0c;基于我学过的技术认真的对每个分享的项目进行鉴别&#xff0c;今天就和大家分享我曾经用来学习的开源项目…

微调codebert、unixcoder、grapghcodebert完成漏洞检测代码

文件结构如下所示&#xff1a; mode.py # Copyright (c) Microsoft Corporation. # Licensed under the MIT License. import torch import torch.nn as nn import torch from torch.autograd import Variable import copy from torch.nn import CrossEntropyLoss, MSELosscl…

若依4.7.6 版本任意文件下载(CVE-2023-27025)

CVE-2023-27025 框架说明 若依/ruoyi 是使用java主流框架的一款优秀的国内开源cms&#xff0c; 基于SpringBoot、Shiro、Mybatis的权限后台管理系统。 环境搭建 查询最近的漏洞信息 https://cve.mitre.org/ 搜索ruoyi 代码审计感兴趣的漏洞&#xff1a;CVE-2023-27025 …

MyBatis-Plus 内置雪花算法主键重复问题

Mybatis-Plus 使用ID_WORKER生成主键id重复 问题描述 目前项目使用的id是mybatis-plus 内置的主键生成策略 ID_WORKER &#xff0c;最近测试在做性能压测&#xff0c;部署架构是单服务集群的部署方式&#xff0c;然后就发现了id重复的异常&#xff0c;异常如下 问题分析 首先分…

JSONUtil.parse将java对象转为json时,需要在java对象中设置get、set方法

想要使用JSONUtil.parse将java对象转为json格式&#xff0c;但是一直为空&#xff0c;代码如下 public class MyTest {public static void main(String[] args) {Test3<String> test3 new Test3<>("2","hhhhhhaaa");System.out.println(JSON…

Excel统计一列数据中某数字出现的频次函数COUNTIF

一、函数COUNTIF 要统计Excel中一列数据中各个元素出现的频次&#xff0c;可以使用Excel的函数COUNTIF。 假设要统计的数据位于A列&#xff0c;从A1到A10&#xff0c;可以在某小格子中使用以下公式来统计每个元素的频次&#xff1a; COUNTIF($A$1:$A$10, A1) 二、示例 下表…

前端笔记:Create React App 初始化项目的几个关键文件解读

1 介绍 Create React App 是一个官方支持的方式&#xff0c;用于创建单页应用的 React 设置用于构建用户界面的 JAVASCRIPT 库主要用于构建 UI 2 项目结构 一个典型的 Create React App 项目结构如下&#xff1a; ├── package.json ├── public # 这…

[ZJCTF 2019]NiZhuanSiWei - 伪协议+文件包含+反序列化

[ZJCTF 2019]NiZhuanSiWei 1 解题流程1.1 分析1.2 解题 题目源码&#xff1a; <?php $text $_GET["text"]; $file $_GET["file"]; $password $_GET["password"]; if(isset($text)&&(file_get_contents($text,r)"welcome t…

中国替代方案探索:替代谷歌企业邮箱的选择

“谷歌企业邮箱在中国有哪些替代方案&#xff1f;在中国市场上表现出色的企业邮箱有腾讯企业邮箱、网易企业邮箱、阿里企业邮箱以及适合外贸的Zoho Mail企业邮箱。” 在中国由于各种原因&#xff0c;包括网络安全、数据隐私保护以及与GFW(防火长城)等&#xff0c;谷歌企业邮箱并…