首页/新闻资讯/正文详情

8051单片机实战:使用HRTOS+DS1302+4位数码管实现电子时钟

发布时间:2026/9/27 7:40:09 来源:云帆数科 栏目:资讯中心
8051单片机实战:使用HRTOS+DS1302+4位数码管实现电子时钟
在8051单片机项目中DS1302是一款比较经典的实时时钟芯片可以用于保存和读取当前的秒、分、时、日、月、星期和年份信息。本文使用HRTOS作为系统运行环境通过DS1302读取当前时间再使用4位数码管显示当前的“时”和“分”最终实现一个简单的8051电子时钟。本文重点不是复杂的硬件电路而是介绍在HRTOS中如何把一个实际的8051应用拆分成多个任务。一、实现效果本例最终实现的功能比较简单DS1302 │ │ 读取时间 ▼ HRTOS任务 │ ▼ 4位数码管 │ ▼ 12:35数码管显示当前的小时和分钟。例如12:35实际4位数码管显示1235如果当前时间为08:06则显示0806DS1302中的时间数据仍然按照BCD格式保存。二、DS1302时间数据本例定义一个7字节数组保存DS1302读取到的时间unsigned char rtc_time[7];各个字节对应的数据如下下标数据time[0]秒time[1]分time[2]时time[3]日time[4]月time[5]星期time[6]年例如当前时间为12:35:20那么其中的小时和分钟分别保存在rtc_time[2] rtc_time[1]三、DS1302使用BCD格式DS1302读取出来的时间数据采用BCD格式。例如25 - 0x25 59 - 0x59因此在显示之前需要先将BCD数据转换为普通十进制数据。这里使用一个简单的BCD转换函数unsigned char bcd_to_dec(unsigned char bcd) { return (bcd 4) * 10 (bcd 0x0F); }例如bcd_to_dec(0x25)返回25而bcd_to_dec(0x08)返回8这样就可以直接用于后面的十位和个位计算。四、为什么使用两个任务这个例子非常适合体现RTOS的一个基本思想不同功能可以由不同任务负责。本例将程序拆成两个任务。任务1DS1302读取任务负责读取DS1302 ↓ 更新rtc_time[] ↓ 等待 ↓ 再次读取对应void task_ds1302_read(void) { while(1) { drv_ds1302_read_time(rtc_time); os_delay(10); } }这个任务不负责数码管显示只负责获取时间。任务2数码管显示任务第二个任务负责读取rtc_time[] ↓ BCD转十进制 ↓ 提取小时、分钟 ↓ 刷新4位数码管对应void task_seg_display(void) { unsigned char hour; unsigned char minute; while(1) { hour bcd_to_dec(rtc_time[2]); minute bcd_to_dec(rtc_time[1]); drv_seg_display(0, hour / 10); os_delay_ms(1); drv_seg_display(1, hour % 10); os_delay_ms(1); drv_seg_display(2, minute / 10); os_delay_ms(1); drv_seg_display(3, minute % 10); os_delay_ms(1); } }这样以后如果需要修改显示方式只需要修改显示任务即可。五、数码管显示过程假设DS1302当前时间为12:35首先读取hour 12; minute 35;然后拆分成4个数字hour / 10 1 hour % 10 2 minute / 10 3 minute % 10 5最终分别显示第0位 → 1 第1位 → 2 第2位 → 3 第3位 → 5因此数码管看到的就是1235六、HRTOS中的任务创建完成任务函数以后在系统初始化函数中创建两个任务void hrtos_main(void) { drv_ds1302_init(); drv_seg_init(); os_task_create( task_ds1302_read, 2, 2, 4 ); os_task_create( task_seg_display, 3, 2, 4 ); }首先初始化DS1302drv_ds1302_init();然后初始化数码管drv_seg_init();最后创建两个任务。七、两个任务的职责整个程序运行起来以后可以简单理解成HRTOS │ ┌────────┴────────┐ │ │ ▼ ▼ DS1302读取任务 数码管显示任务 │ │ ▼ ▼ rtc_time[7] 读取时间数据 │ ▼ 数码管刷新DS1302读取任务只负责“获取数据”。数码管显示任务只负责“显示数据”。这就是RTOS比较典型的任务划分方式。八、为什么读取任务不需要一直运行DS1302本身具有实时时钟功能会自动进行计时。因此程序没有必要在CPU上不断执行drv_ds1302_read_time(rtc_time);而是读取一次以后等待一段时间再读取下一次。本例中使用os_delay(10);让任务进入延时状态。任务延时期间CPU可以运行其他任务。这也是RTOS任务设计中一个比较重要的思想不需要执行的时候就让任务主动让出CPU。相比让任务一直占用CPU进行轮询这种方式更适合多任务系统。九、数码管任务为什么需要较短的延时4位数码管通常采用动态扫描方式。程序需要不断切换第0位 第1位 第2位 第3位 第0位 第1位 ……因此显示任务不能像DS1302读取任务一样等待很长时间。本例在每一位显示之后使用os_delay_ms(1);例如drv_seg_display(0, hour / 10); os_delay_ms(1); drv_seg_display(1, hour % 10); os_delay_ms(1);不断快速刷新4个数码管就可以利用人眼视觉暂留形成稳定的显示效果。十、完整程序下面是本例的完整代码#include hrtos.h #include hrtos_hal.h /* * * DS1302 4位数码管时钟示例 * --------------------------------------------------------- * 功能 * 1. 初始化DS1302 * 2. 读取DS1302当前时间 * 3. 使用4位数码管显示时、分 * 4. 每秒更新一次时间 * * 显示格式 * * 12:35 * * DS1302时间数据采用BCD格式 * * time[0]秒 * time[1]分 * time[2]时 * time[3]日 * time[4]月 * time[5]星期 * time[6]年 * */ /*------------------------------------------------ * DS1302时间数据 *------------------------------------------------*/ unsigned char rtc_time[7]; /*------------------------------------------------ * BCD转十进制 * * 例如 * 0x25 - 25 * 0x59 - 59 *------------------------------------------------*/ unsigned char bcd_to_dec(unsigned char bcd) { return (bcd 4) * 10 (bcd 0x0F); } /*------------------------------------------------ * DS1302读取任务 * * 每秒读取一次DS1302时间 *------------------------------------------------*/ void task_ds1302_read(void) { while(1) { /* 读取DS1302时间 */ drv_ds1302_read_time(rtc_time); /* * DS1302内部自动走时 * 因此这里周期性读取即可。 */ os_delay(10); } } /*------------------------------------------------ * 数码管显示任务 * * 显示 * * HHMM * * 例如 * 12:35 - 1235 * 08:06 - 0806 *------------------------------------------------*/ void task_seg_display(void) { unsigned char hour; unsigned char minute; while(1) { /* BCD转换为十进制 */ hour bcd_to_dec(rtc_time[2]); minute bcd_to_dec(rtc_time[1]); /* 显示小时 */ drv_seg_display(0, hour / 10); os_delay_ms(1); drv_seg_display(1, hour % 10); os_delay_ms(1); /* 显示分钟 */ drv_seg_display(2, minute / 10); os_delay_ms(1); drv_seg_display(3, minute % 10); os_delay_ms(1); } } /** * brief DS1302时钟示例初始化 */ void hrtos_main(void) { /* 初始化DS1302 */ drv_ds1302_init(); /* 初始化数码管 */ drv_seg_init(); /* 创建DS1302读取任务 */ os_task_create( task_ds1302_read, 2, 2, 4 ); /* 创建数码管显示任务 */ os_task_create( task_seg_display, 3, 2, 4 ); }十一、这个例子体现了什么虽然这个电子时钟程序并不复杂但已经包含了一个基本HRTOS应用的几个重要组成部分硬件初始化 ↓ 创建任务 ↓ 任务独立运行 ↓ 任务之间共享数据 ↓ 任务延时 ↓ 硬件驱动其中DS1302任务负责硬件 → 数据数码管任务负责数据 → 显示HRTOS负责任务调度 任务延时 CPU资源管理这样就把底层硬件、应用功能和操作系统调度进行了比较清晰的划分。十二、传统方式与RTOS方式如果不使用RTOS也可以把所有代码都放在一个while(1)中。例如while(1) { 读取DS1302 刷新数码管 判断按键 处理传感器 处理通信 ... }当功能越来越多以后主循环会逐渐变得复杂。而使用HRTOS以后可以按照功能拆分DS1302任务 数码管任务 按键任务 传感器任务 通信任务 ...每个任务负责自己的功能。对于功能不断增加的8051项目这种组织方式会更加清晰。十三、总结本文使用HRTOS、DS1302和4位数码管实现了一个简单的8051电子时钟。整个程序只有两个主要任务task_ds1302_read ↓ 读取RTC时间 task_seg_display ↓ 刷新4位数码管通过这个例子可以初步了解HRTOS应用程序的基本结构初始化硬件 ↓ 创建任务 ↓ 任务执行 ↓ 任务延时 ↓ HRTOS负责调度后续还可以继续增加按键、温度传感器、蜂鸣器、串口通信等功能并进一步使用HRTOS提供的信号量、消息队列、互斥锁等机制。这也是使用RTOS构建8051应用程序时比较常见的一种思路。HRTOS持续维护8051操作系统及相关驱动、示例和组件后续将继续分享更多8051 RTOS实际应用案例。

