STM32日历读取与温湿度显示

这篇具有很好参考价值的文章主要介绍了STM32日历读取与温湿度显示。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、RTC实时时钟原理

1、RTC简介

STM32的 RTC 外设(Real Time Clock),实质是一个掉电后还继续运行的定时器。
掉电:

掉电是指主电源 VDD断开的情况,为了 RTC外设掉电继续运行,必须接
上锂电池给 STM32 的 RTC、备份发卡通过 VBAT引脚供电。当主电源 VDD有效时,由 VDD
给 RTC 外设供电;而当 VDD掉电后,由 VBAT给 RTC 外设供电。但无论由什么电源供电,
RTC 中的数据都保存在属于 RTC 的备份域中,若主电源 VDD 和 VBAT 都掉电,那么备份域
中保存的所有数据将丢失。备份域除了 RTC 模块的寄存器,还有 42 个 16 位的寄存器可以
在 VDD 掉电的情况下保存用户程序的数据,系统复位或电源复位时,这些数据也不会被复
位。

2、RTC架构图

STM32日历读取与温湿度显示,stm32,单片机,嵌入式硬件

二、读取STM32内部时钟到PC

2.1 任务要求

读取STM32F103C8T6 内部的时钟(年月日时分秒),日历(星期x),1秒周期,通过串口输出到PC上位机

2.2 程序设计要点

1、初始化 RTC 外设;
2、设置时间以及添加配置标志;
3、获取当前时间;

2.3 代码实现

1、定义时间结构体,包含 年月日/时分秒

//时间结构体
typedef struct 
{
  vu8 hour;
  vu8 min;
  vu8 sec;			
  //公历日月年周
  vu16 w_year;
  vu8  w_month;
  vu8  w_date;
  vu8  week;		 
}_calendar_obj;	
extern _calendar_obj calendar;	//日历结构体

2、对RTC进行初始化,配置实时时钟
设置初始时间为2023/11/27/16:48:00
初始时间在初始化函数那里更改

//实时时钟配置
//初始化RTC时钟,同时检测时钟是否工作正常
//BKP->DR1用于保存是否第一次配置的设置
//返回0:正常
//其他:错误代码

u8 RTC_Init(void)
{
	//检查是不是第一次配置时钟
	u8 temp=0;
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);	//使能PWR和BKP外设时钟   
	PWR_BackupAccessCmd(ENABLE);	//使能后备寄存器访问  
	//if (BKP_ReadBackupRegister(BKP_DR1) != 0x5050)		//从指定的后备寄存器中读出数据:读出了与写入的指定数据不相乎
		//{	 			
		BKP_DeInit();	//复位备份区域 	
		RCC_LSEConfig(RCC_LSE_ON);	//设置外部低速晶振(LSE),使用外设低速晶振
		while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET&&temp<250)	//检查指定的RCC标志位设置与否,等待低速晶振就绪
			{
			temp++;
			Delay_ms(10);
			}
		if(temp>=250)return 1;//初始化时钟失败,晶振有问题	    
		RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);		//设置RTC时钟(RTCCLK),选择LSE作为RTC时钟    
		RCC_RTCCLKCmd(ENABLE);	//使能RTC时钟  
		RTC_WaitForLastTask();	//等待最近一次对RTC寄存器的写操作完成
		RTC_WaitForSynchro();		//等待RTC寄存器同步  
		RTC_ITConfig(RTC_IT_SEC, ENABLE);		//使能RTC秒中断
		RTC_WaitForLastTask();	//等待最近一次对RTC寄存器的写操作完成
		RTC_EnterConfigMode();/// 允许配置	
		RTC_SetPrescaler(32767); //设置RTC预分频的值
		RTC_WaitForLastTask();	//等待最近一次对RTC寄存器的写操作完成
		RTC_Set(2023,11,27,16,48,00);  //设置时间	2023/11/27/16:48
		RTC_ExitConfigMode(); //退出配置模式  
		BKP_WriteBackupRegister(BKP_DR1, 0X5050);	//向指定的后备寄存器中写入用户程序数据
		RTC_NVIC_Config();//RCT中断分组设置		    				     
		RTC_Get();//更新时间	
		return 0; //ok
}

3、中断服务函数

//RTC时钟中断
//每秒触发一次  
//extern u16 tcnt; 
void RTC_IRQHandler(void)
{		 
  if (RTC_GetITStatus(RTC_IT_SEC) != RESET)//秒钟中断
  {							
  	RTC_Get();//更新时间   
  }
  if(RTC_GetITStatus(RTC_IT_ALR)!= RESET)//闹钟中断
  {
  	RTC_ClearITPendingBit(RTC_IT_ALR);		//清闹钟中断	  	
    RTC_Get();				//更新时间   
	printf("Alarm Time:%d-%d-%d %d:%d:%d\n",calendar.w_year,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec);//输出闹铃时间	
  	
	} 				  								 
  RTC_ClearITPendingBit(RTC_IT_SEC|RTC_IT_OW);		//清闹钟中断
  RTC_WaitForLastTask();	  	    						 	   	 
}

