51单片机学习笔记13 红外遥控接收

51单片机学习笔记13 红外遥控接收

  • 一、红外遥控
    • 1. **发射原理**
    • 2. **接收原理**
    • 3. **发射、接收示例**
  • 二、编码、解码
    • 1. **编码方式分类**:
      • (1)Pulse Distance Modulation (PDM) 脉冲距离调制:
      • (2)Pulse Width Modulation (PWM) 脉冲宽度调制:
      • (3)Manchester Encoding 曼彻斯特编码:
      • (4)Bi-Phase Encoding 双相编码:
    • 2. 常见的红外编解码格式
      • (1)**RC-5 和 RC-6**
      • (2)**Sony SIRC(索尼红外编码)**
      • (3)**Samsung 标准**
      • (4)**NEC 日本电气公司**
      • (5)**RAW (原始) 码**
    • 3. NEC编解码详解
      • (1)帧结构
      • (2)脉冲编码
      • (3)地址码
      • (4)命令码
      • (5)反码
      • (6)结束码
      • (7)连发码
    • 4. 一体化红外遥控接收头
  • 三、实现
    • 1. 硬件电路设备
    • 2. 软件实现
      • (1)IO口及中断初始化
      • (2)外部中断0
    • 3. 使用main.c

一、红外遥控

红外遥控技术是一种常见的无线通信技术,常用于控制家电、汽车、电视机、音响系统等设备。其原理主要基于红外光的发射与接收。

1. 发射原理

  • 发射器通常是一个红外二极管(IR LED),它能够将电能转换为红外光能。
  • 当发射器接收到来自遥控器的信号时,会通过载波调制将信号转换为红外光信号,然后通过发射器发射出去。
  • 这些红外光信号的频率一般在30kHz到60kHz之间,常用的有33K、36K、36.6K、38K、40K、56K等,其中38K使用最多。
  • 在发射端要对晶振进行整数分频,分频系数一般取12,所以455kHz÷12≈37.9 kHz≈38kHz。
  • 常用占空比有1/3、1/2,1/3最多。

2. 接收原理

  • 接收器通常是一个红外接收模块(IR Receiver Module),它包括一个红外光敏元件和一个解调器。
  • 红外光敏元件接收到发射器发射的红外光信号后,将其转换为电信号。
  • 解调器对接收到的信号进行解调,将其还原为数字信号,然后发送给被控制设备的处理器或微控制器。

在这里插入图片描述

3. 发射、接收示例

在这里插入图片描述

二、编码、解码

1. 编码方式分类

(1)Pulse Distance Modulation (PDM) 脉冲距离调制:

PDM 是一种基于脉冲的编码方式,它根据脉冲之间的距离来表示信息。通常,长脉冲和短脉冲分别代表不同的二进制位或符号。

(2)Pulse Width Modulation (PWM) 脉冲宽度调制:

PWM 是一种通过调节脉冲宽度来编码信息的方法。不同的脉冲宽度代表不同的符号或信息。

(3)Manchester Encoding 曼彻斯特编码:

曼彻斯特编码将每个比特位编码为两个等长的脉冲,根据脉冲的变化来表示信息。例如,高电平到低电平表示1,低电平到高电平表示0。

(4)Bi-Phase Encoding 双相编码:

双相编码将每个比特位分为两个阶段,根据信号的相位变化来编码信息。常见的双相编码包括差分曼彻斯特编码(Differential Manchester Encoding)。

2. 常见的红外编解码格式

NEC(日本电气公司)编解码格式是红外遥控器常用的一种标准格式,广泛应用于各种消费电子产品的遥控器中。它采用了一种特定的脉宽调制(PWM)编码方式。

(1)RC-5 和 RC-6

由飞利浦公司(现在的NXP半导体)开发的另两种常见的红外编码解码标准。RC-5 通常用于欧洲市场,而 RC-6 用于全球市场。

(2)Sony SIRC(索尼红外编码)

索尼公司开发的一种常见的红外编码格式,通常用于索尼品牌的遥控器中。

(3)Samsung 标准

三星公司采用的一种红外编码标准,用于其产品系列的遥控器中。

(4)NEC 日本电气公司

广泛用于各种消费电子产品。

(5)RAW (原始) 码

RAW 码不使用特定的编码格式,而是直接记录脉冲的时间间隔,可以通过分析脉冲的时间来解码。

3. NEC编解码详解

文档地址:https://www.sbprojects.net/knowledge/ir/nec.php

(1)帧结构

以下是使用 Markdown 表示 NEC 帧的组成部分的示例:

