51单片机入门:红外遥控

news2024/11/23 5:10:09

红外遥控系统简介

红外遥控系统是利用红外光进行通信的设备,通常由发射和接收两大部分组成,即:由红外LED将调制后的信号发出,再由专门的红外接收头进行解调输出。

红外LED:外表与普通的LED没有什么不同,发射940nm的红外光,人眼看不到。也有850nm的红外LED,可以看见微微的红光。

通讯方式单工,只能一方发送一方接受,不能反过来;异步,没有单独的时钟线,通信需要双方约定时间。

通信协议标准:NEC标准(我国常用)、RC5、SONY、REC80、SAMSWNG等,主要是欧洲和日本生产厂家所使用的编码格式。

生活中,红外LED被广泛应用,比如在电视、空调和电扇的遥控里都有找到红外LED的身影。这些设备之所以能被控制,是因为内部有与之匹配的红外接收二极管,红外接收二极管的颜色一般是黑色的,当红外接收二极管被红外光照射阻值会变小


硬件电路

1、红外发送部分

主要由如下两种电路结构所示:

对于第一个电路,只有当两个三极管开关同时打开时,红外LED才发光。其中第一个接口的38KHz为调制频率,在发送信号时需要一直给这个接口输入一个频率为38KHz的方波;第二个接口就输入我们想要传输的波形。

将两个接口互相联系起来,会发现:在高电平时,红外LED不会发光;在低电平时,红外LED以38KHz频率闪着亮。(这是为了抵抗干扰,在自然界中有很多红外光,例如太阳光,而调制的目的就是为了区分自然光与作为信号的红外光。)

对于第二个电路,没有了38KHz接口,只是一个纯粹的三极管开关(给低电平亮、给高电平不亮),在发送的时候需要程序来实现38KHz调制的功能。

2、红外接收部分

接收部分有单独的一个红外接收LED(黑色),如果直接用红外接收管,则接受到的信号就会有很多成分(自然光等),因此后面还需要进行电路操作(例如滤除自然光、放大发送的信号、滤除38KHz部分的信号,使其输出信号看上去和IN端输入信号一致)。一体化红外接收管就包含了红外接收LED和这些功能电路。

注意,需要将输出信号OUT接在外部中断上。


基本发送与接收

空闲状态:红外LED不亮,接收头输出高电平。

发送低电平:红外LED以38KHz频率闪烁发光,接收头输出低电平。

发送高电平:红外LED不亮,接收头输出高电平。

接收装置如何区分空闲状态和发送高电平?

接收装置以第一个下降沿为开始,在此之后的一段时间内其输出波形都是发送装置所发送的波形(此时红外LED不亮为高电平输出),波形结束后又一直输出高电平(此时红外LED不亮为空闲状态)。

注意,此处的高电平和低电平都不代表逻辑1或0,仅仅是指物理现象本身。


NEC编码

NEC编码是一种红外遥控协议,常用于遥控器与设备之间的通信。它是一种常用的编码格式;将遥控发送过来的信号进行一定形式的编码,转换为对应的信息。

如上所示,这是一帧完整的红外信号(注意是红外信号,即这是从发送装置来看,对应输出信号波形高低电平与之相反),其中黄色区域既不是高电平也不是低电平,而是38KHz的高频脉冲信号

可以看出,一帧完整的红外信号包括:起始位、地址码、地址反码、数据码、数据反码、结束位。

1、起始位:持续低电平(高频脉冲)9ms后持续高电平(不亮)4.5ms,表示要开始传输数据了。

2、地址码:由8位0或1表示,用于确定(选定)设备(比如家里面有很多红外设备,不同的红外设备其地址码是不同的。)其逻辑0或1表示如下:

逻辑0是由562.5us的高频脉冲和562.5us的不亮表示;逻辑1是由562.5us的高频脉冲和1687.5us的不亮表示。对于上上图,其地址码为:11110000。

3、地址反码:对地址码进行取反,因而地址反码为:00001111。地址反码是为了保证传输的准确性,一旦有一个地址反码和地址码对不上号,这这一帧数据都将作废。

4、数据码:同样由8个0或1组成,对于上上图,其数据码为:1111 1111。其包含的信息为所匹配红外设备需要执行的功能。通过8个0或1的排列组合,有256个不同的结果,也就是说红外遥控器最多有256个按键。

5、数据反码:对数据码进行取反。

6、结束位:持续高频脉冲562.5us,表示数据传输结束。

7、重复码:持续低电平9ms后持续不亮4.5ms,在持续562.5us的高频脉冲,在然后又是持续不亮。每个一帧数据的时间约是110ms。(重复码通常用于调音量时的长按)


