首页 > 其他分享 >DS1302时钟模块

DS1302时钟模块

时间:2025-01-05 11:58:29浏览次数:3  
标签:10 temp Int DS1302 st 模块 date 时钟

DS1302

DS1302是一个低功耗、实时时钟(RTC)芯片
在这里插入图片描述

在这里插入图片描述

单字节写

1.发送数据前,需要将CE拉高,使能通信。需要注意的是,拉高CE时,需确保SCLK处于低电平
2.需要先发送命令字节,再发送数据字节,发送时都是低位优先

  • 命令字节用于指定寄存器地址以及声明读/写操作,各位的含义如下
  • 数据字节为发送的具体数据

3.每位数据都需要在一个时钟周期的上升沿发送
在这里插入图片描述

单字节读

1.接收数据前,需要将CE拉高,使能通信。需要注意的是,拉高CE时,需确保 SCLK 处于 低电平
2.需要先发送命令字节,再接收数据字节,发送和接收时都是低位优先
3.发送每位数据要在时钟信号的上升沿,读取每位数据要在时钟信号的下降沿
注意:第8个时钟周期,需要完成最后1位数据的发送和第1位数据的接收

在这里插入图片描述

寄存器介绍

在这里插入图片描述

在这里插入图片描述

注意:DS1302内部有一个写保护寄存器,在向DS1302写入数据前需要先关闭写保护,写完再开启写保护。

代码实现

Int_DS1302.h

#ifndef __INT_DS1302_H__
#define __INT_DS1302_H__

#include "Com_Util.h"
#include <STC89C5xRC.H>

typedef struct
{
    u8 second;
    u8 minute;
    u8 hour;
    u8 day;
    u8 month;
    u8 year;
    u8 day_of_week;
} Struct_Date;

void Int_DS1302_Init(void);

void Int_DS1302_SetDate(Struct_Date *p_st_date);

void Int_DS1302_GetDate(Struct_Date *p_st_date);

#endif /* __INT_DS1302_H__ */

Int_DS1302.c

#include "Int_DS1302.h"
#include "intrins.h"

#define SCLK        P36
#define IO          P34
#define CE          P35

#define SECOND      0x80
#define MINUTE      0x82
#define HOUR        0x84
#define DAY         0x86
#define MONTH       0x88
#define DAY_OF_WEEK 0x8A
#define YEAR        0x8C
#define WP          0x8E

void Int_DS1302_Init(void) {
	SCLK = 0;
	IO = 0;
	CE = 0;
}

static void Int_DS1302_WriteByte(u8 byte) {
	
	u8 i;

	SCLK = 0;
	for (i = 0; i < 8; i++) {
		IO = byte & 0x01;
		SCLK = 1;
		SCLK = 0;
		byte >>= 1;
	}
}

static u8 Int_DS1302_ReadByte() {
	
	u8 i, byte = 0;

	SCLK = 0;
	for (i = 0; i < 8; i++) {
		byte >>= 1;
		if (IO == 1) {
			byte = byte | 0x80;
		}
		SCLK = 1;
		SCLK = 0;
	}
	return byte;
}

static void Int_DS1302_SetRegister(u8 addr, u8 byte) {
	CE = 1;
	Int_DS1302_WriteByte(addr);
	Int_DS1302_WriteByte(byte);
	CE = 0;
}

static u8 Int_DS1302_GetRegister(u8 addr) {
	u8 byte;
	CE = 1;
	Int_DS1302_WriteByte(addr | 1);
	byte = Int_DS1302_ReadByte();
	CE = 0;
	SCLK = 1;
	IO = 0;
	IO = 1;
	return byte;
}

