DS1302时钟芯片

目录

DS1302简介

前言

DS1302内部结构

理解:

DS1302引脚图

DS1302常用寄存器

寄存器控制指令

解释:

常用寄存器指令

DS1302控制时序

单字节读

代码辅助理解

单字节写 

代码辅助理解

仿真案例

电路图

keil文件

DS1302简介

前言

  • DS1302 是一个实时时钟芯片,可以提供秒、分、小时、日期、月、年等信息,并且还有软件自动调整的能力,可以通过配置 AM/PM 来决定采用 24 小时格式还是 12 小时格式。
  • 拥有 31 字节数据存储 RAM。
  • 串行 I/O 通信方式,相对并行来说比较节省IO口的使用。
  • DS1302 的工作电压比较宽,在 2.0~5.5V 的范围内都可以正常工作。
  • DS1302 这种时钟芯片功耗一般都很低,它在工作电压 2.0V 的时候,工作电流小于 300nA。
  • DS1302 共有 8 个引脚,有两种封装形式,一种是 DIP-8 封装,芯片宽度(不含引脚) 是 300mil,一种是 SOP-8 封装,有两种宽度,一种是 150mil,一种是 208mil。

DS1302内部结构

理解:

  • 电源控制模块:DS1302 有两个电源输入,一个是主电源VCC2,另外一个是备用电源VCC1,比如可以用电池或者大电容,这样做是为了在系统掉电的情况下,我们的时钟还会继续走。如果使用的是充电电池,还可以在正常工作时设置充电功能,给我们的备用电池进行充电。
  • 时钟电路:X1和X2接的是外部的晶振,并通过内部的电路进行一些设置(频率分频等)最终会输出1Hz的标准计时频率
  • 实时时钟RAM:实时时钟就是我们的寄存器,我们内部的时间都是存在该寄存器里面的,里面有31*8个RAM,我们只需要对寄存器进行读写就可以访问时间了。
  • 命令控制逻辑和输入移位寄存器模块:该模块决定了怎么去读写寄存器(SCLK每来一个上升沿,那么IO数据输入移位一次,数据到达命令控制逻辑后要经过CE开关,CE为高电平时数据移位才是有用的)。

DS1302引脚图

注意:

  • 我们在上电时,时钟芯片会以VCC当做电源,同时会对备用电池进行冲电,一旦掉电他就会自动切换到备用电池,保障时钟继续运行。
  • DS1302与单片机通信只需要RES(复位线)、IO(数据线)、SCLK(串行时钟)三根信号线(利用这三根引脚,单片机就可以把芯片内部的时钟读出来)
  • VCC1为+3V供电;VCC2为+5V供电

DS1302常用寄存器

注意:

  • 这里面日历寄存器的值采用BCD码的存储行式。
  • BCD码转10进制:DEC=BCD/16*10+BCD%16;10进制转BCD码:BCD=DEC/10*16+DEC%10
  • 秒寄存器中D7的CH就是时钟暂停,若把该位给1,那么这个秒就会停止,进而导致时钟整个都暂停了;若该位给0则时钟运行(秒钟导致分钟进位,分钟导致小时进位,以此类推)。
  • 时寄存器中D7为0则设置的为24小时模式,D7为1则设置的为24小时模式;D5为0表示AM,D5为1表示PM
  • 年寄存器只能记录到2000年到2099年(因为只有十位和个位可变)
  • 写保护寄存器可以用来关闭写保护,通过发送数据0x00关闭写保护;发送数据0x80打开写保护

寄存器控制指令

解释:

  • D7:固定为1
  • D6:RAM/CK杠位,片内的RAM或日历、时钟寄存器选择位,1为片内RAM,0为日历时钟寄存器
  • D5——D1:地址位,用于选择进行读写的日历、时钟寄存器或片内RAM
  • D0:RD/W读写位,0为写,1为读

常用寄存器指令

注意:向寄存器写入时,那么写入的命令为特定寄存器的地址,若从寄存器读取时,那么读取的命令为寄存器的地址+1。

DS1302控制时序

单字节读

