使用STM32制作数字温度计

一、读取STM32F103C8T6 内部的时钟,日历,通过串口输出到PC上位机

1. STM32F103的RTC(实时时钟)原理

STMicroelectronics的STM32F103系列是一系列基于ARM Cortex-M3内核的32位微控制器,其中包含了实时时钟(RTC)模块,用于提供精确的实时时钟和日期信息。以下是STM32F103的RTC原理的基本概述:

RTC模块的基本结构:

RTC时钟源: RTC模块的时钟源可以选择使用低速外部晶体振荡器(LSE)或低速内部振荡器(LSI)。LSE通常连接到32.768kHz的外部晶振,提供高精度的时钟。
时钟和日历计数器: RTC模块包含一个32位的时钟和日历计数器,用于存储秒、分钟、小时、日期、月份和年份等信息。这些计数器可以通过读写相关寄存器进行配置和访问。
时钟和日历分频器: 时钟和日历分频器允许将RTC时钟频率分频为不同的时间单元,例如秒、分钟、小时等。这有助于准确计时和日期跟踪。
RTC中断: RTC模块可以产生不同类型的中断,例如秒中断、闹钟中断等。这些中断可以用于唤醒系统、进行时间戳记录等应用。

RTC的工作原理:

时钟初始化: 在使用RTC之前,需要对RTC时钟源进行初始化。可以选择使用外部晶振(LSE)或内部振荡器(LSI),并配置相应的时钟分频器。
时钟和日期设置: 可以通过写入寄存器设置RTC的初始时间和日期。这包括秒、分钟、小时、日期、月份和年份等信息。
时钟运行: 一旦配置完成,启动RTC时钟,它开始从初始时间点递增。RTC模块负责自动更新时钟和日期计数器。
中断处理: RTC模块可以配置为在达到特定时间或日期时生成中断。中断可以用于唤醒系统、进行特定任务等。
备份寄存器: RTC模块通常提供一些备份寄存器,用于存储在备份电源下保持的持久性数据。这对于在系统掉电时保留一些关键信息非常有用。
校准: RTC模块通常允许进行时钟的校准,以确保高精度的时间计数。
低功耗模式: RTC模块通常能够在系统进入低功耗模式时继续运行,以提供实时时钟功能。
通过合理配置和使用STM32F103的RTC模块,可以实现准确、稳定的实时时钟功能,适用于各种需要时间跟踪和日期计算的应用场景。

2.使用STM32CubeMX配置项目

1.在STM32CubeMX中选择相应芯片
这里使用STM32F103C8芯片进行实现

2.配置RCC

3.配置RTC

4.配置USART1

8.配置时钟

9.在项目设置中进行如下设置

设置完成后,点击右上角GENERATE CODE 进行输出。

3、在keil中进行编程

1.修改main.c文件
配置头文件

编写函数fputc

在while中编写代码

2.编译

3.烧录

4.效果展示

二、使用OLED显示AHT20的温度和湿度,日历

1.编写bsp_i2c.c中的read_AHT20函数

