• 方案介绍
  • 相关推荐
申请入驻 产业图谱

多功能数字时钟万年历温湿度DHT11设计

09/28 08:22
155
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

多功能数字时钟万年历温湿度DHT11设计

项目概述

名称: 多功能数字时钟万年历温湿度DHT11 VHDL+Verilog Quartus II

软件:?Quartus II

语言:?VHDL + Verilog

代码功能

熟悉QUARTUSII开发软件,掌握VHDL语言,掌握EDA技术及其开发流程;

设计一个多功能的数字钟,具有年、月、日、时、分、秒计数显示功能,以24小时循环计数;具有校对、闹铃功能及环境温湿度的采集显示。采用EDA技术自顶向下层次化设计方法,由控制模块、计时模块、显示、报时模块、闹铃模块及温湿度采集模块共同构建一个基于FPGA的数字钟。

用VHDL语言设计满足上述功能要求的数字钟,完成各功能模块的功能仿真,通过系统实验箱下载验证设计课题的正确性。

本项目实现了一个功能丰富的多模式数字时钟万年历系统,集成了DHT11温湿度传感器。系统具备时钟显示、万年历功能、闹钟设置、秒表计时、温湿度监测等多种功能。支持LCD1602液晶显示和数码管显示两种显示方式,用户可通过按键在不同功能模式间切换。系统采用24小时制时间显示,万年历支持年月日显示并能自动处理闰年和月份天数,闹钟功能支持定时提醒,秒表提供精确计时功能。

代码已在开发板验证

核心板CORE4E-6DF说明书.pdf

外设板PERI1-8KD说明书.pdf

请添加图片描述

演示视频

代码实现思路

系统架构设计

系统采用分层模块化设计,主要分为以下几个层次:

  1. 时钟基础层:提供系统时钟分频和基准时序
  2. 功能模块层:实现各种具体功能(时钟、万年历、闹钟、秒表等)
  3. 接口控制层:处理按键输入、传感器通信和显示输出
  4. 模式管理层:协调各功能模块的工作状态

关键技术实现

  • 万年历算法:实现闰年判断和月份天数自动调整
  • DHT11通信协议:采用状态机实现单总线时序控制
  • 多显示接口:同时支持LCD1602和数码管显示
  • 按键防抖:硬件和软件结合的按键处理机制

代码结构

主要模块说明

  • calendar
    ?- 万年历模块,实现年月日计算和闰年处理逻辑
  • clock
    ?- 时钟模块,提供时分秒计时功能和时钟分频
  • alarm
    ?- 闹钟模块,实现闹钟时间设置和报警功能
  • stopwatch
    ?- 秒表模块,提供精确的计时和暂停功能
  • dht11
    ?- 温湿度传感器模块,实现DHT11通信协议(Verilog实现)
  • display
    ?- 显示控制模块,管理数码管的动态扫描显示
  • lcd1602
    ?- LCD显示模块,控制液晶屏的字符显示
  • mode_select
    ?- 模式选择模块,处理功能模式切换逻辑
  • change_io
    ?- 输入输出控制模块,处理按键输入和蜂鸣器输出
  • key_6s
    ?- 按键处理模块,实现按键防抖和长按检测
  • BCD
    ?- BCD码转换模块,处理数字显示的编码转换

系统接口定义

模块
主要接口
功能描述
时钟模块 clk

,?rst,?hour[7:0],?min[7:0],?sec[7:0]
系统时钟输入和时分秒输出
万年历模块 year[15:0]

,?month[7:0],?day[7:0]
年月日数据输出
DHT11模块 dht11_data

,?temp[15:0],?humi[15:0]
温湿度数据通信
显示模块 seg[7:0]

,?sel[5:0],?lcd_data[7:0]
数码管和LCD显示控制
按键模块 key_in[3:0]

,?key_out[3:0]
按键输入处理

功能模式说明

  1. 时钟模式:显示当前时分秒,支持12/24小时制切换
  2. 万年历模式:显示年月日和星期,自动处理闰年
  3. 闹钟模式:设置和显示闹钟时间,支持闹铃提醒
  4. 秒表模式:提供开始、暂停、复位的计时功能
  5. 温湿度模式:实时显示环境温度和湿度数据
  6. 设置模式:调整时间、日期和闹钟参数

设计特点

  • 混合语言设计:主体采用VHDL,DHT11模块使用Verilog实现
  • 多功能集成:集成时钟、万年历、闹钟、秒表、温湿度监测
  • 双显示支持:同时支持LCD1602和数码管显示
  • 智能万年历:自动处理闰年和各月天数差异
  • 用户友好界面:直观的按键操作和模式切换
  • 实时数据采集:DHT11传感器提供环境监测功能