相关推荐

WeChatMsg:免费导出微信聊天记录为 Word/HTML/CSV,记录永久保存还能生成年度报告
WeChatMsg:免费导出微信聊天记录为 Word/HTML/CSV,记录永久保存还能生成年度报告

WeChatMsg:免费导出微信聊天记录为 Word/HTML/CSV,记录永久保存还能生成年度报告 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://… · 2026/9/27 7:39:51

uniApp跨端开发: 解决不同平台显示差异问题
uniApp跨端开发: 解决不同平台显示差异问题

一、引言 在移动应用和小程序开发领域,跨端开发已成为主流趋势,而Uniapp凭借其"一次开发,多端发布"的特性,受到了众多开发者的青睐,然后,不同平台(如IOS,Android,微信小程序,支付宝小程序等)在屏幕尺寸,分辨率,系统字体,组件渲染等方面存在着显著差异,这些差异可能导… · 2026/9/27 7:39:51

LinuxKit 依赖解析:cenkalti/backoff v5 指数退避重试库的变更解读与源码剖析
LinuxKit 依赖解析:cenkalti/backoff v5 指数退避重试库的变更解读与源码剖析

操作系统云原生容器运行时 【免费下载链接】linuxkit A toolkit for building secure, portable and lean operating systems for containers 项目地址: https://gitcode.com/gh_mirrors/li/linuxkit 点击查看 免费下载 导读 本篇文章围绕 LinuxKit 仓库中 vendor… · 2026/9/27 7:39:45

