【WCH】CH32F203基于内部RTC+I2C SSD1306 OLED时钟和温度显示

这篇具有很好参考价值的文章主要介绍了【WCH】CH32F203基于内部RTC+I2C SSD1306 OLED时钟和温度显示。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【WCH】CH32F203基于内部RTC+I2C SSD1306 OLED时钟和温度显示

  • 📌相关篇《【WCH】CH32F203基于内部RTC时钟+I2C SSD1306 OLED显示》
  • 📺显示效果:
  • 【WCH】CH32F203基于内部RTC+I2C SSD1306 OLED时钟和温度显示
  • ✨主要是在其基础 上增加温度显示,温度数据来源于DS18B20,更换了OLED驱动显示字体相关内容。
  • 🔰仅作为功能演示,内部RTC精度不高,长时间运行需要依赖第三方数据校准才行。
  • 🔖代码是从STM32工程基础上修改来的,修改相关内容后完全可以适配CH32F203上运行。

⛳相关驱动注意事项

  1. 软件I2C驱动SSD1306需要注意,驱动引脚需要配置为推挽输出模式,而不是像硬件I2C那样引脚配置使用开漏输出。
  2. 采用内部RTC时钟源,其时钟频率为40KHz,作为时钟源分频系数:39999

📑引脚定义说明

  • 🎉引脚可以根据个人使用需求切换到任意其他可用引脚上。
CH32F203 ------  I2C SSD1306 OLED
  PA5	-------  SCL
  PA7   -------   SDA
  
CH32F203 ------  DS18B20
  PA15   ------  DATA

📓驱动代码部分

  • 🌿内部RTC初始化代码
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) != 0XA1A1)		//从指定的后备寄存器中读出数据:读出了与写入的指定数据不相乎
//	{

    BKP_DeInit();	//复位备份区域
    RCC_LSICmd(ENABLE);
//		RCC_LSEConfig(RCC_LSE_ON);	//设置外部低速晶振(LSE),使用外设低速晶振
//		while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)	//检查指定的RCC标志位设置与否,等待低速晶振就绪
//		while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)
    while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET && temp < 250)
    {
        temp++;
        delay_ms(10);
    }
    if(temp >= 250)return 1; //初始化时钟失败,晶振有问题
//		RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);		//设置RTC时钟(RTCCLK),选择LSE作为RTC时钟
    RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
    RCC_RTCCLKCmd(ENABLE);	//使能RTC时钟
    RTC_WaitForLastTask();	//等待最近一次对RTC寄存器的写操作完成
    RTC_WaitForSynchro();		//等待RTC寄存器同步
    //		RTC_ITConfig(RTC_IT_ALR, ENABLE);
    RTC_ITConfig(RTC_IT_SEC, ENABLE);		//使能RTC秒中断
    RTC_WaitForLastTask();	//等待最近一次对RTC寄存器的写操作完成
    RTC_EnterConfigMode();/// 允许配置
    RTC_SetPrescaler(40000-1);
//		RTC_SetPrescaler(32767); //设置RTC预分频的值
    RTC_WaitForLastTask();	//等待最近一次对RTC寄存器的写操作完成
    RTC_Set(2023, 4, 25, 18, 0, 35); //设置时间
    RTC_ExitConfigMode(); //退出配置模式
    BKP_WriteBackupRegister(BKP_DR1, 0XA1A1);	//向指定的后备寄存器中写入用户程序数据
    RTC_NVIC_Config();//RCT中断分组设置
    RTC_Get();//更新时间
    return 0; //ok

}
  • 🌿main主程序代码
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "oled.h"
#include "rtc.h"
#include "ds18b20.h"

u8 year_buf[4];
u8 month_buf[2];
u8 day_buf[2];
u8 temp_buf[4];

