51单片机学习笔记12 SPI接口 使用1302时钟

51单片机学习笔记12 SPI接口 使用1302时钟

  • 一、DS1302简介
    • 1. 功能特性
    • 2. 涓流充电
    • 3. 接口介绍
      • 时钟数据和控制线:
      • 电源线:
      • 备用电池连接:
  • 二、寄存器介绍
    • 1. 控制寄存器
    • 2. 时间寄存器
    • 3. 日历/时钟寄存器
  • 三、BCD码介绍
  • 四、DS1302时序
    • 1. 读时序
    • 2. 写时序
  • 五、实现
    • 1. 硬件原理图
    • 2. ds1302.h
    • 3. ds1302.c
    • 4. main.c

在这里插入图片描述

一、DS1302简介

1. 功能特性

DS1302是一款由Maxim Integrated公司生产的实时时钟(RTC)芯片。
RTC芯片用于计算机和其他电子设备中的时间和日期的集成电路,通常被用于电子时钟、计时器、温度记录器等应用中。

DS1302部分功能特性:

  1. 实时时钟功能:提供年、月、日、时、分、秒等时间数据。
  2. 串行接口:通过串行接口(如SPI)与微控制器进行通信。
  3. 低功耗设计:具有低功耗特性,在电池供电情况下能够长时间稳定运行。
  4. 内置晶体振荡器:集成了晶体振荡器,不需要外部晶振。
  5. 电池备份:支持电池备份以保持时钟运行,即使主电源断电时也能保持时间数据。
  6. 温度补偿:具有温度补偿功能,可以提高时钟的准确性。

DS1302通常与微控制器或单片机配合使用,通过串行接口进行通信,并通过读写寄存器来配置和读取时间数据。

DS1302工作电压2.0~5.5V。

2. 涓流充电

涓流充电是一种低功率充电方式,它通过限制充电电流的大小来防止电池过度充电和损坏。

DS1302内部集成了涓流充电电路,它会在主电源供电时通过合适的电阻限制充电电流,以适当的速率充电芯片内部的备用电池。一旦电池被充满,充电电路会自动停止充电,以防止过度充电。

当主电源断电时,DS1302会自动从备用电池供电,保持时钟和日期功能正常运行。备用电池通常是一个较小的锂电池,它能够提供足够的电力维持DS1302的基本功能长达数年。

3. 接口介绍

DS1302实时时钟芯片具有串行接口,通常使用3线或4线SPI(Serial Peripheral Interface)进行通信。以下是DS1302的主要接口:

时钟数据和控制线:

  • CE(Chip Enable):芯片使能线,用于启用DS1302的通信。
  • IO(Data I/O):数据输入/输出线,用于与微控制器进行数据交换。
  • SCLK(Serial Clock):串行时钟线,用于同步数据传输。

电源线:

  • VCC:芯片供电正极。
  • GND:芯片地线。

备用电池连接:

  • VBAT:备用电池正极,用于备份时钟数据。
  • GND(BAT):备用电池地线。

在这里插入图片描述

二、寄存器介绍

1. 控制寄存器

在这里插入图片描述

  • BIT7 MSB,1时定稿,0时禁止对DS1302写入
  • BIT6 0:时钟/日历;1RAM数据
  • BIT5~BIT1:输入输出的寄存器
  • BIT0 LSB,0时写操作,1时读操作。

2. 时间寄存器

寄存器D7D6D5D4D3D2D1D0
1RAM/CKA4A3A2A1A0R/W
10000000/1
10000010/1
小时10000100/1
10000110/1
10001000/1
星期10001010/1
10001100/1

3. 日历/时钟寄存器

BCD码格式存入。

寄存器名称取值范围D7D6D5D4D3D2D1D0
秒寄存器00-59CH秒的十位秒的个位
分寄存器00-590分的十位分的个位
小时寄存器01-12或00-2312/240a/pHR小时的个位
日寄存器01-3100日的十位日的个位
月寄存器01-120001/0月的个位
星期寄存器01-070000星期几
年寄存器01-99年的十位年的个位
写保护寄存器 WP=1保护0000000
慢充电寄存器 TCSTCSTCSTCSDSDSRSRS
时钟突发寄存器

三、BCD码介绍

BCD(Binary-Coded Decimal)码是一种数字编码方式,用于表示十进制数字的二进制形式。在BCD编码中,每个十进制数字(0到9)都用4位二进制数表示。这种编码方式可以使计算机更方便地处理十进制数字。

BCD码的基本原理是将一个十进制数的每一位分别用二进制数表示,例如将十进制数 45 分别用BCD编码表示:

  • 数字 4 的BCD编码为 0100
  • 数字 5 的BCD编码为 0101

