51单片机编程应用(C语言):DS1302实时时钟

单片机计时的缺陷:

1.他的精度不高,没有时钟芯片精度高,

2.会占用单片机CPU的时间, 

3.单片机的时钟无法掉电继续运行,(最大的缺点)

DS1302芯片内部有备用电池,可以掉电继续计时。

 

1,VCC2:主电源引脚

2,X1、X2:DS1302 外部晶振引脚,通常需外接 32.768K 晶振(给芯片提供一个稳定的脉冲,用来计数的脉冲,由石英震荡而成)(石英钟) 

3,GND:电源地

4,CE:使能引脚,也是复位引脚(新版本功能变)。

5,I/O:串行数据引脚,数据输出或者输入都从这个引脚

6,SCLK:串行时钟引脚

7,VCC1:备用电源

CE,I/O,SCLK,是我们主要操作的引脚,我们操作这三个引脚把芯片内部的时钟读出来。写入时间也是用这三个引脚,把我们想要设置的时间写进去。它规定了一套协议,我们要熟悉这些协议。这些时间都是存在芯片内部的寄存器中。我们要通过总线对寄存器进行读写,就可以读取和写入了

看内部结构可知,时钟芯片内部有31个8位寄存器。

 

当然,上面只是RTC的寄存器,还有很多其他的寄存器,只是我们只要操作时钟,这些寄存器就够了。 

ds1302控制寄存器 

 用于存放控制DS1302命令,可以控制该寄存器以控制选择读或写等操作。

我们操作单片机,是不是要考虑:在哪  写入  什么   在哪  读出   (什么)

在哪就是我们要操作哪一个寄存器,这么多寄存器,每个寄存器是有地址的,类似于房间的门牌号。写入数据还是读出数据,所以就有了上面的控制寄存器。

1.第7位,固定为1

2.第6位,1为寻址内部存储器地址RAM,0为寻址内部寄存器,即年月日所在存储器,一般设置为0

3.第5到1位,第6位存储器的地址

4.第0位,1位读操作,0为写操作

比如:

就是读秒这个寄存器:对应16进制的0x80 h

 

有了命令字,这些命令字与数据是如何对应起来的呢。

 

CE:复位时序

SCLK:时钟时序

IO:数据传输时序

注:DS1302与DS18B20都是从低位到高位传输(读/写)数据,编程时要注意。

上面是单字节写,单字节读。在写和读的时候,CE都是给高电平的。

SCLK就是单片机给固定的时钟。

I/O口的数据怎么写进去的,我们怎么通过I/O口读出数据呢?

这个协议就规定,在时钟上升沿的时候,I/O的数据将会被写入,在时钟下降沿,DS1302就会把自己的数据输出。(输不输出看我们给的命令)(方便我们要读)

简而言之就是: 上升沿单片机向时钟芯片写入,下降沿单片机对时钟芯片读出。跟SPI通信协议很像。

上升沿是地址,下降沿是数据,就是你首先给出访问的地址,这个地址包括命令,

比如:每来一个上升沿单片机写入了地址,这时候,芯片收到命令,如果是读,在下一个时钟周期

的下降沿就把数据发出来,如果是写,就在每个时钟的上升沿把数据写进去,

下面是代码环节:

比如我们先写入一个数据再读出:

首先按照芯片协议写入相关的函数,比如字节写,字节读等一系列操作

首先引脚定义一下:

//引脚定义
sbit DS1302_SCLK=P3^6;
sbit DS1302_IO=P3^4;
sbit DS1302_CE=P3^5;

初始化:因为单片机刚上电都是默认为1的。

void DS1302_Init(void)
{DS1302_CE=0;DS1302_SCLK=0;
}

写的操作(按照时序图一步一步完成的) 

/*** @brief  DS1302写一个字节* @param  Command 命令字/地址* @param  Data 要写入的数据* @retval 无*/
void DS1302_WriteByte(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;
}

 读的操作(按照时序图一步一步完成的) 

/*** @brief  DS1302读一个字节* @param  Command 命令字/地址* @retval 读出的数据*/
unsigned char DS1302_ReadByte(unsigned char Command)
{unsigned char i,Data=0x00;Command|=0x01;	//将指令转换为读指令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);}}DS1302_CE=0;DS1302_IO=0;	//读取后将IO设置为0,否则读出的数据会出错return Data;
}

下面是是主函数实现写入一位数据后然后读出来:(都是模块化编程)自己把.h文件写一下

#include <REGX52.H>
#include "LCD1602.h"
#include "DS1302.h"unsigned char Second;
void main()
{LCD_Init();DS1302_Init();LCD_ShowString(1,1,"RTC");DS1302_WriteByte(0x80,0x03)while(1){Second=DS1302_ReadByte(0x81);LCD_ShowNum(2,1,Second,3);}
}

但是读出来的数仍然有问题:(看视频28分钟后)为啥加了两个代码不是很理解。

如果读出时间为一个大于59并且不动的数,这芯片有可能是处于写保护状态,在   DS1302_WriteByte(0x80,0x03)后面加上

  DS1302_WriteByte(0x8E,0x00)即可解除芯片保护状态。

