DS1302实时时钟芯片_读写时间实现电子钟功能

一、前言

1.1 功能说明

本项目以STC90C51单片机为核心,结合DS1302实时时钟芯片和IIC协议的OLED显示屏,设计了一款功能丰富、操作简便的电子时钟。

【1】项目目标

  1. 实现高精度的时间显示,包括时、分、秒。
  2. 提供按键调整时间的功能,方便用户校准时间。
  3. 利用OLED显示屏以直观的方式展示时间信息。

【2】系统架构

  1. 微控制器:采用STC90C51单片机作为核心控制器,负责整个系统的数据处理和逻辑控制。
  2. 实时时钟芯片:选用DS1302作为实时时钟芯片,提供高精度的时间信息。DS1302通过I²C接口与STC90C51进行通信,实现时间的读取和设置。
  3. 显示屏:采用IIC协议的OLED显示屏作为显示设备,用于显示时间信息。显示屏与STC90C51通过SPI I²C接口连接,实现数据的传输和显示。
  4. 按键模块:设计一组按键用于调整时间。按键模块通过GPIO接口与STC90C51连接,实现按键信号的输入和识别。

【3】功能实现

  1. 时间显示:STC90C51定时从DS1302读取时间信息,并通过OLED显示屏进行显示。显示屏可以实时更新时间,保证时间的准确性。
  2. 时间调整:用户通过按键模块输入调整时间的指令,STC90C51根据指令对DS1302进行设置,实现时间的校准。

1.2 DS1302介绍

DS1302是由美国DALLAS公司推出的一款低功耗实时时钟芯片,具有涓细电流充电能力。以下是对DS1302的详细介绍:

【1】主要功能特点

  1. 计时功能:DS1302能够对年、月、日、周、时、分、秒进行精确计时,并具备闰年补偿功能,确保时间的准确性。
  2. 低功耗:该芯片功耗极低,工作电压在2.0V至5.5V范围内,使得它非常适合在需要长时间运行且电源有限的设备中使用。
  3. 数据存储:DS1302内部具有一个31×8的RAM寄存器,可用于临时性存放数据。
  4. 双电源引脚:DS1302拥有主电源/后备电源双电源引脚设计,可以在主电源关闭的情况下,通过后备电源保持时钟的连续运行。
  5. 串行I/O通信:采用串行I/O通信方式,相对于并行通信更节省IO口的使用。

【2】引脚说明

DS1302共有8个引脚,包括:

  • VCC2:主电源正极的引脚。
  • X1和X2:晶振输入和输出引脚,外接32.768kHz晶振。
  • GND:负极。
  • CE:使能引脚,接单片机的IO口,用于启动和停止时钟芯片的工作。
  • I/O:数据传输引脚,接单片机的IO口,用于数据的读写。
  • SCLK:通信时钟引脚,接单片机的IO口,用于同步数据传输。
  • RST:复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST也有两种功能:一是接通控制逻辑,允许地址/命令序列送入移位寄存器;二是提供终止单字节或多字节数据传送的方法。
  • VCC1:后备电源引脚,在主电源关闭时,为DS1302提供电源。

【3】应用领域

由于其稳定可靠、易于使用和低功耗等特点,DS1302被广泛应用于各个领域,包括:

  • 电子产品:如手机、平板电脑等需要准确显示时间的设备中。
  • 工业控制系统:如自动化生产线、仪器仪表等需要同步计时和记录数据的设备中。
  • 汽车电子系统:如车载导航仪、车载音响等需要准确显示时间和日期信息的设备中。

image-20240612113752914

image-20240612113806768

二、代码实现

2.1 main.c

#include <reg51.h>
#include "delay.h"
#include "type.h"
#include "uart.h"
#include "ds1302.h"
//#include "key.h"
//#include "led.h"
//#include "timer.h"
//#include "exti.h"
//#include "infrared.h"
//#include "ds18b20.h"
//#include "at24c02.h"int main()
{u8 stat;UART_Init();        //初始化串口波特率为4800DS1302_Init();stat=DS1302_ReadByte(0x80|0x01);//读取秒if(stat&0x80){DS1302_WriteTime(2020-2000,1,18,16,33,33,6);}else{printf("DS1302 OK\r\n");}while(1){DS1302_ReadTime();printf("DS1302:%d-%d-%d %d:%d:%d %d\r\n",(int)DS1302_TIME[0]+2000,(int)DS1302_TIME[1],(int)DS1302_TIME[2],(int)DS1302_TIME[3],(int)DS1302_TIME[4],(int)DS1302_TIME[5],(int)DS1302_TIME[6]);     DelayMs(1000);}
}

