DS1302时钟模块(STM32)

news2024/10/9 14:19:52

目录

一、介绍

二、模块原理

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; //CE
	GPIO_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; //SCLK
	GPIO_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; // DATA
	GPIO_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; //DATA
	GPIO_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.coloradmin.cn/o/2199237.html

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

相关文章

货拉拉冲刺上市:周胜馥已“套现”16亿元,被指经营管理问题突出

撰稿|多客 来源|贝多财经 10月2日&#xff0c;货拉拉以“拉拉科技控股有限公司-W&#xff08;简称“拉拉科技”&#xff0c;英文名&#xff1a;Lalatech&#xff09;”为主体更新递交招股书&#xff0c;继续冲刺港交所上市。此前&#xff0c;货拉拉曾分别于2023年3月、2023年…

面试中遇到的关于Transformer模型的问题有哪些?

Transformer是深度学习中极具影响力的模型架构之一&#xff0c;广泛应用于自然语言处理、计算机视觉等领域。它通过自注意力机制和并行计算等特点&#xff0c;取得了比传统模型&#xff08;如RNN、LSTM&#xff09;更优异的性能。本文将针对Transformer的多个关键问题进行详细探…

1,STM32CubeMX生成第一个freeRTOS工程

1&#xff0c;前言 本章内容是CubeMX工程配置freeRTOS的demo工程&#xff0c;后续其他本专栏文章中不再提及&#xff0c;默认在本章内容上完成。 单片机型号&#xff1a;STM32F407 编程环境 &#xff1a;STM32CubeMX Keil v5 2&#xff0c;STM32CubeMX新建工程 双击打开ST…

最新2024 LLM大模型学习路线图:从入门到精通的完整路径,收藏一下吧很难找全的!

ChatGPT的出现在全球掀起了AI大模型的浪潮&#xff0c;2023年可以被称为AI元年&#xff0c;AI大模型以一种野蛮的方式&#xff0c;闯入你我的生活之中。 从问答对话到辅助编程&#xff0c;从图画解析到自主创作&#xff0c;AI所展现出来的能力&#xff0c;超出了多数人的预料&…

JSBSim脚本运行结果

JSBSim 读取飞机xml文件&#xff1a;a 1982 Cessna 172P "C:\jsbsim-master\aircraft\c172p\c172p.xml"上面是文件位置&#xff0c;下面是读取的结果 JSBSim Flight Dynamics Model v1.2.0.dev1 Oct 5 2024 21:22:03[JSBSim-ML v2.0]JSBSim startup beginning ...…

15个出色和使用的python库用于制图与GIS分析

用于 GIS 和制图的 Python 库。Python 库是 GIS 的终极扩展&#xff0c;因为它们允许你增强其核心功能。通过使用 Python 库&#xff0c;你可以摆脱 GIS 的束缚&#xff0c;深入研究一些严肃的数据科学。Python有200 多个标准库。但也有数千个第三方库。所以&#xff0c;你能走…

必须保证信号连续的原因

**引言&#xff1a;**本文首先总体叙述了信号线不连续的情况&#xff0c;然后通过仿真&#xff0c;更直观的表达了各种阻抗不连续对传输线带来的影响&#xff0c;最后针对信号线提出了相应的措施。 信号不连续的情况&#xff08;阻抗不连续&#xff09; 1、 参考平面不一致 …

Unity实现自定义图集(五)

以下内容是根据Unity 2020.1.0f1版本进行编写的   在Unity编辑器上的自定义图集已经完成了,但是如何将自定义图集文件打包,以及在移动平台将自定义图集和对应的纹理图(Texture)加载出来是个问题,本篇就来解决这些问题 1、思路 首先是自定义图集的打包。 自定义图集实际…

总结β光滑性的推论

文章目录 1. β光滑性的定义2. 补充知识柯西-施瓦茨不等式中值定理 3. β光滑性的推论4. β光滑性推论的证明 1. β光滑性的定义 2. 补充知识 柯西-施瓦茨不等式 中值定理 3. β光滑性的推论 4. β光滑性推论的证明 其中&#xff0c;第4步&#xff1a;使用梯度差的界限中的小于…

实战分析:为什么TAPD是提升团队协作效率的关键工具?

