51单片机-实现红外遥控模块教程

本章概述思维导图:

51单片机实现红外遥控模块

红外线简介

可见光是人类肉眼可感知的电磁波,其波长范围约为 380-780 纳米(nm)。根据波长从长到短,可见光可细分为七种颜色,形成连续光谱:

红色:620-750 nm(典型值 650 nm)

橙色:590-620 nm(典型值 610 nm)

黄色:570-590 nm(典型值 580 nm)

绿色:495-570 nm(典型值 550 nm)

青色:480-495 nm(典型值 490 nm)

蓝色:450-480 nm(典型值 470 nm)

紫色:380-450 nm(典型值 420 nm)

在自然界中比红色波长还高的为红外线,比紫色波长还短的为紫外线。红外线波长越长,能量越低;紫外线波长越短能量越高;红外线遥控就是利用波长为760nm-1500nm之间的近红外线来传送控制信号的;

红外线的特点

不可见性:红外线波长范围为760 nm至1500 mm,位于可见光谱红端外侧,人眼无法 直接感知,但可通过摄像头或红外传感器检测。

直线传播:红外线遵循光的直线传播规律,易被障碍物遮挡,因此遥控设备需对准接收 端或通过反射实现间接控制。

短距离传输:典型有效距离为5-10米,受环境光干扰(如阳光、荧光灯)影响较大, 需通过调制技术提高抗干扰能力。


红外遥控系统简介

红外遥控是一种利用红外线进行无线通信的技术,广泛应用于家电控制(如电视、空调、音响)、智能家居设备(如灯光、窗帘)以及工业自动化领域。其核心原理是通过编码调制将控制指令转换为红外光脉冲信号,再由接收端解码还原为原始指令,实现远程控制。

红外遥控系统的组成

红外遥控系统由发送端和接收端两部分组成,二者通过红外光脉冲信号交互;

一、发送端(遥控器)

按键矩阵:用户通过按键输入控制指令(如开关、音量调节)。

编码芯片:将按键信号转换为特定编码格式(如NEC、RC5、Sony SIRC等)。

调制电路:将编码信号调制到高频载波(通常为38 kHz)上,形成红外光脉冲。

红外发光二极管(LED):将电信号转换为红外光信号并发射目前大量的使用红外发光 二极管发出的红外线波长为940nm左右。

二、接收端(红外接收头)

红外接收头:包含光电二极管和放大电路,用于接收并放大红外光信号。

解调电路:从高频载波中提取原始编码信号。

解码芯片:将编码信号还原为控制指令,驱动设备执行相应操作。

红外接收头引脚定义

|------------|-----|--------------------------------------------|
| 引脚 | 名称 | 功能说明 |
| 1 | OUT | 数字信号输出(TTL电平,低电平有效,即检测到载波时输出低电平,无载波时输出高电平) |
| 2 | GND | 电源地(需与电路板地线连接) |
| 3 | VCC | 电源正极(通常接3.3V或5V) |


红外遥控核心原理

红外遥控的关键在于通过编码和调制技术实现信号的可靠传输:

编码:将指令转换为数字信号

编码芯片将按键信号转换为特定格式的二进制脉冲序列,在这次开发中我们使用NEC 编码协议;

载波频率:采用38kHz的红外线载波进行通信,通过调制技术将信号加载到高频载波上, 增强抗干扰能力。

编码方式:使用脉冲宽度调制(PWM),通过固定脉冲宽度(560μs高电平)和不同低 电平时长区分逻辑0与逻辑1;


NEC协议简介

在本次红外遥控实验中我们采用得是NEC协议,NEC协议是一种广泛应用于红外遥控通信的协议,由日本电气公司(NEC)开发,具有结构简单、抗干扰能力强、成本低等优点,被广泛应用于家电设备(如电视、空调、音响等)的遥控控制中。

NEC码的位定义

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

发送逻辑0:560μs高电平(脉冲载波) + 560μs低电平(无载波)(总时长1.125ms)