部分描述
引导脉冲NEC 编码帧的开始标志,通常是一个特定脉冲序列,用于同步接收器,9ms。
地址码用于识别接收器要控制的设备,通常是 8 位二进制数。
反码对地址码的按位取反,用于增强数据的可靠性。
命令码表示具体的操作或命令,用于控制目标设备的功能。
命令反码对命令码的按位取反,用于增强数据的可靠性。
结束码NEC 编码帧的结束标志,表示一个完整的指令。

一个完整的 NEC 编码帧通常由连续的脉冲序列组成,包括引导脉冲、地址码、反码、命令码、命令反码和结束码等部分。
在这里插入图片描述

(2)脉冲编码

NEC 编码器使用脉冲宽度调制(PWM)来编码信息,通常:

  • 一个脉冲对应 560us 连续载波
  • 逻辑1传输需要2.25ms(560us脉冲+1680us低电平)
  • 逻辑0传输需要1.125ms(560脉冲+560us低电平)

接收端与发送端电平相反 。

下图是逻辑电平1、逻辑电平0的示例:
在这里插入图片描述

(3)地址码

在红外遥控器的通信过程中,地址码标识了特定的设备或设备组,它包含以下几个重要概念:

  1. 长度

    • 地址码的长度通常是 8 位二进制数,即包含 8 位 0 或 1 的序列。这种长度允许识别 256 个不同的设备或设备组。
  2. 编码规则

    • 采用脉冲宽度调制(PWM)方式。通常,逻辑 1 由一个特定宽度的脉冲表示,而逻辑 0 则由另一个宽度的脉冲表示。
  3. 设备识别

    • 接收器根据接收到的地址码来识别要控制的设备。在一个系统中,不同的设备或设备组通常被分配不同的地址码,以确保每个设备都可以准确地识别和响应来自遥控器的命令。
  4. 校验位

    • 在 NEC 编码格式中,通常会包含一个地址码的反码作为校验位,用于增强数据的可靠性。接收器在接收到地址码后,会对其进行校验,以确保数据的准确性。
  5. 地址范围

    • 由于地址码的长度为 8 位二进制数,因此地址码的地址范围是从 00000000 到 11111111(0 到 255)。这允许 NEC 编码格式支持多达 256 个不同的设备或设备组。

通过地址码,接收器能够准确地识别要控制的设备或设备组,从而确保遥控器发送的命令能够正确地被接收并执行。

(4)命令码

命令码用于表示遥控器发送的具体操作或命令。每个命令码都对应着一项特定的功能或动作,例如开启/关闭、音量调节、频道切换等,其主要概念:

  1. 长度
    命令码的长度通常是 8 位二进制数,与地址码相同。这种长度允许有 256 种不同的命令。

  2. 编码规则
    与地址码相同。

  3. 操作指令
    每个命令码都代表着一项具体的操作指令。例如,命令码 00000000 可能代表着“开启”操作,而命令码 11111111 可能代表着“关闭”操作。

  4. 校验位
    类似于地址码,命令码也可以包含一个校验位,通常是命令码的反码。这个校验位用于增强数据的可靠性,确保接收器正确地解码命令。

  5. 功能范围
    NEC 编码格式支持多种不同的功能和操作,因此命令码可以涵盖各种各样的控制命令。这些命令可以包括开关控制、音量调节、频道切换、模式选择等等。

(5)反码

除了地址码和命令码外,NEC 编码格式还包括反码,用于增强数据的可靠性。反码是对地址码和命令码的按位取反。

(6)结束码

结束码表示一个编码帧的结束,用于标识一个完整的指令。

(7)连发码

在用户按住遥控器上的某个按钮时,会连续发送相同的命令信号,直到用户释放按钮为止。

在这里插入图片描述

4. 一体化红外遥控接收头

一体化红外遥控接收头是一种集成了红外接收器功能的组件,它具有接收红外信号并解码的功能,一般支持多种协议 。
在这里插入图片描述

三、实现

1. 硬件电路设备

开发板在 P3.2上安装了红外接收头。
在这里插入图片描述

2. 软件实现

对红外的接收使用外部中断,出现下降沿时触发 。下面代码实现在按下遥控器按键后,数码管显示对应的控制码值,并通过串口输出控制码值。

(1)IO口及中断初始化


u8 ired_data[4];
/**
 * @brief ired 初始化
 */
void ired_init(void){
    // 使能外部中断0
    IT0 = 1;
    // 设置外部中断0下降沿触发
    EX0 = 1;
    // 使能总中断
    EA = 1;
    // 拉高IRED
    IRED = 1;
}

(2)外部中断0


/**
 * @brief ired 接收中断
 */