51单片机的外部中断

以STC89C52为例,有4个外部中断(传统51单片机只有两个)。其外部中断有两种触发方式:下降沿触发和低电平触发。

其外部中断0(INT0)和外部中断1(INT1)外部中断号分别为0、2。


代码设计

Timer0.c

#include <REGX52.H>

//定时器初始化
void Timer0_Init()
{
	TMOD&=0xF0;    //设置定时器模式
	TMOD|=0x01;    //设置定时器模式
	TL0=0x18;      //设置定时器初值
	TH0=0xFC;      //设置定时器初值
	TF0=0;         //清除TF0标志
	TR0=0;         //定时器0不计时
}

//设置定时器初始值
void Timer0_SetCounter(unsigned int Value)
{
	TH0=Value/256;
	TL0=Value%256;
}

//把定时器里变化后的数据拿出来,得到时间差
unsigned int Timer0_GetCounter()
{
	return (TH0<<8)|TL0;
}

//定时器启动开关
void Timer0_Run(unsigned char Flag)
{
	TR0=Flag;     //Flag为1,开始计时;为0,停止计时
}

Int0.c

#include <REGX52.H>

//外部中断0初始化
void Int0_Init()
{
	IT0=1;
	IE0=0;
	EX0=1;
	EA=1;
	PX0=1;   //优先级设为高优先级
}

此处需要将外部中断0的中断优先级设置为高优先级,保证在同时触发多个中断时优先执行此中断,使红外信号被及时接收。

IR.c

#include <REGX52.H>
#include "Timer0.h"
#include "Int0.h"

unsigned int IR_Time;      //计时(时间差)
unsigned char IR_State;    //状态

unsigned char IR_Data[4];  //存储数据
unsigned char IR_pData;    //0~31,即一个完整的信号有32位

unsigned char IR_DataFlag;   //数据帧标志位
unsigned char IR_RepeatFlag; //连发帧标志位
unsigned char IR_Address;    //地址码
unsigned char IR_Command;    //数据码

//红外遥控初始化
void IR_Init()
{
	Timer0_Init();
	Int0_Init();
}


/**
  *功能:红外遥控获取收到数据帧标志位
  *参数:无
	*返回值:是否收到数据帧,1为收到,0为未收到
  */
unsigned char IR_GetDataFlag()
{
	if(IR_DataFlag)
	{
		IR_DataFlag=0;
		return 1;
	}
	return 0;
}

/**
  *功能:红外遥控获取收到连发帧标志位
  *参数:无
	*返回值:是否收到连发帧,1为收到,0为未收到
  */
unsigned char IR_GetRepeatFlag()
{
	if(IR_RepeatFlag)
	{
		IR_RepeatFlag=0;
		return 1;
	}
	return 0;
}

/**
  *功能:红外遥控获取收到的命令数据
  *参数:无
	*返回值:收到的命令数据
  */
unsigned char IR_GetCommand()
{
	return IR_Command;
}

/**
  *功能:红外遥控获取收到的地址数据
  *参数:无
	*返回值:收到的地址数据
  */
unsigned char IR_GetAddress()
{
	return IR_Address;
}


//外部中断0函数,下降沿触发
void Int0_Routine() interrupt 0
{
	if(IR_State==0)          //状态为0,说明是空闲状态
	{
		Timer0_SetCounter(0);     //设置定时器初始值
		Timer0_Run(1);            //开始计时
		IR_State=1;               //进入状态1,即准备接收信号
	}
	else if(IR_State==1)
	{
		IR_Time=Timer0_GetCounter();   //读取计时的时间(时间差)
		Timer0_SetCounter(0);          //定时器清0,重新计时间差
		
		//计时为13.5ms,则收到了起始位(注意,11.0592MHz下为12442)
		if(IR_Time>12442-500&&IR_Time<12442+500) //如果是起始位
		{
			IR_State=2;   //进入状态2,即开始接收数据
		}
		
		//计时为11.25ms,则收到了重复位(同样,11.0592MHz下为10368)
		else if(IR_Time>10368-500&&IR_Time<10368+500)
		{
			IR_RepeatFlag=1;    //说明这一帧已经结束
			Timer0_Run(0);      //结束计时
			IR_State=0;         //回到空闲状态
		}
		
		//接收出错
		else
		{
			IR_State=1;
		}
	}
	else if(IR_State==2)
	{
		IR_Time=Timer0_GetCounter();  //读取计时的时间(时间差)
		Timer0_SetCounter(0);         //定时器清0
		
		//计时为1120us,则收到了逻辑0(注意,11.0592MHz下为1032us)
		if(IR_Time>1032-500&&IR_Time<1032+500) 
		{
			IR_Data[IR_pData/8]&=~(0x01<<(IR_pData%8)); //数据对应位  置0
			IR_pData++;
		}
		
		//计时为2250us,则收到了逻辑1(注意,11.0592MHz下为2074us)
		else if(IR_Time>2074-500&&IR_Time<2074+500)
		{
			IR_Data[IR_pData/8]|=(0x01<<(IR_pData%8));  //数据对应位  置1
			IR_pData++;
		}
		
		//如果接受失败,这一帧作废
		else
		{
			IR_pData=0;
			IR_State=1;
		}
		
		if(IR_pData>=32)   //表示32位数据接受完毕
		{
			IR_pData=0; //重新置0
			if((IR_Data[0]==~IR_Data[1])&&(IR_Data[2]==~IR_Data[3]))
			{
				IR_Address=IR_Data[0];  //数据转移
				IR_Command=IR_Data[2];  //数据转移
				IR_DataFlag=1;
			}
			Timer0_Run(0);  //定时器停止
			IR_State=0;     //置状态为0
		}
	}
}

