[ps:该文章排版有点错乱,如果需要,有PDF版本和WORD版本可供下载观看,还有资源免费下载,请移步作者主页下载,仅供学习参考。该设计是学校要求的课程设计,也是第一次做,很多函数并没有进行封装,部分逻辑比较乱,勉强完成功能设计,介意勿扰哈,最后再说一遍:免费下载,仅供学习参考使用]

1 设计任务及要求
1.1 引言
本文提出了一种基于 STM32 的智能万年历设计方案,本文案以 STM32F103C8T6 最小系统作为主控核心,与 OLED 显示、 DS18B20 温度传感器、 DST11 温湿度传感器等模块组成硬件系统。 其中以 STM32 内部的 RTC(实时时钟) 实现日历和时间的功能,通过修改计数器的值可以重新设置系统的当前时间和日期。综上所述,此电子时钟具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。

1.2 功能要求
(1) 系统组成:
系统选用 STM32F103C8T6 单片机为微处理器, 使用各模块实现万年历的功能。

(2) 实现功能:
1) 在 OLED 显示屏上显示实时的日期和时间。
2)具有闰年的自动调整功能。
3)能够显示实时温度。
4)能够显示实时湿度。

(3) 模块组成:
STM32 单片机最小系统、 OLED 显示模块、温度传感器模块、湿度传感器模块;

2 设计方案
2.1 可选择的芯片方案
整个系统用 STM32F103 单片机作为中央控制器,由单片机采集内部 RTC 值,时钟信号通过单片机 I / O 口传给 OLED, 单片机模块控制驱动模块驱动显示模块,通过显示模块来实现信号的输出、 OLED 的显示及相关的控制功能。

方案 1:采用 89C51 芯片采用 89C51 芯片作为硬件核心,采用 Flash ROM,内部具有4KB ROM 存储空间,能于 3V 的超低压工作,而且与 MCS-51 系列单片机完全兼容,但是运用于电路设计中时由于不具备 ISP 在线编程技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,对芯片的多次拔插会对芯片造成一定的损坏。

方案 2: 采用 STM32 单片机。 STM32F103C8T6 是一款基于 ARM Cortex-M 内核 STM32系列的 32 位的微控制器,程序存储器容量是 64KB,需要电压 2V ~ 3.6V,工作温度为-40° C ~ 85° C。 主要性能有:与 MCS-51 单片机产品兼容、 37 个可编程 I/0 口线、 贴片8M 晶振(通过芯片内部 PLL 最高可达 72M)、支持 JTAG/SWD、 20K RAM, 64K ROM, 16 位的定时、计数器、 中断源、全双工 UART 串行通道等。 价格相对较便宜, 从单片机芯片主要性能角度和价格优势出发,本设计的智能万年历单片机芯片选择设计采用方案采用STM32F103C8T6。

2.2 显示模块选择方案
方案 1: 采用 OLED 显示模块
OLED 显示模块的显示功能强大,可显示大量文字图形显示多样,清晰可见,显示质量高没有电磁辐射,可视面积大, 数字接口,匀称小巧, 功耗小。 应用范围较广,常被用于智能手表,智能手环等设备的显示。 相对于 LCD 来说, OLED 是自发光的,不需要背光。

方案 2: 采用点阵式数码管显示
动态显示,即各位数码管轮流点亮, 对于显示器各位数码管, 每隔一段延时时间循环点亮一次,利用人的视觉暂留功能可以看到整个显示,但需保证扫描速度足够快,人的视觉暂留功能才可察觉不到字符闪烁, 显示器的亮度与导通电流、 点亮时间及间隔时间的比例有关。 调整参数可以实现较高稳定度的显示,动态显示节省了 I/O 口,降低了能耗。

从节省单片机芯片 I/O 口和降低能耗角度出发,本设计采用 OLED 显示。

2.3 温湿度模块的选择方案
湿度测量模块选择: DHT11 传感器包括 1 个电阻式感湿元件和 1 个 NTC 测温元件,并与 1 个高性能 8 位单片机相连接。单线制串行接口,使系统连接可以更简洁。功耗极低,信号传输距离可达 20 m 以上。作为一种新型的单总线数字温湿度传感器, DHT11 具有体积小、功耗低、响应速度快、抗干扰能力强、控制简单、性价比高等优点,能够广泛应用于各个领域。

温度测量模块的选择: DS18B20 的测温范围-55℃~ 125℃,分辨率最大可达0.0625 ℃。 DS18B20 可以直接读出被测温度值。而且采用 3 线制与单片机相连,减少了外部硬件电路,具有低成本和易使用的特点。 DS18B20 是 Dallas 半导体公司的数字化温度传感器,它是一种支持 “一线总线”接口的温度传感器。 支持联网寻址,简单的网络化的温度感知,零功耗等待等特点。 相比于 DHT11 温湿度模块的温度测量, DS18B20 温
度模块测量的温度更加精准,误差小。

因此,本设计采用 DHT11 温湿度模块和 DS18B20 温度模块分别作为湿度测量和温度测量使用。

3 整体电路设计
本设计采用 STM32F103C8T6 作为 MCU,由内部的实时时钟(RTC) 实现日历功能,利用外部连接的 DHT11 温湿度传感器和 DS18B20 温度传感器模块作为信号采集,并在 OLED上进行显示。

3.1 整体电路框图
略。

3.2 整体电路接线图
略。

4 单元电路设计
4.1 单片机的介绍
本设计采用的是 STM32F103C8T6 最小系统板, 该单片机是基于 ARM Cortex-M3 内核的微控制器,主作用是程序的执行和外部电路的控制。

4.1.1 MCU
STM32F103C8T6 单片机是基于 ARM Cortex-M3 内核的微控制器,主要作用是程序的执行和外部电路的控制。

4.1.2 晶振电路
为了提供更为精准的时钟信号,单片机采用外置时钟电路,主要由晶振、电容、电阻构成的。单片机内部振荡器在外部晶振、电容的作用下产生自激振荡,为单片机提供12MHz 的正弦信号。时钟电路相当于单片机的心脏,它的每一次跳动(振荡节拍)都控制着单片机执行代码的工作节奏。振荡得慢时,系统工作速度就慢;振荡得快时,系统工作速度就快。

4.1.3 复位电路
最简单的复位电路由电容串联电阻构成;。电容的电压不能突变的,当系统一上电,单片机的 RST 脚将会出现一个持续的高电平。并且,这个高电平持续的时间由电路的电容值来决定。 STM32 单片机的 RST 脚检测持续到 20us 以上的高电平后,会对单片机进行复位操作。所以,适当组合 RC 的取值就可以保证可靠的复位。

4.1.4 系统电源
由于我们使用的电源适配器产生的直流电压为 5V,单片机的工作电压为 3.3V。所以需要对电压进行降压处理。

4.1.5 SWD 调试下载接口
此电路可供用户进行程序调试和下载。
在设计中, 单片机的硬件接线如图所示
略。

4.2 OLED 显示模块介绍
本次设计采用的 IIC 接口的 0.96 寸 OLED,该 OLED 的分辨率为 128*64, 屏幕为黄蓝屏,黄屏为屏上的 1/4 部分为黄光,下 3/4 部分为蓝光,颜色和显示区域无法修改。

  1. GND 接地
  2. VCC 电源(3 ~ 5.5 V)
  3. SCL OLED 的 D0 脚,在 IIC 通信中为时钟管脚
  4. SDA OLED 的 D1 脚,在 IIC 通信中为数据管脚
    在设计中, OLED 显示模块的硬件接线如图所示
    略。

4.3 DHT11 温湿度传感器介绍
DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个 NTC 测温元件,并与一个高性能 8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比高等优点。每个 DHT11 传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式存在 OTP 内存中,传感器内部在检测型号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,使其成为该类应用甚至最为苛刻的应用场合的最佳选择。产品为 3 针单排引脚封装,连接方便。

