|
| 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 | +[ |
| 28 | +编程达人挑战赛·第1期 |
| 29 | +10w+人浏览 |
| 30 | +400人参与 |
| 31 | + |
| 32 | +](https://activity.csdn.net/writing?id=10970) |
| 33 | + |
| 34 | +本章概述思维导图: |
| 35 | + |
| 36 | + |
| 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 | + |
| 81 | + |
| 82 | +按键矩阵:用户通过按键输入控制指令(如开关、音量调节)。 |
| 83 | + |
| 84 | +编码芯片:将按键信号转换为特定编码格式(如NEC、RC5、Sony SIRC等)。 |
| 85 | + |
| 86 | +调制电路:将编码信号调制到高频载波(通常为38 kHz)上,形成红外光脉冲。 |
| 87 | + |
| 88 | +红外发光二极管(LED):将电信号转换为红外光信号并发射目前大量的使用红外发光 二极管发出的红外线波长为940nm左右。 |
| 89 | + |
| 90 | +二、接收端(红外接收头) |
| 91 | + |
| 92 | + |
| 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 | + |
| 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 | + |
| 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 | + |
| 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