随着企业的不断发展&#xff0c;企业的团队协作能力变得越来越重要&#xff0c;不同类型的企业&#xff0c;在不同的发展阶段&#xff0c;需要的协作方法和工具是不完全相同的。为了在这个快节奏的环境中保持竞争力&#xff0c;许多企业都在寻找能够有效提升团队协作效率的工具…

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

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-04 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-04目录1. A Multiple-Fill-in-the-Blank Exam Approach for Enhancing Zero-Resource Hallucination Detection in Large Langua…

en造数据结构与算法C# 之 堆排序

堆的特点 堆排序有两个分类&#xff1a;大顶堆&#xff0c;小顶堆 比如大顶堆就是说所有根节点的值都比左右子节点大 en造数据结构与算法C# 二叉排序树 泛型类的基本构成-CSDN博客 en造数据结构与算法C# 之 二叉排序树的增/查-CSDN博客 en造数据结构与算法C# 之 二叉排序…

YOLO11涨点优化:注意力魔改 | 双重注意力机制DoubleAttention,有效地捕获图像中不同位置和不同特征的重要性

💡💡💡本文改进内容: DoubleAttention该网络结构采用双重注意力机制,包括Spatial Attention和Channel Attention,有效地捕获图像中不同位置和不同特征的重要性 💡💡💡本文改进:分别加入到YOLO11的backbone、neck、detect,助力涨点 改进1结构图: 改进2结构图…

『网络游戏』XML配置文件随机名字【12】

首先制作xml模板 在桌面上创建txt自定义重命名water 将以下代码复制在txt文本中修改后缀为.xml <?xml version"1.0" encoding"UTF-8"?> <root> <item ID""> <surname></surname> <man…

科技云报到:云服务的中场战事,从AI应用开始

科技云报到原创。 从去年的大模型之战&#xff0c;到今年的AI应用之争&#xff0c;云服务正在迈入全新的发展阶段。AI这个杠杆将各家厂商的竞争策略更向前推进了一步。 “云AI”能够孵化出多少可能&#xff1f;在业界眼中&#xff0c;“云AI”则意味着新的悬念&#xff1a;云计…

调度台设计厂家智能化管理体系中到底有多重要?

在当今这个信息化、智能化高速发展的时代&#xff0c;调度台作为各类指挥中心、监控中心及应急响应系统的核心枢纽&#xff0c;其设计与制造水平直接关系到整个系统的运行效率与稳定性。因此&#xff0c;选择一家专业、可靠的调度台设计厂家&#xff0c;成为了众多企事业单位在…

微信小程序——婚礼邀请函

一、界面设计 首页&#xff1a; 精美的婚礼主题背景图&#xff0c;可能是新人的婚纱照或浪漫的插画。温馨的欢迎语&#xff0c;如 “欢迎参加我们的婚礼”。一个 “打开邀请函” 的按钮&#xff0c;引导用户进入邀请函详情页面。 邀请函详情页面&#xff1a; 顶部展示新人的照片…

瑞华技术募资额巨降过半:业绩大幅下滑,信用期外应收账款占比高

《港湾商业观察》黄懿 上市的节奏有快有慢&#xff0c;常州瑞华化工工程技术股份有限公司&#xff08;下称“瑞华技术”&#xff0c;920099.BJ&#xff09;自2023年3月被北交所受理后&#xff0c;于2024年8月29日获得注册批文&#xff0c;9月25日正式挂牌上市。 据了解&#…

如何使用pymysql和psycopg2连接MySQL和PostgreSQL数据库

在现代软件开发中&#xff0c;数据库是存储和管理数据的核心组件。Python作为一种流行的编程语言&#xff0c;提供了多种方式来连接和操作数据库。在这篇文章中&#xff0c;我们将探讨如何使用pymysql和psycopg2这两个库来连接MySQL和PostgreSQL数据库。我们将从基础概念开始&a…

【总结分享】10种常用前后端鉴权方法,让你不再迷惘

本文转载自&#xff1a;https://juejin.cn/post/7129298214959710244 作者&#xff1a;易师傅 关于前端鉴权这块&#xff0c;token、cookie、session、jwt、单点登录、扫码登录、一键登录是什么意思&#xff1f;分别有什么作用&#xff1f;你一般是怎么做的&#xff1f;以及你…