红外通信的应用——PPM调制与解码(C51)

2023-05-16

目录

一、引言

  红外线是波长在750nm至1mm之间的电磁波,其频率高于微波而低于可见光,是一种人的眼眼看不到的光线。无线电波和微波已被广泛应用在长距离的无线通信中,但由于红外线的波长较短,对障碍物的衍射能力差,所以更适合应用在需要短距离无线通信场合点对点的直接线数据传输。为了使各种设备能够通过一个红外接口进行通信,红外数据协议(InfraredDataAssociation,简称IRDA)发布了一个关于红外的统一的软硬件规范,也就是红外数据通讯标准。

  红外通信是利用950nm近红外波段的红外线作为传递信息的媒体,即通信信道。发送端采用脉位调制(PPM)方式,将二进制数字信号调制成某一频率的脉冲序列,并驱动红外发射管以光脉冲的形式发送出去;接收端将接收到的光脉转换成电信号,再经过放大、滤波等处理后送给解调电路进行解调,还原为二进制数字信号后输出。

  PPM是以帧为单位,帧内每个脉冲间隔表示一个通道的控制量,两帧之间有一个长一点的低电平,这个信号曾经用于同步,作为帧和帧之间的划分。

  简而言之,红外通信的实质就是对二进制数字信号进行调制与解调,以便利用红外信道进行传输;红外通信接口就是针对红外信道的调制解调器。

二、数据格式

  数据格式包括了引导码、用户码、数据码和数据码反码,编码总占32位。数据反码是数据码反相后的编码,编码时可用于对数据的纠错。注意:第二段的用户码也可以在遥控应用电路中被设置
成第一段用户码的反码

在这里插入图片描述
本文使用的STC51单片机使用的红外遥控采用NEC协议

1、8 位地址和 8 位指令长度;
2、地址和命令 2 次传输(确保可靠性)
3、PWM 脉冲位置调制,以发射红外载波的占空比代表“0”和“1”;
4、载波频率为 38Khz;
5、位时间为 1.125ms 或 2.25ms
6、一个脉冲对应 560us 的连续载波,一个逻辑 1 传输需要 2.25ms(560us脉冲+1680us 低电平),一个逻辑 0 的传输需要 1.125ms(560us 脉冲+560us 低电平)。

在NEC码中,起始码用于同步,接着是用户码、用户码反码、数据、数据反码。传输时低位在前、高位在后。

三、解码

使用外部中断1(P33引脚)接收信号,收到信号后串口输出,显示对应的十六进制数值。

外部中断步骤:

1.声明一变量来存放高电平时间;
2.如果P3^3口为低电平,超时判断(等待前9ms过去) 如果传输正确(为高电平)接着运行,否则9ms后结束;
3.如果P3^3口为高电平,超时判断(等待4.5ms过去) 开始接受数据(4组8位数据);
4.采用for循环嵌套(大循环4次对应4字节,小循环8次对应每个字节的8位)循环内:
  等待前面560us低电平 计算高电平时间(区分位0和位1)判断如果时间超过3ms退出(位1的总时间为2.25ms);
  对高电平时间判断分辨出位0或者位1,存放在数组中 时间变量清零;
5.判断数据码和数据反码(取反后)如果相等则退出中断。

/*******************************************************************************
* 函数名         : ReadIr()
* 函数功能		: 读取红外数值的中断函数
* 输入           : 无
* 输出         	 : 无
*******************************************************************************/