在设计中,该温湿度传感器模块的硬件接线如图所示:
略。

4.4 DS18B20 温度传感器介绍
DS18B20 温度传感器具有体积小,硬件开销低,抗干扰能力强,精度高的特点,主要根据应用场合的不同而改变其外观,可用于电缆沟测温、锅炉测温、机房测温、农业大棚测温等各种非极限温度场合,适用于各种狭小空间设备数字测温和控制领域。

在设计中,该温度传感器模块的硬件接线如图所示:
略。

5 软件编程设计
5.1 主程序流程图
略。

5.2 OLED 显示程序设计
显示部分程序的设计步骤为,先确定 OLED 在 STM32 的 IO 连接方式; 然后初始化OLED,即向内写入一系列的设置程序, 来启动 OLED 的显示; 之后对显示部位进行相关的配置;最后通过调用字库等进行显示并配置相关的字符,汉字等。

5.3 时钟程序设计
基于 ARM Cortex-M3 内核的 STM32 其本身包含一个独立的定时器——实时时钟(RTC),由于其拥有一组连续的计数器这一特性,我们就可以通过在相应软件的配置下,来实现时钟日历的功能。若想重新设置系统当前的时间和日期,则可通过修改计数器值的方法来实现。该款单片机的 RTC 模块和时钟配置系统(RCC_BDCR 寄存器)处于后备区域(BKP),这将导致系统复位或从待机模式中唤醒后,对后备寄存器和 RTC 的访问被禁止,之前对 RTC 模块的设置和时间会不会出现变化。其优点在于防止对于后备区域意外的写操作。

RTC 的组成包含两个部分,第一部分是 APB1 接口,除了用于和 APB1 总线相连,还包含一组 16 位的寄存器,是通过 APB1 总线来对其进行读写操作。这一部分是由APB1 总线时钟驱动来与 APB1 总线接口的。第二部分是 RTC 核心,由一组可编程计数器组成,主要分为两个模块: RTC 预分频模块和一个 32 位的可编程计数器。其中 RTC预分频模块包含一个 20 位的可编程分频器被称作为 RTC 预分频器,如果在 RTC_CR 寄存器中将相应的位设置为允许位,就会在每个 TR_CLK 周期 RTC 产生一个秒中断。模块二可以被初始化为当前的系统时间,将系统的时间按 TR_CLK 周期累加并与存储在RTC_ALR 寄存器中的可编程时间进行比较,如果 RTC_CR 控制寄存器相应位设置成允许
位,在比较匹配时就会产生一个闹钟中断。

总体来说 RTC 包含以下几个特性:
(1)可编程的预分频系数最高可达 2^20。
(2)2 个分离的时钟: PCLK1 和 RTC 时钟(RTC 时钟的频率必须要小于 PCLK1 时钟频率的 14 以上)。
(3)可用于较长时间段进行测量的 32 位可编程计数器。
(4)包含三种 RTC 的时钟源: HSE 时钟除以 128;LSE 低速外部时钟; LSI 低速内部时钟。
(5)由系统复位的 APB1 接口而 RTC 核心(预分频器、闹钟、计数器和分频器)只能由后备域复位,这两者之间是相互独立。
(6)专门的可屏蔽中断包含 3 个:闹钟中断–用来产生一个软件可编程的闹钟中断;秒中断–用来产生一个可编程的周期性中断信号(最长可达 1 秒) ;溢出中断–指示内部可编
程计数器溢出并回转为 0 的状态。

RTC 的简化框图如图所示:
略。

在进行编写 RTC 时钟程序时是以 1970 年 1 月 1 日为基准, 把输入的时间转换为秒
钟,程序编写的合法年份是 1970-2099 年。星期的判断是利用蔡勒(Zeller)公式:

w=y+[y4]+[c4]-2c+[26(m+1)10]+d-1,

