HRTOS 应用示例:NEC 红外遥控器与 4 位数码管显示,实现多任务协作
为了展示 HRTOS 外设驱动与多任务调度机制的结合应用,本次提供一个 NEC 红外遥控器与 4 位数码管显示示例。
本示例采用 8051 单片机,通过红外接收模块获取 NEC 遥控器发送的数据,完成协议解码后,将接收到的按键编码转换为十进制数值,并通过 4 位数码管实时显示。
整个应用采用 HRTOS 多任务结构,将红外数据读取、数码管显示和红外信号接收分别组织,实现不同功能之间的协作。
一、示例功能
本示例主要实现以下功能:
-
初始化 NEC 红外接收模块。
-
接收红外遥控器发送的数据。
-
完成 NEC 协议解码及数据校验。
-
获取有效的红外遥控器按键编码。
-
将按键编码转换为十进制数值。
-
使用 4 位数码管显示按键值。
例如,使用 NEC 红外遥控器按下不同按键,数码管显示对应的命令编码:
| 红外命令码 | 十进制数值 | 数码管显示 |
|---|---|---|
| 0x45 | 69 | 0069 |
| 0x46 | 70 | 0070 |
| 0x47 | 71 | 0071 |
数码管显示的是 NEC 命令码对应的十进制数值,而不是十六进制格式。
二、硬件组成
本示例主要使用以下硬件:
-
8051 系列单片机。
-
NEC 红外遥控器。
-
红外接收模块。
-
4 位数码管显示模块。
红外接收模块负责接收遥控器发送的红外信号,并将解调后的数字信号输出至单片机外部中断输入端。
4 位数码管用于显示当前接收到的按键编码。
三、软件架构设计
本示例采用 HRTOS 多任务设计,将整个应用划分为三个任务。
<pre> HRTOS | +----------+----------+ | | | v v v 红外接收 红外读取 数码管显示 任务 任务 任务 | | | v v v NEC数据 按键获取 数值转换 采集 与校验 动态显示 | | | +----------+----------+ | 共享按键数据 </pre>
三个任务的主要职责:
| 任务 | 优先级 | 主要功能 |
|---|---|---|
| 红外接收任务 | 9 | 接收 NEC 红外数据 |
| 红外读取任务 | 3 | 获取按键值并保存 |
| 数码管显示任务 | 3 | 显示当前按键编码 |
其中,红外接收任务负责底层信号采集,红外读取任务负责获取解码后的有效按键,显示任务负责数码管刷新。
这种设计将硬件信号接收、协议处理和应用显示分开,降低了不同功能之间的耦合。
四、红外数据读取任务
红外数据读取任务负责调用红外驱动接口,获取有效的遥控器按键编码。
核心代码:
void task_ir_read(void)
{
unsigned char key;
while(1)
{
if(drv_ir_get_key(&key))
{
ir_key_value = key;
ir_key_valid = 1;
os_delay(100);
}
os_delay(100);
}
}
这里使用:
drv_ir_get_key(&key)
获取红外遥控器按键。
驱动接口内部完成 NEC 数据解码、地址码校验和命令码校验。
当获取到有效按键后,将按键编码保存至 ir_key_value,并设置 ir_key_valid 标志。
应用任务不需要直接处理红外信号时序,只需要调用统一的驱动接口即可。
五、数码管显示任务
数码管显示任务负责读取红外读取任务保存的按键值,并将其转换为十进制数值。
核心代码:
void task_ir_display(void)
{
unsigned char key;
unsigned int value;
while(1)
{
if(ir_key_valid)
{
key = ir_key_value;
}
else
{
key = 0;
}
value = key;
/* 千位 */
drv_seg_display(0, value / 1000);
os_delay_ms(2);
/* 百位 */
drv_seg_display(1, value / 100 % 10);
os_delay_ms(2);
/* 十位 */
drv_seg_display(2, value / 10 % 10);
os_delay_ms(2);
/* 个位 */
drv_seg_display(3, value % 10);
os_delay_ms(2);
}
}
这里采用动态扫描方式驱动 4 位数码管。
通过分别控制四个数码管位选,并使用短时间延时,实现数字显示。
例如,当接收到 0x45 时:
value = 0x45;
转换为十进制后:
69
最终显示:
0069
显示任务独立运行,不需要等待红外遥控器发送数据,因此能够持续刷新数码管。
六、HRTOS 应用程序入口
在 hrtos_main() 中完成硬件初始化和任务创建。
核心代码:
void hrtos_main(void)
{
/* 初始化红外接收模块 */
drv_ir_remote_init();
/* 初始化 4 位数码管 */
drv_seg_init();
ir_key_valid = 0;
ir_key_value = 0;
/* 创建红外数据读取任务 */
os_task_create(
task_ir_read,
2,
3,
6
);
/* 创建数码管显示任务 */
os_task_create(
task_ir_display,
3,
3,
4
);
/* 创建红外接收任务 */
os_task_create(
drv_ir_receive_isr,
0,
9,
0
);
}
这里创建了三个任务。
其中红外接收任务使用较高优先级,负责红外信号采集;红外读取任务和数码管显示任务分别负责数据获取和显示处理。
通过 HRTOS 任务调度机制,不同功能可以按照各自的执行逻辑独立运行。
七、示例的应用价值
这个示例虽然硬件组成比较简单,但包含了一个完整的嵌入式应用开发流程:
-
外部中断接收硬件信号。
-
红外 NEC 协议数据解码。
-
驱动接口与应用程序分离。
-
多任务之间共享数据。
-
数码管动态扫描显示。
-
不同任务之间的协作运行。
在此基础上,还可以进一步扩展:
-
增加红外遥控器控制数码管显示内容。
-
增加按键控制,实现参数调整。
-
增加温湿度传感器,实现红外遥控参数设置。
-
增加 LCD 显示,实现更丰富的人机交互。
-
增加其他外设任务,构建完整的嵌入式控制系统。
八、总结
本示例展示了 HRTOS 在 8051 单片机上的多任务应用方式。
通过红外接收、数据读取和数码管显示三个任务的协作,实现了 NEC 红外遥控器按键接收与数码管显示功能。
从这个简单示例可以看到,HRTOS 不仅能够管理多个独立任务,还能够将外设驱动、协议处理和应用逻辑组织成相对独立的软件模块。
随着 HRTOS 驱动库和应用示例不断完善,将为 8051 单片机开发提供更加完整的工程化开发基础。
HRTOS 始于 2017,持续专注于 8051 操作系统与嵌入式应用开发。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)