void ReadIr() interrupt 2
{
	u8 j,k;
	u16 err;
	Time=0;					 
	delay_10us(700);	//7ms
	if(IRIN==0)		   //确认是否真的接收到正确的信号
	{	 
		err=1000;     //1000*10us=10ms,超过说明接收到错误的信号
		             //当两个条件都为真是循环,如果有一个条件为假的时候跳出循环
		while((IRIN==0)&&(err>0))	//等待前面9ms的低电平过去  		
		{			
			delay_10us(1);
			err--;
		} 
		if(IRIN==1)			//如果正确等到9ms低电平
		{
			err=500;
			while((IRIN==1)&&(err>0))		 //等待4.5ms的起始高电平过去
			{
				delay_10us(1);
				err--;
			}
			for(k=0;k<4;k++)		//共有4字节数据
			{				
				for(j=0;j<8;j++)	//接收一组数据
				{
					err=60;		
					while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去
					{
						delay_10us(1);
						err--;
					}
					err=500;
					while((IRIN==1)&&(err>0))	 //计算高电平的时间长度。
					{
						delay_10us(10);	         //0.1ms
						Time++;
						err--;
						if(Time>30)
						{
							return;
						}
					}
					IrValue[k]>>=1;	 //k表示第几组数据
					if(Time>=8)	    //如果高电平出现大于565us,那么是1
					{
						IrValue[k]|=0x80;
					}
					Time=0;		//用完时间要重新赋值							
				}
			}
		}
		if(IrValue[2]!=~IrValue[3]) //数据校验
		{
			return;
		}
	}		
}

读取的红外数据存放在IrValue中,根据NEC的帧格式,第三位是数据码,即IrValue[2]。在主程序中使用串口发送到电脑上。

使用两个变量存放数据值,当新的红外数据发生变化的时候再使用串口发出去。

while(1)
	{	
		new_value=IrValue[2];
		if(new_value!=old_value)
		{
			old_value=new_value;
			SBUF =new_value;
			while (!TI);			         
			TI = 0;	
				
			SBUF ='\r';  //发完一次数据之后换行0x0D
			while (!TI);			         
			TI = 0;
			SBUF ='\n';  //0x0A
			while (!TI);			         
			TI = 0;
		}
		delay_10us(100);
	}		

在电脑的串口助手中,选择十六进制方式查看,不要使用字符(char),因为有些编码对应的字符是不能显示的,可能会显示“?”之类的。示例:

1C 0D 0A
18 0D 0A

其中,1C、18是NEC帧中的数据,0D和0A 是回车换行

四、应用

可以正确解码,那么下来就要应用了。最常用的有2种,拿空调举例

  1. 空调遥控板按下“开”,就一直运行着。
  2. 空调遥控板按一下“温度+”,温度只增加一度,不应该一直增加。

对于第一种情况,可以用这种格式:

if(IrValue[2]==0x18)
{
	task();  //按一次该按键,就一直运行task
}

对于第二种情况,可以用:

if(IrValue[2]==0x18)
{
	IrValue[2]==0x00;
	task();  //按一次该按键,运行一次task
}

无、完整代码

/**************************************************************************************
* 实验名称:红外通信实验											
* 实现现象:下载程序后,串口输出红外遥控键值数据
* 作者:CQUPTLEI
* 时间:2022/05/26																		  
***************************************************************************************/
#include "reg52.h"		
#include <string.h>
#include <stdio.h>

typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;

sbit IRIN=P3^3;  //外部中断1,接红外接收头

u8 IrValue[6];   //红外数据存放
u8 Time;


/*******************************************************************************
* 函 数 名          : delay_10us
* 函数功能		   : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay_10us(u16 i)
{
	while(i--);	
}

/*******************************************************************************
* 函数名          : IrInit()
* 函数功能		 : 初始化红外线接收
* 输入           : 无
* 输出         	: 无
*******************************************************************************/
void IrInit()
{
	IT1=1;//下降沿触发
	EX1=1;//打开中断1允许
	EA=1;	//打开总中断
	IRIN=1;//初始化端口
}

/*******************************************************************************
* 函数名          :  UsartInit()
* 函数功能		 : 初始化串口,波特率4800
* 输入           : 无
* 输出         	: 无
*******************************************************************************/
void UsartInit()
{
	SCON=0X50;			
	TMOD=0X20;			
	PCON=0X80;			
	TH1=0XF3;
	TL1=0XF3;
	ES=1;	
	//EA=1;			
	TR1=1;
}