但是仍然会出现计时不准确的现象,因为寄存器的存储选着的是BCD码,不是正常的二进制

什么是BCD码:

所以我们要把BCD码转化为10进制。

下面是DS1302显示时间的main函数的代码:其他的在模块化编程中

#include <REGX52.H>
#include "LCD1602.h"
#include "DS1302.h"void main()
{LCD_Init();DS1302_Init();LCD_ShowString(1,1,"  -  -  ");//静态字符初始化显示LCD_ShowString(2,1,"  :  :  ");DS1302_SetTime();//设置时间while(1){DS1302_ReadTime();//读取时间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 没有备用电源,所以掉电后也无法继续计时。

8号引脚没有接备用电源。 

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

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

相关文章

算法刷题:长度最小的子数组

长度最小的子数组 .题目链接题目详情算法原理滑动窗口定义指针进窗口判断出窗口 我的答案 . 题目链接 长度最小的子数组 题目详情 算法原理 滑动窗口 这道题,我们采用滑动窗口的思想来解决,具体步骤如图所示 定义指针 如图所示,两个指针都需要从左往右进行遍历,因此初始值…

为何重复造轮子

重复造轮子&#xff0c;意思是说&#xff0c;一个项目本身存在开源组件&#xff0c;但开发团队还是选择重新手写一套组件库或框架的情况&#xff0c;这在软件业界比比皆是。 下面说下游戏项目里重复造轮子的几点原因。 一&#xff0c;精简化 一般开源项目为了适应多场景多业…

永久禁止windows自动更新方法

文章目录 前言一、打开本地组策略编辑器二、禁用windows更新总结 前言 每次打开电脑&#xff0c;右下角就会弹出设备更新提示&#xff0c;看着令人烦恼&#xff0c;并且更新可能导致电脑设置发生改变甚至是卡顿&#xff0c;所以为了自己方便于是出了禁用电脑更新的办法&#x…

阿里云ECS香港服务器性能强大_安全可靠香港免备案服务器

阿里云香港服务器中国香港数据中心网络线路类型BGP多线精品&#xff0c;中国电信CN2高速网络高质量、大规格BGP带宽&#xff0c;运营商精品公网直连中国内地&#xff0c;时延更低&#xff0c;优化海外回中国内地流量的公网线路&#xff0c;可以提高国际业务访问质量。阿里云服务…

VMware Workstation下载安装

一、VMware Workstation的简介 VMware Workstation是一种虚拟化软件&#xff0c;允许用户在单台PC上创建和运行多个虚拟机。它支持不同操作系统的同时运行&#xff0c;提供灵活的网络配置和资源管理&#xff0c;方便开发、测试和部署应用程序&#xff0c;提高工作效率和资源利用…

安卓实现简单砸地鼠游戏

效果 布局 <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-auto"xmlns:tools"http://schemas.android.com/tools"android:layout_width"match_parent"a…

代码随想录day24--回溯的应用3

LeetCode93.修复IP地址 题目描述&#xff1a; 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 . 分隔。 例如&#xff1a;"0.1.2.201" 和 "192.168.1.1" 是…

Transformer面试十问

1 Scaled Dot-Product Attention中为什么要除以 d k \sqrt{d_k} dk​ ​? 1. 从纯数学上考虑&#xff1a;对于输入均值为0,方差为1的分布&#xff0c;点乘后结果其方差为dk&#xff0c;所以需要缩放一下。下图为原论文注释。 2. 从神经网络上考虑&#xff1a;防止在计算点积…

HTTPS网络通信协议基础

目录 前言&#xff1a; 1.HTTPS协议理论 1.1协议概念 1.2加密 2.两类加密 2.1对称加密 2.2非对称加密 3.引入“证书” 3.1证书概念 3.2数据证书内容 3.3数据签名 4.总结 前言&#xff1a; 了解完HTTP协议后&#xff0c;HTTPS协议是HTTP协议的升级加强版&#xff0c…

HarmonyOS—状态管理概述

在前文的描述中&#xff0c;我们构建的页面多为静态界面。如果希望构建一个动态的、有交互的界面&#xff0c;就需要引入“状态”的概念。 图1 效果图 上面的示例中&#xff0c;用户与应用程序的交互触发了文本状态变更&#xff0c;状态变更引起了UI渲染&#xff0c;UI从“He…

LeetCode刷题计划

LeetCode刷题计划 推荐 代码随想录&#xff1a;https://github.com/youngyangyang04/leetcode-master 卡码网 练习ACM模式 https://kamacoder.com/ 01 #include <iostream> using namespace std;int main() {int a ,b;while(cin>>a>>b){cout<<ab<…

每日五道java面试题之java基础篇(十二)

目录: 第一题 谈谈你对AQS的理解&#xff0c;AQS如何实现可重⼊锁&#xff1f;第二题. Sychronized的偏向锁、轻量级锁、重量级锁第三题 CountDownLatch和Semaphore的区别和底层原理第四题 线程池中阻塞队列的作⽤&#xff1f;为什么是先添加列队⽽不是先创建最⼤线程&#xff…