理解:首先将CE置位高电平开始读,将命令字的最低位设置到IO口中;之后时钟给个上升沿,那么命令字的最低位便会被写入单片机;将时钟再置为0后把数据的第2位放入IO口,时钟再给上升沿如此循环往复将最高位也写入IO口,之后时钟给低电平,此时便完成了对命令字的写入操作;DS1302接收到数据后,就会在紧跟着这个时钟的下降沿将这个数据放在IO线上,单片机此时将IO口释放掉,就开始读出DS1302发来的数据(每个下降沿来一个数据)读取完后时钟置0,CE置0,整个操作结束。

代码辅助理解

//单字节读
unsigned char DS1302_ReadByte(unsigned char Command){
	DS1302_RST=0;
	DS1302_SCLK=0;
	unsigned char i,Data=0x00;
	DS1302_RST=1;
	//写命令字
	for(i=0;i<8;i++){
		DS1302_IO=Command&(0x01<<i); //取出第i位
		//写入
		DS1302_SCLK=0;
		DS1302_SCLK=1;
		//先0后1那么就会在最后致使DS1302_SCLK=1,进而保障了for循环内都与写入有关
	}
	//单片机开始读取数据
	for(i=0;i<8;i++){
	DS1302_SCLK=1;
	DS1302_SCLK=0;
	//若端口状态为1,那么就相当于把IO的1给了Data(先读低位,后读高位)
	if(DS1302_IO==1){
		Data=Data|(0x01<<i);
		}
	}
	DS1302_RST=0;
	DS1302_IO=0; 
	return Data;
}

单字节写 

理解:首先将CE置高电平开始写;将命令字的最低位设置到IO口中;之后时钟给个上升沿,那么命令字的最低位便会被写入单片机;将时钟再置为0后把数据的第2位放入IO口,时钟再给上升沿如此循环往复将最高位也写入IO口,之后时钟给低电平,此时便完成了对命令字的写入操作(发第二个字节的数据和第一个字节命令字过程一样,只不过操作完后再将CE置0)

代码辅助理解

//单字节写
void DS1302_WriteByte(unsigned char Command,unsigned char Data){
	DS1302_RST=0;
	DS1302_SCLK=0;
	unsigned char i;
	DS1302_RST=1;
	//写命令字
	for(i=0;i<8;i++){
		DS1302_IO=Command&(0x01<<i); //取出第i位
		//写入
		DS1302_SCLK=1;
		DS1302_SCLK=0;
	}
	//写数据
	for(i=0;i<8;i++){
		DS1302_IO=Data&(0x01<<i); //取出第i位
		//写入
		DS1302_SCLK=1;
		DS1302_SCLK=0;
	}
	DS1302_RST=0;
	DS1302_IO=0;
}

注意:

  • SCLK每震荡一次,那么就会读取或写入一位数据,在时钟的上升沿,IO口上的电平将会被写入DS1302,在时钟的下降沿,IO口的数据将会从DS1302读出。
  • IO口中数据分两部分,第一部分为指定那一个地址,后面的阶段为真正的读取/写入数据
  • 无论是命令还是数据,一个字节传送时都是低位在前,高位在后(见时序图)。
  • 向芯片写入数据时,首先关闭写保护。

仿真案例

需求:根据数组设定,LCD液晶屏上显示年月日,时分秒(步进)。

电路图

keil文件

