遥控器是现代生活中必不可少的电子产品之一,目前市面上的遥控器种类繁多,应用范围广泛。而 NEC 红外遥控器协议则是目前应用最为广泛的一种协议之一,几乎所有的电视、空调等家用电器都支持该协议。
本项目是基于 51 单片机设计支持 NEC 协议的红外遥控器,实现接收解码和发送功能。用户通过按下相应按键进行信号的发射,红外发射二极管向外发射红外信号,被控制设备通过红外接收头接收到这个信号,然后解码执行相应的操作。
本项目所需的硬件器件主要包括:
(1)5STC89C52单片机
(2)红外发射管
(3)红外接收头
(4)OLED显示屏
(5)按键开关
本项目的程序代码采用 C 语言编写,主要分为三个部分:初始化部分、接收解码部分和发送数据部分。
(1)初始化部分
初始化函数主要完成各个端口的初始化和定时器的配置,以及红外接收头和红外发射管的引脚的配置。
(2)接收解码部分
接收解码函数主要采用计数器方式对红外遥控器发送的信号进行捕获,并将捕获到的信号转换成 NEC 码。然后根据 NEC 码的规定,解码出用户所输入的指令,最终实现控制设备的功能。
(3)发送数据部分
发送数据函数主要将单片机中存放的指令码进行编码,并通过红外发射管发送给被控制的设备。在该函数中,需要通过计时器的方式来调节发送信号的时间和频率,以保证信号能够正确传输。
下面是基于 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