小白跟做江科大51单片机之DS1302可调时钟
原理部分
1.DS1302可调时钟介绍
单片机定时器主要占用CPU时间,掉电不能继续运行

图1
2.原理

图2
内部有寄存器,寄存的时候以时分秒寄存,以通信协议实现数据交互,就可以实现对数据进行访问和读写
3.主要寄存器定义
CE芯片使能,IO数据输入输出,相当于时序电路中的SER,SCLK:串行时钟

图3
第6位为0表示到CK——时钟,第0位为0表示WR——写
CE写入给1,写完给0
4.时序图

图4
5.BCD码

图5
代码部分
1.新建项目引入LCD1602
2.编写DS1302_con.c和DS1302_con.h文件
①DS1302_con.h
#ifndef __DS1302_CON_H__
#define __DS1302_CON_H__
void DS1302_Init();
void DS1302_Write(unsigned char command,Data);
unsigned char DS1302_Read(unsigned char command);
#endif
②DS1302_con.c
#include <REGX52.H>
sbit DS1302_SCLK=P3^6;
sbit DS1302_CE=P3^5;
sbit DS1302_IO=P3^4;
//刚开始单片机上电,所有端口默认为1,所以需要调0
void DS1302_Init()
{
DS1302_SCLK=0;
DS1302_CE=0;
}
void DS1302_Write(unsigned char command,Data)
{
unsigned char i;
DS1302_CE=1;
for(i=0;i<8;i++)
{
//IO从最低位开始读
DS1302_IO=command&(0x01<<i);
DS1302_SCLK=1;
DS1302_SCLK=0;
}
for(i=0;i<8;i++)
{
//从最低位开始
DS1302_IO=Data&(0x01<<i);
DS1302_SCLK=1;
DS1302_SCLK=0;
}
DS1302_CE=0;
}
unsigned char DS1302_Read(unsigned char command)
{
unsigned char i,Data=0x00;
DS1302_CE=1;
for(i=0;i<8;i++)
{
//从最低位开始
DS1302_IO=command&(0x01<<i);
DS1302_SCLK=0;
DS1302_SCLK=1;
}
for(i=0;i<8;i++)
{
//从最低位开始
DS1302_SCLK=1;
DS1302_SCLK=0;
if(DS1302_IO) //直接使用就相当于读取
{
Data|=(0x01<<i); //这里第一次运行就相当于Data已经拿到了第0位数据,只是在存入Data
}
}
DS1302_CE=0;
DS1302_IO=0; //这里要把IO口置位0,清空IO缓存,否则输出数字会闪烁不定
return Data;
}
3.main.c
#include <REGX52.H>
#include "LCD1602.h"
#include "DS1302_con.h"
#include "Delay.h"
void main()
{
unsigned char sec;
LCD_Init();
DS1302_Init();
LCD_ShowString(1,1,"RTC");
DS1302_Write(0x8e,0x00); //关闭写保护,没有这一行则可能显示数字大于59且不动
DS1302_Write(0x80,0x03); //写入秒时0x80,可看图3
while(1)
{
sec=DS1302_Read(0x81); //读取秒时0x81,可看图3
LCD_ShowNum(2,1,sec/16*10+sec%16,3); //这里有一个BCD转10进制的计算,可看图5
}
}
到这一步可验证结果是否秒钟的递增数字是否显示正常
4.显示时分秒以及年月日
①DS1302_con.h
#ifndef __DS1302_CON_H__
#define __DS1302_CON_H__
void DS1302_Init();
void DS1302_Write(unsigned char command,Data);
unsigned char DS1302_Read(unsigned char command);
extern unsigned char DS1302_Time[];
#endif
②DS1302_con.c
#include <REGX52.H>
//寄存器写入地址/指令定义
#define DS1302_SECOND 0x80
#define DS1302_MINUTE 0x82
#define DS1302_HOUR 0x84
#define DS1302_DATE 0x86
#define DS1302_MONTH 0x88
#define DS1302_YEAR 0x8C
#define DS1302_WP 0x8E
sbit DS1302_SCLK=P3^6;
sbit DS1302_CE=P3^5;
sbit DS1302_IO=P3^4;
//年、月、日、时、分、秒
unsigned char DS1302_Time[] = {24,2,29,11,11,26};
//刚开始单片机上电,所有端口默认为1,所以需要调0
void DS1302_Init()
{
DS1302_SCLK=0;
DS1302_CE=0;
}
void DS1302_Write(unsigned char command,Data)
{
unsigned char i;
DS1302_CE=1;
for(i=0;i<8;i++)
{
//从最低位开始
DS1302_IO=command&(0x01<<i);
DS1302_SCLK=1;
DS1302_SCLK=0;
}
for(i=0;i<8;i++)
{
//从最低位开始
DS1302_IO=Data&(0x01<<i);
DS1302_SCLK=1;
DS1302_SCLK=0;
}
DS1302_CE=0;
}
unsigned char DS1302_Read(unsigned char command)
{
unsigned char i,Data=0x00;
//更改命令的最后一位,减少代码
command|=1;
DS1302_CE=1;
for(i=0;i<8;i++)
{
//从最低位开始
DS1302_IO=command&(0x01<<i);
DS1302_SCLK=0;
DS1302_SCLK=1;
}
for(i=0;i<8;i++)
{
//从最低位开始
DS1302_SCLK=1;
DS1302_SCLK=0;
if(DS1302_IO) //直接使用就相当于读取
{
Data|=(0x01<<i); //这里第一次运行就相当于Data已经拿到了第0位数据,只是在存入Data
}
}
DS1302_CE=0;
DS1302_IO=0;
return Data;
}
//时间的写入
void DS1302_SetTime()
{
DS1302_Write(DS1302_WP,0x00);//取消写保护
DS1302_Write(DS1302_YEAR,DS1302_Time[0]/10*16+DS1302_Time[0]%10);//十进制转BCD码后写入
DS1302_Write(DS1302_MONTH,DS1302_Time[1]/10*16+DS1302_Time[1]%10);
DS1302_Write(DS1302_DATE,DS1302_Time[2]/10*16+DS1302_Time[2]%10);
DS1302_Write(DS1302_HOUR,DS1302_Time[3]/10*16+DS1302_Time[3]%10);
DS1302_Write(DS1302_MINUTE,DS1302_Time[4]/10*16+DS1302_Time[4]%10);
DS1302_Write(DS1302_SECOND,DS1302_Time[5]/10*16+DS1302_Time[5]%10);
DS1302_Write(DS1302_WP,0x00);//打开写保护
}
void DS1302_showTime()
{
unsigned char temp;
temp=DS1302_Read(DS1302_YEAR);
DS1302_Time[0]=temp/16*10+temp%16;
temp=DS1302_Read(DS1302_MONTH);
DS1302_Time[1]=temp/16*10+temp%16;
temp=DS1302_Read(DS1302_DATE);
DS1302_Time[2]=temp/16*10+temp%16;
temp=DS1302_Read(DS1302_HOUR);
DS1302_Time[3]=temp/16*10+temp%16;
temp=DS1302_Read(DS1302_MINUTE);
DS1302_Time[4]=temp/16*10+temp%16;
temp=DS1302_Read(DS1302_SECOND);
DS1302_Time[5]=temp/16*10+temp%16;
}
③main.c
#include <REGX52.H>
#include "LCD1602.h"
#include "DS1302_con.h"
#include "Delay.h"
void main()
{
LCD_Init();
DS1302_Init();
LCD_ShowString(1,1," - - ");
LCD_ShowString(2,1," : : ");
DS1302_SetTime(); //这句循环写入多个命令,相当于之前的 DS1302_Write(0x80,0x03);
while(1)
{
DS1302_showTime(); //这句相当于多个之前的sec=DS1302_Read(0x81);
LCD_ShowNum(1,1,DS1302_Time[0],2);
LCD_ShowNum(1,4,DS1302_Time[1],2);
LCD_ShowNum(1,7,DS1302_Time[2],2);
LCD_ShowNum(2,1,DS1302_Time[3],2);
LCD_ShowNum(2,4,DS1302_Time[4],2);
LCD_ShowNum(2,7,DS1302_Time[5],2);
}
}
即可实现以下效果

