新闻详情

新闻详情

首页 / 资讯中心 / 详情

HRTOS实战:8051使用雨滴传感器DO检测雨滴并通过数码管显示

发布时间:2026/11/12 17:04:56来源:尧图网络
HRTOS实战:8051使用雨滴传感器DO检测雨滴并通过数码管显示
一、前言在前面的文章中我们使用雨滴传感器的 AO 模拟量输出通过 ADC 获取雨滴传感器的模拟数据并使用4位数码管显示 ADC 转换结果。除了 AO 模拟输出之外常见的雨滴传感器模块还提供 DO 数字输出可以直接根据传感器的阈值判断当前是否检测到雨滴。本文使用 HRTOS 在 8051 单片机上实现一个简单的雨滴检测应用读取雨滴传感器 DO 数字量判断当前是否检测到雨滴使用4位数码管显示检测状态将传感器读取和显示分别设计为独立任务最终显示效果0000检测到雨滴 0001未检测到雨滴通过这个简单的实例可以进一步了解 HRTOS 在 8051 传感器检测类应用中的基本使用方法。二、雨滴传感器 DO 输出雨滴传感器模块通常可以提供 AO 和 DO 两种输出。其中AO模拟量输出可以反映传感器检测到的雨滴变化程度DO数字量输出根据模块上的比较器阈值输出高低电平本文使用的是 DO 数字量输出。程序中约定DO 0检测到雨滴 DO 1未检测到雨滴因此应用程序并不需要进行 ADC 转换只需要读取一个数字状态即可。这种方式比较适合实现简单的开关量检测例如是否下雨 是否有人 是否有障碍物 是否触发传感器如果需要获得更加连续、精确的雨滴变化数据则可以使用前面介绍的 AO 模拟量方式。三、程序结构本实例仍然采用 HRTOS 的多任务方式组织程序。整个应用划分为两个任务┌──────────────────────────┐ │ HRTOS 应用程序 │ ├──────────────────────────┤ │ │ │ task_raindrop_read │ │ 雨滴传感器DO读取任务 │ │ │ │ │ ▼ │ │ raindrop_do │ │ │ │ │ ▼ │ │ task_seg_display │ │ 数码管显示任务 │ │ │ └──────────────────────────┘其中任务1雨滴传感器读取负责周期性调用drv_raindrop_read_do();读取传感器当前的 DO 状态。任务2数码管显示负责不断刷新4位数码管并根据raindrop_do的状态显示0000或者0001这样可以将传感器采集和数据显示分开使程序结构更加清晰。四、定义雨滴传感器状态首先定义一个变量保存雨滴传感器的 DO 状态unsigned char raindrop_do 1;初始化为1表示默认状态为未检测到雨滴传感器读取任务运行后会不断更新这个变量。五、创建雨滴传感器读取任务传感器读取任务如下void task_raindrop_read(void) { while(1) { /* 读取雨滴传感器数字量 */ raindrop_do drv_raindrop_read_do(); /* * 周期读取传感器状态 */ os_delay(50); } }任务首先调用drv_raindrop_read_do();获得当前雨滴传感器的 DO 状态。然后保存到raindrop_do变量中。读取完成之后调用os_delay(50);让当前任务延时一段时间然后再次读取。这样就形成了一个周期性的传感器采集任务读取DO ↓ 保存状态 ↓ 延时 ↓ 再次读取 ↓ 循环对于这种变化速度比较慢的传感器没有必要让任务一直高速读取因此使用周期性任务即可。六、创建数码管显示任务数码管显示任务如下void task_seg_display(void) { while(1) { /* * 显示雨滴传感器状态 * * 0000检测到雨滴 * 0001未检测到雨滴 */ drv_seg_display(0, 0); drv_seg_display(1, 0); drv_seg_display(2, 0); drv_seg_display(3, raindrop_do); } }这里前三位固定显示000最后一位显示raindrop_do。因此当raindrop_do 0;数码管显示0000表示检测到雨滴。当raindrop_do 1;数码管显示0001表示未检测到雨滴。这里没有在显示任务中调用os_delay()而是持续执行数码管刷新操作。这样可以保持动态数码管正常显示。七、初始化 HRTOS 应用系统入口函数void hrtos_main(void) { /* 初始化雨滴传感器 */ drv_raindrop_init(); /* 初始化数码管 */ drv_seg_init(); /* 创建雨滴传感器读取任务 */ os_task_create( task_raindrop_read, 2, 2, 4 ); /* 创建数码管显示任务 */ os_task_create( task_seg_display, 3, 2, 4 ); }首先初始化雨滴传感器drv_raindrop_init();然后初始化4位数码管drv_seg_init();最后创建两个任务os_task_create(task_raindrop_read, 2, 2, 4); os_task_create(task_seg_display, 3, 2, 4);这样 HRTOS 启动后就可以同时运行传感器读取任务和数码管显示任务。八、完整程序完整示例代码如下#include hrtos.h #include hrtos_hal.h /* * * 雨滴传感器DO 4位数码管显示示例 * --------------------------------------------------------- * 功能 * 1. 初始化雨滴传感器 * 2. 读取雨滴传感器数字量DO * 3. 使用4位数码管显示检测状态 * * DO状态 * 0检测到雨滴 * 1未检测到雨滴 * * 数码管显示 * 0000检测到雨滴 * 0001未检测到雨滴 * */ unsigned char raindrop_do 1; /*------------------------------------------------ * 雨滴传感器DO读取任务 *------------------------------------------------*/ void task_raindrop_read(void) { while(1) { /* 读取雨滴传感器数字量 */ raindrop_do drv_raindrop_read_do(); /* * 周期读取传感器状态 */ os_delay(50); } } /*------------------------------------------------ * 数码管显示任务 *------------------------------------------------*/ void task_seg_display(void) { while(1) { /* * 显示雨滴传感器状态 * * 0000检测到雨滴 * 0001未检测到雨滴 */ drv_seg_display(0, 0); drv_seg_display(1, 0); drv_seg_display(2, 0); drv_seg_display(3, raindrop_do); } } /** * brief 雨滴传感器DO示例初始化 */ void hrtos_main(void) { /* 初始化雨滴传感器 */ drv_raindrop_init(); /* 初始化数码管 */ drv_seg_init(); /* 创建雨滴传感器读取任务 */ os_task_create( task_raindrop_read, 2, 2, 4 ); /* 创建数码管显示任务 */ os_task_create( task_seg_display, 3, 2, 4 ); }九、HRTOS任务划分的意义这个例子虽然非常简单但它体现了一个比较典型的嵌入式任务划分方式。传统的单循环程序可能会写成while(1) { raindrop_do drv_raindrop_read_do(); drv_seg_display(0, 0); drv_seg_display(1, 0); drv_seg_display(2, 0); drv_seg_display(3, raindrop_do); }当功能继续增加以后所有功能都会堆积在一个循环中。使用 HRTOS 后可以按照功能拆分传感器任务 ↓ 负责数据采集 显示任务 ↓ 负责数据显示以后如果继续增加蜂鸣器、继电器、串口通信等功能还可以继续创建对应任务而不需要把所有代码都集中在一个while(1)中。例如可以进一步扩展为task_raindrop_read │ ├── 获取雨滴状态 │ ▼ raindrop_do │ ├───────────────┐ ▼ ▼ 显示任务 报警任务 数码管显示 蜂鸣器控制这也是 HRTOS 在实际 8051 项目中的一个重要作用将不同功能按照任务进行组织。十、DO与AO的区别雨滴传感器的 AO 和 DO 适合不同的应用场景。输出方式数据类型典型用途AO模拟量获取雨滴变化程度DO数字量判断是否达到检测阈值如果只是需要判断有没有雨那么 DO 就已经足够。如果需要进一步分析雨滴变化大小 雨量变化趋势 传感器输出曲线则可以使用 AO并通过 ADC 获取更加详细的数据。因此这两个接口并不是相互替代而是针对不同应用需求提供不同的数据形式。十一、总结本文使用 HRTOS 在 8051 单片机上实现了一个简单的雨滴传感器数字量检测实例。整个程序主要包含两个任务task_raindrop_read负责周期读取雨滴传感器 DO 状态task_seg_display负责实时刷新4位数码管。最终通过0000表示检测到雨滴通过0001表示未检测到雨滴。虽然这个实例功能比较简单但它完整体现了传感器采集任务 显示任务的基本 HRTOS 应用结构。对于 8051 这类资源有限的单片机来说通过任务划分组织应用程序可以让程序结构更加清晰也方便后续继续加入更多传感器、执行器和通信功能。后续还可以在这个基础上扩展雨滴报警、继电器控制、串口上传以及多传感器协同等功能。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

