DS1302时钟模块(STM32)

目录

一、介绍

二、模块原理

1.原理图

2.引脚描述

3.工作原理:读/写时序

4.寄存器地址/定义 

三、程序设计

main.c文件

ds1302.h文件

ds1302.c文件

四、实验效果 

五、资料获取

项目分享


一、介绍

        DS1302是一款由达拉斯半导体(Dallas Semiconductor)公司生产的实时时钟(RTC)芯片,它能够为微控制器提供年、月、日、星期、时、分、秒的时间信息,并且可以通过简单的串行接口进行通信。DS1302 具有低功耗、备用电池接口和 RAM 存储等功能,广泛应用于需要时间记录的电子设备中。

以下是DS1302时钟模块的参数:

型号

DS1302

工作电压

2.0~5.5V

晶振

32.768MHz

工作温度

0~70℃

备用电池型号

CR2032

哔哩哔哩视频链接:

DS1302时钟模块(STM32)

(资料分享见文末) 

二、模块原理

1.原理图

2.引脚描述

引脚名称

描述

VCC

电源正极

GND

电源负极

SCLK

串行时钟线

I/O

数据输入/输出

RST

复位线

3.工作原理:读/写时序

        DS1302通过三线串行接口与微控制器进行通信。微控制器可以通过设置RST引脚为高电平来使能DS1302,并通过SCLK引脚提供串行时钟信号,然后通过I/O引脚进行数据的读写操作。DS1302 的时钟和日历数据采用二进制编码的十进制(BCD码,即字节的高四位是数据的十位,字节的低四位是数据的个位)格式存储,这样方便读取和显示。

4.寄存器地址/定义 


三、程序设计

使用STM32F103C8T6使用DS1302时钟模块显示当前实时时间。

DS1302_CE

PA5

DS1302_DATA

PA6

DS302_SCLK

PA7

OLED_SCL

PB11

OLED_SDA

PB10

main.c文件

#include "stm32f10x.h"
#include "led.h"
#include "usart.h"
#include "delay.h"
#include "oled.h"
#include "ds1302.h"
#include "timer.h"/*****************辰哥单片机设计******************STM32* 项目			:	DS1302时钟模块实验                     * 版本			: V1.0* 日期			: 2024.10.3* MCU			:	STM32F103C8T6* 接口			:	参看ds1302.h							* BILIBILI	:	辰哥单片机设计* CSDN			:	辰哥单片机设计* 作者			:	辰哥 **********************BEGIN***********************/char st[50];	
int main(void)
{ u16 ii=0;delay_init(72);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级DS1302_GPIO_Init();	//DS1302_Init();						//时间设置DS1302_read_realTime();   //读取实时数据 LED_Init();OLED_Init();                                  //屏幕初始化OLED_Clear();while(1){DS1302_read_realTime();    //读取此时时刻sprintf(st,"%d  ",TimeData.year);OLED_ShowString(8,0,st,16,1);OLED_ShowChinese(40,0,9,16,1);//年sprintf(st,"%d  ",TimeData.month);OLED_ShowString(56,0,st,16,1);OLED_ShowChinese(72,0,10,16,1);//月sprintf(st,"%d  ",TimeData.day);OLED_ShowString(88,0,st,16,1);OLED_ShowChinese(104,0,11,16,1);//日sprintf(st,"%d  ",TimeData.hour);OLED_ShowString(48+8,16,st,16,1);OLED_ShowString(48+8+16,16,"-",16,1);sprintf(st,"%d  ",TimeData.minute);OLED_ShowString(48+8+16+8,16,st,16,1);OLED_ShowString(48+8+16+16+8,16,"-",16,1);sprintf(st,"%d  ",TimeData.second);OLED_ShowString(48+8+16+16+16,16,st,16,1);OLED_ShowChinese(0,16,0,16,1);//星期OLED_ShowChinese(16,16,1,16,1);switch(TimeData.week){case 1:{OLED_ShowChinese(32,16,2,16,1);}break;case 2:{OLED_ShowChinese(32,16,3,16,1);}break;case 3:{OLED_ShowChinese(32,16,4,16,1);}break;case 4:{OLED_ShowChinese(32,16,5,16,1);}break;case 5:{OLED_ShowChinese(32,16,6,16,1);}break;case 6:{OLED_ShowChinese(32,16,7,16,1);}break;case 7:{OLED_ShowChinese(32,16,8,16,1);}}OLED_Refresh();}
}

