Skip to content

Commit d6e56b6

Browse files
Auto-update blog content
1 parent 9bdf491 commit d6e56b6

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+22873
-0
lines changed
Lines changed: 336 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,336 @@
1+
---
2+
layout: post
3+
title: "51单片机-实现红外遥控模块教程"
4+
date: 2025-09-24T13:01:21+0800
5+
description: "本章详细讲解:红外线简介、红外遥控控制系统、NEC协议简介、红外遥控硬件电路原理图分析、红外遥控软件编程设计"
6+
keywords: "51单片机-实现红外遥控模块教程"
7+
categories: ['未分类']
8+
tags: ['嵌入式硬件', '单片机', '51单片机']
9+
artid: "152032107"
10+
arturl: "https://blog.csdn.net/2401_86262955/article/details/152032107"
11+
image:
12+
path: https://api.vvhan.com/api/bing?rand=sj&artid=152032107
13+
alt: "51单片机-实现红外遥控模块教程"
14+
render_with_liquid: false
15+
featuredImage: https://bing.ee123.net/img/rand?artid=152032107
16+
featuredImagePreview: https://bing.ee123.net/img/rand?artid=152032107
17+
cover: https://bing.ee123.net/img/rand?artid=152032107
18+
image: https://bing.ee123.net/img/rand?artid=152032107
19+
img: https://bing.ee123.net/img/rand?artid=152032107
20+
---
21+
22+
23+
24+
# 51单片机-实现红外遥控模块教程
25+
26+
27+
[![](https://csdnimg.cn/release/blogv2/dist/pc/img/activeVector.png)
28+
编程达人挑战赛·第1期
29+
10w+人浏览
30+
400人参与
31+
32+
![](https://csdnimg.cn/release/blogv2/dist/pc/img/arrowright-line-White.png)](https://activity.csdn.net/writing?id=10970)
33+
34+
本章概述思维导图:
35+
36+
![](https://i-blog.csdnimg.cn/direct/88de893ebee143d28581094fc372aaa9.png)
37+
38+
## 51单片机实现红外遥控模块
39+
40+
### 红外线简介
41+
42+
可见光是人类肉眼可感知的电磁波,其波长范围约为 380-780 纳米(nm)。根据波长从长到短,可见光可细分为七种颜色,形成连续光谱:
43+
44+
                红色:620-750 nm(典型值 650 nm)
45+
46+
                橙色:590-620 nm(典型值 610 nm)
47+
48+
                黄色:570-590 nm(典型值 580 nm)
49+
50+
                绿色:495-570 nm(典型值 550 nm)
51+
52+
                青色:480-495 nm(典型值 490 nm)
53+
54+
                蓝色:450-480 nm(典型值 470 nm)
55+
56+
                紫色:380-450 nm(典型值 420 nm)
57+
58+
在自然界中比红色波长还高的为红外线,比紫色波长还短的为紫外线。红外线波长越长,能量越低;紫外线波长越短能量越高;红外线遥控就是利用波长为760nm-1500nm之间的近红外线来传送控制信号的;
59+
60+
#### 红外线的特点
61+
62+
不可见性:红外线波长范围为760 nm至1500 mm,位于可见光谱红端外侧,人眼无法  直接感知,但可通过摄像头或红外传感器检测。
63+
64+
直线传播:红外线遵循光的直线传播规律,易被障碍物遮挡,因此遥控设备需对准接收  端或通过反射实现间接控制。
65+
66+
短距离传输:典型有效距离为5-10米,受环境光干扰(如阳光、荧光灯)影响较大,    需通过调制技术提高抗干扰能力。
67+
68+
---
69+
70+
### 红外遥控系统简介
71+
72+
红外遥控是一种利用红外线进行无线通信的技术,广泛应用于家电控制(如电视、空调、音响)、智能家居设备(如灯光、窗帘)以及工业自动化领域。其核心原理是通过编码调制将控制指令转换为红外光脉冲信号,再由接收端解码还原为原始指令,实现远程控制。
73+
74+
#### 红外遥控系统的组成
75+
76+
红外遥控系统由发送端和接收端两部分组成,二者通过红外光脉冲信号交互;
77+
78+
一、发送端(遥控器)
79+
80+
![](https://i-blog.csdnimg.cn/direct/ddc5b327089c4b0eb0e54c0186f09a48.png)
81+
82+
按键矩阵:用户通过按键输入控制指令(如开关、音量调节)。
83+
84+
编码芯片:将按键信号转换为特定编码格式(如NEC、RC5、Sony SIRC等)。
85+
86+
调制电路:将编码信号调制到高频载波(通常为38 kHz)上,形成红外光脉冲。
87+
88+
红外发光二极管(LED):将电信号转换为红外光信号并发射目前大量的使用红外发光   二极管发出的红外线波长为940nm左右。
89+
90+
二、接收端(红外接收头)
91+
92+
![](https://i-blog.csdnimg.cn/direct/6da8e6f15f0c43a885b30a72fd55d4be.png)
93+
94+
红外接收头:包含光电二极管和放大电路,用于接收并放大红外光信号。
95+
96+
解调电路:从高频载波中提取原始编码信号。
97+
98+
解码芯片:将编码信号还原为控制指令,驱动设备执行相应操作。
99+
100+
红外接收头引脚定义
101+
102+
| | | |
103+
| --- | --- | --- |
104+
| ****引脚**** | 名称 | 功能说明 |
105+
| ****1**** | OUT | 数字信号输出(TTL电平,低电平有效,即检测到载波时输出低电平,无载波时输出高电平) |
106+
| ****2**** | GND | 电源地(需与电路板地线连接) |
107+
| ****3**** | VCC | 电源正极(通常接3.3V或5V) |
108+
109+
---
110+
111+
### 红外遥控核心原理
112+
113+
红外遥控的关键在于通过编码和调制技术实现信号的可靠传输:
114+
115+
编码:将指令转换为数字信号
116+
117+
编码芯片将按键信号转换为特定格式的二进制脉冲序列,在这次开发中我们使用NEC 编码协议;
118+
119+
载波频率:采用38kHz的红外线载波进行通信,通过调制技术将信号加载到高频载波上, 增强抗干扰能力。
120+
121+
编码方式:使用脉冲宽度调制(PWM),通过固定脉冲宽度(560μs高电平)和不同低           电平时长区分逻辑0与逻辑1;
122+
123+
---
124+
125+
### NEC协议简介
126+
127+
在本次红外遥控实验中我们采用得是NEC协议,NEC协议是一种广泛应用于红外遥控通信的协议,由日本电气公司(NEC)开发,具有结构简单、抗干扰能力强、成本低等优点,被广泛应用于家电设备(如电视、空调、音响等)的遥控控制中。
128+
129+
#### NEC码的位定义
130+
131+
一个脉冲对应560us的连续载波,一个逻辑1传输需要2.25.ms(560us脉冲+1680us低电平),一个逻辑0传输需要1.125ms(560us脉冲+560us低电平)。
132+
133+
        发送逻辑0:560μs高电平(脉冲载波) + 560μs低电平(无载波)(总时长1.125ms)
134+
135+
        发送逻辑1:560μs高电平 (脉冲载波)+ 1680μs低电平(无载波)(总时长2.25ms)
136+
137+
红外接收头处理:通过解调器和输出缓冲区将解调后的数据反转;红外接收头在接收到脉冲的时候为低电平,在没有脉冲的时候为高电平。如下图所示,所有我们可以通过计算高电平时间判断接收到的数据是0还是1;
138+
139+
![](https://i-blog.csdnimg.cn/direct/0c31487b39334b5cbc48c2f6e954c2c9.png)
140+
141+
一帧完整的NEC信号包含32位数据,分为五个部分:引导码、地址码、地址反码、控制命令码、控制命令反码;
142+
143+
        引导码:9ms低电平 + 4.5ms高电平
144+
145+
        地址码:8位,标识被控设备(如电视、空调)。
146+
147+
        地址反码:8位,地址码的按位取反,用于校验。
148+
149+
        控制命令码:8位,表示具体操作(如开关、音量调节)。
150+
151+
        控制命令反码:8位,命令码的按位取反,用于校验。
152+
153+
红外接收视角图
154+
155+
![](https://i-blog.csdnimg.cn/direct/030c323a37c1438d850b33b295807dc9.png)
156+
157+
NEC码还规定了连发码(由9ms低电平+2.5ms高电平+0.56ms低电平+97.94ms高电平组成),如果在一帧数据发送完毕之后,红外遥控器按键仍然没有放开,则发送连发码,可以通过统计连发码的次数来标记按键按下的次数;
158+
159+
#### NEC协议的工作流程
160+
161+
1、信号发射:
162+
163+
        用户按下遥控器按键,编码芯片生成包含引导码、地址码、命令码等信息的32位数据帧。
164+
165+
        数据通过38kHz载波调制后,由红外LED发射为光脉冲信号。
166+
167+
2、信号接收:
168+
169+
        接收端(如电视红外接收头)检测光脉冲,转换为电信号并放大。
170+
171+
        解调电路提取38kHz载波中的原始编码信号。
172+
173+
        解调器和输出缓存器将信号转换为反向的数字电平输出
174+
175+
        解码芯片解析数据帧,校验地址码和命令码的反码是否匹配。
176+
177+
        若校验通过,执行对应操作(如调高音量);若失败,则丢弃数据。
178+
179+
---
180+
181+
### 红外遥控硬件电路原理图分析
182+
183+
![](https://i-blog.csdnimg.cn/direct/8aeedac57de0429982f4ffdfb19ce59e.png)
184+
185+
红外接收头硬件电路原理分析
186+
187+
1脚数字信号接收脚与MCU芯片的P32管脚进行连接,因为红外接收头在默认时没有脉冲信号时为高电平,所以在设计电路时要添加上拉电阻,但由于P32在最小系统部分已添加上拉电阻所以无需再次添加上拉电阻;
188+
189+
2脚电源地脚与电路板地线连接;
190+
191+
3脚电源正极脚与电源正极连接;
192+
193+
---
194+
195+
### 红外遥控软件编程设计
196+
197+
本章做的实验任务为:使用红外遥控器控制LED灯的开关,并在数码管中显示出控制指令
198+
199+
实现步骤:
200+
201+
第一步为:因为不知道什么时候按下红外遥控器按键,所以应设置为外部中断模式。每次按下时第一个数据引导码的低电平阶段;所以设置为下降沿触发;
202+
203+
代码示例:
204+
205+
```
206+
sbit IR_dat=P3^2;
207+
void IR_EXIN(void) //红外遥控初始化外部中断配置函数
208+
{
209+
//步骤1:配置中断源触发模式:下降沿
210+
IT0=1;
211+
//步骤2:外部中断允许位开启
212+
EX0=1;
213+
//步骤3:开启总中断
214+
EA=1;
215+
}
216+
```
217+
218+
第二步为:编写中断服务函数实现接收红外遥控器发送的指令(引导码、地址吗、地址反码、控制码、控制反码);
219+
220+
代码示例:
221+
222+
```
223+
void IR_ISR(void) interrupt 0 //红外遥控中断服务函数
224+
{
225+
u16 time_cnt=0;
226+
u8 i=0,j=0;
227+
u8 IR_H_time=0;
228+
if(IR_dat==0) //引导码
229+
{
230+
time_cnt=1000;
231+
while((!IR_dat) && time_cnt)//判断是否为引导码的低电平阶段
232+
{
233+
time_cnt--;
234+
Delay_10us(1); //延时10微秒
235+
if(time_cnt ==0 )
236+
{
237+
return ; //等待10毫秒未发生转变,退出函数。
238+
}
239+
}
240+
if(IR_dat) //判断是否为引导吗的高电平阶段
241+
{
242+
time_cnt=500;
243+
while(IR_dat && time_cnt)
244+
{
245+
time_cnt--;
246+
Delay_10us(1); //延时10微秒
247+
if(time_cnt==0)
248+
{
249+
return ; //等待5毫秒未发生转变,退出函数。
250+
}
251+
}
252+
for(i=0;i<4;i++) //一共四字节32位数据(地址码、地址反码、控制码、控制反码)
253+
{
254+
for(j=0;j<8;j++) //每个字节数据8位
255+
{
256+
time_cnt=60;
257+
while((IR_dat==0) && time_cnt) //不管是逻辑0还是逻辑1都有一个560微秒的低电平阶段,等待低电平0.6毫秒阶段,没有就结束
258+
{
259+
Delay_10us(1); //延时10微秒
260+
time_cnt--;
261+
if(time_cnt == 0)
262+
{
263+
return;
264+
}
265+
}
266+
time_cnt=20;
267+
while(IR_dat)
268+
{
269+
Delay_10us(10); //延时100微秒
270+
time_cnt--;
271+
IR_H_time++;
272+
if(time_cnt==0)
273+
{
274+
return;
275+
}
276+
}
277+
IR_data[i]>>=1;
278+
if(IR_H_time>8) //高电平阶段大于800微秒,就判定为发生逻辑1
279+
{
280+
IR_data[i]|=0x80;
281+
}
282+
IR_H_time=0; //重新清零,计算
283+
}
284+
}
285+
}
286+
if(IR_data[2] != ~IR_data[3]) //判断校验控制码与控制反码是否相同
287+
{
288+
for(i=0;i<4;i++)
289+
{
290+
IR_data[i]=0;
291+
}
292+
return;
293+
}
294+
}
295+
}
296+
```
297+
298+
代码讲解:
299+
300+
按照NEC信号时序图来逐步判断,首先判断引导码的低电平阶段,如超时就自动结束,检测到后判断引导码的高电平阶段,如超时就自动结束;通过后开始接收32位数据(地址码、地址反码、控制码、控制反码),不管是发送逻辑0还是逻辑1前面都有一个560微秒的低电平;判断完成后开始根据高电平时间区分是发送数据0还是数据1;并将数据放入到缓冲区数组里;
301+
302+
第三步:主函数整合
303+
304+
```
305+
int main()
306+
{
307+
u8 IR_buffer[3];
308+
IR_EXIN(); //红外遥控外部中断配置函数
309+
while(1)
310+
{
311+
IR_buffer[0]=Display[IR_data[2]/16];
312+
IR_buffer[1]=Display[IR_data[2]%16];
313+
IR_buffer[2]=0x76;
314+
DIGITALTUBE_EEPROM_Display2(IR_buffer,6);
315+
if(IR_data[2]==0x0c) //按键1按下开灯
316+
{
317+
LED_1=0;
318+
}
319+
else if(IR_data[2]==0x18) //按键2按下关灯
320+
{
321+
LED_1=1;
322+
}
323+
}
324+
}
325+
```
326+
327+
红外遥控控制展示效果:
328+
329+
实现红外遥控LED灯控制
330+
331+
---
332+
333+
制作不易!喜欢的小伙伴给个小赞赞!喜欢我的小伙伴点个关注!有不懂的地方和需要的资源随时问我哟!
334+
335+
336+

0 commit comments

Comments
 (0)