void ired() interrupt 0{
    u8 i,j;
    u16 time_cnt ;
    // 保存高电平时间
    u16 high_cnt;
    // 是不是低电平
    if(IRED == 0){
        time_cnt = 1000;
        // 高电平时退出
        while((!IRED) && time_cnt){
            delay_10us(1);
            time_cnt--;
        }
        if(time_cnt==0)return;
        // ired接收到信号, 10ms内进入高电平

        if(IRED){
            // 4.5ms高电平结束,超过5ms就是错误信号
            time_cnt = 500;
            while(IRED && time_cnt){
                delay_10us(1);
                time_cnt--;
            }
            if(time_cnt==0)return;

            // 接收数据,地址码、地址反码、控制码、控制反码
            for(i=0;i<4;i++){
                for(j=0;j<8;j++){
                    // 0.56ms低电平(这里使用600us)
                    time_cnt = 600;
                    while(IRED==0 && time_cnt){
                        delay_10us(1);
                        time_cnt--;
                    }
                    // 大于560us,非正常信号
                    if(time_cnt==0)return;

                    // 判断高电平时间,0  560us, 1680us
                    time_cnt = 20;
                    high_cnt = 0;
                    while(IRED && time_cnt){
                        delay_10us(10);
                        time_cnt--;
                        high_cnt++;
                    }
                    // 超时
                    if(time_cnt==0)return;
                    ired_data[i] >>= 1;

                    // 大于800us就认为是1
                    if(high_cnt>=8){
                        // 高电平
                        ired_data[i] |= 0x80;
                    }
                }
            }
            // 反码判断数据是否正确
            if(ired_data[2] != ~ired_data[3] ){
                // 数据错误
                for(i=0;i<4;i++){
                    ired_data[i] = 0;
                }
            }
        }
    }
}

3. 使用main.c

#include "led_utils.h"
#include "ired_utils.h"
#include "segment_display_utils.h"
#include "uart_utils.h"

/**
* @brief 主函数
*/
void main()
{
	// 关闭所有led
	led_all_off();
    ired_init();
    // 速率 9600
    uart_init(0xfa);
	while(1)
	{
        uart_send(0);
        uart_send(ired_data[2]);
        uart_send(1);
        segment_show_u8(0, ired_data[2]);
	}
}

本文代码开源地址:
https://gitee.com/xundh/learn51.git

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python coding with ChatGPT 专题2| 全解递归算法

文章目录 递归与栈的关系如何思考递归汉诺塔 经典题目入门&#xff1a;斐波那契数列分治法&#xff1a;归并排序树的递归遍历组合问题&#xff1a;子集搜索问题&#xff1a;N皇后 拓展阶乘的迭代法斐波那契数列迭代法青蛙跳 参考文献 掌握递归是解决许多编程问题的关键&#xf…

VBA数据库解决方案第九讲:把数据库的内容在工作表中显示

《VBA数据库解决方案》教程&#xff08;版权10090845&#xff09;是我推出的第二套教程&#xff0c;目前已经是第二版修订了。这套教程定位于中级&#xff0c;是学完字典后的另一个专题讲解。数据库是数据处理的利器&#xff0c;教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法…

如何使用极狐GitLab 启用自动备份功能

本文作者&#xff1a;徐晓伟 GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 本文主要讲述了如何极狐GitLab 自…

HarmonyOS 和 OpenHarmony

HarmonyOS 和 OpenHarmony 支持的 shell 命令不同&#xff0c;因此有时候需要做一做区分&#xff0c;目前有些文档上没有标注&#xff0c;因此可能产生歧义。 HarmonyOS 支持 getprop&#xff1a; getprop hw_sc.build.os.apiversion # 查看API版本OpenHarmony 上支持 param…

2024年NAND价格市场继续上涨

TrendForce发布了最新的NAND闪存市场价格走势预测。根据其报告&#xff0c;在2024年第二季度&#xff0c;NAND闪存合同价格将进一步呈现两位数的增长&#xff0c;叠加前一季度的增长。不过&#xff0c;客户端SSD的价格涨幅预计在第二季度将不超过15%&#xff0c;相比于2024年第…

破解密码:掌握2024年的营销归因

Cracking the Code: Mastering Marketing Attribution in 2024 营销归因是识别哪些营销渠道和触及点有助于销售或转化的过程。随着消费者继续通过多个渠道与品牌互动&#xff0c;掌握营销归因对企业来说变得越来越重要。在这篇文章中&#xff0c;我们将探讨破解代码和有效衡量…

PW1503限流芯片:可达3A限流,保障USB电源管理安全高效

在电源管理领域&#xff0c;开关的性能直接关系到设备的稳定性和安全性。今天&#xff0c;我们将详细解析一款备受关注的超低RDS&#xff08;ON&#xff09;开关——PW1503。它不仅具有可编程的电流限制功能&#xff0c;还集成了多项保护机制&#xff0c;为各类电子设备提供了高…

vue两个特性和什么是MVVM