2.2 DS1302.c

#include"ds1302.h"
//定义ds1302使用的IO口
sbit DS1302_IO=P3^4;
sbit DS1302_RST=P3^5;
sbit DS1302_SCLK=P3^6;u8 DS1302_TIME[7]; //存放读取的时间/*
函数功能: 将十进制数据转为BCD码
*/
u8 DEC_TO_BCD(u8 val)
{return ((val/10)<<4)+val%10;
}/*
函数功能: 将BCD码数据转为十进制格式
*/
u8 BCD_TO_DEC(u8 val)
{return (val&0x0f)+(val>>4)*10;
}void DS1302_Init(void)
{DS1302_RST=0;DS1302_SCLK=0;//先将DS1302_SCLK置低电平。
}/*
函数功能: 向DS1302指定寄存器里写一个字节数据
*/
void DS1302_WriteByte(u8 addr,u8 dat)
{u8 n;DS1302_RST=1; //然后将DS1302_RST(CE)置高电平。/*1. 设置写入的地址*/for(n=0;n<8;n++){DS1302_IO=addr&0x01;//数据从低位开始传送addr>>=1;DS1302_SCLK=1;//数据在上升沿时,DS1302读取数据DS1302_SCLK=0;}/*2. 写入数据*/for(n=0;n<8;n++){DS1302_IO=dat&0x01;dat>>=1;DS1302_SCLK=1;//数据在上升沿时,DS1302读取数据DS1302_SCLK=0;}	DS1302_RST=0;//传送数据结束
}/*
函数功能: 从DS1302指定寄存器里读取一个字节数据
*/
u8 DS1302_ReadByte(u8 addr)
{u8 n=0,dat=0;DS1302_RST=1;   //然后将DS1302_RST(CE)置高电平。/*1. 设置读取的地址*/for(n=0;n<8;n++){DS1302_IO=addr&0x01;//数据从低位开始传送addr>>=1;DS1302_SCLK=1;//数据在上升沿时,DS1302读取数据DS1302_SCLK=0;//DS1302下降沿时,放置数据}/*2. 读取数据*/for(n=0;n<8;n++){dat>>=1;if(DS1302_IO)dat|=0x80;DS1302_SCLK=1;DS1302_SCLK=0;//DS1302下降沿时,放置数据}DS1302_RST=0;//必须的操作,复位时间DS1302_IO=0;DS1302_IO=1;return dat;	
}/*
函数功能: 设置DS1302芯片的时间
DS1302的时间基准是从2000年开始的,设置年份时要减去2000再传入设置
例如:DS1302_WriteTime(20,1,18,14,46,20,6);
*/
void DS1302_WriteTime(u8 year,u8 mon,u8 mday,u8 hour,u8 min,u8 sec,u8 week)
{DS1302_WriteByte(0x8E,0x00); //禁止写保护,就是关闭写保护功能	DS1302_WriteByte(0x8c,DEC_TO_BCD(year)); //设置年	DS1302_WriteByte(0x88,DEC_TO_BCD(mon));  //设置月	DS1302_WriteByte(0x86,DEC_TO_BCD(mday)); //设置日	DS1302_WriteByte(0x84,DEC_TO_BCD(hour)); //设置时	DS1302_WriteByte(0x82,DEC_TO_BCD(min));  //设置分	DS1302_WriteByte(0x80,DEC_TO_BCD(sec));  //设置秒	DS1302_WriteByte(0x8a,DEC_TO_BCD(week)); //设置星期	DS1302_WriteByte(0x8E,0x80);		     //打开写保护功能
}/*
函数功能: 读取DS1302时钟的时间
DS1302寄存器的最低位是读写位,0是写,1是读
*/
void DS1302_ReadTime(void)
{DS1302_TIME[0]=BCD_TO_DEC(DS1302_ReadByte(0x8c|0x01));//读取年DS1302_TIME[1]=BCD_TO_DEC(DS1302_ReadByte(0x88|0x01));//读取月DS1302_TIME[2]=BCD_TO_DEC(DS1302_ReadByte(0x86|0x01));//读取日	DS1302_TIME[3]=BCD_TO_DEC(DS1302_ReadByte(0x84|0x01));//读取时DS1302_TIME[4]=BCD_TO_DEC(DS1302_ReadByte(0x82|0x01));//读取分	DS1302_TIME[5]=BCD_TO_DEC(DS1302_ReadByte(0x80|0x01));//读取秒	DS1302_TIME[6]=BCD_TO_DEC(DS1302_ReadByte(0x8a|0x01));//读取星期
}