void read_AHT20(void)
{
	uint8_t   i;
	for(i=0; i<6; i++)
	{
		readByte[i]=0;
	}

	//-------------
	I2C_Start();

	I2C_WriteByte(0x71);
	ack_status = Receive_ACK();
	readByte[0]= I2C_ReadByte();
	Send_ACK();

	readByte[1]= I2C_ReadByte();
	Send_ACK();

	readByte[2]= I2C_ReadByte();
	Send_ACK();

	readByte[3]= I2C_ReadByte();
	Send_ACK();

	readByte[4]= I2C_ReadByte();
	Send_ACK();

	readByte[5]= I2C_ReadByte();
	SendNot_Ack();
	//Send_ACK();

	I2C_Stop();

	//--------------
	if( (readByte[0] & 0x68) == 0x08 )
	{
		H1 = readByte[1];
		H1 = (H1<<8) | readByte[2];
		H1 = (H1<<8) | readByte[3];
		H1 = H1>>4;

		H1 = (H1*1000)/1024/1024;

		T1 = readByte[3];
		T1 = T1 & 0x0000000F;
		T1 = (T1<<8) | readByte[4];
		T1 = (T1<<8) | readByte[5];

		T1 = (T1*2000)/1024/1024 - 500;

		AHT20_OutData[0] = (H1>>8) & 0x000000FF;
		AHT20_OutData[1] = H1 & 0x000000FF;

		AHT20_OutData[2] = (T1>>8) & 0x000000FF;
		AHT20_OutData[3] = T1 & 0x000000FF;
	}
	else
	{
		AHT20_OutData[0] = 0xFF;
		AHT20_OutData[1] = 0xFF;

		AHT20_OutData[2] = 0xFF;
		AHT20_OutData[3] = 0xFF;
		printf("lyy");

	}

	t=T1/10;
	t1=T1%10;
	a=(float)(t+t1*0.1);
	h=H1/10;
	h1=H1%10;
	b=(float)(h+h1*0.1);
	sprintf(strTemp,"%.1f",a);  
    sprintf(strHumi,"%.1f",b);    
	GUI_ShowCHinese(16,00,16,"温湿度",1);
	GUI_ShowCHinese(16,20,16,"温度",1);
	GUI_ShowString(53,20,strTemp,16,1);
	GUI_ShowCHinese(16,38,16,"湿度",1);
	GUI_ShowString(53,38,strHumi,16,1);
	delay_ms(1500);		
	delay_ms(1500);
}

2.编写main.c文件

#include "delay.h"
#include "usart.h"
#include "bsp_i2c.h"
#include "sys.h"

#include "oled.h"
#include "gui.h"
#include "test.h"

int main(void)
{	
	delay_init();	    	        	  
	uart_init(115200);	 
	IIC_Init();
		  
	NVIC_Configuration(); 	  	
	OLED_Init();			        
	OLED_Clear(0); 
	while(1)
	{
		
		read_AHT20_once();
		OLED_Clear(0); 
		delay_ms(1500);
  }
}

3.在oledfont.h文件中输入
例:

	"温",0x00,0x00,0x23,0xF8,0x12,0x08,0x12,0x08,0x83,0xF8,0x42,0x08,0x42,0x08,0x13,0xF8,
  0x10,0x00,0x27,0xFC,0xE4,0xA4,0x24,0xA4,0x24,0xA4,0x24,0xA4,0x2F,0xFE,0x00,0x00,/*"ÎÂ",0*/
	"度",0x01,0x00,0x00,0x80,0x3F,0xFE,0x22,0x20,0x22,0x20,0x3F,0xFC,0x22,0x20,0x22,0x20,
  0x23,0xE0,0x20,0x00,0x2F,0xF0,0x24,0x10,0x42,0x20,0x41,0xC0,0x86,0x30,0x38,0x0E,/*"¶È",0*/

4.实现效果

三、总结

实验首先涉及到硬件的连接,包括选择合适的温度传感器并将其连接到STM32微控制器。在此过程中,我学到了如何正确选择传感器,并理解了不同传感器的工作原理和特性STM32CubeMX和HAL库的使用提供了便捷的配置和初始化工具。通过图形界面进行引脚分配、时钟配置等操作,极大地简化了初始化过程,减少了出错的可能性。大多数数字温度传感器使用I2C或SPI等通信协议与微控制器进行数据交互。在实验中,我学到了如何在STM32中配置和使用这些通信接口,以确保可靠的数据传输。利用串口通信或者LCD等外设,实现了实时监控和显示温度数据。这提供了一种方便的方式,可以随时了解系统测量到的温度值。

四、参考

STM32通过RTC实现日历

作者:Yokuershi

物联沃分享整理
物联沃-IOTWORD物联网 » 使用STM32制作数字温度计

发表回复