#include "reg51.h"
//注意:想看DS1302代码,请见61行后
sbit RS=P3^0;
sbit RW=P3^1;
sbit E=P3^2;
void delay(unsigned int n){
	unsigned int i=0,j=0;
	for(i=0;i<n;i++){
		for(j=0;j<120;j++);
	}
}
//写指令
void writecom(unsigned char com){
	//写指令
	RS=0;
	RW=0;
	E=0;
	P2=com;
	delay(5);
	E=1;
	E=0;
}
//写数据
void writedat(unsigned char dat){
	//写指令
	RS=1;
	RW=0;
	E=0;
	P2=dat;
	delay(5);
	E=1;
	E=0;
}
//初始化液晶屏
void initlcd(){
	writecom(0x38);
	writecom(0x0c);
	writecom(0x06);
	writecom(0x01);
}
int LCD_Pow(int X,int Y){
	unsigned char i;
	int Result=1;
	for(i=0;i<Y;i++){
		Result*=X;
	}
	return Result;
}
//展示数字
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length){
	unsigned char i;
	if(Line==1){
		writecom(0x80|(Column-1));
	}else{
		writecom(0x80|(Column-1)+0x40);
	}
	for(i=Length;i>0;i--){
		writedat('0'+Number/LCD_Pow(10,i-1)%10);
	}
}
//DS1302篇
sbit DS1302_RST=P3^3;
sbit DS1302_SCLK=P3^4;
sbit DS1302_IO=P3^5;
#define DS1302_SECOND 0x80
#define DS1302_MINUTE 0x82
#define DS1302_HOUR 0x84
#define DS1302_DATE 0x86
#define DS1302_MONTH 0x88
#define DS1302_DAY 0x8A
#define DS1302_YEAR 0x8C
#define DS1302_WP 0x8E
unsigned char DS1302_Time[]={19,11,16,12,59,55,6}; //年月日时分秒,星期
//初始化DS1302
void DS1302_Init(){
	DS1302_RST=0;
	DS1302_SCLK=0;
}
//单字节写
void DS1302_WriteByte(unsigned char Command,unsigned char Data){
	unsigned char i;
	DS1302_RST=1;
	//写命令字
	for(i=0;i<8;i++){
		DS1302_IO=Command&(0x01<<i); //取出第i位
		//写入
		DS1302_SCLK=1;
		DS1302_SCLK=0;
	}
	//写数据
	for(i=0;i<8;i++){
		DS1302_IO=Data&(0x01<<i); //取出第i位
		//写入
		DS1302_SCLK=1;
		DS1302_SCLK=0;
	}
	DS1302_RST=0;
	DS1302_IO=0;
}
//单字节读
unsigned char DS1302_ReadByte(unsigned char Command){
	unsigned char i,Data=0x00;
	Command|=0x01; //因为我想给地址的时候给写的地址
	DS1302_RST=1;
	//写命令字
	for(i=0;i<8;i++){
		DS1302_IO=Command&(0x01<<i); //取出第i位
		//写入
		DS1302_SCLK=0;
		DS1302_SCLK=1;
		//先0后1那么就会在最后致使DS1302_SCLK=1,进而保障了for循环内都与写入有关
	}
	//单片机开始读取数据
	for(i=0;i<8;i++){
	DS1302_SCLK=1;
	DS1302_SCLK=0;
	//若端口状态为1,那么就相当于把IO的1给了Data(先读低位,后读高位)
	if(DS1302_IO==1){
		Data=Data|(0x01<<i);
		}
	}
	DS1302_RST=0;
	DS1302_IO=0; 
	return Data;
}
//10进制转化BCD码
unsigned char DecToBcd(unsigned char dec){
	return (dec/10*16+dec%10);
}
//BCD码转10进制
unsigned char BcdToDec(unsigned char bcd){
	return (bcd/16*10+bcd%16);
}
//设定时间
void DS1302_SetTime(){
	DS1302_WriteByte(DS1302_WP,0x00); //关闭写保护
	DS1302_WriteByte(DS1302_YEAR,DecToBcd(DS1302_Time[0]));
	DS1302_WriteByte(DS1302_MONTH,DecToBcd(DS1302_Time[1]));
	DS1302_WriteByte(DS1302_DATE,DecToBcd(DS1302_Time[2]));
	DS1302_WriteByte(DS1302_HOUR,DecToBcd(DS1302_Time[3]));
	DS1302_WriteByte(DS1302_MINUTE,DecToBcd(DS1302_Time[4]));
	DS1302_WriteByte(DS1302_SECOND,DecToBcd(DS1302_Time[5]));
	DS1302_WriteByte(DS1302_DAY,DecToBcd(DS1302_Time[6]));
	DS1302_WriteByte(DS1302_WP,0x80); //打开写保护
}
//读取时间
void DS1302_ReadTime(){
	unsigned char temp=0;
	  temp=DS1302_ReadByte(DS1302_YEAR);
	DS1302_Time[0]=BcdToDec(temp);
	  temp=DS1302_ReadByte(DS1302_MONTH);
	DS1302_Time[1]=BcdToDec(temp);
	  temp=DS1302_ReadByte(DS1302_DATE);
	DS1302_Time[2]=BcdToDec(temp);
	  temp=DS1302_ReadByte(DS1302_HOUR);
	DS1302_Time[3]=BcdToDec(temp);
	  temp=DS1302_ReadByte(DS1302_MINUTE);
	DS1302_Time[4]=BcdToDec(temp);
	  temp=DS1302_ReadByte(DS1302_SECOND);
	DS1302_Time[5]=BcdToDec(temp);
	  temp=DS1302_ReadByte(DS1302_DAY);
	DS1302_Time[6]=BcdToDec(temp);
}
unsigned char Second=0;
void main()
{
	initlcd();
	DS1302_Init();
	DS1302_SetTime();
	while(1)
	{
		DS1302_ReadTime();
		LCD_ShowNum(1,1,DS1302_Time[0],2);
		delay(5);
		LCD_ShowNum(1,4,DS1302_Time[1],2);
		delay(5);
		LCD_ShowNum(1,7,DS1302_Time[2],2);
		delay(5);
		LCD_ShowNum(2,1,DS1302_Time[3],2);
		delay(5);
		LCD_ShowNum(2,4,DS1302_Time[4],2);
		delay(5);
		LCD_ShowNum(2,7,DS1302_Time[5],2);
		delay(5);
	}
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Pycharm环境配置完整教程

目录 python解释器下载 检查是否正确安装 Pycharm下载 Pycharm环境配置 本文主要介绍python解释器安装、Pycharm环境配置以及运行第一个程序的零基础的教程&#xff0c;即使是python小白也能正确配置相应的python学习环境哦&#xff01; python解释器下载 官网地址&#…

在jupyter notebook中使用conda环境

在jupyter notebook中使用conda环境 1. 环境配置 conda activate my-conda-env # this is the environment for your project and code conda install ipykernel conda deactivateconda activate base # could be also some other environment conda install nb_cond…

java学习之路-数组定义与使用

目录 ​编辑 1.什么是数组 2.数组的创建及其初始化 2.1数组的创建 2.2数组的初始化 3.数组的使用 3.1数组元素访问 3.2遍历数组 4.数组是引用类型 4.1jvm的内存分布 4.2基本类型变量与引用类型变量的区别 4.3引用变量详解 4.4 null 5.数组的使用场景 5.1存储数据 5…

【网课必备】学浪视频下载到本地

学浪作为知识付费平台&#xff0c;拥有大量的课程&#xff0c;所以很多人在学浪上购买自己的课程&#xff0c;但是学浪官方没有提供下载选项&#xff0c;只可以在学浪客户端软件观看&#xff0c;并不是很方便 于是为了解决这一个需求&#xff0c;小白老师s开发了学浪视频下载到…

uniapp 开发之原生Android插件

开发须知 在您阅读此文档时&#xff0c;我们假定您已经具备了相应Android应用开发经验&#xff0c;使用Android Studio开发过Android原生。也应该对HTML,JavaScript,CSS等有一定的了解, 并且熟悉在JavaScript和JAVA环境下的JSON格式数据操作等。 为了插件开发者更方便快捷的开…

verdi出现的问题

仿真时Verdi出现的问题&#xff1a; User Defined system task or function ($fsdbDumpfile) registered during elaboration and used within the simulation has not been registered during simulation. 解决方法&#xff1a;在run脚本中加上以下设置 又遇到如下问题&#x…

基于kmeans的聚类微博舆情分析系统

第一章绪论 1.1研究背景 如今在我们的生活与生产的每个角落都可以见到数据与信息的身影。自从上十世纪八十年代的中后期开始&#xff0c;我们使用的互联网技术已经开始快速发展&#xff0c;近些年来云计算、大数据和物联网等与互联网有相领域的发展让互联网技术达到了史无前例…

揭秘阿里巴巴面试题:JVM垃圾回收存活算法和两次标记过程

大家好,我是你们的小米。今天我们来聊聊一个热门话题,那就是阿里巴巴的面试题:JVM垃圾回收存活算法和两次标记过程。作为一个热爱技术、乐于分享的小米,我将会带领大家一起深入探讨这个话题。 引用计数法 首先,我们来了解一下引用计数法。这是一种简单直观的垃圾回收算法…

备战蓝桥杯---刷杂题1

1.来个小定理&#xff08;上次DP的青蛙过河用过&#xff09; 事实上&#xff0c;假如他们的gcd&#xff01;1,那么P,q都可以表示成gcd的倍数&#xff0c;因此假如一个数不是gcd的倍数就不可以表示&#xff0c;若互质由裴蜀定理大于一定时一定可以表示出。 事实上为&#xff08…

关于 QSound播放wav音频文件,播放失败“using null output device, none available” 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/137264493 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软…

GaussDB云数据库极简版安装与使用-新手指南

一、前言 作为一款领先的企业级数据库管理系统&#xff0c;GaussDB 提供了强大的性能、高度可靠性和丰富的功能&#xff0c;是企业构建可靠、高性能的数据库解决方案的理想选择。 本文主要针对高校和个人测试环境&#xff0c;介绍极简版安装和使用过程&#xff0c;更加适合高…

护眼台灯哪个牌子好?护眼台灯品牌排行前十名推荐

台灯可以说家家必备的一盏灯具&#xff0c;如果家长有正在上学的孩子的更需要一款好的台灯&#xff0c;因为不管是看书、写字、阅读都离不开台灯的帮助&#xff0c;而且一款好的台灯不仅仅能够提供明亮充足的照明环境&#xff0c;而且还能起到保护视力健康&#xff0c;预防近视…

echarts实现炫酷科技感的流光效果

前言&#xff1a; echarts实现炫酷科技感的流光效果 效果图&#xff1a; 实现步骤&#xff1a; 1、引入echarts,直接安装或者cdn引入 npm i echarts https://cdn.jsdelivr.net/npm/echarts5.4.3/dist/echarts.min.js 2、封装 option方法&#xff0c;第一个数据是折线数据&a…

互联网轻量级框架整合之JavaEE基础I

不得不解释得几个概念 JavaEE SUN公司提出来的企业版Java开发中间件&#xff0c;主要用于企业级互联网系统的框架搭建&#xff0c;同时因为Java语言优质的平台无关性、可移植性、健壮性、支持多线程和安全性等优势&#xff0c;其迅速成为构建企业互联网平台的主流技术&#x…

AI预测福彩3D第24弹【2024年4月2日预测--第4套算法重新开始计算第10次测试】

今天继续对第4套算法进行测试&#xff0c;因为第4套算法已连续多期命中&#xff0c;相对来说还算稳定。好了&#xff0c;废话不多说了&#xff0c;直接上预测的结果吧~ 2024年4月2日福彩3D的七码预测结果如下 第一套&#xff1a; 百位&#xff1a;1 2 …

旅游管理系统|基于Springboot的旅游管理系统设计与实现(源码+数据库+文档)

旅游管理系统目录 目录 基于Springboot的旅游管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户管理 2、景点分类管理 3、景点信息管理 4、酒店信息管理 5、景点信息 6、游记分享管理 四、数据库设计 1、实体ER图 2、具体的表设计如下所示&#xf…

【MySQL】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)