技术亮点

  • 精确时序控制:采用多级时钟分频确保计时精度
  • 状态机设计:DHT11通信和按键处理均采用状态机实现
  • 模块化架构:各功能模块独立设计,便于扩展和维护
  • 资源优化:合理的逻辑设计,有效利用FPGA资源

工程相关图片

请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

部分代码展示:

LIBRARY ieee;
? ?USE ieee.std_logic_1164.all;
? ?USE ieee.std_logic_unsigned.all;
--时分秒模块
ENTITY clock IS
PORT(
? ? ? clk ? ? ? ??: IN STD_LOGIC;
? ? ? RST ? ? ? ??: IN STD_LOGIC;
? ? ? hour_add ? ?: IN STD_LOGIC;
? ? ? minute_add ?: IN STD_LOGIC;
? ? ? day_cin ? ??: OUT STD_LOGIC;
? ? ? hour_out ? ?: OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
? ? ? minute_out ?: OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
? ? ? second_out ?: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
);
END clock;

ARCHITECTURE behave OF clock IS

? ?SIGNAL hour ??:STD_LOGIC_VECTOR(7 DOWNTO 0);
? ?SIGNAL minute :STD_LOGIC_VECTOR(7 DOWNTO 0);
? ?SIGNAL second :STD_LOGIC_VECTOR(7 DOWNTO 0);
? ?SIGNAL day_en : STD_LOGIC :='0';
? ?SIGNAL cnt ? ?:STD_LOGIC_VECTOR(31 DOWNTO 0):="00000000000000000000000000000000";
BEGIN
? ?day_cin <= day_en;
PROCESS(clk, RST)
? ?BEGIN
IF(RST ='1') THEN
? ? ? ? ?cnt <="00000000000000000000000000000000";
ELSIF(clk'EVENT AND clk = '1') THEN
IF(cnt >="00000010111110101111000010000000") THEN-----------0000001111101000
? ? ? ? ? ? cnt <="00000000000000000000000000000000";
? ? ? ? ?ELSE
? ? ? ? ? ? cnt <= cnt +"00000000000000000000000000000001";
? ? ? ? ?END IF;
? ? ? END IF;
? ?END PROCESS;


PROCESS(clk, RST)
? ?BEGIN
IF(RST ='1') THEN
? ? ? ? ?hour <="00000000";
? ? ? ? ?minute <="00000000";
? ? ? ? ?second <="00000000";
? ? ? ? ?day_en <='0';
ELSIF(clk'EVENT AND clk = '1') THEN
IF(hour_add ='1') THEN
IF(hour >="00010111") THEN
? ? ? ? ? ? ? ?hour <="00000000";
? ? ? ? ? ? ELSE
? ? ? ? ? ? ? ?hour <= hour +"00000001";
? ? ? ? ? ? END IF;
ELSIF(minute_add ='1') THEN
IF(minute >="00111011") THEN
? ? ? ? ? ? ? ?minute <="00000000";
? ? ? ? ? ? ELSE
? ? ? ? ? ? ? ?minute <= minute +"00000001";
? ? ? ? ? ? END IF;
ELSIF(cnt >="00000010111110101111000010000000") THEN---------0000001111101000
IF(hour ="00010111" AND minute ="00111011" AND second ="00111011") THEN
? ? ? ? ? ? ? ?day_en <='1';
? ? ? ? ? ? ? ?hour <="00000000";
? ? ? ? ? ? ? ?minute <="00000000";
? ? ? ? ? ? ? ?second <="00000000";
ELSIF(minute ="00111011" AND second ="00111011") THEN
? ? ? ? ? ? ? ?day_en <='0';
? ? ? ? ? ? ? ?hour <= hour +"00000001";
? ? ? ? ? ? ? ?minute <="00000000";
? ? ? ? ? ? ? ?second <="00000000";
ELSIF(second ="00111011") THEN
? ? ? ? ? ? ? ?day_en <='0';
? ? ? ? ? ? ? ?hour <= hour;
? ? ? ? ? ? ? ?minute <= minute +"00000001";
? ? ? ? ? ? ? ?second <="00000000";
? ? ? ? ? ? ELSE
? ? ? ? ? ? ? ?day_en <='0';
? ? ? ? ? ? ? ?hour <= hour;
? ? ? ? ? ? ? ?minute <= minute;
? ? ? ? ? ? ? ?second <= second +"00000001";
? ? ? ? ? ? END IF;
? ? ? ? ?END IF;
? ? ? END IF;
? ?END PROCESS;


? ?hour_out <= hour;
? ?minute_out <= minute;
? ?second_out <= second;

END behave;

代码下载(付费可见):

点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=1549

相关推荐