/*******************************************************************************
* 函 数 名       : main
* 函数功能		: 主函数
* 输    入       : 无
* 输    出    	: 无
*******************************************************************************/
void main()
{	
	char old_value,new_value; //上一次红外值和本次红外值
	IrInit();
	UsartInit();
	old_value=1;
	while(1)
	{	
		new_value=IrValue[2];
		if(new_value!=old_value)
		{
			old_value=new_value;
			SBUF =new_value;
			while (!TI);			         
			TI = 0;	
					
			SBUF ='\r';  //发完一次数据之后换行0x0D
			while (!TI);			         
			TI = 0;
			SBUF ='\n';  //0x0A
			while (!TI);			         
			TI = 0;
		}
		delay_10us(100);
	}		
}


/*******************************************************************************
* 函数名         : ReadIr()
* 函数功能		   : 读取红外数值的中断函数
* 输入           : 无
* 输出         	 : 无
*******************************************************************************/

void ReadIr() interrupt 2
{
	u8 j,k;
	u16 err;
	Time=0;					 
	delay_10us(700);	//7ms
	if(IRIN==0)		//确认是否真的接收到正确的信号
	{	 
		err=1000;				//1000*10us=10ms,超过说明接收到错误的信号
		/*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时
		侯,程序死在这里*/	
		while((IRIN==0)&&(err>0))	//等待前面9ms的低电平过去  		
		{			
			delay_10us(1);
			err--;
		} 
		if(IRIN==1)			//如果正确等到9ms低电平
		{
			err=500;
			while((IRIN==1)&&(err>0))		 //等待4.5ms的起始高电平过去
			{
				delay_10us(1);
				err--;
			}
			for(k=0;k<4;k++)		//共有4组数据
			{				
				for(j=0;j<8;j++)	//接收一组数据
				{

					err=60;		
					while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去
					{
						delay_10us(1);
						err--;
					}
					err=500;
					while((IRIN==1)&&(err>0))	 //计算高电平的时间长度。
					{
						delay_10us(10);	 //0.1ms
						Time++;
						err--;
						if(Time>30)
						{
							return;
						}
					}
					IrValue[k]>>=1;	 //k表示第几组数据
					if(Time>=8)			//如果高电平出现大于565us,那么是1
					{
						IrValue[k]|=0x80;
					}
					Time=0;		//用完时间要重新赋值							
				}
			}
		}
		if(IrValue[2]!=~IrValue[3])
		{
			return; //数据和它的反码的反码不相同,退出
		}
	}		
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

红外通信的应用——PPM调制与解码(C51) 的相关文章

  • SQL Server 中时间的几种表示

    在SQL Server中 xff0c 点开数据类型 xff0c 单单是时间这一类变量都有着多重数据类型 datetimetimestampdatetimedatetime2datetimeoffset 他们的显示效果如下 xff1a spa
  • SQL Server(2019) 实验二 单表查询

    单表查询 一 实验目的二 实验内容和要求2 1 表结构修改2 1 1 xff0e 在实验三的所建立的数据库中增加Teacher表 xff0c 结构如下 xff1a 2 1 2 xff0e 在实验三的所建立的数据库中增加Teaching表 x
  • SQL Server(2019)导入excel数据

    要导入的excel文件如图所示 xff0c 600个记录 操作步骤 xff1a 1 在要导入的数据库上右键 xff0c 任务 xff0c 导入数据 2 选择数据源为excel xff0c 选择相应excel文件 xff0c 选择excel版
  • SQL Server(2019)导出excel数据

    目标 xff1a 将Grademanager数据库中的test表导出为excel test表内容 xff1a 如图 xff0c 600条记录 操作步骤 xff1a 1 在相应数据库上右键 xff0c 任务 xff0c 导出数据 2 选择数据
  • 机器视觉特征提取介绍:HOG、SIFT、SURF、ORB、LBP、HAAR

    一 概述 这里主要记录自己的一些感悟 xff0c 不是很系统 想要详细系统的理论 xff0c 请参考文末的 图像处理之特征提取 个人不是专业cv工程师 xff0c 很多细节没有深究 xff0c 描述可能不严谨 在总结物体检测算法之前先把基础
  • ROS低调复习总结

    ROS复习 一 考试时间 形式 日期二 题型三 不知道随便写四 课程知识点 难点1 1 3章课后复习题1 1 单元测试一1 2 单元测试二1 3 单元测试三 2 第二章 ROS系统架构2 1 比较Topic与Service通信2 2 关闭一
  • 了解Web前端-1 Http基本原理

    HTTP基本原理 1 HTTP协议2 HTTP与Web服务器3 浏览器中的请求和响应1xx 信息2xx 成功3xx 重定向4xx 客户端错误5xx 服务器错误 1 HTTP协议 Hyper Text Transfer Protocol xf
  • 了解Web前端2-HTML语言

    HTML语言 1 什么是HTML2 了解HTML结构4 HTML的基本标签4 1 不是标签4 2 文件开始标签 96 96 4 3文件头部标签 96 96 4 4文件标题标签 96 96 4 5元信息标签 96 96 4 6页面的主体标签
  • 了解Web前端3-CSS层叠样式表

    CSS样式层叠表 1 CSS 概述2 属性选择器2 1属性选择器2 2属性和值选择器2 3属性和值的选择器 多值 3 类和ID选择器3 1ID选择器3 2类选择器3 3为特定元素使用class 1 CSS 概述 CSS是一种标记语言 xff
  • 了解Web前端4-JavaScript动态脚本语言

    JavaScript 动态脚本语言 1 页面中直接嵌入JavaScript代码2 连接外部JavaScript文件 JavaScript 是 web 开发人员必须学习的 3 门语言中的一门 xff1a HTML 定义了网页的内容CSS 描述
  • 爬虫の简介

    爬虫简介 一 什么是爬虫二 Python爬虫架构 一 什么是爬虫 爬虫 xff1a 一段自动抓取互联网信息的程序 xff0c 从互联网上抓取对于我们有价值的信息 二 Python爬虫架构 Python 爬虫架构主要由五个部分组成 xff0c
  • 一个不错的在线作图网站

    菜鸟教程的一个在线工具 连接 xff1a https c runoob com more shapefly diagram 优点 xff1a 没有广告 xff0c 不用关注微信公众号 xff0c 不用登陆 此外 xff0c 菜鸟还提供了其他
  • ABB机器人复习

    1 工业机器人最显著的特点 xff1a 2 工业气人的5种典型的结构 xff1a 3 认识示教器 xff1a 4 ABB机器人坐标系 xff1a 5 轴运动与线性运动 xff1a 1 轴运动 xff1a 2 线性运动 xff1a 6 重定位
  • step7basic的许可无法彻底完成

    安装博途并 后 xff0c 在项目中选择设备时可能会出现 xff1a step7basic的许可无法彻底完成 因为automation license manager中 的报错 原因 xff1a win10系统的更新 xff0c 导致软件不
  • 西门子学习第一章 S7-1200基础

    第一章 1 1 S7 1200系统概述 xff08 1 xff09 PLC 运用领域 xff08 2 xff09 S7 1200外观 xff08 3 xff09 西门子系列分类 1 2博途软件1 3 S7 1200系列PLC的硬件介绍 xf
  • 可见光的波长转换为RGB值颜色,光谱波长与RGBA分量,不同波长的光转换成不同的RGB值,JavaScript版本

    JS版本的光谱波长转换RGBA颜色值的方法 xff0c 在网上没找到 xff0c 后来领导发来一个C 43 43 版本的 xff0c 我对照着改为JS版 xff0c 有需要的朋友 可以参考 xff0c 代码如下 xff1a lt html
  • Modbus TCP Server端(附超全注释)

    实验项目名称 Modbus TCP实验 一 实验目的二 实验内容三 实验环境四 设计方案五 实验结果及分析 xff08 或设计总结 xff09 六 完整代码6 1 server c6 2 respond c6 3 respond h 开发语
  • ORB特征提取和匹配

    一 步骤二 代码三 部分结果展示3 1 使用Sobel算子且方向为vertical xff0c 进行边缘检测3 2 特征点提取 xff08 部分 xff09 3 3 特征点匹配 一 步骤 Step1 xff1a 读取彩色图片 1 新建实验用
  • windows下 Gitee(码云)使用

    1 注册Gitee并新建远程仓库2 初始化本地工作空间3 Git 全局设置 4 SSH公钥绑定5 提交文件到远程仓库 本文前提 xff1a 你已经在windows安装了git xff0c 如图所示 xff0c 关于git的安装 xff0c
  • 在 VS Code 中使用 Git

    1 VS Code安装2 在VS Code中登录Github账号3 Git 安装4 Git配置5 新建远程仓库并用命令行提交6 使用VSCode提交 1 VS Code安装 到vs code官网下载合适的版本并安装 2 在VS Code中登

随机推荐

  • 图像处理与机器视觉复习

    完整资源 xff1a GIthub链接 一 填空题 图像灰度均值 方差 图像的灰度平均值是平指灰度的平均水平 平均方差是衡量一个样本波动大小的量 xff0c 对图像来说 xff0c 平均方差反应的是图像高频部分的大小 方差小 xff0c 则
  • You-get && FFmpeg

    一 引言二 you get 介绍2 1 you get 安装2 2 you get语法及参数2 3 you get运用实例 三 FFmpeg介绍3 1 FFmpeg安装3 2 you get与FFmpeg的结合使用 四 HEVC 扩展 一
  • 一文读懂 主成分分析 与 因子分析

    2023 2 20更新 xff1a 修改了一些文字错误 xff0c 优化了排版 xff0c 增加了一些拓展内容 xff0c 祝大家学业有成 xff01 xff08 期待三连 x1f601 x1f601 xff09 目录 一 主成分分析二 因
  • Ubuntu 18.04 升级 20.04

    1 更换源2 安装所有更新包3 移除Ubuntu18 04上未用的旧包4 升级 鸿蒙开发要使用Ubuntu 20 04 及以上编译源码 xff0c 故将原来学习ROS 的Ubuntu18 04升级为20 04 1 更换源 好久没用这系统了
  • Ubuntu 20.04 update 报错 Problem executing scripts APT::Update

    报错内容 xff1a appstreamcli error span class token keyword while span loading shared libraries libxapian so 22 cannot span c
  • 解决Ubuntu20.04 开机黑屏光标闪烁进不去系统

    问题描述 xff1a 我是双系统 xff0c 原Ubuntu系统是18 04的 xff0c 使用命令行升级到20 04 xff0c 我搞到晚上2 xff1a 00 xff0c tnnd学校插座断电了 xff0c 大部分是升级好了 xff0c
  • 百度发布深度学习可视化平台 Visual DL

    恩威AI 科技评论消息 xff0c 1 月 16 日 xff0c 百度 ECharts 团队发布旗下知名开源产品 ECharts 的最新 4 0 版本 xff0c 并宣布品牌升级为 百度数据可视化实验室 xff08 http vis bai
  • VS Code SSH远程连接Ubuntu

    1 ubuntu设置 安装SSH服务并获取远程访问的IP地址 在Ubuntu系统中 xff0c Ctrl 43 Alt 43 T 打开终端工具 xff0c 执行如下命令安装SSH服务 说明 xff1a 如果执行该命令失败 xff0c 提示o
  • Ubuntu 20.04 根目录磁盘扩容(很快 很简单)

    1 下载安装GParted span class token function sudo span span class token function apt get span span class token function insta
  • Ubuntu创建pycharm快捷启动方式

    普通启动方式 xff1a 下载pycharm压缩包解压进入pycharm的bin目录下终端运行 sh pycharm sh 创建快捷启动方式 xff1a 终端输入 span class token function sudo span ge
  • Neptune w800初学 Ubuntu下程序编译与烧写

    一 hb学习1 1一些基本概念1 2构建流程1 3目录说明1 4使用说明 二 Neptune w800开发版实操2 1 准备工作2 1 1 示例工程下载2 1 2 编译1 编译工具链配置2 WiFIOT环境配置3 安装编译工具hb4 编译
  • Python安装 scons、pycryptodome等各种库很慢、安装失败

    本文方法适用于 绝大部分 python扩展库的安装 xff0c win Linux逗适用 原来 xff1a pip3 span class token function install span scons 报错 修改 xff1a pip3
  • Ubuntu 20.04 下VSCode编译并烧录openHarmony源码(Neptune w800开发版)

    昨天写过一篇文章 xff0c 是在命令行编译 xff0c 使用命令行串口工具minicom烧录的 有点小麻烦 推荐大家先试用上述方法试一试 xff0c 里面要安装的依赖也在文章里面 文章链接 鸿蒙Dev Device Tool本身就是VSC
  • Neptune w800点灯(中断)工程详解

    目录 一 鸿蒙项目简介1 1 项目构建1 1 1 什么是 Ninja xff1f 1 1 2 什么是gn 1 2 项目结构1 3 启动流程 二 点灯工程详解2 1 实现代码2 2 相关配置2 2 1 项目目录下BUILD gn2 2 2 a
  • Ubuntu(Linux)上安装微信(windows应用)

    本教程适用于大部分windows应用在ubuntu上安装 xff0c 很多软件还是不支持的 xff0c 比如游戏什么的 xff0c 我暂时没有尝试 目录 1 wine简介2 安装wine3 安装问题解决4 安装微信 1 wine简介 Win
  • Keil代码一键对齐工具

    1 下载AStyle工具2 Keil中配置3 效果展示4 扩展参数4 1 只格式化当前文件4 2 格式化整个工程4 3 参数说明 1 下载AStyle工具 下载链接 下载后将其放在合适的位置 xff0c 不用安装 我放在了keil安装目录下
  • 鸿蒙设备开发——Neptune w800 网络编程——按键控制WIFI连接状态

    目录 1 梗概与基础知识2 主要依赖3 主要函数解析3 1变参宏 日志打印3 2 PrintLinkedInfo 打印连到的接AP信息3 3 SecurityTypeName 返回AP加密方式 xff08 安全类型 xff09 3 4 Fo
  • 【前端】大数据时代的图表可视化利器——Highcharts,D3和百度的Echarts

    当你开始嫌弃Excel过于简单 xff0c 当你面对python和R的可视化工具包望而却步 xff0c 那么恭喜你 xff0c Echarts或Highcharts这两种基于浏览器渲染技术的纯JS框架 xff0c 就是你的不二选择 当然 x
  • I2C通信原理

    1 概述2 I2C总线的数据传送2 1 数据位的有效性规定2 2起始和终止信号2 3 数据传送格式2 3 1字节传送与应答2 3 2总线的寻址2 3 3数据帧格式 3 传输速率 1 概述 读法 xff1a 常用 xff1a I方C 标准 x
  • 红外通信的应用——PPM调制与解码(C51)

    目录 一 引言 红外线是波长在750nm至1mm之间的电磁波 xff0c 其频率高于微波而低于可见光 xff0c 是一种人的眼眼看不到的光线 无线电波和微波已被广泛应用在长距离的无线通信中 xff0c 但由于红外线的波长较短 xff0c 对