一、什么是vue 1.构建用户界面 用vue往html页面中填充数据&#xff0c;非常的方便 2.框架 框架是一套线成的解决方案 vue的指令、组件&#xff08;是对ui结构的复用&#xff09;、路由、vuex 二、vue的特性 1.数据驱动视图 2.双向数据绑定 1.数据驱动视图 数据的变化会驱动…

基于tensorflow和kereas的孪生网络推理图片相似性

一、环境搭建 基础环境&#xff1a;cuda 11.2 python3.8.13 linux ubuntu18.04 pip install tensorflow-gpu2.11.0 验证&#xff1a;# 查看tensorflow版本 import tensorflow as tf tf.__version__ # 是否能够成功启动GPU from tensorflow.python.client import device_lib pr…

Navicat for MySQL 15免费注册方法

一、效果图如下&#xff1a; 注&#xff1a;此方法仅用于非商业用途&#xff0c;请勿传播&#xff0c;否则后果自负。 二、下载安装 下载安装包&#xff0c;分为32位和6位&#xff0c;下载文件名&#xff1a;Navicat for MySQL 15.zip&#xff08;https://download.csdn.net/…

Prometheus+grafana环境搭建redis(docker+二进制两种方式安装)(四)

由于所有组件写一篇幅过长&#xff0c;所以每个组件分一篇方便查看&#xff0c;前三篇 Prometheusgrafana环境搭建方法及流程两种方式(docker和源码包)(一)-CSDN博客 Prometheusgrafana环境搭建rabbitmq(docker二进制两种方式安装)(二)-CSDN博客 Prometheusgrafana环境搭建m…

Nginx反向代理和缓存

一、Nginx反向代理 1.调度和代理的区别&#xff1a; 1.调度基于内核层面&#xff0c;代理基于应用层面 2.代理必须实现一手托两家 3.调度不需要监听任何端口&#xff0c;不需要工作任何应用程序&#xff0c;代理需要工作和上游服务器一模一样的进程 4.调度没有并发上限&am…

CentOS7安装flink1.17完全分布式

前提条件 准备三台CenOS7机器&#xff0c;主机名称&#xff0c;例如&#xff1a;node2&#xff0c;node3&#xff0c;node4 三台机器安装好jdk8&#xff0c;通常情况下&#xff0c;flink需要结合hadoop处理大数据问题&#xff0c;建议先安装hadoop&#xff0c;可参考 hadoop安…

nslookup查询网站是否支持IPV6

nslookup是一种网络管理命令行工具&#xff0c;可用于查询DNS域名和IP地址输入指令nslookup默认服务器和Address是当前上网所用的DNS服务器域名和地址A记录A&#xff08;Address&#xff09;记录指的是用来指定主机名或域名对应的IP记录。

java数据结构与算法刷题-----LeetCode547. 省份数量

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 深度优先遍历广度优先遍历 本题考察图的连通分量个数。也就是所有…

24/04/02总结

API: bigdecima: 方法名 说明 public static BigDecimal valueof( double val) 静态获取对象 public BigDecimal add(BigDecimal val) 加法 public BigDecimal subtract(BigDecimal val…

JavaScript库,编写$()和getElementsByClassName()方法

背景: JavaScript库是一组预先编写好的JavaScript代码集合&#xff0c;旨在简化常见的网页开发任务。这些库通常包含了许多函数和方法&#xff0c;可以帮助开发人员处理各种任务&#xff0c;比如DOM操作、事件处理、动画效果、AJAX请求等等。使用JavaScript库可以节省开发时间…

Python 与机器学习,在服务器使用过程中,常用的 Linux 命令包括哪些?

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 本博客旨在分享在实际开发过程中&#xff0c;开发者需要了解并熟练运用的 Linux 操作系统常用命令。Linux 作为一种操作系统&#xff0c;与 Windows 或 MacOS 并驾齐驱&#xff0c;尤其在服务器和开发环…

Redis缓存设计与性能优化【缓存和数据库不一致问题,解决方案:1.加过期时间这样可以一段时间后自动刷新 2.分布式的读写锁】

Redis缓存设计与性能优化 缓存与数据库双写不一致 缓存与数据库双写不一致 在大并发下&#xff0c;同时操作数据库与缓存会存在数据不一致性问题 1、双写不一致情况 2、读写并发不一致 解决方案&#xff1a; 1、对于并发几率很小的数据(如个人维度的订单数据、用户数据等)&a…

Spring中BeanFactoryPostProcessor详解

目录 功能与作用 使用案例 spring提供的常见BeanFactoryPostProcessor 1.EventListenerMethodProcessor 2.BeanDefinitionRegistryPostProcessor 功能与作用 使用案例 spring提供的唯一BeanDefinitionRegistryPostProcessor 总结 功能与作用 参考BeanFactoryPostProce…