发送逻辑1:560μs高电平 (脉冲载波)+ 1680μs低电平(无载波)(总时长2.25ms)

红外接收头处理:通过解调器和输出缓冲区将解调后的数据反转;红外接收头在接收到脉冲的时候为低电平,在没有脉冲的时候为高电平。如下图所示,所有我们可以通过计算高电平时间判断接收到的数据是0还是1;

一帧完整的NEC信号包含32位数据,分为五个部分:引导码、地址码、地址反码、控制命令码、控制命令反码;

引导码:9ms低电平 + 4.5ms高电平

地址码:8位,标识被控设备(如电视、空调)。

地址反码:8位,地址码的按位取反,用于校验。

控制命令码:8位,表示具体操作(如开关、音量调节)。

控制命令反码:8位,命令码的按位取反,用于校验。

红外接收视角图

NEC码还规定了连发码(由9ms低电平+2.5ms高电平+0.56ms低电平+97.94ms高电平组成),如果在一帧数据发送完毕之后,红外遥控器按键仍然没有放开,则发送连发码,可以通过统计连发码的次数来标记按键按下的次数;

NEC协议的工作流程

1、信号发射:

用户按下遥控器按键,编码芯片生成包含引导码、地址码、命令码等信息的32位数据帧。

数据通过38kHz载波调制后,由红外LED发射为光脉冲信号。

2、信号接收:

接收端(如电视红外接收头)检测光脉冲,转换为电信号并放大。

解调电路提取38kHz载波中的原始编码信号。

解调器和输出缓存器将信号转换为反向的数字电平输出

解码芯片解析数据帧,校验地址码和命令码的反码是否匹配。

若校验通过,执行对应操作(如调高音量);若失败,则丢弃数据。


红外遥控硬件电路原理图分析

红外接收头硬件电路原理分析

1脚数字信号接收脚与MCU芯片的P32管脚进行连接,因为红外接收头在默认时没有脉冲信号时为高电平,所以在设计电路时要添加上拉电阻,但由于P32在最小系统部分已添加上拉电阻所以无需再次添加上拉电阻;

2脚电源地脚与电路板地线连接;

3脚电源正极脚与电源正极连接;


红外遥控软件编程设计

本章做的实验任务为:使用红外遥控器控制LED灯的开关,并在数码管中显示出控制指令

实现步骤:

第一步为:因为不知道什么时候按下红外遥控器按键,所以应设置为外部中断模式。每次按下时第一个数据引导码的低电平阶段;所以设置为下降沿触发;

代码示例:

cpp 复制代码
sbit IR_dat=P3^2;
void IR_EXIN(void)					//红外遥控初始化外部中断配置函数
{
	//步骤1:配置中断源触发模式:下降沿
	IT0=1;
	//步骤2:外部中断允许位开启
	EX0=1;
	//步骤3:开启总中断
	EA=1;
}

第二步为:编写中断服务函数实现接收红外遥控器发送的指令(引导码、地址吗、地址反码、控制码、控制反码);

代码示例:

cpp 复制代码
void IR_ISR(void) interrupt 0		//红外遥控中断服务函数
{
	u16 time_cnt=0;
	u8 i=0,j=0;
	u8 IR_H_time=0;
	if(IR_dat==0)					//引导码
	{
		time_cnt=1000;
		while((!IR_dat) && time_cnt)//判断是否为引导码的低电平阶段
		{
			time_cnt--;
			Delay_10us(1);			//延时10微秒
			if(time_cnt ==0 )
			{
				return ;			//等待10毫秒未发生转变,退出函数。
			}
		}
		if(IR_dat)				    //判断是否为引导吗的高电平阶段
		{
			time_cnt=500;
			while(IR_dat && time_cnt)
			{
				time_cnt--;
				Delay_10us(1);		//延时10微秒
				if(time_cnt==0)
				{
					return ;		//等待5毫秒未发生转变,退出函数。 
				}
			}
			for(i=0;i<4;i++)	  					//一共四字节32位数据(地址码、地址反码、控制码、控制反码)
			{
				for(j=0;j<8;j++)					//每个字节数据8位
				{
					time_cnt=60;
					while((IR_dat==0) && time_cnt)	//不管是逻辑0还是逻辑1都有一个560微秒的低电平阶段,等待低电平0.6毫秒阶段,没有就结束
					{
						Delay_10us(1);				//延时10微秒
						time_cnt--;
						if(time_cnt == 0)
						{
							return;
						}
					}
					time_cnt=20;
					while(IR_dat)
					{
						Delay_10us(10);				//延时100微秒
						time_cnt--;
						IR_H_time++;
						if(time_cnt==0)
						{
							return;
						}
					}
					IR_data[i]>>=1;
					if(IR_H_time>8)					//高电平阶段大于800微秒,就判定为发生逻辑1
					{
						IR_data[i]|=0x80;
					}
					IR_H_time=0;					//重新清零,计算					
				}
			}		
		}
		if(IR_data[2] != ~IR_data[3])				//判断校验控制码与控制反码是否相同
		{
			for(i=0;i<4;i++)
			{
				IR_data[i]=0;
			}
			return;
		}
	}
}

代码讲解:

按照NEC信号时序图来逐步判断,首先判断引导码的低电平阶段,如超时就自动结束,检测到后判断引导码的高电平阶段,如超时就自动结束;通过后开始接收32位数据(地址码、地址反码、控制码、控制反码),不管是发送逻辑0还是逻辑1前面都有一个560微秒的低电平;判断完成后开始根据高电平时间区分是发送数据0还是数据1;并将数据放入到缓冲区数组里;

第三步:主函数整合

cpp 复制代码
int main()
{
	u8 IR_buffer[3];
	IR_EXIN();						//红外遥控外部中断配置函数
	while(1)
	{   
		IR_buffer[0]=Display[IR_data[2]/16];
		IR_buffer[1]=Display[IR_data[2]%16];
		IR_buffer[2]=0x76;
		DIGITALTUBE_EEPROM_Display2(IR_buffer,6);
		if(IR_data[2]==0x0c) 		//按键1按下开灯
		{
			LED_1=0;	
		}
		else if(IR_data[2]==0x18)   //按键2按下关灯
		{
			LED_1=1;	
		}			
	}
}	 

红外遥控控制展示效果:

实现红外遥控LED灯控制


制作不易!喜欢的小伙伴给个小赞赞!喜欢我的小伙伴点个关注!有不懂的地方和需要的资源随时问我哟!

相关推荐
辛集电子3 小时前
【STM32】位带操作
stm32·单片机·嵌入式硬件
wei-dong-183797540083 小时前
嵌入式硬件工程师每日提问
嵌入式硬件·电源拓扑结构
MOS管-冠华伟业4 小时前
微硕WSF4012 N+P双沟MOS管,驱动汽车智能座椅“无感”升降气泵
单片机·嵌入式硬件
沐欣工作室_lvyiyi4 小时前
基于单片机的汽车防碰撞刹车系统(论文+源码)
单片机·嵌入式硬件·stm32单片机·汽车·毕业设计
点灯小铭4 小时前
基于51单片机宠物喂食系统设计
单片机·mongodb·毕业设计·51单片机·课程设计·宠物
机器视觉知识推荐、就业指导4 小时前
STM32 外设驱动模块:声音传感器模块
stm32·单片机·嵌入式硬件
亿道电子Emdoor5 小时前
【ARM】MDK-Functions界面设置
stm32·单片机·嵌入式硬件
学不动CV了5 小时前
ARM单片机中断及中断优先级管理详解
c语言·arm开发·stm32·单片机·嵌入式硬件·51单片机
Topplyz6 小时前
最近两个电路调试的经历与总结(二)
嵌入式硬件·硬件设计·运放