本章概述思维导图:

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灯控制
制作不易!喜欢的小伙伴给个小赞赞!喜欢我的小伙伴点个关注!有不懂的地方和需要的资源随时问我哟!