int main(void)
{
    u16 temp;
    delay_init();	     //延时初始化
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
    
    OLED_Init();
    RTC_Init();	  			//RTC初始化
    DS18B20_Init();

    delay_ms(200);
    OLED_CLS();
    OLED_P16x16Ch(40, 0, 36); //第一行第三列显示年
    OLED_P16x16Ch(72, 0, 37);      //显示月
    OLED_P16x16Ch(106, 0, 38);      //显示日
    OLED_P16x16Ch(0, 6, 39); //星
    OLED_P16x16Ch(16, 6, 41); //期
    OLED_P16x16Ch(32, 2, 34);
    OLED_P16x16Ch(32, 4, 35); //:
    OLED_P16x16Ch(80, 2, 34);
    OLED_P16x16Ch(80, 4, 35); //:
    while(1)
    {
        sprintf((char*)year_buf, "%04d", calendar.w_year);
        OLED_P8x16Str(8, 0, year_buf);
        sprintf((char*)month_buf, "%02d", calendar.w_month);
        OLED_P8x16Str(58, 0, month_buf);
        sprintf((char*)day_buf, "%02d", calendar.w_date);
        OLED_P8x16Str(90, 0, day_buf);

        OLED_P16x16Ch(0, 2, calendar.hour / 10 * 2);
        OLED_P16x16Ch(0, 4, calendar.hour / 10 * 2 + 1); //
        OLED_P16x16Ch(16, 2, calendar.hour % 10 * 2);
        OLED_P16x16Ch(16, 4, calendar.hour % 10 * 2 + 1); //

        OLED_P16x16Ch(48, 2, calendar.min / 10 * 2);
        OLED_P16x16Ch(48, 4, calendar.min / 10 * 2 + 1); //
        OLED_P16x16Ch(64, 2, calendar.min % 10 * 2);
        OLED_P16x16Ch(64, 4, calendar.min % 10 * 2 + 1); //

        OLED_P16x16Ch(95, 2, calendar.sec / 10 * 2);
        OLED_P16x16Ch(95, 4, calendar.sec / 10 * 2 + 1); //
        OLED_P16x16Ch(111, 2, calendar.sec % 10 * 2);
        OLED_P16x16Ch(111, 4, calendar.sec % 10 * 2 + 1); //

        OLED_P16x16Ch(32, 6, calendar.week + 20); //

        temp = DS18B20_Get_Temp();
        OLED_P16x16str(64, 6, 11);
        OLED_P16x16str(80, 6, 12);
        OLED_P16x16str(96, 6, temp % 1000 / 100);
        OLED_P16x16str(112, 6, temp % 100 / 10);

    }
}

📚工程源码

  • ✨申明:本文章仅发表在CSDN网站,任何其他网站,未注明来源,见此内容均为盗链和爬取。
  • 🍁对于文中所提供的相关资源链接将作不定期更换。
链接: https://pan.baidu.com/s/1Xxkau67AxeHwqFFvrP095Q
提取码: 1adv

文章来源地址https://www.toymoban.com/news/detail-426053.html