ds1302.h文件

#ifndef __DS1302_H 
#define __DS1302_H  #include "sys.h" /*****************辰哥单片机设计******************STM32* 文件			:	DS1302时钟模块h文件                     * 版本			: V1.0* 日期			: 2024.10.3* MCU			:	STM32F103C8T6* 接口			:	见代码							* BILIBILI	:	辰哥单片机设计* CSDN			:	辰哥单片机设计* 作者			:	辰哥 **********************BEGIN***********************///---------------DS1302端口定义----------------- 
/***************根据自己需求更改****************/
#define DS1302_CLK  						RCC_APB2Periph_GPIOA
#define DS1302_CE_PORT  				GPIOA
#define DS1302_CE_PIN						GPIO_Pin_5
#define DS1302_DATA_PORT				GPIOA
#define DS1302_DATA_PIN   			GPIO_Pin_6
#define DS1302_SCLK_PORT   			GPIOA
#define DS1302_SCLK_PIN  				GPIO_Pin_7/*********************END**********************/#define CE_L				 GPIO_ResetBits(DS1302_CE_PORT,DS1302_CE_PIN)//CE
#define CE_H				 GPIO_SetBits(DS1302_CE_PORT,DS1302_CE_PIN)#define DATA_L			 GPIO_ResetBits(DS1302_SCLK_PORT,DS1302_DATA_PIN)//DATA
#define DATA_H			 GPIO_SetBits(DS1302_SCLK_PORT,DS1302_DATA_PIN)#define SCLK_L			 GPIO_ResetBits(DS1302_DATA_PORT,DS1302_SCLK_PIN)//SCLK
#define SCLK_H			 GPIO_SetBits(DS1302_DATA_PORT,DS1302_SCLK_PIN)struct TIMEData
{u16 year;u8  month;u8  day;u8  hour;u8  minute;u8  second;u8  week;
};//创建TIMEData结构体方便存储时间日期数据struct TIMERAM
{u8  hour_kai;u8  minute_kai;u8  hour_guan;u8  minute_guan;u8  kai;u8  guan;
};//创建TIMEData结构体方便存储时间日期数据extern struct TIMERAM TimeRAM;
extern struct TIMEData TimeData;//全局变量void DS1302_GPIO_Init(void);//ds1302端口初始化
void DS1302_write_onebyte(u8 data);//向ds1302发送一字节数据
void DS1302_wirte_rig(u8 address,u8 data);//向指定寄存器写一字节数据
u8 	 DS1302_read_rig(u8 address);//从指定寄存器读一字节数据
void DS1302_Init(void);//ds1302初始化函数
void DS1302_DATAOUT_init(void);//IO端口配置为输出
void DS1302_DATAINPUT_init(void);//IO端口配置为输入
void DS1302_read_time(void);//从ds1302读取实时时间(BCD码)
void DS1302_read_realTime(void);//将BCD码转化为十进制数据
void DS1302_wirteRAM(void);
void DS1302_readRAM(void);#endif

ds1302.c文件

