一、项目介绍
遥控器是现代生活中必不可少的电子产品之一,目前市面上的遥控器种类繁多,应用范围广泛。而 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 < 8; i++) //解码 8 个 bit { k = 0; while (!IRIN) //等待高电平出现 { k++; if (k > 1000) return 0; //超时返回 } delay_us(650); if (IRIN) //判断 bit 的值 data |= (1 < < i); k = 0; while (IRIN) //等待低电平出现 { k++; if (k > 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 < <= 1; //移位更新掩码 } IRLED = 0; //发送结束,将红外发射管关闭 } void send_command(unsigned char code_val) //将命令码转换为 NEC 码并发送 { unsigned char nec_val = 0; if (code_val > 6) //判断是否超出范围 return; nec_val = 0x80 | (code_val < < 4) | ((~code_val) & 0x0F); //计算 NEC 码 for (int i = 0; i < 2; i++) //发送两遍,以提高成功率 { send_IR(nec_val); delay_ms(50); } } void main() { while (1) { //向电视发送命令码为 1 的指令 send_command(1); delay_ms(1000); //延时 1s } }
以上代码主要实现了将命令码转换为 NEC 码并发送的功能,可以根据需要修改指令码来控制不同的设备。
红外发射管发射的红外信号有一定的传输范围和传输角度限制,需要根据具体情况调整发射管的位置和方向。
4.3 按键检测代码
以下是支持控制发送不同控制码的代码,可以根据需要修改指令码和按键设置:
#define IRLED P1_1 //红外发射管 #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 < 8; i++) //解码 8 个 bit { k = 0; while (!IRIN) //等待高电平出现 { k++; if (k > 1000) return 0; //超时返回 } delay_us(650); if (IRIN) //判断 bit 的值 data |= (1 < < i); k = 0; while (IRIN) //等待低电平出现 { k++; if (k > 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 < <= 1; //移位更新掩码 } IRLED = 0; //发送结束,将红外发射管关闭 } void send_command(unsigned char code_val) //将命令码转换为 NEC 码并发送 { unsigned char nec_val = 0; if (code_val > 6) //判断是否超出范围 return; nec_val = 0x80 | (code_val < < 4) | ((~code_val) & 0x0F); //计算 NEC 码 for (int i = 0; i < 2; i++) //发送两遍,以提高成功率 { send_IR(nec_val); delay_ms(50); } } void main() { unsigned char data = 0; unsigned char code_val = 0; while (1) { data = read_IR(); //读取红外信号 if (data > 0) //判断是否有按键按下 { code_val = Remote6[data - 1]; //根据按键编号获取命令码 send_command(code_val); //将命令码转换为 NEC 码并发送 delay_ms(500); //延时一段时间,防止频繁发送 } } }
以上代码主要实现了支持控制发送不同控制码的功能,可以根据需要修改指令码和按键设置。当用户按下遥控器上的按键时,程序会根据按键编号获取到对应的命令码,并将其转换为 NEC 码进行发送。
审核编辑 黄宇
关键词:
-
基于51单片机设计的红外遥控器|天天亮点
本项目是基于51单片机设计支持NEC协议的红外遥控器,实现接收解码和发
-
要闻速递:基金观察|权益市场持续低迷,旗下产品同质化明显
本文共2000字阅读完约5分钟金融投资报记者刘庆华6月以来,民生加银基金
-
全球今亮点!迄今最大最全人肺细胞图谱公布
迄今最大、最全面的人类肺细胞图谱8日发表在《自然·医学》杂志上。通
-
发动机号码在哪里看的_发动机号码在哪里看-环球微速讯
1、查购车单据,一般都会有2、仪表板下有车辆识别码。3、驾驶座侧门有
-
短期内 甘肃省大部气温回升明显 焦点报道
根据最新气象观测资料,预计8日夜间到9日白天,甘南高原阴间多云,部分
-
世界通讯!装饰公司简介内容_装修公司简介怎么写
1、XX装饰工程有限公司XX装饰工程有限公司注册成立于XX年,公司注册资
-
沈晓明:将企业发展和家乡建设紧密结合 续写湘商回归互利共赢新篇章
沈晓明主持召开湘商回归企业家代表座谈会强调将企业发展和家乡建设紧密
-
老詹打到45岁退役,库里投进5000记三分,美媒列举NBA9大疯狂猜想|全球热资讯
相信在未来数个赛季的时间里,约基奇还是会继续打出更加精彩的表现,所
-
拟定调研课题34个 力解企业发展之忧 湖北联投推动主题教育落实落细 世界独家
拟定调研课题34个力解企业发展之忧湖北联投推动主题教育落实落细---湖
-
【播资讯】兰石化什么时候单招2022年开始公布成绩
1、兰石化什么时候单招最好的专业是石油化工专业。国家重点专业:炼油
-
怀孕几天有什么反应_刚怀孕几天会有什么反应 全球新动态
1、怀孕的头几天一般没有反应,但也有少数人在怀孕刚四周就出现早孕反
-
法巴农银理财揭牌!
记者获悉,第五家外商控股合资理财公司-法巴农银理财,6月8日下午于上
-
紫荆国际金融(08340)完成发行1280万股配售股份 天天热闻
紫荆国际金融(08340)发布公告,该公司于2023年6月8日完成发行1280万股
-
山东钢铁(600022):6月8日北向资金减持170.43万股
6月8日北向资金减持170 43万股山东钢铁。近5个交易日中,获北向资金减
-
热讯:武汉邓南振兴街社区开展安全生产月宣传活动
武汉邓南振兴街社区开展安全生产月宣传活动---为了更好的向居民宣传各
-
新三板创新层标准2022 新三板创新层标准
1、按照此前分层方案征求意见稿,进入创新层的三条标准,标准一为最近
-
一大波文博会配套演出来袭 南山、福田音乐节等众多文化活动开启
南方财经全媒体记者欧雪深圳报道6月7日文博会现场,一舞跳动的《满堂红
-
泰达股份:本次担保后 公司及控股子公司提供担保的余额为82.99亿元
泰达股份(SZ000652,收盘价:4 12元)6月8日晚间发布公告称,(二)本
-
安徽巢湖经开区市场监管局:营业执照“掌上办”,登记注册“不打烊”
中国质量新闻网讯为保障经营主体无障碍登记注册,进一步优化营商环境,
-
上古战魂雷克塞多少钱 上古战魂雷克赛_全球新视野
1、还行我朋友有。相信通过上古战魂雷克赛这篇文章能帮到你,在和好朋