当前位置: 首页 > news >正文

51综合程序03-DS1302时钟

文章目录

    • DS1302时钟芯片
      • 一、DS1302时钟芯片的工作原理
        • 1. 芯片特点
        • 2. 引脚说明
        • 3. 寄存器地址
        • 4. 读数据的时序图
        • 5. 写数据的时序图
      • 二、综合实例LCD1602显示

DS1302时钟芯片

一、DS1302时钟芯片的工作原理

1. 芯片特点
  • 实时计算年、月、日、时、分、秒、星期,直到2100年,并有闰年调节功能;

  • 31x8位通用暂存RAM串行输入输出,使管脚数最少;

  • 2.0V至5.5V宽电压范围操作;

  • 在2.0V时工作电流小于300nA;

  • 读写时钟或RAM数据时有单字节或多字节(脉冲串模式)数据传送方式;

  • 8管脚DIP封装或可选的8管脚表面安装SO封装·简单的3线接口;

  • 与TTL兼容(VCC=5V);

  • 可选的工业温度范围:-40°C~+85°C。

2. 引脚说明

在这里插入图片描述
电路引脚连接图
在这里插入图片描述

3. 寄存器地址

在这里插入图片描述

从图中能够清晰的看到,读操作和写操作的寄存器地址以及它们控制的年月日周时分秒。

4. 读数据的时序图

时序图
在这里插入图片描述

对应的代码

/*向DS1302写命令(地址+数据)*/
void Ds1302Write(unsigned char addr, unsigned char dat)  
{unsigned char n;RST = 0;delay_us();SCLK = 0;  //先将SCLK置低电平。delay_us();RST = 1;  //然后将RST(CE)置高电平。delay_us();for (n=0; n<8; n++)  //开始传送八位地址命令{DSIO=addr&0x01;  //数据从低位开始传送addr>>=1;SCLK=1;  //数据在上升沿时,DS1302读取数据delay_us();SCLK=0;delay_us();}for (n=0; n<8; n++)  //写入8位数据{DSIO = dat&0x01;dat>>=1;SCLK=1;   //数据在上升沿时,DS1302读取数据delay_us();SCLK=0;delay_us();	}	RST = 0;  //传送数据结束,拉低CE端delay_us();
}
5. 写数据的时序图

时序图

在这里插入图片描述

对应的代码

/*读取一个地址的数据*/
unsigned char Ds1302Read(unsigned char addr)   
{unsigned char n,dat,dat1;RST = 0;delay_us();SCLK = 0;//先将SCLK置低电平。delay_us();RST = 1;//然后将RST(CE)置高电平。delay_us();for(n=0; n<8; n++)//开始传送八位地址命令{DSIO = addr & 0x01;//数据从低位开始传送addr >>= 1;SCLK = 1;//数据在上升沿时,DS1302读取数据delay_us();SCLK = 0;//DS1302下降沿时,放置数据delay_us();}delay_us();for(n=0; n<8; n++)//读取8位数据{dat1 = DSIO;//从最低位开始接收dat = (dat>>1) | (dat1<<7);SCLK = 1;delay_us();SCLK = 0;//DS1302上升沿时,放置数据delay_us();}RST = 0;delay_us();	//以下为DS1302复位的稳定时间,必须的。SCLK = 1;delay_us();DSIO = 0;delay_us();DSIO = 1;delay_us();return dat;	
}

二、综合实例LCD1602显示

DS1302.h

#ifndef __DS1302_H_
#define __DS1302_H_#include<reg51.h>extern unsigned char TIME[7];	//加入全局变量sbit DSIO=P3^4;
sbit RST=P3^5;
sbit SCLK=P3^6;void delay_us();  //延时2us
void Ds1302Write(unsigned char addr, unsigned char dat);	//写地址,写数据
unsigned char Ds1302Read(unsigned char addr);  //读地址
void Ds1302Init();  //初始化
void Ds1302ReadTime();#endif

DS1302.c