4、主函数main.c

#include "sys.h"
#include "usart.h"
#include "rtc.h"
#include "stm32f10x.h"
#include "delay.h"
#include "gui.h"
#include "bmp.h"
#include "oled.h"

int main(void) {
    u8 t;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);               /* 设置NVIC中断分组2:2位抢占优先级,2位响应优先级 */
    //delay_init();                                                   /* 延时函数初始化 */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);      /* 关闭jtag,使能SWD,可以用SWD模式调试 */
    Delay_ms(500);                                                /* 等待稳定 */
    uart_init(115200);//以115200的波特率初始化串口
    //IIC_Init();
    RTC_Init();                //RTC初始化
    while (1) {
        if (t != calendar.sec) {
            t = calendar.sec;
            printf("%d-%02d-%02d %02d:%02d:%02d\r\n", calendar.w_year, calendar.w_month, calendar.w_date,
                   calendar.hour, calendar.min, calendar.sec);
            switch (calendar.week) {
                case 0:
                    printf("Sunday   \r\n");
                    break;
                case 1:
                    printf("Monday   \r\n");
                    break;
                case 2:
                    printf("Tuesday  \r\n");
                    break;
                case 3:
                    printf("Wednesday\r\n");
                    break;
                case 4:
                    printf("Thursday \r\n");
                    break;
                case 5:
                    printf("Friday   \r\n");
                    break;
                case 6:
                    printf("Saturday \r\n");
                    break;
            }
        }
        Delay_ms(10);
    }
}

2.4 硬件实现

1、烧录
STM32日历读取与温湿度显示,stm32,单片机,嵌入式硬件
2、物理连接

STM32日历读取与温湿度显示,stm32,单片机,嵌入式硬件
3、实现效果
STM32日历读取与温湿度显示,stm32,单片机,嵌入式硬件

三、OLED显示年月份时分秒和实时温湿度

3.1 任务要求

读取AHT20的温度和湿度,通过OLED,把年月份时分秒、日历和实时温度、湿度显示出来,2秒周期。

3.2 代码实现

1、在oledfont.h文件中的cfont16[]函数中添加需要用得到字模

