多功能闹钟

实验应用场景

本次实验设计多功能低功耗手表,能够完成校时、计时、设置闹钟等功能,并且能够实时检测环境的温湿度。

操作流程

首先会从DS1302中读取时间与初始化时间进行比较,若符合条件则无须再进行设置。直接在LCD屏幕上显示当前时间。

按键说明:

表1
按键初始菜单设置菜单校时菜单计数菜单闹钟设置
SW0闹钟工作时关闭-归零
SW1---
SW2按住查看闹钟时间选择选择计数暂停/开始选择
SW3进入设置菜单确定确定并返回初态回到初始菜单确定并返回

打开电源后进入初始状态,此时在LCD屏幕上会显示当前的时间,包括年、月、日、时、分、秒,也会显示环境的温湿度。按住SW2可以查看当前的闹钟时间,初始为0点0分,按下SW3可以进入设置菜单。在设置菜单中,LCD下面两行会展示选项,当前选项会闪烁,按SW2可以在选项间跳转,按SW3可以进入当前选项的下一级界面。

若在校时菜单,同样的当前选项会闪烁,按SW0向上调整,按SW1向下调整,年份的调整区间为200~2099,调整秒时无论按SW0还是SW1都会清零,按住SW0或SW1可连续调整。

若在计数菜单,初始为00:00:00,表示时、分、秒,其中小时的范围为0~255。按SW2可以开始或暂停计数,按SW0会使计数值归零并停止计数,按SW3则会回到初始菜单。若在计数时返回初始菜单,则计数仍会进行,暂停的计数结果保留。

若在闹钟设置菜单,开始会显示当前闹钟,若未进行过设置,则为00:00,表示时、分。按SW0,向上调整;按SW1,向下调整;按SW2在时和分之间进行选择;按SW3则会保存当前的闹钟时间并返回初始菜单。若要查看闹钟时间,在初始菜单按住SW2即可。当时间与设置的闹钟时间相等时,蜂鸣器会响,直到时间不再与闹钟时间相等,按SW0可以暂时关闭闹钟。

实验设计

本次实验设计了一个多功能手表,利用教学实验箱(皮赛电子 stm32f407tg)上的DS1302芯片存储时间,DS1302能够存储年、月、日、周、时、分、秒,并且能够自动判别闰年闰月,针对不同月份有不同的天数。实验以课程中使用的DS1302历程为基础,辅以定时器TIM、按键KEY、蜂鸣器BEEP、液晶显示屏LCD,还外接了温湿度传感器DHT11。下面主要对DS1302和DHT11进行介绍。

DS1302芯片包含一个实时时钟/日历和31字节的静态RAM。它通过一个简单的串行接口与微处理器通信。 实时时钟/日历提供秒、分钟、小时、日、日、月和年信息。 月末的日期会自动调整天数少于31天的月份,包括闰年的更正。时钟运行在24小时或12小时的格式与AM/PM指示器使用同步串行通信简化了DS1302与微处理器的接口。 只需要三根电线与时钟/RAM: CE通信 I/O(数据线) SCLK(串行时钟) DS1302被设计成在非常低的功率下工作,并且以低于1uW的速度保留数据和时钟信息。

DHT11 是一款湿温度一体化的数字传感器。该传感器包括一个电阻式测湿元件和一个 NTC测温元件,并与一个高性能 8 位单片机相连接。通过单片机等微处理器简单的电路连接就能够实时的采集本地湿度和温度。DHT11 与单片机之间能采用简单的单总线进行通信(使用I2C通信协议),仅仅需要一个 I/O 口。传感器内部湿度和温度数据 40Bit 的数据一次性传给单片机,数据采用校验和方式进行校验,有效的保证数据传输的准确性。DHT11 功耗很低,5V 电源电压下,工作平均最大电流 0.5mA。

DHT11 数字湿温度传感器采用单总线数据格式。即,单个数据引脚端口完成输入输出双向传输。其数据包由 5Byte(40Bit)组成。数据分小数部分和整数部分,一次完整的数据传输为40bit,高位先出。DHT11 的数据格式为:8bit 湿度整数数据+8bit 湿度小数数据+8bit 温度整数数据+8bit 温度小数数据+8bit 校验和。其中校验和数据为前四个字节相加。

传感器数据输出的是未编码的二进制数据。数据(湿度、温度、整数、小数)之间应该分开

处理。例如,某次从 DHT11 读到的数据如图1所示:

image-20220730215629660

图1

由以上数据就可得到湿度和温度的值,计算方法: 湿度= byte4 . byte3=45.0 (%RH) 温度= byte2 . byte1=28.0 ( °C) 校验= byte4+ byte3+ byte2+ byte1=73(=湿度+温度)(校验正确) 可以看出,DHT11 的数据格式是十分简单的,DHT11 和 MCU 的一次通信最大为 3ms 左右,建议主机连续读取时间间隔不要小于 100ms。

图2 DHT11数据发送流程

首先主机发送开始信号,即:拉低数据线,保持 t1(至少 18ms)时间,然后拉高数据线 t2(20~40us)时间,然后读取 DHT11 的响应,正常的话,DHT11 会拉低数据线,保持 t3(40~50us)时间,作为响应信号,然后 DHT11 拉高数据线,保持 t4(40~50us)时间后,开始输出数据。 DHT11 输出数字‘0’的时序如图3:

图3 DHT11 数字“0”时序

DHT11 输出数字‘1’的时序如图4:

图4 DHT11 数字“0”时序

教学所用试验箱没有DHT11芯片,所以需要外接。本次使用的DHT11有3个引脚,其中GND与电源引脚直接接在电路扩展模块的地和电源上。而data引脚可以用杜邦线接在DS18B20的temp引脚上。

DHT11配置的头文件dht11.h如下:

DHT11配置的源文件dht11.c如下:

代码流程

主干部分

主要的工作流程:

Y
N
Y
N
Y
N
开始
初始化DS1302、LCD、BEEP、KEY、DHT11
按键为SW3?
设置菜单
按键为SW2?
展示闹钟
按键为SW0?
关闭正在工作的蜂鸣器
展示时间及温湿度
校时
计时
闹钟

主函数如下:

校时模块
Y
N
Y
N
Y
N
Y
N
校时
按键为SW2?
在年、月、日、时、分、秒间跳转
按键为SW3?
返回初始状态
按键为SW0?
向上调整时间
按键为SW1?
向下调整时间
更新时间

校时代码如下:

 

计数模块
Y
N
Y
N
Y
N
计数
更新时间
按键为SW0?
计数归零并停止计数
按键为SW2?
停止\开始计数
按键为SW3?
返回初始状态

计数模块代码如下:

闹钟模块
Y
N
Y
N
Y
N
Y
N
闹钟
更新时间
按键为SW2?
在时、分间选择
按键为SW3?
返回初始状态
按键为SW1?
向上调整时间
按键为SW0?
向下调整时间

闹钟模块代码如下:

 

实验展示

多功能闹钟