void Int_DS1302_SetDate(Struct_Date* p_st_date) {
	u8 temp;

	// 关闭写保护
	Int_DS1302_SetRegister(WP, 0x00);

	// 设置秒
	temp = (p_st_date->second % 10) | ((p_st_date->second / 10) << 4);
	Int_DS1302_SetRegister(SECOND, temp);

	// 设置分钟
	temp = (p_st_date->minute % 10) | ((p_st_date->minute / 10) << 4);
	Int_DS1302_SetRegister(MINUTE, temp);

	// 设置小时
	temp = (p_st_date->hour % 10) | ((p_st_date->hour / 10) << 4);
	Int_DS1302_SetRegister(HOUR, temp);

	// 设置日
	temp = (p_st_date->day % 10) | ((p_st_date->day / 10) << 4);
	Int_DS1302_SetRegister(DAY, temp);

	// 设置月
	temp = (p_st_date->month % 10) | ((p_st_date->month / 10) << 4);
	Int_DS1302_SetRegister(MONTH, temp);

	// 设置年
	temp = (p_st_date->year % 10) | ((p_st_date->year / 10) << 4);
	Int_DS1302_SetRegister(YEAR, temp);

	// 设置星期
	Int_DS1302_SetRegister(DAY_OF_WEEK, p_st_date->day_of_week % 10);

	// 开启写保护
	Int_DS1302_SetRegister(WP, 0x80);
}

void Int_DS1302_GetDate(Struct_Date* p_st_date) {
	u8 temp;
	// 获取秒
	temp = Int_DS1302_GetRegister(SECOND);
	p_st_date->second = (temp >> 4) * 10 + (temp & 0x0F);

	temp = Int_DS1302_GetRegister(MINUTE);
	p_st_date->minute = (temp >> 4) * 10 + (temp & 0x0F);

	temp = Int_DS1302_GetRegister(HOUR);
	p_st_date->hour = (temp >> 4) * 10 + (temp & 0x0F);

	temp = Int_DS1302_GetRegister(DAY);
	p_st_date->day = (temp >> 4) * 10 + (temp & 0x0F);

	temp = Int_DS1302_GetRegister(MONTH);
	p_st_date->month = (temp >> 4) * 10 + (temp & 0x0F);

	temp = Int_DS1302_GetRegister(YEAR);
	p_st_date->year = (temp >> 4) * 10 + (temp & 0x0F);

	temp = Int_DS1302_GetRegister(DAY_OF_WEEK);
	p_st_date->day_of_week = (temp >> 4) * 10 + (temp & 0x0F);
}


main.c

#include "Int_DS1302.h"
#include "Int_Oled.h"
#include "STDIO.H"

code char* WEEK_NAME[] = {
	"Mon",
	"Tue",
	"Wed",
	"Thu",
	"Fri",
	"Sat",
	"Sun" };

void main() {
	u8 str[17];
	Struct_Date st_date;
	st_date.year = 23;
	st_date.month = 12;
	st_date.day = 29;
	st_date.day_of_week = 5;
	st_date.hour = 11;
	st_date.minute = 32;
	st_date.second = 00;

	// 初始化时钟并设置时间
	Int_DS1302_Init();
	Int_Oled_Init();
	Int_DS1302_SetDate(&st_date);

	Int_Oled_Clear();

	while (1) {
		Int_DS1302_GetDate(&st_date);

		sprintf(str, "20%02d/%02d/%02d %s",
			(int)st_date.year,
			(int)st_date.month,
			(int)st_date.day,
			WEEK_NAME[st_date.day_of_week - 1]);

		Int_Oled_ShowStr(0, 0, str);

		sprintf(str, "%02d:%02d:%02d",
			(int)st_date.hour,
			(int)st_date.minute,
			(int)st_date.second);

		Int_Oled_ShowStr(0, 1, str);
	}
}

原理图

在这里插入图片描述
说明:
这里I/O口没有接上拉电阻,所以代码中需要注意以下几点
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

标签:10,temp,Int,DS1302,st,模块,date,时钟
From: https://blog.csdn.net/m0_58749949/article/details/144933939