【外设】之大彩串口显示屏 2026/11/11 13:52:51

【外设】之大彩串口显示屏

大彩串口屏初步使用 1 .官网下载 STM32 屏幕 GUI 设计资料 http://www.gz-dc.com/category/typeid/4112 找到 STM32 Keil 工程,移植相关代码因项目而异进行移植,由于项目简单,本人只对用到的指令接口进行修改。 比如:注意事项&…

阅读更多 →
无法下载Windows系统iso文件 2026/11/10 19:42:40

无法下载Windows系统iso文件

当我遇到这个问题的时候,我打开了一个网站: 登录 然后我打算下载的时候: 突然那个官方的连接就可以下载了:

阅读更多 →
【清华代码熊】DeepSeek V4.1 Flash 后训练详解 2026/11/12 9:50:02

【清华代码熊】DeepSeek V4.1 Flash 后训练详解

📌 上期解析了 DeepSeek V4.1 Flash 模型架构改进,本期解析 DeepSeek V4.1 Flash 预训练/后训练技术: 🌟 预训练:45T 文本 多模态混合语料、直接训练 sparse attention(取消 DeepSeek V4 的 dense 冷启动&…

阅读更多 →
Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ... 2026/11/12 9:25:38

Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ...

文章主要内容和创新点 主要内容 本文聚焦于多模态大语言模型(MLLM)强化学习(RL)训练中的效率问题,提出了一个名为Shuffle-R1的框架。研究发现,当前RL训练存在两个关键缺陷: 优势值坍缩(Advantage Collapsing):批次中大多数优势值集中在零附近,导致有效梯度信号被淹…

阅读更多 →
PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction 2026/11/12 15:57:44

PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction

一、文章主要内容总结 本文聚焦于利用大型语言模型(LLMs)实现个人身份信息(PII)脱敏的研究,旨在解决传统脱敏方法(如基于规则的系统、领域特定命名实体识别(NER)模型)泛化能力差、跨格式/跨语境适应性弱的问题。 研究通过全面评估多种LLM架构(包括密集型LLM(D-LLM…

阅读更多 →
LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model 2026/11/10 17:14:10

LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model

文章主要内容和创新点 主要内容 本文聚焦于二进制图像-文本相关性评估任务(判断图像与文本“相关”或“不相关”),针对该任务中文本格式多样、相关性定义随场景变化等挑战,提出了基于多模态大语言模型(MLLM)的解决方案LLaVA-RE。 模型设计:LLaVA-RE基于LLaVA 1.5架构,…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