news 2026/5/5 13:43:51

基于FPGA的DS18B20温度监控与管理系统:实时显示温度,按键查看历史数据并存储温度点,超...

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于FPGA的DS18B20温度监控与管理系统:实时显示温度,按键查看历史数据并存储温度点,超...

基于FPGA的 DS18B20多功能温度显示 实现功能: 1.实时温度显示在数码管上,更新速率1-2s一次 2.按下按键显示最近30s内的最高温和最低温 不包含板子, 3.按下按键可以存储当前温度,最多存5个 4.超过温度报警

最近在搞一个挺有意思的FPGA温度显示项目,用DS18B20数字温度传感器搭配数码管玩出了新花样。这种单总线协议的温度传感器用起来有点小脾气,不过搞定了之后发现FPGA驱动起来还挺带感的。

先上段单总线通信的状态机核心代码:

always@(posedge clk_1mhz) begin case(state) 0: begin // 初始化 if(cnt == 750_000) begin cnt <= 0; state <= 1; end else cnt <= cnt + 1; end 1: begin // 发送跳过ROM命令 if(bit_cnt == 8) begin state <= 2; bit_cnt <= 0; end else begin tx_data <= 8'hCC; // 发送单字节代码... end end // ...后续状态省略 endcase end

这个状态机负责和DS18B20的通信握手。注意时钟用1MHz分频得来,实测发现这个频率下通信最稳定。状态0做传感器复位操作,拉低总线至少480us。这里用计数器实现时间控制比用定时器模块更节省资源。

数码管显示部分玩了个小花招,把温度数据拆成三个数码管显示:

// 温度数据处理 wire [11:0] temp_data = {rx_buffer[1], rx_buffer[0]}; wire [15:0] temp_bcd = bin2bcd(temp_data[11:4]); // 动态扫描模块 always@(posedge scan_clk) begin case(sel) 2'b00: begin seg_data <= temp_bcd[11:8]; // 十位 seg_point <= 1'b0; end 2'b01: begin seg_data <= temp_bcd[7:4]; // 个位 seg_point <= 1'b1; // 点亮小数点 end 2'b10: begin seg_data <= temp_bcd[3:0]; // 小数位 seg_point <= 1'b0; end endcase sel <= sel + 1; end

这里用bin2bcd自定义函数把二进制温度转成BCD码,注意DS18B20的温度数据是12位分辨率,所以只取高8位整数部分。小数位的处理可以自己决定要不要显示,实测发现0.5度精度对大多数场景够用了。

基于FPGA的 DS18B20多功能温度显示 实现功能: 1.实时温度显示在数码管上,更新速率1-2s一次 2.按下按键显示最近30s内的最高温和最低温 不包含板子, 3.按下按键可以存储当前温度,最多存5个 4.超过温度报警

按键处理模块是功能切换的核心:

// 按键状态机 always@(posedge clk) begin case(key_state) 0: begin if(key_pressed) begin key_timer <= 0; key_state <= 1; end end 1: begin if(key_timer == 200_000) begin // 20ms消抖 if(key_hold) begin key_state <= 2; // 触发功能切换 mode <= (mode == 3'd4) ? 3'd0 : mode + 1; end else key_state <= 0; end else key_timer <= key_timer + 1; end // ...状态处理省略 endcase end

这里用时间戳方式实现按键长短按判断。消抖计数器跑在10kHz时钟下,实测比用机械消抖电路更可靠。模式切换时要注意数码管显示内容的切换逻辑,特别是最高最低温需要从环形缓冲区里读取历史数据。

温度存储用了简单的FIFO结构:

reg [7:0] temp_mem [0:4]; reg [2:0] mem_ptr; always@(posedge save_trigger) begin if(mem_ptr <5) begin temp_mem[mem_ptr] <= current_temp; mem_ptr <= mem_ptr +1; end else begin // 循环覆盖旧数据 temp_mem[0] <= temp_mem[1]; temp_mem[1] <= temp_mem[2]; // ...数据移位操作 temp_mem[4] <= current_temp; end end