到了这里,关于【WCH】CH32F203基于内部RTC+I2C SSD1306 OLED时钟和温度显示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • vivado技巧|如何在fpga内部实现i2c信号透传(fpga内部两组i2c inout信号互连)

    大家好,我是数字小熊饼干,一个练习时长两年半的ic打工人。我在两年前通过自学跨行社招加入了IC行业。现在我打算将这两年的工作经验和当初面试时最常问的一些问题进行总结,并通过汇总成文章的形式进行输出,相信无论你是在职的还是已经还准备入行,看过之后都会

    2024年03月18日
    浏览(39)
  • STM32F103C8T6—库函数应用I2C/SPI驱动OLED显示中文、字符串

    I2C(Inter-Integrated Circuit) SPI(Serial Peripheral Interface) 传输方式 半双工 全双工 传输速度 低速,100Kbps----4Mbps 高速,30Mbps以上 几线制 4线制:VCC,GND,SCL,SDA 6/7线制:VCC,GND,SCLK(D0),MOSI(D1/SDA),DC,CS/SS 主从模式 多主机总线,通过SDA上的地址信息锁定从机 只有一个主机,主

    2024年02月02日
    浏览(23)
  • STM32基于CubeMX与HAL库的I2C应用

    1.1 物理层         I2C协议和摩托罗拉公司的SPI协议一样,是一种通讯协议。串行外围设备接口,是一种高速全双工的通信总线,是由 Phiilps 公司开发的。由于它引脚少,硬件实现简单,可扩展性强,不需要 USART、CAN 等通讯协议的外部收发设备,现在被广泛地使用在系统内

    2024年02月21日
    浏览(27)
  • 【STM32】AT24C256硬件I2C读写,基于HAL库

    目录 一、简单介绍 二、配置工程 打开CubeMX,配置时钟,调试接口,工程名,目录等 配置iic 配置串口用于显示信息 三、硬件连接 四、代码编写 一、随机写入一个字节 测试代码 波形如下 代码编写 二、连续写入 代码如下 三、随机读取 测试代码 波形如下 代码编写 四、连续

    2024年02月03日
    浏览(23)
  • STM32基于HAL工程硬件I2C读写AT24C02/04/08数据

    ✨申明:本文章仅发表在CSDN网站,任何其他网站,未注明来源,见此内容均为盗链和爬取,请多多尊重和支持原创! 🍁对于文中所提供的相关资源链接将作不定期更换。 相关篇针对AT24C32及以上容量《STM32基于STM32-HAL工程硬件I2C读取AT24Cxx数据》 🎯本工程使用STM32F103VE+AT24C02实

    2023年04月11日
    浏览(17)
  • 【STM32 CubeMX】I2C层次结构、I2C协议

    在STM32 CubeMX环境中,I2C(Inter-Integrated Circuit)是一种常用的串行通信协议,广泛应用于连接各种外设和传感器。理解I2C的层次结构、协议和硬件结构对于STM32微控制器的开发至关重要。通过STM32 CubeMX提供的图形化配置工具,我们能够更轻松地理解和配置I2C通信,同时深入了解

    2024年02月22日
    浏览(27)
  • 基于HAL库的stm32的OLED显示屏显示(模拟I2C,四脚,0.96寸)

    参考视频:江科大oled程序移植stm32hal库,freertos学习,cpu使用率_哔哩哔哩_bilibili ​ STM32入门教程-2023持续更新中_哔哩哔哩_bilibili 高速和低速晶振均选择为陶瓷晶振即可。 不需更改初始化配置,因为模拟I2C初始化时会设置这两个引脚的电平 step1、step2完成后生成工程即可。 代

    2024年02月06日
    浏览(24)
  • STM32---I2C

    目录                                       一.I2C协议 1.什么是I2C协议?  2.物理层特性                                     二.协议层 1.I2C读写过程 2.I2C外设 3.I2C外设通讯过程              三.I2C库函数                       四.EEPROM 写操作: 读操作:      

    2024年02月16日
    浏览(18)
  • STM32 I2C

    目录 I2C通信  软件I2C读写MPU6050 I2C通信外设 硬件I2C读写MPU6050 I2C通信 R/W:0写1读 十轴:3轴加速度,3轴角速度,3轴磁场强度和一个气压强度  软件I2C读写MPU6050 MyI2C.c MPU6050.c MPU6050_Reg.h(寄存器) main.c I2C通信外设 GPIO口需要配置为复用开漏输出模式。复用:就是GPIO的状态是交由

    2024年02月19日
    浏览(20)
  • STM32学习笔记(十)丨I2C通信(使用I2C实现MPU6050和STM32之间通信)

    ​  本次课程采用单片机型号为STM32F103C8T6。(鉴于笔者实验时身边只有STM32F103ZET6,故本次实验使基于ZET6进行的) ​  课程链接:江协科技 STM32入门教程   往期笔记链接:   STM32学习笔记(一)丨建立工程丨GPIO 通用输入输出   STM32学习笔记(二)丨STM32程序调试

    2024年01月19日
    浏览(26)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包