为了展示 HRTOS 外设驱动与多任务调度机制的结合应用,本次提供一个 NEC 红外遥控器与 4 位数码管显示示例。

本示例采用 8051 单片机,通过红外接收模块获取 NEC 遥控器发送的数据,完成协议解码后,将接收到的按键编码转换为十进制数值,并通过 4 位数码管实时显示。

整个应用采用 HRTOS 多任务结构,将红外数据读取、数码管显示和红外信号接收分别组织,实现不同功能之间的协作。

一、示例功能

本示例主要实现以下功能:

  1. 初始化 NEC 红外接收模块。

  2. 接收红外遥控器发送的数据。

  3. 完成 NEC 协议解码及数据校验。

  4. 获取有效的红外遥控器按键编码。

  5. 将按键编码转换为十进制数值。

  6. 使用 4 位数码管显示按键值。

例如,使用 NEC 红外遥控器按下不同按键,数码管显示对应的命令编码:

红外命令码十进制数值数码管显示
0x45690069
0x46700070
0x47710071

数码管显示的是 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 协议数据解码。

  • 驱动接口与应用程序分离。

  • 多任务之间共享数据。

  • 数码管动态扫描显示。

  • 不同任务之间的协作运行。

在此基础上,还可以进一步扩展:

  1. 增加红外遥控器控制数码管显示内容。

  2. 增加按键控制,实现参数调整。

  3. 增加温湿度传感器,实现红外遥控参数设置。

  4. 增加 LCD 显示,实现更丰富的人机交互。

  5. 增加其他外设任务,构建完整的嵌入式控制系统。

八、总结

本示例展示了 HRTOS 在 8051 单片机上的多任务应用方式。

通过红外接收、数据读取和数码管显示三个任务的协作,实现了 NEC 红外遥控器按键接收与数码管显示功能。

从这个简单示例可以看到,HRTOS 不仅能够管理多个独立任务,还能够将外设驱动、协议处理和应用逻辑组织成相对独立的软件模块。

随着 HRTOS 驱动库和应用示例不断完善,将为 8051 单片机开发提供更加完整的工程化开发基础。

HRTOS 始于 2017,持续专注于 8051 操作系统与嵌入式应用开发。

 

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