2.2 ds1302.h

#ifndef _DS1302_H
#define _DS1302_H
#include "type.h"
#include <reg51.h>
#include "delay.h"
#include "type.h"
#include "uart.h"
#include <intrins.h>//定义全局函数
u8 DEC_TO_BCD(u8 val);  //十进制转BCD码
u8 BCD_TO_DEC(u8 val);  //BCD码转十进制
u8 DS1302_ReadByte(u8 addr);
void DS1302_WriteByte(u8 addr,u8 dat);
void DS1302_WriteTime(u8 year,u8 mon,u8 mday,u8 hour,u8 min,u8 sec,u8 week);
void DS1302_ReadTime(void);
void DS1302_Init(void);
//加入全局变量
extern u8 DS1302_TIME[7];
#endif

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

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

相关文章

[Java]Swing版坦克大战小游戏项目开发(1)——new出一个窗口

highlight: xcode theme: vuepress 前言 本系列文章带领 Java 初学者学习使用 Java 语言结合 Swing 技术以及设计模式开发一款经典小游戏——坦克大战。通过这个小游戏&#xff0c;你可以学会很多实用的设计模式思想&#xff0c;并且提高你的编码水平。 熟悉Frame Frame 类是 J…

【java计算机毕设】基于java的奶茶店管理系统的设计与实现MySQL ssm JSP maven项目代码源码+文档

目录 1项目功能 2项目介绍 3项目地址 1项目功能 【java计算机毕设】奶茶店管理系统java MySQL ssm JSP maven项目源码代码万字文档 小组设计 2项目介绍 系统功能&#xff1a; 奶茶店管理系统包括管理员、用户俩种角色。 管理员功能包括个人中心模块用于修改个人信息和密码、…

UDP通讯实现

服务器端&#xff1a; 1.获取套接字 int fd;fdsocket(AF_INET,SOCK_DGRAM,0);if(fd<0){perror("socket");exit(0);} #include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int protocol); -domain: 指定通信域&…

Retrofit框架源码深度剖析【Android热门框架分析第二弹】

Android热门框架解析&#xff0c;你确定不来看看吗&#xff1f; OkHttp框架源码深度剖析【Android热门框架分析第一弹】 Retrofit框架源码深度剖析【Android热门框架分析第二弹】 什么是Retrofit&#xff1f; 准确来说&#xff0c;Retrofit 是一个 RESTful 的 HTTP 网络请求…

Miniconda的常见用法——以Isaacgym为例

1. ubuntu24.04安装minicondda mkdir -p ~/miniconda3 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh解释下这段代码 bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3~/miniconda3/miniconda.sh: 指向Mi…

SHARPNESS-AWARE MINIMIZATION FOR EFFICIENTLY IMPROVING GENERALIZATION--论文笔记

论文笔记 资料 1.代码地址 https://github.com/google-research/sam https://github.com/davda54/sam 2.论文地址 https://arxiv.org/abs/2010.01412 3.数据集地址 论文摘要的翻译 在当今严重过度参数化的模型中&#xff0c;训练损失的值很难保证模型的泛化能力。事实上…

MySQL第三次练习

作业三 一 先创建DB abc&#xff0c;创建table student 1、插入一条记录 2、添加多条记录 3、添加部分记录 4、加0.5 5、删除成绩为空的记录 二 1、创建一个用户test1使他只能本地登录拥有查询student表的权限。 2、查询用户test1的权限。 3、删除用户test1. 全在一张图上…

怎样优化 PostgreSQL 中对日期时间范围的模糊查询?

文章目录 一、问题分析&#xff08;一&#xff09;索引未有效利用&#xff08;二&#xff09;日期时间格式不统一&#xff08;三&#xff09;复杂的查询条件 二、优化策略&#xff08;一&#xff09;使用合适的索引&#xff08;二&#xff09;规范日期时间格式&#xff08;三&a…

逻辑回归模型(非回归问题,而是分类问题)

目录&#xff1a; 一、Sigmoid函数&#xff1a;二、逻辑回归介绍&#xff1a;三、决策边界四、逻辑回归模型训练过程&#xff1a;1.训练目标&#xff1a;2.梯度下降调整参数&#xff1a; 一、Sigmoid函数&#xff1a; Sigmoid函数是构建逻辑回归模型的重要函数&#xff0c;如下…

