新闻详情

新闻详情

首页 / 资讯中心 / 详情

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

发布时间:2026/9/27 7:34: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

相关资讯

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

较早相关资讯

最新相关资讯

如何攻击Wordpress站点常见报错与解决 2026/9/27 8:23:46

如何攻击Wordpress站点常见报错与解决

5个WordPress安全陷阱与防御注意事项 改个需求建站公司拖一周,这种憋屈感谁懂?刚上线的WordPress站点,后台改个按钮颜色,外包团队说“底层逻辑冲突”,得排期。结果第二天网站直接变白屏,或者更糟——被黑客植入了恶意代码,SEO收…

阅读更多 →
themeforestwordpress新手避坑速查手册:别花冤枉钱 2026/9/27 8:23:46

themeforestwordpress新手避坑速查手册:别花冤枉钱

themeforestwordpress新手避坑速查手册:别花冤枉钱 网站做好了没人访问,比没做还让人焦虑。你盯着后台那可怜个位数的UV,心里直打鼓,是不是域名没选对?是不是服务器太慢?别急,这大概率不是玄学,而是技术选型和基础配置的硬伤。…

阅读更多 →
NoneBot2 跨插件访问与依赖声明:深入理解 require 机制与插件加载时序 2026/9/27 8:23:40

NoneBot2 跨插件访问与依赖声明:深入理解 require 机制与插件加载时序

后端即时通讯 【免费下载链接】nonebot2 跨平台 Python 异步聊天机器人框架 / Asynchronous multi-platform chatbot framework written in Python 项目地址: https://gitcode.com/gh_mirrors/no/nonebot2 点击查看 免费下载 跨插件调用是 NoneBot2 插件化架构中的…

阅读更多 →
基于自适应语义路由(Semantic Routing)的知识库多路混合召回实战 2026/9/27 8:23:33

基于自适应语义路由(Semantic Routing)的知识库多路混合召回实战

基于自适应语义路由(Semantic Routing)的知识库多路混合召回实战在企业级大型 RAG(检索增强生成)知识库架构中,企业通常维护着数十个物理隔离、数据形态各异的垂直专业知识库(如:API 技术文档库…

阅读更多 →
Onivim 2 按键绑定(Key Bindings)配置完全指南:keybindings.json 格式、when 条件上下文与命令参考 2026/9/27 8:23:33

Onivim 2 按键绑定(Key Bindings)配置完全指南:keybindings.json 格式、when 条件上下文与命令参考

开发工具代码编辑器桌面应用 【免费下载链接】oni2 Native, lightweight modal code editor 项目地址: https://gitcode.com/gh_mirrors/on/oni2 点击查看 免费下载 Onivim 2 的按键绑定体系在设计上力求与 VSCode 的 Key Bindings 兼容,同时完整保留 V…

阅读更多 →
核心 Web 指标(CWV)2026 最新标准走读与应对 2026/9/27 8:23:26

核心 Web 指标(CWV)2026 最新标准走读与应对

核心 Web 指标(CWV)2026 最新标准走读与应对在 Google 搜索引擎的 SEO 排名权重与现代前端性能工程中,Google 核心 Web 指标(Core Web Vitals,简称 CWV) 是全球衡量真实用户体验(Field Experien…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

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

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