数字温度计

一、实验目标

阅读资料了解 STM32F103的RTC(实时时钟)原理,使用带SPI或IIC接口的OLED屏显模块实现以下功能: 1) 读取STM32F103C8T6 内部的时钟(年月日时分秒),日历(星期x),1秒周期,通过串口输出到PC上位机,;2) 读取AHT20的温度和湿度,通过OLED,把年月份时分秒、日历和实时温度、湿度显示出来,2秒周期。

二、RTC介绍

在这里插入图片描述

​ RTC实图

RTC,全称Real-Time Clock,即实时时钟。它是一个计算机内部或外部的硬件设备,用于提供计算机系统的当前时间和日期。RTC不仅提供了秒、分、时、日、月、年的信息,还可以用来生成周期性的中断,如每秒一次或每分钟一次,以便操作系统调度任务。

RTC的核心是一个32位的可编程计数器,它可以对应到Unix时间戳的秒计数器。此外,还有一个20位的可编程预分频器,可以适配不同频率的输入时钟。

在嵌入式中,RTC扮演着重要的角色。它不仅为系统提供了准确的时间,还为系统的操作提供了可靠的依据。例如,在分布式系统中,RTC可以确保不同节点之间的时间同步,从而确保系统的一致性。此外,RTC还可以用于安全系统,如加密和身份验证,以及事件记录和审计。

然而,虽然RTC非常重要,但它并不是万无一失的。例如,如果电池供电不足,或者设备出现故障,RTC可能会停止工作或提供错误的时间。因此,在关键应用中,需要对RTC进行定期的维护和检查,以确保其正常工作。

RTC硬件电路如下:

在这里插入图片描述

三、基于HAL库利用RTC读取日期时间并输出到串口

3.1 配置CubeMX

在这里插入图片描述

3.2 RCC配置

在这里插入图片描述

3.3 RTC配置

在这里插入图片描述

3.4 设置时间

在这里插入图片描述

3.5 打开USART1,设置串口通信,设置为异步通信,同时开启中断

在这里插入图片描述

3.6 打开时钟,配置LSI低速内部时钟

在这里插入图片描述

3.7 生成工程

在这里插入图片描述

3.2 代码撰写

1.定义重定向printf函数,使其能够打印文字和数据到串口。同时定义年月日结构体以及时分秒结构体
#include "stdio.h"
int fputc(int ch,FILE *f){
 uint8_t temp[1]={ch};
 HAL_UART_Transmit(&huart1,temp,1,2);
 return ch;
}
RTC_DateTypeDef GetData;  //获取日期结构体

RTC_TimeTypeDef GetTime;   //获取时间结构体
2.编写while函数
 while (1)
  {
/* Get the RTC current Time */
	    HAL_RTC_GetTime(&hrtc, &GetTime, RTC_FORMAT_BIN);
      /* Get the RTC current Date */
      HAL_RTC_GetDate(&hrtc, &GetData, RTC_FORMAT_BIN);

      /* Display date Format : yy/mm/dd */
      printf("%02d/%02d/%02d\r\n",2000 + GetData.Year, GetData.Month, GetData.Date);
      /* Display time Format : hh:mm:ss */
		/* Display date Format : weekday */
		if(GetData.WeekDay==1){
			printf("星期一\r\n");
		}else if(GetData.WeekDay==2){
			printf("星期二\r\n");
		}else if(GetData.WeekDay==3){
			printf("星期三\r\n");
		}else if(GetData.WeekDay==4){
			printf("星期四\r\n");
		}else if(GetData.WeekDay==5){
			printf("星期五\r\n");
		}else if(GetData.WeekDay==6){
			printf("星期六\r\n");
		}else if(GetData.WeekDay==7){
			printf("星期日\r\n");
		}

      printf("%02d:%02d:%02d\r\n",GetTime.Hours, GetTime.Minutes, GetTime.Seconds);

      printf("\r\n");

      HAL_Delay(1000);

  }

3.3 实现结果

在这里插入图片描述

四、读取日期温湿度并在oled显示

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文件

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.实现效果

在这里插入图片描述

五、总结

​ 本次实验主要目的是读取STM32F103C8T6微控制器内部的时钟和日历信息,以及AHT20传感器的温度和湿度数据,并通过串口输出到PC上位机,和通过OLED显示屏实时显示时间、日历和温度、湿度信息。
​ 实验过程中,首先需要配置STM32F103C8T6的时钟系统,以便正确读取年月日时分秒信息。然后,使用AHT20传感器读取温度和湿度数据,并将其通过I2C接口传输给STM32F103C8T6。在每秒钟的固定时刻,STM32F103C8T6会通过串口将时间、日历和温度、湿度数据发送到PC上位机。同时,在OLED显示屏上实时显示这些信息。
​ 实验结果表明,该系统能够正确读取STM32F103C8T6的时钟和日历信息,以及成功在oled上AHT20传感器的温度和湿度数据。在实验过程中遇到了一些问题通过csdn和查阅有关资料都得到了有效的解决。本实验总结了实验过程中遇到的问题及解决方法,为今后的实验提供了参考。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值