前言 大家好吖&#xff0c;欢迎来到 YY 滴MySQL系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C Linux的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…

郭天祥新概念51单片机(第四期读书笔记)

时钟周期、状态周期、机器周期、指令周期与晶振频率之间的关系 1、晶振频率与脉冲的关系 假设单片机的晶振频率是12MHz&#xff0c;那么它的一个脉冲为1/12微秒&#xff1b;晶振单位时间发出的脉冲则为&#xff1a; 12 ∗ 1 0 6 12*10^6 12∗106。 假设单片机的晶振频率是4MH…

【微众银行笔试题汇总】 2024-03-31-微众银行春招笔试题-三语言题解(CPP/Python/Java)

&#x1f36d; 大家好这里是KK爱Coding &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新微众银行近期的春秋招笔试题汇总&#xff5e; &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&…

全流程基于GIS、python机器学习技术的地质灾害风险评价与信息化建库实践应用

将结合项目实践案例和科研论文成果进行讲解。入门篇&#xff0c;ArcGIS软件的快速入门与GIS数据源的获取与理解&#xff1b;方法篇&#xff0c;致灾因子提取方法、灾害危险性因子分析指标体系的建立方法和灾害危险性评价模型构建方法&#xff1b;拓展篇&#xff0c;GIS在灾害重…