#include "ds1302.h"
#include "sys.h"
#include "delay.h"/*****************辰哥单片机设计******************STM32* 文件			:	DS1302时钟模块c文件                     * 版本			: V1.0* 日期			: 2024.10.3* MCU			:	STM32F103C8T6* 接口			:	见代码							* BILIBILI	:	辰哥单片机设计* CSDN			:	辰哥单片机设计* 作者			:	辰哥 **********************BEGIN***********************/struct TIMEData TimeData;
struct TIMERAM TimeRAM;
u8 read_time[7];void DS1302_GPIO_Init(void)//CE,SCLK端口初始化
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(DS1302_CLK, ENABLE);GPIO_InitStructure.GPIO_Pin = DS1302_SCLK_PIN; //CEGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出GPIO_Init(DS1302_SCLK_PORT, &GPIO_InitStructure);//初始化GPIO_ResetBits(DS1302_SCLK_PORT,DS1302_SCLK_PIN); GPIO_InitStructure.GPIO_Pin = DS1302_CE_PIN; //SCLKGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出GPIO_Init(DS1302_CE_PORT, &GPIO_InitStructure);//初始化GPIO_ResetBits(DS1302_CE_PORT,DS1302_CE_PIN); 
}void DS1302_DATAOUT_init()//配置双向I/O端口为输出态
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(DS1302_CLK, ENABLE);GPIO_InitStructure.GPIO_Pin = DS1302_DATA_PIN; // DATAGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(DS1302_DATA_PORT, &GPIO_InitStructure);//初始化GPIO_ResetBits(DS1302_DATA_PORT,DS1302_DATA_PIN);
}void DS1302_DATAINPUT_init()//配置双向I/O端口为输入态
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(DS1302_CLK, ENABLE);GPIO_InitStructure.GPIO_Pin = DS1302_DATA_PIN; //DATAGPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(DS1302_DATA_PORT, &GPIO_InitStructure);//初始化
}void DS1302_write_onebyte(u8 data)//向DS1302发送一字节数据
{u8 count=0;SCLK_L;DS1302_DATAOUT_init();for(count=0;count<8;count++){	SCLK_L;if(data&0x01){DATA_H;}else{DATA_L;}//先准备好数据再发送SCLK_H;//拉高时钟线,发送数据data>>=1;}
}void DS1302_wirte_rig(u8 address,u8 data)//向指定寄存器地址发送数据
{u8 temp1=address;u8 temp2=data;CE_L;SCLK_L;delay_us(1);CE_H;delay_us(3);DS1302_write_onebyte(temp1);DS1302_write_onebyte(temp2);CE_L;SCLK_L;delay_us(3);
}u8 DS1302_read_rig(u8 address)//从指定地址读取一字节数据
{u8 temp3=address;u8 count=0;u8 return_data=0x00;CE_L;SCLK_L;delay_us(3);CE_H;delay_us(3);DS1302_write_onebyte(temp3);DS1302_DATAINPUT_init();//配置I/O口为输入delay_us(3);for(count=0;count<8;count++){delay_us(3);//使电平持续一段时间return_data>>=1;SCLK_H;delay_us(5);//使高电平持续一段时间SCLK_L;delay_us(30);//延时14us后再去读取电压,更加准确if(GPIO_ReadInputDataBit(DS1302_DATA_PORT,DS1302_DATA_PIN)){return_data=return_data|0x80;}}delay_us(2);CE_L;DATA_L;return return_data;
}void DS1302_Init(void)
{DS1302_wirte_rig(0x8e,0x00);//关闭写保护DS1302_wirte_rig(0x80,0x00);//seconds00秒DS1302_wirte_rig(0x82,0x30);//minutes30分DS1302_wirte_rig(0x84,0x20);//hours20时DS1302_wirte_rig(0x86,0x03);//date3日DS1302_wirte_rig(0x88,0x10);//months10月DS1302_wirte_rig(0x8a,0x04);//days星期四DS1302_wirte_rig(0x8c,0x24);//year2024年DS1302_wirte_rig(0x8e,0x80);//开启写保护
}void DS1302_read_time(void)
{read_time[0]=DS1302_read_rig(0x81);//读秒read_time[1]=DS1302_read_rig(0x83);//读分read_time[2]=DS1302_read_rig(0x85);//读时read_time[3]=DS1302_read_rig(0x87);//读日read_time[4]=DS1302_read_rig(0x89);//读月read_time[5]=DS1302_read_rig(0x8B);//读星期read_time[6]=DS1302_read_rig(0x8D);//读年
}void DS1302_read_realTime(void)
{DS1302_read_time();  //BCD码转换为10进制TimeData.second=(read_time[0]>>4)*10+(read_time[0]&0x0f);TimeData.minute=((read_time[1]>>4))*10+(read_time[1]&0x0f);TimeData.hour=(read_time[2]>>4)*10+(read_time[2]&0x0f);TimeData.day=(read_time[3]>>4)*10+(read_time[3]&0x0f);TimeData.month=(read_time[4]>>4)*10+(read_time[4]&0x0f);TimeData.week=read_time[5];TimeData.year=(read_time[6]>>4)*10+(read_time[6]&0x0f)+2000;	
}void DS1302_wirteRAM(void)
{DS1302_wirte_rig(0x8e,0x00);//关闭写保护DS1302_wirte_rig(0xC0,TimeRAM.hour_kai);//开时DS1302_wirte_rig(0xC2,TimeRAM.minute_kai);//开分DS1302_wirte_rig(0xC4,TimeRAM.hour_guan);//关时DS1302_wirte_rig(0xC6,TimeRAM.minute_guan);//关分DS1302_wirte_rig(0xC8,TimeRAM.kai);//关分DS1302_wirte_rig(0xCA,TimeRAM.guan);//关分DS1302_wirte_rig(0x8e,0x80);//关闭写保护
}
void DS1302_readRAM(void)
{TimeRAM.hour_kai=DS1302_read_rig(0xC1);//读秒TimeRAM.minute_kai=DS1302_read_rig(0xC3);//读分TimeRAM.hour_guan=DS1302_read_rig(0xC5);//读时TimeRAM.minute_guan=DS1302_read_rig(0xC7);//读日	TimeRAM.kai=DS1302_read_rig(0xC9);//读日TimeRAM.guan=DS1302_read_rig(0xCB);//读日
}

四、实验效果 

五、资料获取

项目分享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/55875.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第三方软件测评机构简析:软件安全测试报告的内容和作用

随着数字化时代的到来&#xff0c;软件的安全性显得尤为重要。尤其在信息安全事件频发的今天&#xff0c;软件安全测试报告成为企业和开发者关注的焦点。软件安全测试报告是评估软件系统安全性的一种综合性文档&#xff0c;通常在软件开发生命周期中进行安全性测试后生成。 软…

windows C++-创建图像处理的异步消息(二)

创建图像处理网络 此部分介绍如何创建对给定目录中的每个 JPEG (.jpg) 图像执行图像处理的异步消息块网络。 网络执行以下图像处理操作&#xff1a; 对于 Tom 创作的任何图像&#xff0c;转换为灰度。 对于任何以红色作为主色的图像&#xff0c;移除绿色和蓝色分量&#xff0…

嵌入式项目:STM32平衡车详解 (基础知识篇) (基于STM32F103C8T6)

前言&#xff1a; 本文是基于B站草履虫编写的平衡车相关内容&#xff0c;包括模块和基础知识&#xff0c;结合代码进行讲解&#xff0c;将知识进行汇总 &#xff08;由于本篇内容较长&#xff0c;请结合目录使用) 注&#xff1a;基于开源精神&#xff0c;本文仅供学习参考 目…

Java—逻辑控制与输入输出

各位看官&#xff1a;如果您觉得这篇文章对您有帮助的话 欢迎您分享给更多人哦 感谢大家的点赞收藏评论&#xff0c;感谢您的支持&#xff01;&#xff01;&#xff01; 一.顺序结构&#xff1a; 我每天起床&#xff0c;躺在床上玩手机&#xff0c;然后吃中午饭&#xff0c;睡…

PIFA天线工作原理:【图文讲解】

1&#xff1a;什么是PIFA天线 PIFA ( Planar Inverted F-shaped Antenna)天线即平面倒F形天线&#xff0c;因为整个天线的形状像个倒写的英文字母F而得名 2&#xff1a;PIFA天线的应用 PIFA常见于手机天线设计&#xff0c;占手机内置天线的60%-80% 3&#xff1a;PIFA天线结构…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-09

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-09 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-09目录1. Can LLMs plan paths with extra hints from solvers?摘要创新点算法模型实验效果重要数据与结论 推荐阅读指数 2. Sc…

SQL第14课挑战题

1. 将两个select语句结合起来&#xff0c;以便从OrderItems表中检索产品ID(prod_id)和quantity。其中&#xff0c;一个select语句过滤数量为100的行&#xff0c;另一个select语句过滤ID以BNBG开头的产品。按产品ID对结果进行排序。 2. 重新第一题&#xff0c;仅使用单个select语…

【原创】可用于 Android Studio 的翻译插件

在不少讲解Android 开发的老师视频中会出现一个运行在Android Studio 上的翻译插件&#xff0c;感觉挺实用的。 接下来&#xff0c;我们把它安装在我们的Android Studio 上。 设置 点击右上角齿轮按钮&#xff0c;选择Settings 安装 翻译插件 输入Tanslation&#xff0c;选…

[简单实践]Noisy Print - 自制基于加性噪声模型的简易降噪器

NoisyPrint 最近在学习的过程中&#xff0c;突然想起一个在Adobe Audition中用过的功能。 为什么会想到这个功能呢&#xff0c;因为在我使用DeepFilter的过程中&#xff0c;我发现对于一些低信噪比的信号来说&#xff0c;DeepFilter很容易出现过拟合现象&#xff0c;导致音源…

低质量数据的多模态融合方法

目录 多模态融合 低质量多模态融合的核心挑战 噪声多模态数据学习 缺失模态插补 平衡多模态融合 动态多模态融合 启发式动态融合 基于注意力的动态融合 不确定性感知动态融合 论文 多模态融合 多模态融合侧重于整合多种模态的信息,以实现更准确的预测,在自动驾驶、…

08_OpenCV文字图片绘制

import cv2 import numpy as npimg cv2.imread(image0.jpg,1) font cv2.FONT_HERSHEY_SIMPLEXcv2.rectangle(img,(500,400),(200,100),(0,255,0),20) # 1 dst 2 文字内容 3 坐标 4 5 字体大小 6 color 7 粗细 8 line type cv2.putText(img,flower,(200,50),font,1,(0,0,250)…

c#-出现类型初始值设定项引发异常的解决方案

当出现该问题时&#xff0c;通常摸不着头脑&#xff0c;无法定位到该问题所在行。 我们可以找到应发异常的类&#xff0c;例如我上面类为YY_Model.DefaultConfig。 打开这个类文件&#xff0c;加一个断点&#xff0c;一行行运行&#xff0c;到哪里突然跳出该文件&#xff0c;则…

(计算机毕设)基于Vue和Spring Boot的宠物救助网站设计与实现

博主可接毕设&#xff01;&#xff01;&#xff01; 毕业设计&#xff08;论文&#xff09; 基于Vue和Spring Boot的宠物救助网站设计与实现 摘 要 随着中国互联网的迅猛发展&#xff0c;传统宠物救助领域面临着信息管理繁琐、辐射范围有限、信息传播受限、丢失宠物找回几率较…

机器学习框架(含实例说明)

机器学习框架是用于开发和部署机器学习模型的软件库和工具集。它们提供了一系列的算法、工具和基础设施&#xff0c;帮助开发者更高效地构建、训练和部署机器学习模型。以下是一些主要的机器学习框架及其详细介绍&#xff1a; 1. TensorFlow TensorFlow 是由Google开发的开源…

卫瓴科技,驶向「协同CRM」深水区

在卫瓴协同CRM的产品之上&#xff0c;能看到的不单纯是产品本身&#xff0c;即“提高转化率”这个单纯的指标&#xff0c;而更多的是在产品之中蕴含的“现代企业营销建设”的科学理念和认知。以此为基础&#xff0c;企业可以构建真正有价值且能长期驱动的品牌营销模型。 作者…

攻防世界---->sherlock

做题笔记。 下载。 单词中出现大写很可疑。因为大写最多出现在开头等。 猜测是隐写术。 进行筛选。 借助python实现 with open(C:\\Users\\Acer\\Downloads\\f590c0f99c014b01a5ab8b611b46c57c.txt, r) as file:text file.read() uppercase_letters [char for char in text…

Study-Oracle-11-ORALCE19C-ADG集群测试

一、用户及数据测试 1、主库创建tes3用户&#xff0c;创建表test_table。备库登录test3用户并查询test_table表中数据。 -- 创建用户 CREATE USER test7 IDENTIFIED BY test7;-- 给予创建会话的权限 GRANT CREATE SESSION TO test7;-- 给予创建表的权限 GRANT CREATE TABLE TO…

贴吧软件怎么切换ip

在网络使用中&#xff0c;有时我们需要切换IP地址来满足特定的需求&#xff0c;比如需要切换贴吧软件IP以进行不同的操作。本文将介绍几种贴吧切换IP地址的方法&#xff0c;帮助用户更好地管理自己的网络身份和访问权限。 1、更换网络环境‌ 通过连接到不同的Wi-Fi网络或使用移…

解决雪花ID在前端精度丢失问题

解决雪花ID在前端精度丢失问题 在现代分布式系统中&#xff0c;雪花算法&#xff08;Snowflake&#xff09;被广泛用于生成唯一的ID。这些ID通常是Long类型的整数。然而&#xff0c;当这些ID从后端传递到前端时&#xff0c;JavaScript的精度限制可能会导致精度丢失&#xff0c…

Android 电源管理各个版本的变动和限制

由于Android设备的电池容量有限&#xff0c;而用户在使用过程中会进行各种高耗电操作&#xff0c;如网络连接、屏幕亮度调节、后台程序运行等&#xff0c;因此需要通过各种省电措施来优化电池使用‌&#xff0c;延长电池续航时间&#xff0c;提高用户体验&#xff0c;并减少因电…