这里用指针循环覆盖的设计比用真正的FIFO更节省资源,毕竟只需要存5个数据。注意存储触发条件要放在按键处理模块里,避免误触发。

报警模块就比较直接了:

always@(posedge clk) begin if(current_temp > 38 || current_temp <5) begin alarm_led <= 1'b1; buzzer <= ~buzzer; // 产生方波报警声 end else begin alarm_led <= 1'b0; buzzer <= 1'b0; end end

阈值可以改成参数化设计,这里直接写死方便调试。蜂鸣器用PWM控制的话效果更好,不过方波实现起来最简单。

这个项目最坑的地方是单总线时序,建议调试时先用示波器抓波形,确保符合DS18B20的时序要求。数码管刷新率设在60Hz左右比较合适,肉眼看起来不会有闪烁感。最后实测效果挺有意思,按键切换时能看到温度数据像跑马灯一样在数码管上流转,报警时的蜂鸣器尖叫也够刺激——当然,别在图书馆玩这个。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/5 11:37:44

什么是计算机网络安全?初学者指南:概念、技术与学习资料全汇总

一、网络安全原理 网络安全包含两大部分内容&#xff1a;一是网络系统安全&#xff0c;二是网络上的信息安全。它涉及网络系统的可靠性、稳定性&#xff0c;以及网络上信息的保密性、完整性、可用性、真实性和可控性等。 网络系统安全&#xff1a;指保证信息处理和传输系统的…

作者头像 李华
网站建设 2026/4/23 21:03:28

SpringBoot+Vue 学生评奖评优管理系统平台完整项目源码+SQL脚本+接口文档【Java Web毕设】

摘要 随着教育信息化的快速发展&#xff0c;高校学生评奖评优管理工作逐渐从传统纸质化向数字化、智能化转型。传统评奖评优流程中存在效率低、透明度不足、数据管理混乱等问题&#xff0c;亟需一套高效、公平、透明的管理系统来优化流程。学生评奖评优管理系统平台旨在通过信息…

作者头像 李华
网站建设 2026/5/2 2:02:46

03. NFS服务器

NFS 服务介绍 在计算机网络存储领域&#xff0c;NFS&#xff08;Network File System&#xff0c;网络文件系统&#xff09;是一种实现不同计算机之 间文件共享的经典技术。它允许网络中的客户端计算机像访问本地文件一样&#xff0c;透明地访问远程服 务器上的文件资源&#…

作者头像 李华
网站建设 2026/4/24 16:21:15

Java版LeetCode热题100之「LRU 缓存」详解

Java版LeetCode热题100之「LRU 缓存」详解 本文约9200字&#xff0c;全面深入剖析 LeetCode 第146题《LRU 缓存》。涵盖题目解析、哈希表双向链表解法、复杂度分析、面试高频问答、实际开发应用场景、相关题目推荐等&#xff0c;助你彻底掌握缓存淘汰算法的核心实现技巧。 一、…

作者头像 李华
网站建设 2026/5/3 13:39:41

入门网络安全工程师要学习哪些内容【2026年寒假最新学习计划】

大家都知道网络安全行业很火&#xff0c;这个行业因为国家政策趋势正在大力发展&#xff0c;大有可为!但很多人对网络安全工程师还是不了解&#xff0c;不知道网络安全工程师需要学什么?知了堂小编总结出以下要点。 网络安全工程师是一个概称&#xff0c;学习的东西很多&…

作者头像 李华
网站建设 2026/5/2 12:20:37

vue基于Python老年人服务预约系统 flask django Pycharm

这里写目录标题项目介绍项目展示详细视频演示感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff08;免费咨询指导选题&#xff09;&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;希望帮助更多的人技术栈文章下方名片联系我即可~解决的思路…

作者头像 李华