式中的符号含义如下
w:星期;
c:世纪-1;
y:年(后两位数);
m:月(m 大于等于 3,小于等于 14,即在蔡勒公式中,某年的 1、 2 月要看作上一年的13、 14 月来计算,比如 2003 年 1 月 1 日要看作 2002 年的 13 月 1 日来计算);
d:日;
[]代表取整,即只要整数部分。将算出来的 w 除以 7(若算出的 w 是负数则将 w 加 7 直至 w 大于零后再除以 7),余数是几就是星期几。如果余数是 0,则为星期日。

时钟的程序流程图如图所示:
略。

5.4 温度传感器模块的程序设计
DS18B20 的 64 位序列号排列是:前 8 位是产品家族码,接着 48 位是 DS18B20的序列号,最后 8 位是前面 56 位的循环冗余校验码(CRC=X8+X5 +X4 +1)。 ROM 作用是使每一个 DS18B20 都各不相同,这样就可实现一根总线上挂接多个。

所有的单总线器件要求采用严格的信号时序,以保证数据的完整性。 DS18B20 共有6 种信号类型:复位脉冲、应答脉冲、写 0、写 1、读 0 和读 1。所有这些信号,除了应答脉冲以外, 都由主机发出同步信号。并且发送所有的命令和数据都是字节的低位在前。

1)复位脉冲和应答脉冲
单总线上的所有通信都是以初始化序列开始。主机输出低电平,保持低电平时间至少 480us,以产生复位脉冲。接着主机释放总线, 4.7K 的上拉电阻将单总线拉高,延时15~60 us, 并进入接收模式(Rx)。接着 DS18B20 拉低总线 60~240 us,以产生低电平应答脉冲, 若为低电平,再延时 480 us。

2)写时序
写时序包括写 0 时序和写 1 时序。所有写时序至少需要 60us,且在 2 次独立的写时序之间至少需要 1us 的恢复时间,两种写时序均起始于主机拉低总线。写 1 时序:主机输出低电平, 延时 2us,然后释放总线,延时 60us。写 0 时序:主机输出低电平,延时 60us,然后释放总线, 延时 2us。

3)读时序
单总线器件仅在主机发出读时序时,才向主机传输数据,所以,在主机发出读数据命令后, 必须马上产生读时序,以便从机能够传输数据。所有读时序至少需要 60us,且在 2 次独立的读时序之间至少需要 1us 的恢复时间。每个读时序都由主机发起,至少拉低总线 1us。主机在读时序期间必须释放总线,并且在时序起始后的 15us 之内采样总线状态。典型的读时序过程为: 主机输出低电平延时 2us,然后主机转入输入模式延时12us,然后读取单总线当前的电平,然后延时 50us。

DS18B20 的典型温度读取过程为:复位——发 SKIP ROM 命令(0XCC) ——发开始转换命令(0X44) ——延时——复位——发送 SKIP ROM 命令(0XCC) ——发读存储器命令(0XBE) ——连续读出两个字节数据(即温度)——结束。

5.5 温湿度传感器模块的程序设计
DHT11 数字湿温度传感器采用单总线数据格式。即,单个数据引脚端口完成输入输出双向传输。其数据包由 5Byte(40Bit)组成。数据分小数部分和整数部分,一次完整的数据传输为 40bit,高位先出。 DHT11 的数据格式为: 8bit 湿度整数数据+8bit 湿度小数数据+8bit 温度整数数据+8bit 温度小数数据+8bit 校验和。其中校验和数据为前四个字节相加。 传感器数据输出的是未编码的二进制数据。数据(湿度、温度、整数、小数)之间应该分开处理。
例如:某次从 DHT11 读到的数据如图所示:
由以上数据就可得到湿度和温度的值,计算方法:
湿度= byte4 . byte3=45.0 (%RH)
温度= byte2 . byte1=28.0 ( ℃)
校验= byte4+ byte3+ byte2+ byte1=73(=湿度+温度)(校验正确)
可以看出, DHT11 的数据格式是十分简单的, DHT11 和 MCU 的一次通信最大为 3ms 左右, 建议主机连续读取时间间隔不要小于 100ms。

