基于STM32的智能万年历设计
[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: 采⽤点阵式数码管显⽰
动态显⽰,即各位数码管轮流点亮, 对于显⽰器各位数码管, 每隔⼀段延时时间循游击队之歌合唱
环点亮⼀次,利⽤⼈的视觉暂留功能可以看到整个显⽰,但需保证扫描速度⾜够快,⼈3
的视觉暂留功能才可察觉不到字符闪烁, 显⽰器的亮度与导通电流、 点亮时间及间隔时
间的⽐例有关。 调整参数可以实现较⾼稳定度的显⽰,动态显⽰节省了 I/O ⼝,降低了
能耗。
从节省单⽚机芯⽚ I/O ⼝和降低能耗⾓度出发,本设计采⽤ OLED 显⽰。
2.3 温湿度模块的选择⽅案
湿度测量模块选择: DHT11 传感器包括 1 个电阻式感湿元件和 1 个 NTC 测温元件,并
与 1 个⾼性能 8 位单⽚机相连接。单线制串⾏接⼝,使系统连接可以更简洁。功耗极
低,信号传输距离可达 20 m 以上。作为⼀种新型的单总线数字温湿度传感器, DHT11 具
有体积⼩、功耗低、响应速度快、抗⼲扰能⼒强、控制简单、性价⽐⾼等优点,能够⼴
痞幼吹笛6分钟泛应⽤于各个领域。
温度测量模块的选择: DS18B20 的测温范围-55℃~ 125℃,分辨率最⼤可达
0.0625 ℃。 DS18B20 可以直接读出被测温度值。⽽且采⽤ 3 线制与单⽚机相连,减少了
外部硬件电路,具有低成本和易使⽤的特点。 DS18B20 是 Dallas 半导体公司的数字化
温度传感器,它是⼀种⽀持 “⼀线总线”接⼝的温度传感器。 ⽀持联⽹寻址,简单的⽹
络化的温度感知,零功耗等待等特点。 相⽐于 DHT11 温湿度模块的温度测量, DS18B20 温度模块测量的温度更加精准,误差⼩。
因此,本设计采⽤ DHT11 温湿度模块和 DS18B20 温度模块分别作为湿度测量和温度
测量使⽤。4
3 整体电路设计
try名扬四海歌词本设计采⽤ STM32F103C8T6 作为 MCU,由内部的实时时钟(RTC) 实现⽇历功能,利
⽤外部连接的 DHT11 温湿度传感器和 DS18B20 温度传感器模块作为信号采集,并在 OLED 上进⾏显⽰。
3.1 整体电路框图
STM32F103C8T6
单⽚机
OLED 显⽰
DHT11 温湿度模块湿
度测量
DS18B20 温度模块温
度测量5
3.2 整体电路接线图6
4 单元电路设计
4.1 单⽚机的介绍
本设计采⽤的是 STM32F103C8T6 最⼩系统板, 该单⽚机是基于 ARM Cortex-M3 内核
的微控制器,主作⽤是程序的执⾏和外部电路的控制。
4.1.1 MCU
STM32F103C8T6 单⽚机是基于 ARM Cortex-M3 内核的微控制器,主要作⽤是程序的
执⾏和外部电路的控制。
4.1.2 晶振电路
为了提供更为精准的时钟信号,单⽚机采⽤外置时钟电路,主要由晶振、电容、电
阻构成的。单⽚机内部振荡器在外部晶振、电容的作⽤下产⽣⾃激振荡,为单⽚机提供
12MHz 的正弦信号。时钟电路相当于单⽚机的⼼脏,它的每⼀次跳动(振荡节拍)都控制着
单⽚机执⾏代码的⼯作节奏。振荡得慢时,系统⼯作速度就慢;振荡得快时,系统⼯作速
度就快。7
4.1.3 复位电路
最简单的复位电路由电容串联电阻构成; 电容的电压不能突变的,当系统⼀上电,单
⽚机的 RST 脚将会出现⼀个持续的⾼电平,并且,这个⾼电平持续的时间由电路的电容值
来决定。 STM32 单⽚机的 RST 脚检测持续到 20us 以上的⾼电平后,会对单⽚机进⾏复位操作。所以,适当组合 RC 的取值就可以保证可靠的复位。
ryangosling
4.1.4 系统电源
由于我们使⽤的电源适配器产⽣的直流电压为 5V,单⽚机的⼯作电压为 3.3V。所以
需要对电压进⾏降压处理。89
4.1.5 SWD 调试下载接⼝
此电路可供⽤户进⾏程序调试和下载。
在设计中, 单⽚机的硬件接线如图所⽰
欣然撮合武艺舒妃
4.2 OLED 显⽰模块介绍
本次设计采⽤的 IIC 接⼝的 0.96 ⼨ OLED,该 OLED 的分辨率为 128*64, 屏幕为黄
蓝屏,黄屏为屏上的 1/4 部分为黄光,下 3/4 部分为蓝光,颜⾊和显⽰区域⽆法修改。10
1. GND 接地
2. VCC 电源(3 ~ 5.5 V)
3. SCL OLED 的 D0 脚,在 IIC 通信中为时钟管脚
4. SDA OLED 的 D1 脚,在 IIC 通信中为数据管脚
在设计中, OLED 显⽰模块的硬件接线如图所⽰11
4.3 DHT11 温湿度传感器介绍
DHT11 数字温湿度传感器是⼀款含有已校准数字信号输出的温湿度复合传感器,它
应⽤专⽤的数字模块采集技术和温湿度传感技术,确保产品具有极⾼的可靠性和卓越的长期稳定性。传感器包括⼀个电阻式感湿元件和⼀个 NTC 测温元件,并与⼀个⾼性能 8位单⽚机相连接。因此该产品具有品质卓越、超快响应、抗⼲扰能⼒强、性价⽐⾼等优点。每个 DHT11 传感器都在极为精确的湿度校验室中进⾏校准。校准系数以程序的形式存在 OTP 内存中,传感器内部在检测型号的处理过程中要调⽤这些校准系数。单线制串⾏接⼝,使系统集成变得简易快捷。超⼩的体积、极低的功耗,使其成为该类应⽤甚⾄最为苛刻的应⽤场合的最佳选择。产品为 3 针单排引脚封装,连接⽅便。
在设计中,该温湿度传感器模块的硬件接线如图所⽰:12
4.4 DS18B20 温度传感器介绍
DS18B20 温度传感器具有体积⼩,硬件开销低,抗⼲扰能⼒强,精度⾼的特点,主要根据应⽤场合的不同⽽改变其外观,可⽤于电缆沟测温、锅炉测温、机房测温、农业⼤棚测温等各种⾮极限温度场合,适⽤于各种狭⼩空间设备数字测温和控制领域。
在设计中,该温度传感器模块的硬件接线如图所⽰:13
5 软件编程设计
5.1 主程序流程图
开始
初始化 OLED、系统时钟、
RTC、 各个模块等
判断是否初始
化完成
刷新时间
正常显⽰
结束
等待初始
是 化完成
否14
5.2 OLED 显⽰程序设计
显⽰部分程序的设计步骤为,先确定 OLED 在 STM32 的 IO 连接⽅式; 然后初始化OLED,即向内写⼊⼀系列的设置程序, 来启动 OLED 的显⽰; 之后对显⽰部位进⾏相关的配置;最后通过调⽤字库等进⾏显⽰并配置相关的字符,汉字等。
开始
配置 STM32 与 OLED 相连
的 IO ⼝的电⽓属性
初始化 OLED
通过编写设计程序将要显⽰的汉
字、字符等显⽰在屏幕的合适位置
结束15
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 的状态。16
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,则为星期⽇。
时钟的程序流程图如图所⽰:17
5.4 温度传感器模块的程序设计
DS18B20 的 64 位序列号排列是:前 8 位是产品家族码,接着 48 位是 DS18B20
的序列号,最后 8 位是前⾯ 56 位的循环冗余校验码(CRC=X8+X5 +X4 +1)。 ROM 作
⽤是使每⼀个 DS18B20 都各不相同,这样就可实现⼀根总线上挂接多个。
上瘾exo
所有的单总线器件要求采⽤严格的信号时序,以保证数据的完整性。 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) ——连续读出两个字节数据(即温度)——结束。18
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)时间后, 开始输出数据。1920
6 系统联调设计
程序调试主要以软件调试和在开发板上进⾏实际运⾏两种⽅式相结合。软件调试时
现在 MDK5 上进⾏程序的编写、调试,出程序中命令的错误并修改。当软件调试⽆错
误后⽣成以.hex 结尾的⽂件,再将此⽂件通过 ST LINK 烧录到开发板的 STM32F103C8T6芯⽚上,观察运⾏结果是否和⾃⼰期望的结果相同,如若不同可到程序中该不同的部
分进⾏修改,直⾄达到⾃⼰的要求。
实际运⾏结果如图所⽰:
在屏幕顶端中间显⽰汉字点阵为 16*16 的“智能万年历”, 第⼆⾏显⽰对应的年⽉⽇
和星期,第三⾏显⽰时分秒和湿度,在最后⼀⾏显⽰温度和作者的信息。
该设计基本能够实现设计要求。21
7 ⼼得体会
本次设计的智能万年历系统采⽤了模块化设计⽅式,以单⽚机 STM32F103C8T6 作为
主控制模块, OLED 作为液晶显⽰模块,内部的 RTC 时钟作为实施时钟模块, DS18B20 作为温度模块, DHT11 作为湿度传感器模块。 整体程序的开发⽅式是基于固件库开发, 每⼀个模块的逻辑清晰,⽬的明确,结构简单,易于编写,调试和修改, 程序的可读性强,
可以很⽅便的对程序在保持主体不变的前提下进⾏局部修改,以达到更好的显⽰。
由于设计者⽔平和设计时间有限,该智能万年历的设计还存在很多不⾜之处,如没
有⾃定义修改时间,整点报时,⾳乐闹钟等功能。
在设计之初,由于本⼈第⼀次接触到 STM32 实物,对于焊接、 电路设计、程序编
写、 调试和修改⽅⾯存在很多问题,买来的模块也曾因操作不当导致毁坏。在经过向同
学和⽼师请教,以及上⽹查资料,论坛发帖等⽅式,顺利地完成了设计。 通过本次设
计,第⼀次接触到了嵌⼊式实物的设计, 使我迈向嵌⼊式⽅向了⼀⼤步,希望在接下来
的时间,继续深⼊的学习嵌⼊式的相关知识和操作。22
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