相关文章:
小白跟做江科大51单片机之DS1302可调时钟
原理部分 1.DS1302可调时钟介绍 单片机定时器主要占用CPU时间,掉电不能继续运行 图1 2.原理 图2 内部有寄存器,寄存的时候以时分秒寄存,以通信协议实现数据交互,就可以实现对数据进行访问和读写 3.主要寄存器定义 CE芯片使能…...
2024蓝桥杯每日一题(归并排序)
一、第一题:火柴排队 解题思路:归并排序 重点在于想清楚是对哪个数组进行归并排序求逆序对 【Python程序代码】 from math import * n int(input()) a list(map(int,input().split())) b list(map(int,input().split())) na,nb [],[] for …...
生成对抗网络 (GAN)
生成对抗网络(Generative Adversarial Networks,GAN)是由Ian Goodfellow等人在2014年提出的一种深度学习模型。GAN由两部分组成:一个生成器(Generator)和一个判别器(Discriminator)&…...
QGridLayout网格布局和QVBoxLayout垂直布局有着非常大的差别
QGridLayout网格布局:1.把这块控件划分成一个个的 单元格 2.把你的控件填充进入 单元格 3.这些有关限制大小的函数接口统统失效 setMaximumWidth() setMinimumWidth() setPolicySize()图示:我是用的网格布局,左边放QT…...
HCIA-HarmonyOS设备开发认证V2.0-习题2
目录 习题一习题二坚持就有收获 习题一 # 判断题## 1.PWM占空比指的是低电平时间占周期时间的百分比。(错误)正确(True)错误(False)解题: - PWM占空比指的是高电平时间占周期时间的百分比## 2.UART是通用异步收发传输器,是通用串行数据总线,…...
【npm】前端工程项目配置文件package.json详解
简言 详细介绍了package.json中每个字段的作用。 package.json 本文档将为您介绍 package.json 文件的所有要求。它必须是实际的 JSON,而不仅仅是 JavaScript 对象文字。 如果你要发布你的项目,这是一个特别重要的文件,其中name和version是…...
Python快速入门系列-2(Python的安装与环境设置)
第二章:Python的安装与环境设置 2.1 Python的下载与安装2.1.1 访问Python官网2.1.2 安装Python对于Windows用户对于macOS用户对于Linux用户 2.2 集成开发环境(IDE)的选择与设置2.2.1 PyCharm2.2.2 Visual Studio Code2.2.3 Jupyter Notebook2…...
Linux的环境安装以及项目部署
LInux软件安装 是在发行版是CentOS下安装 通常使用yum安装,可以在rpm上增加了自动解决依赖的功能 传输安装包方式安装JDK与tomcat 安装JDK ●安装包:将.gz文件通过Xftp传输到/opt目录下准备安装 ●解压:进入/opt目录,使用命令tar -zxvf 压缩包名称 (名称…...
ASUS华硕天选2锐龙版笔记本电脑FA506ICB/FA706IC原装出厂Windows11系统,预装OEM系统恢复安装开箱状态
链接:https://pan.baidu.com/s/122iHHEOtNUu4azhVPnxNuA?pwdsqk7 提取码:sqk7 适用型号: FA506IM、FA506IE、FA506IC、FA506IHR FA506IR、FA506IHRB、FA506ICB、FA506IEB FA706IM、FA706IE、FA706IC、FA706IHR FA706IR、FA706IHRB、F…...
登录校验认证
会话技术 会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。 会话跟踪: 一种维护浏览器状态的方法,服务器需要识别多次请…...
Kubernetes 几大概念的作用
更详细的组件通信流程 Kubernetes 主要由以下几个核心组件组成: 1. etcd 保存了整个集群的状态; 2. API Server 提供了资源操作的唯一入口,并提供认证,授权,访问控制,API 注册和发现等机制; …...
力扣199. 二叉树的右视图(DFS,BFS)
Problem: 199. 二叉树的右视图 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 无论是DFS还是BFS我们都要思考到达二叉树的每一层(或者每一层中的每一个节点)时,我们都该如何按题目要求做出对应得处理!!!在本体中我们主要是&#x…...
[数据集][目标检测]光伏板太阳能版缺陷检测数据集VOC+YOLO格式2400张3类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2400 标注数量(xml文件个数):2400 标注数量(txt文件个数):2400 标注…...
根据QQ号获取暗恋的人的全部歌单
文章目录 前言一、成果展示二、后端开发流程三、前后端障碍与难点解决四、待扩展内容五、总结 前言 本人喜欢使用QQ音乐听歌,并且喜欢点击好友栏目观看最近在听,了解暗恋的人最近在听什么歌曲,知己知彼,百战不殆。但是每次都需要…...
解决火狐浏览器访问地址受限制问题(This address is restricted)
问题如下图: This address is restrictedThis address uses a network port which is normally used for purposes other than Web browsing. Firefox has canceled the request for your protection. 此地址受到限制 此地址使用通常用于 Web 浏览以外的目的的网…...
基于MPPT的太阳能光伏电池simulink性能仿真,对比扰动观察法,增量电导法,恒定电压法
目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 扰动观察法 (Perturb and Observe Method) 4.2 增量电导法 (Incremental Conductance Method) 4.3 恒定电压法 (Constant Voltage Method) 5.完整工程文件 1.课题概述 在simulink中,实…...
HUAWEI 华为交换机 配置 MAC 防漂移 防MAC伪造示例
组网需求 某企业网络中,用户需要访问企业的服务器。如果某些非法用户从其他接口假冒服务器的MAC 地址发送报文,则服务器的 MAC 地址将在其他接口学习到。这样用户发往服务器的报文就会发往非法用户,不仅会导致用户与服务器不能正常通信&…...
Java 反射机制实践案例
Java反射机制允许程序在运行时查询和操作对象的类信息,甚至可以调用类的方法、访问字段和创建新的对象。下面通过几个简单的示例来展示Java反射的实践应用。 1. 获取Class对象的引用 有三种主要方式可以在运行时获得Class对象的引用: // 方法1: 通过对…...
OJ:循环队列
622. 设计循环队列 - 力扣(LeetCode) 思路 思路:首先循环队列的意思是:空间固定,就是提前开辟好,满了就不能插入了,但是删除数据后仍有空间,删除循环队列里面的数据后,保…...
专业140+总430+电子科技大学858信号与系统考研经验成电电子信息与通信工程,电科大,真题,大纲,参考书。
今年考研成绩出来,初试专业课858信号与系统140,总分430,其余各门分数都比较平稳,总分好于自己估分,应群里很多同学要求,我总结一下自己的复习经验。首先我是一个大冤种,专业课资料学长给了一套&…...
Visual Studio 2022搭配XAML Styler:拯救强迫症的WPF/XAML自动格式化与保存即美化实战
Visual Studio 2022搭配XAML Styler:拯救强迫症的WPF/XAML自动格式化与保存即美化实战 每次打开一个混乱的XAML文件,就像走进一间堆满杂物的房间——控件属性随意堆放,命名空间声明像散落的衣物,缩进混乱得像打翻的积木。作为长期…...
网络拓扑发现实战:从LLDP数据采集到D3.js可视化前端全链路解析
网络拓扑发现实战:从LLDP数据采集到D3.js可视化全链路解析 现代网络架构正变得越来越复杂,从传统的三层架构到如今的云原生网络,设备之间的连接关系呈现出动态化、多样化的特征。对于网络运维团队而言,如何快速准确地掌握全网拓扑…...
SpringBoot 快速实现 api 加密,一个轮子搞定!
来源:网络目录项目介绍什么是 RSA 加密加密实战实战准备真刀真枪解密实战实战准备真刀真枪总结项目坑点在项目中,为了保证数据的安全,我们常常会对传递的数据进行加密。常用的加密算法包括对称加密(AES)和非对称加密&a…...
终极视频下载助手:一键抓取网页视频的完整解决方案
终极视频下载助手:一键抓取网页视频的完整解决方案 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 还在为无法下载网页视频而烦恼…...
5秒极速转换:让B站缓存视频重获新生的开源神器
5秒极速转换:让B站缓存视频重获新生的开源神器 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾经为那些"消失"的B…...
5个步骤从零开始:用OBS StreamFX打造电影级直播画面
5个步骤从零开始:用OBS StreamFX打造电影级直播画面 【免费下载链接】obs-StreamFX StreamFX is a plugin for OBS Studio which adds many new effects, filters, sources, transitions and encoders! Be it 3D Transform, Blur, complex Masking, or even custom …...
从无人机飞控到机械臂:工程师如何用四元数(Quaternion)彻底告别‘万向死锁’的烦恼
从无人机飞控到机械臂:工程师如何用四元数彻底告别万向死锁 想象一下,你正在调试一架无人机的飞控系统。当飞机俯仰角接近90度时,突然发现滚转和偏航控制开始互相干扰,原本独立的三个轴向操作突然"锁死"成两个——这就是…...
终极英雄联盟皮肤更换指南:R3nzSkin让你的游戏体验焕然一新
终极英雄联盟皮肤更换指南:R3nzSkin让你的游戏体验焕然一新 【免费下载链接】R3nzSkin Skin changer for League of Legends (LOL) 项目地址: https://gitcode.com/gh_mirrors/r3/R3nzSkin 你是否厌倦了英雄联盟中千篇一律的皮肤?想要在游戏中体验…...
【SITS2026权威前瞻】:全球TOP12AI代码引擎实测对比,3大生产级陷阱你避开了吗?
第一章:SITS2026圆桌:智能代码生成未来 2026奇点智能技术大会(https://ml-summit.org) 在SITS2026圆桌论坛上,来自GitHub、Tabnine、DeepMind与国内大模型实验室的七位核心研发者共同探讨了智能代码生成从“补全助手”迈向“协同编程伙伴”…...
《QGIS快速入门与应用基础》288:多波段影像加载(识别红/绿/蓝/近红外波段)
作者:翰墨之道,毕业于国际知名大学空间信息与计算机专业,获硕士学位,现任国内时空智能领域资深专家、CSDN知名技术博主。多年来深耕地理信息与时空智能核心技术研发,精通 QGIS、GrassGIS、OSG、OsgEarth、UE、Cesium、OpenLayers、Leaflet、MapBox 等主流工具与框架,兼具…...