此代码主要通过下降沿之间的时间差来判断逻辑0、逻辑1、起始位、重复位。

对于重复位直接返回状态0即可(不需要再进入状态2中改变地址码和数据码),并且在下一次下降沿到来时在进行判断时起始位还是重复位。

对于起始位,则让其进入状态2,记录地址码与数据码。

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

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

相关文章

解锁合同管理的新路径:低代码与定制开发的完美结合

引言 合同管理在企业中扮演着至关重要的角色。无论是与供应商、客户还是合作伙伴之间的合作&#xff0c;合同都是约束双方责任和权利的关键文档。然而&#xff0c;随着业务的不断增长和全球化的发展&#xff0c;合同管理变得越来越复杂。传统的合同管理方法往往面临着诸多挑战&…

Web安全:SQL注入之时间盲注原理+步骤+实战操作

「作者简介」&#xff1a;2022年北京冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础对安全知识体系进行总结与归纳&#xff0c;著作适用于快速入门的 《网络安全自学教程》&#xff0c;内容涵盖系统安全、信息收集等…

深入 Rust 标准库,Rust标准库源代码系统分析

系列文章目录 送书第一期 《用户画像&#xff1a;平台构建与业务实践》 送书活动之抽奖工具的打造 《获取博客评论用户抽取幸运中奖者》 送书第二期 《Spring Cloud Alibaba核心技术与实战案例》 送书第三期 《深入浅出Java虚拟机》 送书第四期 《AI时代项目经理成长之道》 …

彩信JSON接口对接发送

随着通讯技术的飞速发展&#xff0c;传统的短信已经无法满足人们日益增长的沟通需求。在这样的背景下&#xff0c;群发彩信作为一种更为先进、更为丰富的信息传递方式&#xff0c;逐渐受到了企业和个人的青睐。那么&#xff0c;群发彩信应该怎么对接&#xff0c;又具体有哪些优…

开发短剧平台的7大关键步骤,轻松掌握

短剧平台的开发是当前数字娱乐领域的热门话题之一。随着在线视频消费的增长和用户对短视频内容的需求不断增加&#xff0c;开发一个成功的短剧平台成为了许多创业者和企业关注的焦点。在本文中&#xff0c;我将分享开发短剧平台的7大关键步骤&#xff0c;帮助您轻松掌握这一过程…

文件外发审核是数据防泄漏的重要手段,那该怎么落地?

企业在日常经营中&#xff0c;无可避免地会产生文件外发的需求&#xff0c;文件发送对象包括但不限于合作方、供应商、客户、公关媒体、慈善组织等等&#xff0c;不一而足。而由于外发的对象不同&#xff0c;所涉及的文件类型也多种多样&#xff1a; 商业合作合同&#xff1a;…

react实现把pc网站快捷添加到桌面快捷方式

文章目录 1. 需求2. 实现效果3. 核心逻辑4. 完整react代码 1. 需求 这种需求其实在国外一些游戏网站和推广网站中经常会用到&#xff0c;目的是为了让客户 快捷方便的保存网站到桌面 &#xff0c;网站主动尽量避免下次找不到网站地址了&#xff0c;当然精确的客户自己也可以使…

【B站 heima】小兔鲜Vue3 项目学习笔记Day04