DHT11 的数据发送流程如图所示:
略。

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

6 系统联调设计
程序调试主要以软件调试和在开发板上进行实际运行两种方式相结合。软件调试时现在 MDK5 上进行程序的编写、调试,找出程序中命令的错误并修改。当软件调试无错误后生成以.hex 结尾的文件,再将此文件通过 ST LINK 烧录到开发板的STM32F103C8T6芯片上,观察运行结果是否和自己期望的结果相同,如若不同可找到程序中该不同的部分进行修改,直至达到自己的要求。

实际运行结果如图所示:
略。

在屏幕顶端中间显示汉字点阵为 16*16 的“智能万年历”, 第二行显示对应的年月日和星期,第三行显示时分秒和湿度,在最后一行显示温度和作者的信息。

该设计基本能够实现设计要求。

7 心得体会
本次设计的智能万年历系统采用了模块化设计方式,以单片机 STM32F103C8T6 作为主控制模块, OLED 作为液晶显示模块,内部的 RTC 时钟作为实施时钟模块, DS18B20 作为温度模块, DHT11 作为湿度传感器模块。 整体程序的开发方式是基于固件库开发, 每一个模块的逻辑清晰,目的明确,结构简单,易于编写,调试和修改, 程序的可读性强,可以很方便的对程序在保持主体不变的前提下进行局部修改,以达到更好的显示。

由于设计者水平和设计时间有限,该智能万年历的设计还存在很多不足之处,如没有自定义修改时间,整点报时,音乐闹钟等功能。

在设计之初,由于本人第一次接触到 STM32 实物,对于焊接、 电路设计、程序编写、 调试和修改方面存在很多问题,买来的模块也曾因操作不当导致毁坏。在经过向同学和老师请教,以及上网查找资料,论坛发帖等方式,顺利地完成了设计。 通过本次设计,第一次接触到了嵌入式实物的设计, 使我迈向嵌入式方向了一大步,希望在接下来的时间,继续深入的学习嵌入式的相关知识和操作。