免费压缩pdf文件大小软件收费吗?pdf如何压缩文件大小?12款压缩应用推荐!

在数字化时代&#xff0c;PDF文件因其跨平台、格式统一的特点而广受欢迎。然而&#xff0c;随着文件内容的增加&#xff0c;PDF文件的大小也逐渐增大&#xff0c;给存储和传输带来了诸多不便。因此&#xff0c;寻找一款合适的PDF压缩软件成为了许多用户的需求。本文将详细介绍1…

电子设备常用的胶水有哪些?

目录 1、502胶水 2、703胶水 3、704胶水 4、AB胶 5、红胶 6、Underfill 7、导电胶 8、UV胶 9、热熔胶 10、环氧树脂胶 11、硅酮胶 12、聚氨酯胶 13、丙烯酸胶 14、丁基胶 1、502胶水 502胶水&#xff0c;也被称为瞬间胶或快干胶&#xff0c;是一种非常常见的粘合…

电动卡丁车语音芯片方案选型:让驾驶体验更智能、更安全

在追求速度与激情的电动卡丁车领域&#xff0c;每一次升级都意味着更加极致的驾驶体验。而今天&#xff0c;我们要介绍的&#xff0c;正是一款能够显著提升电动卡丁车智能化与安全性的语音芯片方案——为您的爱车增添一份独特的魅力与安全保障。 智能化升级&#xff0c;从“听…

布隆过滤器 redis

一.为什么要用到布隆过滤器&#xff1f; 缓存穿透&#xff1a;查询一条不存在的数据&#xff0c;缓存中没有&#xff0c;则每次请求都打到数据库中&#xff0c;导致数据库瞬时请求压力过大&#xff0c;多见于爬虫恶性攻击因为布隆过滤器是二进制的数组&#xff0c;如果使用了它…

科普文:K8S中常见知识点梳理

简单说一下k8s集群内外网络如何互通的 要在 Kubernetes&#xff08;k8s&#xff09;集群内外建立网络互通&#xff0c;可以采取以下措施&#xff1a; 使用service&#xff1a; 使用Service类型为NodePort或LoadBalancer的Kubernetes服务。这可以使服务具有一个公共IP地址或端口…

Open3D 计算点云的平均密度

目录 一、概述 1.1基于领域密度计算原理 1.2应用 二、代码实现 三、实现效果 2.1点云显示 2.2密度计算结果 一、概述 在点云处理中&#xff0c;点的密度通常表示为某个点周围一定区域内的点的数量。高密度区域表示点云较密集&#xff0c;低密度区域表示点云较稀疏。计算…

Redis连接Resp图形化工具和springboot

Redis连接Resp图形化工具和springboot 1.redis配置1.1 备份、修改conf文件1.2 Redis的其它常见配置&#xff1a;1.3 启动Redis&#xff1a;1.4 停止服务&#xff1a;1.5 开机自启&#xff1a; 2. resp的安装、配置和连接&#xff1a;2.1 GitHub上下载2.2 开始连接redis ![在这里…

C++初探究

概述 C可以追溯到1979年&#xff0c;C之父Bjarne Stroustrup在在使用C语言研发工作时发现C语言的不足&#xff0c;并想要将其改进&#xff0c;到1983年&#xff0c;Bjarne Stroustrup在C语言的基础上添加了面向对象编程的特性&#xff0c;设计出了C的雏形。 网址推荐 C官方文…

王老师 linux c++ 通信架构 笔记(三)安装 xftp、

&#xff08;11&#xff09;调整 xshell 终端的字体大小&#xff0c;默认字体大小是 9 &#xff1a; &#xff08;12&#xff09; 共享文件夹 hgfs 的含义&#xff1a; &#xff08;13&#xff09;安装 xftp &#xff0c; 傻瓜式安装&#xff0c;出了修改下默认安装位置。 操作…

.locked勒索病毒解析与防护指南

引言 随着信息技术的飞速发展&#xff0c;网络安全问题日益严峻&#xff0c;其中勒索病毒成为威胁企业和个人数据安全的重要隐患之一。在众多勒索病毒家族中&#xff0c;.locked勒索病毒以其独特的加密方式和广泛的传播途径&#xff0c;引起了广泛的关注。本文将从多个方面详细…