const typFNT_GB16 cfont16[] = 
{
  
/*--  文字:  温  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
"温",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,

/*--  文字:  湿  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
"湿",0x00,0x00,0x27,0xF8,0x14,0x08,0x14,0x08,0x87,0xF8,0x44,0x08,0x44,0x08,0x17,0xF8,0x11,0x20,0x21,0x20,0xE9,0x24,0x25,0x28,0x23,0x30,0x21,0x20,0x2F,0xFE,0x00,0x00,

/*--  文字:  度  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
"度",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,

/*--  文字:  显  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
"显",0x00,0x00,0x1F,0xF0,0x10,0x10,0x10,0x10,0x1F,0xF0,0x10,0x10,0x10,0x10,0x1F,0xF0,0x04,0x40,0x44,0x44,0x24,0x44,0x14,0x48,0x14,0x50,0x04,0x40,0xFF,0xFE,0x00,0x00,

/*--  文字:  示  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
"示",0x00,0x00,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x01,0x00,0x01,0x00,0x11,0x10,0x11,0x08,0x21,0x04,0x41,0x02,0x81,0x02,0x05,0x00,0x02,0x00,
  
/*--  文字:  星  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
"星",0x00,0x00,0x1F,0xF0,0x10,0x10,0x1F,0xF0,0x10,0x10,0x1F,0xF0,0x01,0x00,0x11,0x00,0x1F,0xF8,0x21,0x00,0x41,0x00,0x1F,0xF0,0x01,0x00,0x01,0x00,0x7F,0xFC,0x00,0x00,

/*--  文字:  期  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
"期",0x22,0x00,0x22,0x7C,0x7F,0x44,0x22,0x44,0x22,0x44,0x3E,0x7C,0x22,0x44,0x22,0x44,0x3E,0x44,0x22,0x7C,0x22,0x44,0xFF,0x44,0x04,0x84,0x22,0x84,0x41,0x14,0x82,0x08,

/*--  文字:  时  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
"时",0x00,0x08,0x00,0x08,0x7C,0x08,0x44,0x08,0x45,0xFE,0x44,0x08,0x44,0x08,0x7C,0x08,0x44,0x88,0x44,0x48,0x44,0x48,0x44,0x08,0x7C,0x08,0x44,0x08,0x00,0x28,0x00,0x10,

/*--  文字:  分  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
"分",0x00,0x40,0x04,0x40,0x04,0x20,0x08,0x20,0x10,0x10,0x20,0x08,0x40,0x04,0x9F,0xE2,0x04,0x20,0x04,0x20,0x04,0x20,0x08,0x20,0x08,0x20,0x10,0x20,0x21,0x40,0x40,0x80,

/*--  文字:  秒  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
"秒",0x08,0x20,0x1C,0x20,0xF0,0x20,0x10,0xA8,0x10,0xA4,0xFC,0xA2,0x11,0x22,0x31,0x20,0x3A,0x24,0x54,0x24,0x54,0x28,0x90,0x08,0x10,0x10,0x10,0x20,0x10,0xC0,0x13,0x00,

//以及文字:一二三四五六年月日
};

2、修改main.c

#include "sys.h"
#include "usart.h"
#include "rtc.h"
#include "stm32f10x.h"
#include "delay.h"
#include "gui.h"
#include "bmp.h"
#include "oled.h"
int main(void) {
  u8 t;
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);               /* 设置NVIC中断分组2:2位抢占优先级,2位响应优先级 */
  //delay_init();                                                   /* 延时函数初始化 */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);      /* 关闭jtag,使能SWD,可以用SWD模式调试 */
  Delay_ms(500);                                                /* 等待稳定 */
  uart_init(115200);
  IIC_Init();
  RTC_Init();                //RTC初始化
  OLED_Init();			         //初始化OLED  
  OLED_Clear(0);             //清屏(全黑)
	while (1) {
		
		read_AHT20_once();
		OLED_Clear(0);
        
		if (t != calendar.sec) {
            t = calendar.sec;
			GUI_ShowNum(00,00,calendar.w_year,4,16,1);
			GUI_ShowCHinese(32,00,16,"年",1);
			GUI_ShowNum(48,00,calendar.w_month,2,16,1);
			GUI_ShowCHinese(64,00,16,"月",1);
			GUI_ShowNum(80,00,calendar.w_date,2,16,1);
			GUI_ShowCHinese(96,00,16,"日",1);
			GUI_ShowNum(00,20,calendar.hour,2,16,1);
			GUI_ShowCHinese(16,20,16,"时",1);
			GUI_ShowNum(32,20,calendar.min,2,16,1);
			GUI_ShowCHinese(48,20,16,"分",1);
			GUI_ShowNum(64,20,calendar.sec,2,16,1);
			GUI_ShowCHinese(80,20,16,"秒",1);
            
            switch (calendar.week) {
                case 0:
					GUI_ShowCHinese(00,40,16,"星期日",1);
					//GUI_ShowString(0,100,"Sunday",16,1);
                    //printf("Sunday   \r\n");
                    break;
                case 1:
					GUI_ShowCHinese(00,40,16,"星期一",1);
                    //GUI_ShowString(0,100,"Monday",16,1);
				    //printf("Monday   \r\n");
                    break;
                case 2:
					GUI_ShowCHinese(00,40,16,"星期二",1);
					//GUI_ShowString(0,100,"Tuesday",16,1);
                    //printf("Tuesday  \r\n");
                    break;
                case 3:
					GUI_ShowCHinese(00,40,16,"星期三",1);
                    //GUI_ShowString(0,100,"Wednesday",16,1);
				    //printf("Wednesday\r\n");
                    break;
                case 4:
					GUI_ShowCHinese(00,40,16,"星期四",1);
					//GUI_ShowString(0,100,"Thursday",16,1);
                    //printf("Thursday \r\n");
                    break;
                case 5:
					GUI_ShowCHinese(00,40,16,"星期五",1);
					//GUI_ShowString(0,100,"Friday",16,1);
                    //printf("Friday   \r\n");
                    break;
                case 6:
					GUI_ShowCHinese(00,40,16,"星期六",1);
					//GUI_ShowString(0,100,"Saturday",16,1);
                    //printf("Saturday \r\n");
                    break;
            }
        }			
		Delay_ms(1500);
        Delay_ms(1500);
		OLED_Clear(0);
    }
}

3.3 硬件实现

1、硬件连接
OLED屏连线说明(7脚)

1.GND 电源地
2.VCC 电源正(3~5.5V)
3.D0(SCL) SCK管脚
4.D1(SDA) MOSI管脚
5.RES(RST) 用来复位(低电平复位)
6.DC(D/C) 数据和命令控制管脚 1表示数据 0表示命令
7.CS(NSS) 片选管脚