相关文章

  • python【模块与包】
    Python不仅在Python标准库包含了大量的模块(标准模块),还有很多第三方模块,也可以自定义模块。目录1.概念1.1模块1.2包2.使用模块2.1创建模块2.2导入包2.3 引入模块使用import语句导入使用from···import语句导入使用from…import* 语句导入__......
  • 基于AT89C51的数字时钟课程设计
    摘要:单片微型计算机简称单片机,又称为微控制器,是将CPU、RAM、ROM、定时/计数器、I/O接口电路集成到一块电路芯片上构成的微型计算机。本次设计的系统由单片机系统、数码管显示系统、键盘、蜂鸣器等组成,通过按键来控制单片机实现数字时钟的时、分、秒显示,12、24制转换,设定时间、闹......
  • maven 多模块版本统一
    1.概述在使用maven开发的时候,我们会使用到多模块开发,比如我们开发一些starter,我们可以在一个项目下开发多个starter,如果每个模块都有一个版本,我们需要对每个版本进行调整。这样会很麻烦。所以我们需要实现多个模块实现版本统一,在引用的时候实现统一版本就可以了。2.实现方法在m......
  • WiFi+4G摄像头拍照图传模块(夜视2K高清1080P)-外部引脚触发拍照http post上传到服务器
    <p><iframename="ifd"src="https://mnifdv.cn/resource/cnblogs/product/audioCamera.html"frameborder="0"scrolling="auto"width="100%"height="1500"></iframe></p>  测试1......
  • ROS节点架构设计:提高模块化与可扩展性
    在ROS2(RobotOperatingSystem2)的开发中,节点的架构设计是构建高效、稳定和可扩展机器人系统的基石。一个设计良好的节点架构不仅有助于提升系统的模块化水平,还能极大地增强代码的可维护性。本文将深入探讨ROS2中的三种常见节点架构模式:分层架构、微服务架构和事件驱动架......
  • WiFi+4G摄像头拍照图传模块(夜视2K高清1080P)-定时拍照http post上传到服务器,然后低
    <p><iframename="ifd"src="https://mnifdv.cn/resource/cnblogs/product/audioCamera.html"frameborder="0"scrolling="auto"width="100%"height="1500"></iframe></p> 提示!1,......
  • Java学习笔记07-加油站支付小模块
    需求:某加油站为了吸引更多的车主,推出如下活动,车主可以办理金卡或银卡。卡片信息包括:车牌号码、车主姓名、电话号码、卡片余额。金卡办理时入存金额必须>=5000元,银卡办理时入存金额必须>=2000元,金卡支付时享受8折优惠,银卡支付时享受9折优惠,金卡消费满200元可以提供打印免费洗......
  • javaweb仓库仓储系统出入库模块设计
    目录项目介绍具体实现截图开发核心技术:写作提纲开发过程思路核心代码部分展示实验方案:详细视频演示源码获取方式项目介绍本系统主要包括管理员和员工;主要包括:主页、个人中心、员工管理、客户信息管理、供应商管理、仓库信息管理、货物类型管理、货物信息管理、货物......
  • 请说下在TypeScript中命名空间与模块的区别?
    在TypeScript中,命名空间和模块是两个重要的概念,但它们之间存在一些关键的区别。命名空间(Namespace)命名空间,也被称为内部模块,是TypeScript早期版本中用于组织代码的一种方式。它允许你将相关的类型、变量、函数等封装在一个命名空间内,以避免命名冲突,并提供更好的代码组织结构。命......
  • 请说说你对TypeScript中模块的理解
    在TypeScript(以及现代JavaScript)中,模块是一个非常重要的概念。模块允许我们将代码分割成多个独立的、可复用的片段,这些片段可以按需加载和组合,以构建更复杂的应用程序。在前端开发中,模块的使用尤其重要,因为它们有助于我们更好地组织和管理代码,提高代码的可维护性和可扩展性。以下......