一、项目介绍遥控器是现代生活中必不可少的电子产品之一,目前市面上的遥控器种类繁多,应用范围广泛。而 nec 红外遥控器协议则是目前应用最为广泛的一种协议之一,几乎所有的电视、空调等家用电器都支持该协议。
本项目是基于 51 单片机设计支持 nec 协议的红外遥控器,实现接收解码和发送功能。用户通过按下相应按键进行信号的发射,红外发射二极管向外发射红外信号,被控制设备通过红外接收头接收到这个信号,然后解码执行相应的操作。
二、硬件设计本项目所需的硬件器件主要包括:
(1)5stc89c52单片机
(2)红外发射管
(3)红外接收头
(4)oled显示屏
(5)按键开关
三、软件设计本项目的程序代码采用 c 语言编写,主要分为三个部分:初始化部分、接收解码部分和发送数据部分。
(1)初始化部分
初始化函数主要完成各个端口的初始化和定时器的配置,以及红外接收头和红外发射管的引脚的配置。
(2)接收解码部分
接收解码函数主要采用计数器方式对红外遥控器发送的信号进行捕获,并将捕获到的信号转换成 nec 码。然后根据 nec 码的规定,解码出用户所输入的指令,最终实现控制设备的功能。
(3)发送数据部分
发送数据函数主要将单片机中存放的指令码进行编码,并通过红外发射管发送给被控制的设备。在该函数中,需要通过计时器的方式来调节发送信号的时间和频率,以保证信号能够正确传输。
四、代码实现4.1 nec协议解码代码下面是基于 51 单片机实现 nec 协议解码的代码:
#define irin p1_0 //红外接收管 unsigned char code remote6[] = {0x06, 0x09, 0x08, 0x0a, 0x0c, 0x0d, 0x0f}; //遥控器按键对应的命令码 unsigned char read_ir() //读取红外信号 { int k = 0; unsigned char data = 0; while (irin) //等待低电平出现 { k++; if (k > 1000) return 0; //超时返回 } k = 0; while (!irin) //等待高电平出现 { k++; if (k > 1000) return 0; //超时返回 } k = 0; while (irin) //等待低电平出现 { k++; if (k > 1000) return 0; //超时返回 } for (int i = 0; i 1000) return 0; //超时返回 } delay_us(650); if (irin) //判断 bit 的值 data |= (1 < 1000) return 0; //超时返回 } } return data; //返回解码结果 } unsigned char decode_ir(unsigned char code_val) //nec 码转换为命令码 { for (int i = 0; i < 7; i++) { if (remote6[i] == code_val) return (i + 1); } return 0; } void main() { unsigned char data = 0; unsigned char code_val = 0; while (1) { data = read_ir(); //读取红外信号 if (data == 0) //判断是否读取成功 continue; code_val = decode_ir(data); //将 nec 码转换为命令码 switch (code_val) //根据命令码控制设备 { case 1: //控制设备执行命令 1 break; case 2: //控制设备执行命令 2 break; case 3: //控制设备执行命令 3 break; case 4: //控制设备执行命令 4 break; case 5: //控制设备执行命令 5 break; case 6: //控制设备执行命令 6 break; default: break; } } }以上代码主要实现了读取红外信号和将 nec 码转换为命令码的功能,并且可以根据不同的命令码控制设备执行不同的指令。
4.2 nec协议发送代码以下是基于 51 单片机实现 nec 协议发送的代码,可以根据需要修改指令码来控制不同的设备:
#define irled p1_1 //红外发射管 unsigned char code remote6[] = {0x06, 0x09, 0x08, 0x0a, 0x0c, 0x0d, 0x0f}; //遥控器按键对应的命令码 void delay_us(unsigned int us) //延时函数,单位为微秒 { while (us--) _nop_(); } void send_ir(unsigned char data) //发送红外信号 { unsigned char mask = 0x01; //bit 掩码 for (int i = 0; i < 8; i++) //发送 8 个 bit { if (data & mask) { irled = 0; delay_us(600); irled = 1; delay_us(1600); } else { irled = 0; delay_us(600); irled = 1; delay_us(600); } mask < 6) //判断是否超出范围 return; nec_val = 0x80 | (code_val < < 4) | ((~code_val) & 0x0f); //计算 nec 码 for (int i = 0; i 1000) return 0; //超时返回 } k = 0; while (!irin) //等待高电平出现 { k++; if (k > 1000) return 0; //超时返回 } k = 0; while (irin) //等待低电平出现 { k++; if (k > 1000) return 0; //超时返回 } for (int i = 0; i 1000) return 0; //超时返回 } delay_us(650); if (irin) //判断 bit 的值 data |= (1 < 1000) return 0; //超时返回 } } return data; //返回解码结果 } void delay_ms(unsigned int ms) //延时函数,单位为毫秒 { while (ms--) for (int i = 0; i < 120; i++) _nop_(); } void delay_us(unsigned int us) //延时函数,单位为微秒 { while (us--) _nop_(); } void send_ir(unsigned char data) //发送红外信号 { unsigned char mask = 0x01; //bit 掩码 for (int i = 0; i < 8; i++) //发送 8 个 bit { if (data & mask) { irled = 0; delay_us(600); irled = 1; delay_us(1600); } else { irled = 0; delay_us(600); irled = 1; delay_us(600); } mask < 6) //判断是否超出范围 return; nec_val = 0x80 | (code_val < < 4) | ((~code_val) & 0x0f); //计算 nec 码 for (int i = 0; i 0) //判断是否有按键按下 { code_val = remote6[data - 1]; //根据按键编号获取命令码 send_command(code_val); //将命令码转换为 nec 码并发送 delay_ms(500); //延时一段时间,防止频繁发送 } } }以上代码主要实现了支持控制发送不同控制码的功能,可以根据需要修改指令码和按键设置。当用户按下遥控器上的按键时,程序会根据按键编号获取到对应的命令码,并将其转换为 nec 码进行发送。
阿里首家未来酒店开业 全程机器人服务
助听器的电池的使用
中芯国际与湖北省科技投资集团公司签订合资合同
英特尔推出第10代处理器中的所有8个都使用英特尔的14纳米工艺
华天慧创科技:获得4000万元融资,打造西安“硬实力”
基于51单片机设计的红外遥控器
市委书记李强调研华虹集团旗下上海集成电路研发中心
铁路运输安全技术及应用软件开发企业思维列控发布2022第一季度报告
云存储技术是如何影响商业世界的
向从未有人到过的星球发送信号时,会发生什么呢?
详述摄像头模组激光焊锡方案的应用
腾讯启动碳中和规划,用AI与大数据助力实现0碳排放
探究Modelsim仿真--波形状态机名称显示
JDI 获救!中国投资公司Harvest Group确定增加投资到4亿美金
力压小米与魅蓝?360手机vizza用实力上位的899元新千元机之王!
TCL 98X9C量子点Pro诠释经典永不过时
为什么发送CANFD加速报文要开启发送延迟补偿(TDC)?
可靠性好的交流固体继电器
苹果在韩国要被认定剥削当地运营商,将被重罚
IGBT中的MOS结构—输入电容(上)