文章目录 二级分类1.整体认识和路由配置2.面包屑导航功能实现3. 基础商品列表实现4. 定制路由滚动行为 详情页1.整体认识和路由配置2.基础数据渲染3.热榜区域实现4. 图片预览组件封装5.放大镜-滑块跟随移动左侧滑块跟随鼠标移动放大镜-大图效果 6. props适配7. SKU组件熟悉使用…

【Git】Git学习-12:关联本地仓库和远程仓库

学习视频链接&#xff1a;【GeekHour】一小时Git教程_哔哩哔哩_bilibili​编辑https://www.bilibili.com/video/BV1HM411377j/?vd_source95dda35ac10d1ae6785cc7006f365780 在github上建立仓库 根据指引将本地仓库push到github上 git remote add origin gitgithub.com:JVZO/f…

【STL专题】深入探索C++之std::string:不止于字符串【万字详解】

欢迎来到CILMY23的博客 &#x1f3c6;本篇主题为&#xff1a;深入探索C之std::string&#xff1a;不止于字符串 &#x1f3c6;个人主页&#xff1a;CILMY23-CSDN博客 &#x1f3c6;系列专栏&#xff1a;Python | C | C语言 | 数据结构与算法 | 贪心算法 | Linux &#x1f3…

一阶数字高通滤波器

本文的主要内容包含一阶高通滤波器公式的推导和数字算法的实现以及编程和仿真 1 计算公式推导 1.1.2 算法实现及仿真 利用python实现的代码如下&#xff1a; import numpy as np # from scipy.signal import butter, lfilter, freqz import matplotlib.pyplot as plt #2pifW…

网站工作原理

web发展史 1.0时代不可修改 2.0可修改&#xff0c;比如发微博 有以下问题&#xff1a; 课程2&#xff1a; 静态页面 html 动态页面 php 经过服务端的语言解释器&#xff0c;解析成html文件&#xff0c;剩下的就和静态流程一样 后面三个是web服务器&#xff0c;语言解释器&…

二、使用Django创建一个基础应用

职位管理系统 - 建模 职位名称类别工作地点职位职责职位要求发布人发布日期修改日期 安装django pip install django5.0查看django版本 python -m django --version创建项目 django-admin startproject recruitment启动服务 python manage.py runserver 0.0.0.0:8000创建…

web APIs总结(3)

1. 本地存储介绍&#xff08;重点&#xff09; 数据存储在用户浏览器中设置、读取方便、甚至页面刷新不丢失数据容量较大&#xff0c;sessionStorage和localStorage约 5M 左右 本地存储分类- localStorage 作用: 可以将数据永久存储在本地(用户的电脑), 除非手动删除&#x…

网络编程—— Http的Get请求

http: hyper text transport protocal:超文本传输协议。 http是一种基于客户端-服务器模式的协议(Client-Server)。它规定只能由客户端先发起请求给服务器&#xff0c; 服务器做出响应。 http数据传输以数据报文的形式进行&#xff0c; 客户端向服务器发起的请求叫做请求报文。…

burpsuite抓包响应报文乱码

1、响应报文中的中文信息乱码 2、解决办法 3、设置成功后重新发起请求

无线网络安全技术基础

无线网络安全技术基础 无线网络安全风险和隐患 随着无线网络技术广泛应用,其安全性越来越引起关注.无线网络的安全主要有访问控制和数据加密,访问控制保证机密数据只能由授权用户访问,而数据加密则要求发送的数据只能被授权用户所接受和使用。 无线网络在数据传输时以微波进…

七大医用耗材启动!如何用数屿医械查询医用耗材中标?

近日&#xff0c;国家医保局发布《关于加强区域协同做好2024年医药集中采购提质扩面的通知》&#xff0c;标志着我国医药集中采购进入新阶段&#xff0c;将实现更高效、更规范的采购模式。 医用耗材是指经药品监督管理部门批准使用的&#xff0c;在诊断、治疗、防护和康复等医疗…

AI代理的类型、优势及示例

AI 代理的类型、优势和示例 AI 代理是重塑商业动态的关键技术进步。了解这些代理的运作方式&#xff0c;发现它们的关键优势包括效率、可扩展性和成本效益。我们将探索代理的实例及它们在各领域的应用&#xff0c;为未来的人工智能趋势和对客户体验的影响铺平道路。 想象一支由…

基于粒子群算法优化的长短期记忆神经网络(PSO-LSTM)回归预测

粒子群算法优化的长短期记忆&#xff08;LSTM&#xff09;神经网络用于回归预测是一种结合了进化计算和深度学习的强大方法。 1. 背景介绍 LSTM神经网络 LSTM&#xff08;Long Short-Term Memory&#xff09;是一种特殊的递归神经网络&#xff08;RNN&#xff09;&#xff0c…