普陀区网站开发避坑:3招搞定源码下载与低价陷阱
普陀区网站开发避坑:3招搞定源码下载与低价陷阱

普陀区网站开发避坑:3招搞定源码下载与低价陷阱 在普陀区找建站公司,最让人头疼的不是技术难,而是怕被坑高价。很多老板拿着几千块的预算,最后被忽悠花了几万,还发现拿不到核心代码。其实,只要搞懂 源码下载 的逻辑,你就掌握了谈判的主动权。… · 2026/9/27 8:21:06

企业网页制作公司青岛实战案例
企业网页制作公司青岛实战案例

青岛企业网页制作公司揭秘:3招搞定性能优化 很多老板想给公司做个官网,第一反应是找青岛企业网页制作公司。但心里往往发虚:自己完全不懂代码,怎么判断人家做得好不好?最怕花了几万块,做出来的网站打开像蜗牛爬,客户等两秒就关掉。这种时候,光看页面… · 2026/9/27 8:21:00

端侧离线全文检索深度实战:基于 MiniSearch 的中文拼音与模糊搜索
端侧离线全文检索深度实战:基于 MiniSearch 的中文拼音与模糊搜索

端侧离线全文检索深度实战:基于 MiniSearch 的中文拼音与模糊搜索在本地优先(Local-First)的手账工具中,当用户需要搜索某篇历史日记或特定待办时,单纯的精确字符串匹配(str.includes())经常无法… · 2026/9/27 8:20:54

大规模异构 GPU 资源碎片治理:基于拓扑亲和与 Binpack 算法的调度优化
大规模异构 GPU 资源碎片治理:基于拓扑亲和与 Binpack 算法的调度优化

大规模异构 GPU 资源碎片治理:基于拓扑亲和与 Binpack 算法的调度优化在管理上百节点、包含 A100、H800、L40 及国产异构加速卡的混合算力集群时,最令人头疼的问题往往不是算力绝对总量的不足,而是“显存碎片化”与“拓扑不匹配”。 经常出现… · 2026/9/27 8:20:48

招一个程序员可以做网站吗最佳实践
招一个程序员可以做网站吗最佳实践

招一个程序员做网站风险高吗? 3大隐患解析与保姆级建站教程 备案流程一头雾水,后台权限乱给,代码直接裸奔在公网。很多老板觉得“招个程序员”就是找个干活的人,结果网站上线不到一周就被挂马、被勒索,甚至因为数据泄露面临监管处罚。这篇保姆级建站教… · 2026/9/27 8:20:35

大模型辅助数仓模型反范式宽表与范式解耦决策:基于查询开销的自动物化推荐
大模型辅助数仓模型反范式宽表与范式解耦决策:基于查询开销的自动物化推荐

大模型辅助数仓模型反范式宽表与范式解耦决策:基于查询开销的自动物化推荐在企业级数据仓库(Data Warehouse)分层建模与数据资产治理中,数据架构师永远面临着一个永恒的架构权衡——“反范式大宽表(Denormalized Wide … · 2026/9/27 8:20:35

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码