名称: 智能温度监测显示系统的设计Verilog代码Quartus Spirit_V4开发板
软件: Quartus II
语言: Verilog
代码功能
本项目实现了一个基于DS18B20温度传感器的智能温度监测与显示系统,具备多模式显示和智能报警功能。系统主要功能包括:
·温度采集:通过DS18B20数字温度传感器实时采集环境温度,精度达到0.01℃
·多屏显示:同时支持LCD1602液晶屏和六位数码管显示温度数据
·智能报警:根据预设温度阈值(低于10℃或高于30℃)自动触发声光报警
·实时监控:系统每10秒自动采集并更新一次温度数据
·精确控制:采用1MHz时钟精确控制DS18B20通信时序
·多接口设计:支持多种显示和通信接口,具有良好的扩展性
代码实现思路
本代码已在Spirit_V4开发板验证,Spirit_V4开发板如下,其他开发板可以修改管脚适配:
系统架构设计
系统采用分层模块化设计,主要包含七个核心功能模块:
1.顶层控制模块:集成所有功能模块,实现数据路由和系统协调
2.温度采集模块:控制DS18B20传感器,实现温度数据采集
3.LCD显示模块:驱动LCD1602液晶屏显示温度信息
4.数码管模块:六位数码管动态扫描显示温度数据
5.串口通信模块:UART协议实现温度数据上传
6.报警控制模块:温度阈值检测和声光报警输出
7.时钟生成模块:为各模块提供精确的时钟信号
温度采集协议实现
DS18B20驱动模块采用七状态状态机实现完整的1-Wire通信协议:
·初始化状态:发送复位脉冲,检测传感器响应
·ROM跳过状态:发送跳过ROM命令,直接访问传感器
·温度转换状态:启动温度转换过程
·延时等待状态:等待温度转换完成
·数据读取状态:读取转换后的温度数据
·数据处理状态:对原始数据进行格式转换和符号处理
代码结构
模块层次结构
temp_disp (顶层模块)
├── ds18b20_dri (温度采集模块)
├── LCD_Top (LCD显示控制模块)
│ ├── Clock_Gen (LCD时钟生成)
│ └── LCD_Driver (LCD驱动控制)
├── seg_led (数码管显示模块)
├── uart_send (串口发送模块)
└── beep (报警控制模块)
模块功能描述
1.temp_disp.v:顶层模块,集成所有功能模块
2.ds18b20_dri.v:DS18B20驱动,实现温度采集
3.LCD_Top.v:LCD显示顶层控制
4.LCD_Driver.v:LCD1602驱动,显示温度信息
5.Clock_Gen.v:为LCD模块生成500Hz时钟
6.seg_led.v:六位数码管动态扫描显示
7.uart_send.v:UART串口数据发送
8.beep.v:温度报警控制,声光报警输出
显示系统设计
系统采用双显示模式,显示格式为:
·LCD1602显示:第一行显示"temperature",第二行显示温度值(如:25.36℃)
·数码管显示:六位数码管显示温度值,支持小数点显示
温度数据采用20位格式存储,实际值为温度的100倍,便于精确显示小数点后两位。
整体仿真图
数码管显示模块
串口发送模块
报警模块
LCD1602模块
部分代码展示:
/* * Hacky baud rate generator to divide a 50MHz clock into a 9600 baud * rx/tx pair where the rx clcken oversamples by 16x. */ module baud_rate_gen(input wire clk_50m, output wire rxclk_en, output wire txclk_en); //***************************************************** //** main code //***************************************************** parameter RX_ACC_MAX = 50000000 / (9600 * 16); parameter TX_ACC_MAX = 50000000 / 9600;//波特率9600 parameter RX_ACC_WIDTH = $clog2(RX_ACC_MAX); parameter TX_ACC_WIDTH = $clog2(TX_ACC_MAX); reg [RX_ACC_WIDTH - 1:0] rx_acc = 0; reg [TX_ACC_WIDTH - 1:0] tx_acc = 0; assign rxclk_en = (rx_acc == 5'd0); assign txclk_en = (tx_acc == 9'd0); always @(posedge clk_50m) begin if (rx_acc == RX_ACC_MAX[RX_ACC_WIDTH - 1:0]) rx_acc <= 0; else rx_acc <= rx_acc + 5'b1; end always @(posedge clk_50m) begin if (tx_acc == TX_ACC_MAX[TX_ACC_WIDTH - 1:0])
228