8 参考文献
[1]张勇, ARM Cortex-M3 嵌入式开发与实践——基于 STM32F103[M]北京: 清华大学出版社, 2017
[2]正点原子.STM32F1 开发指南(库函数版)
[3]周立功等.ARM 嵌入式系统基础教程[M]北京:北京航空航天大学出版社, 2005.1
[4]刘鹏程基于 ARM 的温度测量系统[J.科技信息, 2008(18):77-78
[5]李宁基于 MDK 的 STM32 处理器开发应用[M]北京航空航天大学出版社, 2008

基于STM32的智能万年历设计相关推荐

  1. 智能手环功能模块设计_基于STM32实现智能手环设计

    龙源期刊网 http://www.qikan.com.cn 基于 STM32 实现智能手环设计 作者:付海生 陈婷婷 韩百科 涂曾兵 来源:<科学导报 · 学术> 2017 年第 10 期 ...

  2. 【毕业设计】基于STM32的智能路灯设计与实现 - 物联网 嵌入式 单片机

    文章目录 1 简介 2 绪论 2.1 项目背景 2.2 需求分析 3 系统设计 3.1 功能设计 3.1.1 系统角色分析 3.1.2 开发环境 3.2 总体设计 3.3 硬件部分 3.3.1 整体架 ...

  3. 基于STM32的智能储物柜设计

    本设计是基于STM32的智能储物柜设计,主要实现以下功能: 1.实现快递箱.快递员和客户之间的手机通信功能 2.实现设置6位密码.密码开锁 3.实现快递箱控制,区分箱体大.中.小 4.实现OLED显示 ...

  4. 基于STM32的智能鞋柜设计与实现--“臭臭没了”

    Hello,大家好,我是阿金,本文仅供参考,提供一些建议.如有不对,还请指正.谢谢~ 随着5G网络的迅速普及,"万物联网"的时代指日可待.针对传统鞋柜及目前市场上现有的智能鞋柜功能 ...

  5. 【毕业设计】基于STM32的智能台灯设计 物联网 电子信息 APP远程控制

    文章目录 一.项目简介 二.项目组成 三.原理图设计 四.源码设计 五.APP设计 六.成品展示 视频教程 1.项目开题 2.原理图讲解 3.程序讲解 4.实物展示 一.项目简介 本设计是基于一款ST ...

  6. 基于STM32的智能窗户设计

    基于STM32智能窗户设计 程序编译器:keil 5 编程语言:C语言 编号C0006 [腾讯文档]C0006 网盘链接 资料下载链接 功能说明: 1.智能模式:传感器采集的风力.雨水.温度.湿度.P ...

  7. 基于STM32的智能加湿器设计

    一.任务简述 本次设计采用基于单片机的智能加湿器系统,以STM32F103C8T6和温湿度传感器DHT11为核心,通过湿度传感器采集和转换温湿度信号,再利用单片机进行数据分析和处理,实现智能开启和关闭 ...

  8. 基于STM32的智能电子秤设计

    硬件设计 本设计是一款基于STM32单片机的电子秤系统,随着科学技术的不断发展,传统的机械秤逐渐被电子秤所取代,相比于计量不精确,费时费力的机械秤,电子秤采用在方便快捷的同时,又保证了结果的准确性.本 ...

  9. 基于stm32蓝牙智能小车设计

    前言: 本文描述了一个由STM32微处理器.步进电机.蓝牙,L298N等模块构成的.该系统采用STM32微处理器为核心,在MDK环境下进行编程,通知控制L298N模块IN1~IN4引脚的高低电平进而控 ...

最新文章

  1. iOS布局-autoresizingMask
  2. Can not find the tag library descriptor for http://www.springframework.org/tags/form 解决方法
  3. 视频 | BIM数据中心模型
  4. cdoj844-程序设计竞赛 (线段树的区间最大连续和)【线段树】
  5. python test suit_python unittest学习3---添加测试套件,testsuit
  6. Matlab生成动态链接库供C#调用
  7. 好用的php空间,推荐国内三个优质的免费PHP空间
  8. 使用火狐的restclient发送http接口post及get请求
  9. 程序员菜鸟到高手的11个阶段,你处于哪个阶段?
  10. 光猫(吉比特h2-2)超级用户名与密码
  11. win10如何局部截图
  12. OpenCV - 10 开发一个视频切割成图片的软件
  13. oracle ovm配置使用
  14. 直播带货系统的六大热门功能模块概述
  15. PHP微信公众号开发之:获得和缓存access_token,原理及代码
  16. ITIL工具系列之Tivoli
  17. 2020年,最优秀的大数据公司有哪些?
  18. 【PTA~L1-080 乘法口诀数列】
  19. ACCU天气API以及Okhttp、Retrofit、RxJava的使用
  20. pe中怎么卸载服务器系统更新,如何卸载win7系统更新用pe装win7

热门文章

  1. 新浪博客服务器是不是在维护,新浪博客外推接单,新浪博客界面为什么总是打不开?...
  2. 春节晚会告诉我们要占领东京
  3. 2020 Java开发者数据分析:中国已成为 Java 第一大国
  4. php抓取今日头条,分析Ajax来抓取今日头条街拍美图
  5. Linux Ubuntn环境下---Redis缓存的安装和启动
  6. php优秀表格样式,用html和css代码实现各种表格样式的总结
  7. 实用围棋作战理论——围棋十诀,据说是从唐朝流传下来的哦
  8. 青山依旧在,几度夕阳红
  9. delete called on non-final ‘xxx‘ that has virtual functions but non-virtual destructor
  10. webgl火焰特效(证实可用)