一.实验内容:
阅读资料了解 STM32F103的RTC(实时时钟)原理,使用带SPI或IIC接口的OLED屏显模块实现以下功能:
1) 读取STM32F103C8T6 内部的时钟(年月日时分秒),日历(星期x),1秒周期,通过串口输出到PC上位机,;
2) 读取AHT20的温度和湿度,通过OLED,把年月份时分秒、日历和实时温度、湿度显示出来,2秒周期。
二.实验目的:
1) 理解并配置 STM32F103C8T6 的 RTC (实时时钟) 模块,实现对内部时钟的读取和日历信息的获取。
2) 了解并配置 SPI/I2C 接口,连接并操作 OLED 屏显模块,实现时间、日期、温度和湿度的显示。
3) 使用串口通信将 STM32F103C8T6 的内部时钟信息传输到 PC 上位机上,以便进一步分析和处理。
4) 了解并配置 AHT20 温湿度传感器的通信接口,实现温度和湿度的读取。
5) 掌握数据处理和显示控制的技巧,将获取到的时间、日期、温度和湿度信息在 OLED 屏显模块上进行实时显示。
三.实验具体步骤:
温度传感器
OLED显示屏——SSD1360
OLED是一种采用自发光原理的显示技术,在高对比度、响应速度快和低功耗等方面具有优势。SSD1306是一种常用的OLED控制芯片,主控器可以通过其提供的I2C或SPI接口与之通信。SSD1306支持多种分辨率设置和颜色显示,并具有一些特殊功能,例如显示缓冲区、屏幕翻转和亮度调节等。OLED广泛应用于便携设备、智能穿戴设备、电子产品、工业控制、车载显示等领域。
STM32F103C8T6
STM32F103C8T6属于STM32F1系列,其采用了ARM Cortex-M3内核,拥有最高72MHz的工作频率。该芯片提供了64KB的闪存和20KB的SRAM,并配备了丰富的外设资源,包括通用定时器、PWM输出、多种通信接口等。此外,它还具备大量的GPIO引脚,为用户提供了灵活的连接能力。STM32F103C8T6的供电电压范围为2.V至3.6V,可在-40℃至+85℃的工作温度范围内正常运行。由于其性能和价格的平衡,该芯片在嵌入式系统、物联网、工业控制以及自动化等领域得到了广泛应用。
软件设计:
先初始化STM32微控制器、AHT20传感器和SSD1306 OLED显示屏,建立它们之间的通信连接。然后利用STM32微控制器读取AHT20传感器的温度和湿度数据。再使用STM32内部时钟或外部时钟模块,获取当前时间。对获取到的温度、湿度和时间数据进行处理,以确保数据的准确性和可用性。最后将处理后的数据通过SSD1306 OLED显示屏实时展示,包括时间、温度和湿度信息。 通过循环结构,持续更新和刷新显示的数据,以确保数据保持实时性。
通过这样的硬件和软件设计,我们能够实现STM32微控制器与OLED显示屏协同工作,呈现实时的时间、温度和湿度信息。这个设计旨在帮助用户便捷获取环境信息,实现实时监测和调整。同时,展示了STM32微控制器和OLED显示屏的强大功能和灵活性,为用户提供了一个实用而易于操作的解决方案。
实验代码:
AHT20代码:
/*******************************************/
/*@????:?????????? */
/*@??:????????? */
/*@??:V1.2 */
/*******************************************/
//#include "main.h"
#include "AHT20.h"
#include "gpio.h"
#include "i2c.h"
void Delay_N10us(uint32_t t)//????
{
uint32_t k;
while(t--)
{
for (k = 0; k < 2; k++);//110
}
}
void SensorDelay_us(uint32_t t)//????
{
for(t = t-2; t>0; t--)
{
Delay_N10us(1);
}
}
void Delay_4us(void) //????
{
Delay_N10us(1);
Delay_N10us(1);
Delay_N10us(1);
Delay_N10us(1);
}
void Delay_5us(void) //????
{
Delay_N10us(1);
Delay_N10us(1);
Delay_N10us(1);
Delay_N10us(1);
Delay_N10us(1);
}
void Delay_1ms(uint32_t t) //????
{
while(t--)
{
SensorDelay_us(1000);//??1ms
}
}
//void AHT20_Clock_Init(void) //????
//{
// RCC_APB2PeriphClockCmd(CC_APB2Periph_GPIOB,ENABLE);
//}
void SDA_Pin_Output_High(void) //?PB7????? , ???????, PB7??I2C?SDA
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;//????
GPIO_InitStruct.Pin = GPIO_PIN_7;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB