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

2023-10-10 05:28
文章标签 单片机 18 遥控 红外线

本文主要是介绍【单片机】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协议讲解

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;}}			
}

五、代码的移植

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还可以工作。

这篇关于【单片机】18-红外线遥控的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/178272

相关文章

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

单片机毕业设计基于单片机的智能门禁系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍程序代码部分参考 设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订

react笔记 8-18 事件 方法 定义方法 获取/改变数据 传值

1、定义方法并绑定 class News extends React.Component {constructor(props) {super(props)this.state = {msg:'home组件'}}run(){alert("我是一个run") //方法写在类中}render() {return (<div><h2>{this.state.msg}</h2><button onCli

基于stm32的河流检测系统-单片机毕业设计

文章目录 前言资料获取设计介绍功能介绍具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机设计精品

VB和51单片机串口通信讲解(只针对VB部分)

标记:该篇文章全部搬自如下网址:http://www.crystalradio.cn/thread-321839-1-1.html,谢谢啦            里面关于中文接收的部分,大家可以好好学习下,题主也在研究中................... Commport;设置或返回串口号。 SettingS:以字符串的形式设置或返回串口通信参数。 Portopen:设置或返回串口

MCU5.51单片机的最小系统

1.最小系统的组成部分 晶振电路(时钟),复位电路,电源电路(控制电压,保持稳定),下载电路(外加的,用于烧录程序) 烧录: 通过下载电路,把程序下载到单片机中用于运行 2.晶振电路 电路图: 是晶振 是电容 为了防止晶振起振时产生影响,因此加电容 3.复位电路 电路图: 按按钮RSTK1(保持一段时间的高电平)即可实现STC芯片的复位 4.电源电路 电路图:

单片机XTAL引脚引出的晶振分析

51单片机的18,19脚XTAL1,XTAL2用来提供外部振荡源给片内的时钟电路。 XTAL1和XTAL2引脚,该单片机可以使用外部时钟也可以使用内部时钟。 当使用内部时钟时,此二引线端用于外接石英晶体和微调电容; 当使用外部时钟时,用于接外部时钟信号,NMOS接XTAL2,CMOS接XTAL1。 原理: XTAL1和XTAL2分别是一个反相器的输入和输出。NMOS的反相器是

Day18_0.1基础学习MATLAB学习小技巧总结(18)——MATLAB绘图篇(1)

利用空闲时间把碎片化的MATLAB知识重新系统的学习一遍,为了在这个过程中加深印象,也为了能够有所足迹,我会把自己的学习总结发在专栏中,以便学习交流。 参考书目:《MATLAB基础教程 (第三版) (薛山)》 之前的章节都是基础的数据运算用法,对于功课来说更加重要的内容是建模、绘图、观察数据趋势,接下来我会结合自己的使用经验,来为大家分享绘图、建模使用的小技巧。 二维图形绘制 在本章开

18. 4 Sum

题目: 解答: 与之前的三数之和的解法类似,也是先排序,然后不断剔除不可能的条件,最后两个参数,通过两头求和计算得出。 代码: class Solution {public:vector<vector<int>> fourSum(vector<int>& nums, int target) {vector<vector<int>> result;int len = nums.size

系统架构师考试学习笔记第三篇——架构设计高级知识(18)面向服务架构设计理论与实践

本章考点:         第18课时主要学习面向服务架构设计理论与实践。根据考试大纲,本课时知识点会涉及单选题型(约占2~5分)和案例题(25分),本课时内容偏重于方法的掌握和应用,根据以往全国计算机技术与软件专业技术资格(水平)考试的出题规律,概念知识的考查内容多数来源于实际应用,还需要灵活运用相关知识点。         本课时知识架构如图18.1所示。 一、SOA的相关概念 (