#include "DS1302.h"//初始值的设定
unsigned char code READ[7] =  {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};//读命令  秒分时日月周年
unsigned char code WRITE[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};//写命令 秒分时日月周年
unsigned char TIME[7] = {0, 0, 0x09, 0x15, 0x07, 0x02, 0x18};  //秒分时日月周年,存储格式是用BCD码void delay_us()	/*延时2us*/
{	
}/*向DS1302写命令(地址+数据)*/
void Ds1302Write(unsigned char addr, unsigned char dat)  
{unsigned char n;RST = 0;delay_us();SCLK = 0;  //先将SCLK置低电平。delay_us();RST = 1;  //然后将RST(CE)置高电平。delay_us();for (n=0; n<8; n++)  //开始传送八位地址命令{DSIO=addr&0x01;  //数据从低位开始传送addr>>=1;SCLK=1;  //数据在上升沿时,DS1302读取数据delay_us();SCLK=0;delay_us();}for (n=0; n<8; n++)  //写入8位数据{DSIO = dat&0x01;dat>>=1;SCLK=1;   //数据在上升沿时,DS1302读取数据delay_us();SCLK=0;delay_us();	}	RST = 0;  //传送数据结束,拉低CE端delay_us();
}/*读取一个地址的数据*/
unsigned char Ds1302Read(unsigned char addr)   
{unsigned char n,dat,dat1;RST = 0;delay_us();SCLK = 0;//先将SCLK置低电平。delay_us();RST = 1;//然后将RST(CE)置高电平。delay_us();for(n=0; n<8; n++)//开始传送八位地址命令{DSIO = addr & 0x01;//数据从低位开始传送addr >>= 1;SCLK = 1;//数据在上升沿时,DS1302读取数据delay_us();SCLK = 0;//DS1302下降沿时,放置数据delay_us();}delay_us();for(n=0; n<8; n++)//读取8位数据{dat1 = DSIO;//从最低位开始接收dat = (dat>>1) | (dat1<<7);SCLK = 1;delay_us();SCLK = 0;//DS1302上升沿时,放置数据delay_us();}RST = 0;delay_us();	//以下为DS1302复位的稳定时间,必须的。SCLK = 1;delay_us();DSIO = 0;delay_us();DSIO = 1;delay_us();return dat;	
}/*初始化DS1302*/
void Ds1302Init()	  
{unsigned char n;Ds1302Write(0x8E,0X00);  //禁止写保护,就是关闭写保护功能for (n=0; n<7; n++)  //写入7个字节的时钟信号:分秒时日月周年{Ds1302Write(WRITE[n],TIME[n]);	}Ds1302Write(0x8E,0x80);		 //打开写保护功能
}/*读取时钟信息*/
void Ds1302ReadTime()	
{unsigned char n;for (n=0; n<7; n++)//读取7个字节的时钟信号:分秒时日月周年{TIME[n] = Ds1302Read(READ[n]);}}

LCD1602.h

#ifndef __LCD1602_H__
#define __LCD1602_H__#include<reg51.h>sbit RS=P2^6;  //寄存器选择位
sbit RW=P2^5;  //读写选择位
sbit EN=P2^7;  //使能信号位void delay(unsigned int n);
void WriteStruction(unsigned char date);
void WriteData(unsigned char dat);
void LCDInitiate(); #endif

LCD1602.c

#include <reg51.h>
#include "LCD1602.h"void delay(unsigned int n)	    /*延时函数*/
{int i,j;for (i=n;i>0;i--)for (j=10;j>0;j--);
}void WriteStruction(unsigned char date)	/*LCD写指令函数*/
{RS=0;	  //选择指令RW=0;	  //选择写入EN=0;	  //使能端初始化P0=date;  //写指令delay(1);EN=1;	    //写时序,置高电平delay(1);EN=0;	   //液晶屏出现由1到0的负跳变,使液晶模块开始工作
}void WriteData(unsigned char dat)  /*LCD写数据函数*/
{RS=1;	   //选择数据RW=0;	   //选择写入EN=0;	   //初始化使能端P0=dat;	   //写数据delay(1);EN=1;	   //写时序delay(1);EN=0;	   //液晶屏出现由1到0的负跳变,使液晶模块开始工作
}void LCDInitiate()     /*LCD初始化函数*/
{WriteStruction(0x38);  //功能设定指令,DL->8位   N->2行  F->5x7WriteStruction(0x0c);  //显示开关指令,DCB=100,整体显示,关光标,不闪烁WriteStruction(0x06);  //进入模式设置指令,设定输入方式,增量不移位	WriteStruction(0x01);  //清屏指令,清除屏幕显示WriteStruction(0x80);  //设置数据指针起点
}

mian.c

#include<reg51.h>
#include"LCD1602.h"
#include"DS1302.h"unsigned char SetState,SetPlace;
unsigned char LCDshow[]="0123456789";void LcdDisplay()	  /*显示函数*/
{WriteStruction(0x80+0X40);WriteData(LCDshow[TIME[2]/16]);		//时WriteData(LCDshow[TIME[2]%16]);				 WriteData('-');WriteData(LCDshow[TIME[1]/16]);		//分WriteData(LCDshow[TIME[1]%16]);	WriteData('-');WriteData(LCDshow[TIME[0]/16]);		//秒WriteData(LCDshow[TIME[0]%16]);WriteStruction(0x80);WriteData('2');WriteData('0');WriteData(LCDshow[TIME[6]/16]);		//年WriteData(LCDshow[TIME[6]%16]);WriteData('-');WriteData(LCDshow[TIME[4]/16]);			//月WriteData(LCDshow[TIME[4]%16]);WriteData('-');WriteData(LCDshow[TIME[3]/16]);			//日WriteData(LCDshow[TIME[3]%16]);WriteStruction(0x8D);WriteData(LCDshow[TIME[5]&0x07]);	//星期			 
}void main()
{Int0Configuration();  //中断初始化LCDInitiate();   //LCD初始化Ds1302Init();    //1302初始化while(1){	Ds1302ReadTime();LcdDisplay();	}	
}

相关文章:

51综合程序03-DS1302时钟

文章目录 DS1302时钟芯片一、DS1302时钟芯片的工作原理1. 芯片特点2. 引脚说明3. 寄存器地址4. 读数据的时序图5. 写数据的时序图 二、综合实例LCD1602显示 DS1302时钟芯片 一、DS1302时钟芯片的工作原理 1. 芯片特点 实时计算年、月、日、时、分、秒、星期&#xff0c;直到2…...

redis的缓存击穿,缓存穿透,缓存雪崩

Redis是一个开源的、内存中的数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息代理。Redis支持多种数据结构&#xff0c;如字符串、哈希表、列表、集合和有序集合。此外&#xff0c;Redis还支持各种操作&#xff0c;如读取和写入数据、删除和更新数据等。 Redis的特点…...

AutoHotKey-study

目录 使用编辑器脚本注意函数解释信息调试方法键盘获取方法脚本练习 最近发现常用键盘的上下左右箭头去操作输入输出问题感觉很不是滋味&#xff0c;不像Linux那样&#xff0c;有vim的使用&#xff0c;就想着有没有什么方法更快捷&#xff0c;更方便的去使用电脑键盘&#xff0…...

Go to do list

go 语言中怎么实现分布式系统&#xff1f; 在Go语言中实现分布式系统需要考虑以下几个方面&#xff1a; 通信协议&#xff1a;在分布式系统中&#xff0c;各个节点需要通过网络进行通信。Go语言提供了丰富的网络编程库&#xff0c;如net/http、net/rpc等&#xff0c;可以方便…...

JWT 认证机制

1. Session 认证的局限性 Session 认证机制需要配合 Cookie 才能实现。由于 Cookie 默认不支持跨域访问&#xff0c;所以&#xff0c;当涉及到前端跨域请求后端按口的时候&#xff0c;需要做很多额外的配置&#xff0c;才能实现跨域 Session 认证。 注意&#xff1a; 1&#xf…...

内核启动时间信息打印

文章目录 一 串口打印1 借助串口助手2 dmesg自带时间3 内核显示时间信息4 借助initcall_debug二 图形花显示1 bootgraph工具使用2 Bootchart工具使用3 Grabserial工具使用一 串口打印 1 借助串口助手 2 dmesg自带时间 root@xboard:~# dmesg [ 0.000000] Booting Linux on …...

Web端专业级H264/H265 直播流播放器实现-JessibucaPro播放器

概况 这个主要是参加“深圳 liveVideoStack” 的ppt的文字版的分享。 深圳 liveVideoStack 讲师介绍 关于Jessibuca 官网地址&#xff1a;jessibuca.comDemo: DemoDoc&#xff1a;DocGithub地址&#xff1a;Github 关于JessibucaPro 地址&#xff1a;JessibucaProDemo: …...

macOS sandbox 文件夹授权

macOS sandbox 文件夹授权 macOS如果想上苹果市场发布的话,那么必须要遵守苹果的沙盒协议,这样应用的存储默认都是沙盒路径,隔离了用户的文件系统,那么这个时候我需要访问 /User/xxx/Library/Developer/ 这种文件夹的时候,直接访问是会被拒绝的,那既然这样就肯定要授权了…...

CentOS 7安装Java 8

前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 要在CentOS 7上安装Java 8&#xff0c;请按照以下步骤操作&#xff1a; 打开终端并以root身份登录。 更新系统软件包&#xff1a; …...

施密特正交

描述 给出一个向量组原始基&#xff0c;通过施密特正交化、单位化&#xff0c;构造出标准正交基。 输入 本题有多组测试数据。每组测试数据在第一行给出两个正整数t&#xff0c;n&#xff0c;表示有t个n维向量。随后t行每行给出n个实数表示一个向量。 输出 每行输出一个向量…...

视频号小店怎么起量?实操详解!

我是电商珠珠 视频号小店于22年由视频号团队发展起来&#xff0c;跟抖音小店一样&#xff0c;都是电商平台。 目前对于视频号小店来说&#xff0c;正是风口期&#xff0c;就像19年的抖音小店一样&#xff0c;月入5w是没一点问题的。 去年的视频号小店还没有掀起多大的波浪&a…...

如何将unity项目托管到github(快速便捷)

如何将unity项目托管到github&#xff08;快速便捷&#xff09; 文章目录 如何将unity项目托管到github&#xff08;快速便捷&#xff09;前置准备Gitgithubgit-lfs 具体操作1.配置.gitignore文件2.配置.gitattributes3.使用git 前置准备 Git github git-lfs 这些内容省略&…...

ClickHouse(16)ClickHouse日志引擎Log详细解析

日志引擎系列 这些引擎是为了需要写入许多小数据量&#xff08;少于一百万行&#xff09;的表的场景而开发的。 这系列的引擎有&#xff1a; StripeLogLogTinyLog 共同属性 引擎&#xff1a; 数据存储在磁盘上。 写入时将数据追加在文件末尾。 不支持突变操作,也就是更新…...

opencv项目开发实战--填补字母的空白

目录 完成/填写字母 OpenCV C++ 完成opencv表中缺失的行 如何使用 OpenCV 获取图像中所有文本的位置? 完成/填写字母 OpenCV C++ 解决方案一: 您似乎已经对图像进行了...

Wnmp本地搭建结合内网穿透实现远程访问本地Wnmp服务

文章目录 前言1.Wnmp下载安装2.Wnmp设置3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c; 通俗易懂&a…...

C++ 红黑树的封装

一.map/set的封装 在实现了红黑树的部分功能后&#xff0c;我们可以便可以将红黑树作为底层结构来封装map 和 set &#xff0c;但是问题也随之而来。我们都知道map是k-v的数据模型&#xff0c;而set是k的数据模型&#xff0c;我们难道要去使用两棵红黑树来封装吗&#xff1f;显…...

MongoDB快速入门及其SpringBoot实战

MongoDB快速入门及其SpringBoot实战 MongoDB简介 MongoDB 是一个基于分布式文件存储的数据库。由 C 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个开源、高性能、无模式的文档型数据库&#xff0c;当初的设计就是用于简化开发和方便扩展&am…...

Python网络爬虫练习

爬取历年中国大学排名(前20名)&#xff0c;并随机选取一所高校画图展示其历年总分变化,并计算平均分&#xff0c;在图上展示该平均分直线&#xff1a; 代码如下&#xff1a; import matplotlib.pyplot as plt import pandas as pd import requests import randomdef main(yea…...

《opencv实用探索·九》中值滤波简单理解

1、引言 均值滤波、方框滤波、高斯滤波&#xff0c;都是线性滤波方式。由于线性滤波的结果是所有像素值的线性组合&#xff0c;因此含有噪声的像素也会被考虑进去&#xff0c;噪声不会被消除&#xff0c;而是以更柔和的方式存在。这时使用非线性滤波效果可能会更好。中值滤波是…...

PC行内编辑

点击编辑&#xff0c;行内编辑输入框出现&#xff0c;给列表的每条数据定义编辑标记&#xff0c;最后一定记得 v-model双向绑定&#xff0c;使数据回显。 步骤&#xff1a; 1、给行数据定义编辑标记 2、点击行编辑标记&#xff08;isedit&#xff09; 3、插槽根据标记渲染表单 …...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...

HTML前端开发:JavaScript 获取元素方法详解

作为前端开发者&#xff0c;高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法&#xff0c;分为两大系列&#xff1a; 一、getElementBy... 系列 传统方法&#xff0c;直接通过 DOM 接口访问&#xff0c;返回动态集合&#xff08;元素变化会实时更新&#xff09;。…...

Java后端检查空条件查询

通过抛出运行异常&#xff1a;throw new RuntimeException("请输入查询条件&#xff01;");BranchWarehouseServiceImpl.java // 查询试剂交易&#xff08;入库/出库&#xff09;记录Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…...

表单设计器拖拽对象时添加属性

背景&#xff1a;因为项目需要。自写设计器。遇到的坑在此记录 使用的拖拽组件时vuedraggable。下面放上局部示例截图。 坑1。draggable标签在拖拽时可以获取到被拖拽的对象属性定义 要使用 :clone, 而不是clone。我想应该是因为draggable标签比较特。另外在使用**:clone时要将…...

学习 Hooks【Plan - June - Week 2】

一、React API React 提供了丰富的核心 API&#xff0c;用于创建组件、管理状态、处理副作用、优化性能等。本文档总结 React 常用的 API 方法和组件。 1. React 核心 API React.createElement(type, props, …children) 用于创建 React 元素&#xff0c;JSX 会被编译成该函数…...