因此,数字 45 的BCD编码为 0100 0101。

BCD码有几种常见的表示方法:

  1. 8421码:每个十进制数字用4位二进制数表示,范围从 0000 到 1001。这种编码方式的名称来自每个位上的权重,分别是8、4、2和1。例如,十进制数 7 的BCD编码为 0111。

  2. 2421码:类似于8421码,但在前四个数字中,9表示为 1001,而不是 1000。这种编码方式的目的是为了简化BCD加法的实现。

  3. Excess-3码:在8421码的基础上,每个数字都加上了3。例如,数字 0 的8421码是 0000,加上3后变为 0011。

DS1302实时时钟芯片使用的是8421码(也称为8421BCD码)

四、DS1302时序

1. 读时序

单字节读:
在这里插入图片描述

  • CE:高电平使能

  • SCLK:时钟

  • IO:数据读

  • I/O设置为输入

    • 在时钟上升沿写入,从低向高写入;
  • 第一个字节是写入指令

  • I/O设置为输出

  • 后一个字节是读操作

  • 写入完成后,在下一个时钟下降沿读;

2. 写时序

单字节写:
在这里插入图片描述

五、实现

1. 硬件原理图

在这里插入图片描述
下面代码在数码管显示时间。

2. ds1302.h

//
// 时钟芯片
//#ifndef LESSON11_DS1302_H
#define LESSON11_DS1302_H
#include <reg52.h>
#include "types.h"sbit DS1302_CE = P3^5;
// 时钟口
sbit DS1302_CLK = P3^6;
// IO 口
sbit DS1302_IO = P3^4;/**
* 写入一个字节
*/
void ds1302_write_byte(u8 addr, u8 dat);
/**
* 读取一个字节
*/
u8 ds1302_read_byte(u8 addr);//变量声明
extern u8 gDS1302_TIME[7];//存储时间void ds1302_init(void);
void ds1302_read_time(void);
#endif //LESSON11_DS1302_H

3. ds1302.c

