当前位置: 首页 > 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、插槽根据标记渲染表单 …...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...