STM32日历读取与温湿度显示,stm32,单片机,嵌入式硬件

AHT20
STM32日历读取与温湿度显示,stm32,单片机,嵌入式硬件
2、FlyMCU烧录
STM32日历读取与温湿度显示,stm32,单片机,嵌入式硬件
3、实验效果STM32日历读取与温湿度显示,stm32,单片机,嵌入式硬件文章来源地址https://www.toymoban.com/news/detail-830131.html

到了这里,关于STM32日历读取与温湿度显示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Proteus仿真】【STM32单片机】蔬菜大棚温湿度控制系统设计

    本项目使用Proteus8仿真STM32单片机控制器,使用LCD1602液晶、DHT11温湿度、蜂鸣器、按键、LED、继电器、电机模块等。 主要功能: 系统运行后,LCD1602显示DHT11温湿度采集值, 当按下K3键进入阈值设置,第一次进入温度上限, 第二次进入温度下限,第三次进入湿度上限, 第四次

    2023年04月08日
    浏览(37)
  • STM32驱动AHT10&OLED显示温湿度

    AHT10是新一代的温湿度传感器,使用SMD封装,上面有一个改进型的MEMS半导体电容式湿度传感器和一个标准的片上温度传感器原件,可用于空调,除湿器等温湿度控制领域的检测。 电气参数 AHT10模块 工作电压 DC1.8-3.3V 通讯接口 IIC 湿度 分辨率:0.024 %RH 误差:±2%RH 温度 分辨率

    2024年02月01日
    浏览(45)
  • (STM32F103单片机)DHT11温湿度传感器

    目录   一,产品介绍 二,产品亮点 三,产品参数 四,引脚连接及通信说明  五,原理讲解 六,源码 1,DHR11.C 2.DHR11.H 3,main.c DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高

    2023年04月08日
    浏览(53)
  • stm32项目之DHT11温湿度显示(LCD1602)

    掌握LCD1602的使用 掌握DHT11的原理及使用 看懂LCD1602和DHT11时序图 看懂DHT11的原理 掌握LCD1602的显示 编写程序用LCD1602显示温湿度 DHT11部分: DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次 通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当

    2024年02月02日
    浏览(52)
  • stm32毕设分享 Stm32 WIFI智能家居温湿度和烟雾检测系统 - 单片机 物联网 嵌入式

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月02日
    浏览(109)
  • 使用STM32 在实现温湿度LCD显示并蓝牙透传

    通过温湿度传感器将值传到LCD1602,并实时通过蓝牙透传到手机。 LCD1602 是一种工业字符型液晶,能够同时显示16x02即32字符 (16列两行) DHT11  DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。 HC-01 蓝牙模块。 关于以上这三个模块的使用和详细介绍

    2024年02月17日
    浏览(34)
  • STM32驱动dht11检测温湿度由OLED12864显示

    本次实验所使用的硬件环境如下: STM32F103C8T6开发板 DHT11温湿度传感器 OLED12864显示屏 杜邦线若干 软件环境 本次实验所使用的软件环境如下: Keil C51编译器 ST-LINK V2下载器 ST-LINK Utility软件 硬件连接 首先,将STM32F103C8T6开发板、DHT11温湿度传感器和OLED12864显示屏分别连接在一起

    2023年04月13日
    浏览(55)
  • 第七章 OLED+DHT11+STM32动态显示温湿度

            上一章给大家介绍了OLED显示模块的使用,但上一章我们在OLED上显示的是静态的,不会变动的,所以这一章我结合第一章介绍的DHT11温湿度模块,实现温湿度数值在OLED显示模块上进行动态显示,其实也是非常简单。         首先打开第一章提供的DHT11代码工程文件和

    2024年01月16日
    浏览(42)
  • 基于STM32单片机的温湿度检测报警器(数码管)(Proteus仿真+程序)

           本设计由STM32F103单片机最小系统+DHT11温湿度传感器+数码管显示模块+声光报警模块+独立按键组成。 1、主控制器是STM32F103单片机 2、DHT11传感器测量温度和湿度数据 3、数码管显示温度、湿度,精度1℃、1%RH 4、三个按键可设置温度、湿度上限报警值,温度或者湿度超过

    2024年02月03日
    浏览(72)
  • 68、基于STM32单片机DHT11温湿度蓝牙控制报警器app系统设计

    毕设帮助、开题指导、技术解答(有偿)见文末。 目录 摘要 一、硬件方案 二、设计功能 三、实物图 四、原理图 五、PCB图 六、程序源码 七、资料包括 温度、湿度和人类的生产、生活有着密切的关系,同时也是工业生产中最常见最基本的工艺参数,例如机械、电子、石油、

    2024年02月08日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包