//
// 时钟芯片
//
#include "ds1302.h"
#include "intrins.h"// DS1302写入和读取的地址命令
u8 gREAD_RTC_ADDR[7] = {0x81,   // 二进制  1000 0001 , 表示: 1000 0000 读取秒0x83,   // 1000 0011 读取分 0x85,   // 1000 0101 读取时0x87,   // 1000 0111 读取日0x89,   // 1000 1001 读取月0x8b,   // 1000 1011 读取星期0x8d    // 1000 1101 读取年};
u8 gWRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
// DS1302 初始化要写入的时间
u8 gDS1302_TIME[7] = {0x47,   // 秒0x56,   // 分0x15,   // 时0x20,   // 日0x03,   // 月0x05,   // 星期0x24    // 年};/**
* 写入一个字节
*/
void ds1302_write_byte(u8 addr, u8 dat){u8 i;// 使能脚复位DS1302_CE = 0;_nop_();// 时钟脚复位DS1302_CLK = 0;_nop_();// 使能脚置高DS1302_CE = 1;_nop_();// 从低位开始写入for(i=0; i<8; i++){// 先发送地址DS1302_IO = addr & 0x01;// 右移一位addr >>= 1;// SLK 上升沿写入DS1302_CLK = 1;_nop_();DS1302_CLK = 0;_nop_();}// 写入数据for(i=0; i<8; i++){// 先发送数据DS1302_IO = dat & 0x01;// 右移一位dat >>= 1;// SLK 上升沿写入DS1302_CLK = 1;_nop_();DS1302_CLK = 0;_nop_();}// 复位DS1302_CE = 0;_nop_();
}
/**
* 读取一个字节
*/
u8 ds1302_read_byte(u8 addr){u8 i;u8 temp = 0;u8 value = 0;// 使能脚复位DS1302_CE = 0;_nop_();// 时钟脚复位DS1302_CLK = 0;_nop_();// 使能脚置高DS1302_CE = 1;_nop_();// 从低位开始写入for(i=0; i<8; i++){// 先发送地址DS1302_IO = addr & 0x01;// 右移一位addr >>= 1;// SLK 上升沿写入DS1302_CLK = 1;_nop_();DS1302_CLK = 0;_nop_();}// 读取数据for(i=0; i<8; i++){temp = DS1302_IO;value = (temp << 7) | (value >> 1);// SLK 下降沿读取DS1302_CLK = 1;_nop_();DS1302_CLK = 0;_nop_();}// 复位DS1302_CE = 0;_nop_();// 释放时钟DS1302_CLK = 1;_nop_();DS1302_IO = 0;_nop_();DS1302_IO = 1;_nop_();return value;
}
/**
* ds1302初始化
*/
void ds1302_init(void){u8 i = 0;// 写入禁止写保护ds1302_write_byte(0x8e, 0x00);// 写数据for(i=0; i<7; i++){ds1302_write_byte(gWRITE_RTC_ADDR[i], gDS1302_TIME[i]);}// 写入启用写保护ds1302_write_byte(0x8e, 0x80);
}
/**
* 写入时间
*/
void ds1302_read_time(void){u8 i=0;for(i=0;i<7;i++){gDS1302_TIME[i]=ds1302_read_byte(gREAD_RTC_ADDR[i]);	}	
}

4. main.c

#include <reg52.h>
#include "led_utils.h"
#include "common_utils.h"
#include "timer_utils.h"
#include "uart_utils.h"
#include "key_utils.h"
#include "eeprom_utils.h"
#include "segment_display_utils.h"
#include "ds1302.h"/**
* @brief 主函数
*/
main()
{u8 time_buf[8];// 关闭所有ledled_all_off();uart_init(0xFA);ds1302_init(); while(1){ds1302_read_time();uart_send(u8_to_hex(gDS1302_TIME[2]));time_buf[0]=gDS1302_TIME[2]/16;time_buf[1]=gDS1302_TIME[2]&0x0f;time_buf[2]=0x10;time_buf[3]=gDS1302_TIME[1]/16;time_buf[4]=gDS1302_TIME[1]&0x0f;time_buf[5]=0x10;time_buf[6]=gDS1302_TIME[0]/16;time_buf[7]=gDS1302_TIME[0]&0x0f;segment_show_u8_array(time_buf);}
}

本文代码开源在
https://gitee.com/xundh/learn51

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

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

相关文章

第十四届省赛大学B组(C/C++)子串简写

原题链接&#xff1a;子串简写 程序猿圈子里正在流行一种很新的简写方法&#xff1a; 对于一个字符串&#xff0c;只保留首尾字符&#xff0c;将首尾字符之间的所有字符用这部分的长度代替。 例如 internationalization 简写成 i18n&#xff0c;Kubernetes 简写成 K8s&#…

Jmeter的使用

Jmeter的使用 1.Jmeter简介 以下内容来自Jmeter中文网http://www.jmeter.com.cn/jieshao&#xff0c;很好的解释了Jmeter的作用&#xff1a; Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试&#xff0c;它最初被设计用于Web应用测试&#xf…

31. 下一个排列 —— LeetCode (python) [PS: LeetCode 运行环境疑似出错]

# encoding utf-8 # 开发者&#xff1a;xxx # 开发时间&#xff1a; 20:26 # "Stay hungry&#xff0c;stay foolish."class Solution(object):def nextPermutation(self, nums):import itertoolsl len(nums)a tuple(nums)nums.sort()permutations_lst list(ite…

SQL Server维护计划

目录 1.概述 2.启动SQL Server 代理服务 3.制定维护计划 4.验证维护计划 5.删除维护计划 1.概述 此文还是存货哈&#xff01; SQL Server 2008 R2维护计划。 2.启动SQL Server 代理服务 在设置维护计划之前&#xff0c;必须先确保SQL Server 代理服务已启动。启动方法如…

网络基础二——TCP可靠性实现机制补充

11.3.4确认应答机制 ​ 1.双方通信时要返回确认应答报文&#xff0c;保证对方发送的报文是有效的&#xff1b;尽管整个通信过程中无法保证数据全部可靠&#xff0c;但是可以保证单个方向发送的数据是可靠的&#xff1b; ​ 发送的报文要设置序号&#xff0c;如果是应答报文要…

蓝桥杯23年第十四届省赛-异或和之和|拆位、贡献法

题目链接&#xff1a; 蓝桥杯2023年第十四届省赛真题-异或和之和 - C语言网 (dotcpp.com) 1.异或和之和 - 蓝桥云课 (lanqiao.cn) 参考题解&#xff1a; 蓝桥杯真题讲解&#xff1a;异或和之和 &#xff08;拆位、贡献法&#xff09;-CSDN博客 洛谷P9236 [蓝桥杯 2023 省 A]…

配置 施耐德 modbusTCP 分布式IO子站 RPA0100

1. 总体步骤 2. 软件组态&#xff1a;在 Unity Pro 软件中创建编辑 PRA 模块工程 2.1 新建项目 模块箱硬件型号如下 点击 Unity Pro 软件左上方【新建】按钮&#xff0c;选择正确的 DIO 模块型号、背板型号 2.2 模块组态 2.2.1 拖拽添加模块 双击【配置】菜单下的【0&…

Python卷积网络车牌识别系统(V2.0)

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

Qt学习记录(C++)——Day 2

目录 一、作业 要求&#xff1a; 实现&#xff1a; 1.创建新的窗口类 2. 主窗口中实现 二、 窗口菜单设计 效果展示图 三、图片资源的导入 步骤&#xff1a; 举例&#xff1a; 四、 对话框 1.模拟对话框 2. 非模态对话框 3.错误对话框 4.信息对话框 5.提问对话…

python调用java中的jar

一、基于IDEA生成可执行jar包 1、编写class的代码&#xff0c;注意一定要有main()方法才可以生成jar包&#xff0c;main()方法可以没有内容。例如下Java 代码&#xff1a; package Project;public class Demo {public static void main(String[] args){Demo t2 new Demo();S…

网络编程(TCP、UDP)

文章目录 一、概念1.1 什么是网络编程1.2 网络编程中的基本知识 二、Socket套接字2.1 概念及分类2.2 TCP VS UDP2.3 通信模型2.4 接口方法UDP数据报套接字编程TCP流套接字编程 三、代码示例3.1 注意点3.2 回显服务器基于UDP基于TCP 一、概念 首先介绍了什么是网络编程&#xff…

Linux 用户、用户组 useradd、groupadd等详解

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Linux &#xff1a;从菜鸟到飞鸟的逆袭》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、前言 1、Linux的起源与发展 2、Linux在现代计算机领域…

FMEA引领智能家居安全革新,打造无忧智能生活新纪元!

在智能家居日益普及的今天&#xff0c;如何确保家居安全成为消费者关注的焦点。本文将探讨如何通过FMEA&#xff08;故障模式与影响分析&#xff09;这一强大的质量管理工具&#xff0c;为智能家居赋能&#xff0c;打造安全无忧的智能生活新体验。 一、FMEA在智能家居领域的应用…

Python快速入门系列-7(Python Web开发与框架介绍)

第七章:Python Web开发与框架介绍 7.1 Flask与Django简介7.1.1 Flask框架Flask的特点Flask的安装一个简单的Flask应用示例7.1.2 Django框架Django的特点Django的安装一个简单的Django应用示例7.2 前后端交互与数据传输7.2.1 前后端交互7.2.2 数据传输格式7.2.3 示例:使用Flas…

Cisco Modeling Labs (CML) 2.7 - 网络仿真工具

Cisco Modeling Labs (CML) 2.7 - 网络仿真工具 思科建模实验室 (CML) 请访问原文链接&#xff1a;https://sysin.org/blog/cisco-modeling-labs-2/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 Cisco Modeling Labs 是我们用于网络仿真的首要平台。凭借易…

2024免费Mac苹果解压压缩包软件BetterZip5

在2024年&#xff0c;对于Mac电脑用户来说&#xff0c;如果你想要无需解压就能快速查看压缩文档的内容&#xff0c;BetterZip是一个极佳的选择。这款软件不仅支持多种格式的压缩和解压&#xff0c;如zip、rar、7z、tar等&#xff0c;还具备丰富的功能和设置&#xff0c;包括预览…

【深度学习】深度学习md笔记总结第3篇:TensorFlow介绍,学习目标【附代码文档】

深度学习笔记完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;深度学习课程&#xff0c;深度学习介绍要求,目标,学习目标,1.1.1 区别,学习目标,学习目标。TensorFlow介绍&#xff0c;2.4 张量学习目标,2.4.1 张量(Tensor),2.4.2 创建张量的指令,2.4.3 张量…

【考研经验贴】24考研860软件工程佛系上岸经验分享【丰富简历、初复试攻略、导师志愿、资料汇总】

&#x1f60a;你好&#xff0c;我是小航&#xff0c;一个正在变秃、变强的文艺倾年。 &#x1f514;本文讲解24考研860软件工程佛系上岸经验分享【丰富简历、初复试攻略、导师志愿、资料汇总】&#xff0c;期待与你一同探索、学习、进步&#xff0c;一起卷起来叭&#xff01; 目…

JS-11A/11时间继电器 板前接线 JOSEF约瑟

系列型号&#xff1a; JS-11A/11集成电路时间继电器&#xff1b;JS-11A/12集成电路时间继电器&#xff1b; JS-11A/13集成电路时间继电器&#xff1b;JS-11A/136集成电路时间继电器&#xff1b; JS-11A/137集成电路时间继电器&#xff1b;JS-11A/22集成电路时间继电器&#…

LangChain Demo | Agent X ReAct X wikipedia 询问《三体》的主要内容

背景 LangChain学习中&#xff0c;尝试改了一下哈里森和吴恩达课程当中的问题&#xff0c;看看gpt-3.5-turbo在集成了ReAct和wikipedia后&#xff0c;如何回答《三体》的主要内容是什么这个问题&#xff0c;当然&#xff0c;主要是为了回答这问题时LangChain内部发生了什么。所…