DS1302 原理及操作方法

本文详细介绍了DS1302实时时钟芯片的特性,包括其秒、分钟、小时等时间显示功能,31x8电池支持RAM,以及宽电压范围操作等。文章还提供了DS1302的典型连接电路、结构简图和引脚说明,并解释了地址/命令字节的使用,以及读写操作的具体方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DS1302 特征

你好! 这是你第一次使用 **Markdown编辑器** 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

  1. 实时时钟显示秒、分钟、小时、月、月、日、周、年的秒、分钟、小时,最多可获得2100年的飞跃补偿。
  2. 31 x 8电池支持通用RAM。
  3. 最小针数系列I/O。
  4. 2.0V至5.5V全面运作。
  5. 2.0V时使用少于300nA。
  6. 单字节或多字节(突发模式)数据传输,用于读取或写入时钟或RAM数据。
  7. 8PinDIP或可选的8Pin,所以表面安装。
  8. 简单的3线接口。
  9. TTL兼容(V CC=5V)。
  10. 可选工业温度范围:-40°C至85°C。
  11. DS1202兼容。
  12. 承销商实验室(UL®认可)
    建议大家去看DS1302的芯片手册。

典型连接电路和结构简图

在这里插入图片描述在这里插入图片描述
可以看到DS132由电源控制,输入移位寄存器,命令和控制逻辑,延时时钟,31×8 RAM和晶振输入模块构成。

引脚说明

在这里插入图片描述 值得注意的是当使用有源晶振时,只接X1引脚,而X2引脚悬空。
Vcc2 为主供电。 在没有主电源的情况下,VCC1连接到备份源,以维护时间和日期。 DS1302是从较大的VCC1或VCC2运行的。 当VCC2大于VCC1时 0.2V,VCC2为DS1302供电。 当VCC2小于VCC1时,VCC1为DS1302供电。

地址/命令字节

在这里插入图片描述 当对DS1320进行读操作时,需要发送地址字节,而进行写操作时,则需要发送地址和命令字节。
A4 A3 A2 A1 A0 是表示的是DS1320内部地址编号,如 下一部分的读写操作地址。81H — 10000001B 对应上图的地址字节。第1位因为是读操作,所以为1,第1位到第5位表示地址为00000,第六位为RAM/CK,这里我们选择时钟,第七位固定为1。可以对照下一部分的读写操作地址联系一下。

读写操作地址

在这里插入图片描述
大家可能疑惑的是10 Seconds 是什么意思?其实就是十位。例如:58 — 十位为 5 各位为 8。
写保护寄存器
WP:0允许写入,1禁止写入。
涓流充电寄存器
慢充电寄存器,用于管理对备用电源的充电
TCS:当4位TCS=1010时,才允许使用涓流充电寄存器,其他任何状态都将禁止使用涓流充电器。
DS:两DS位用于选择连接在VCC2和VCC1间的二极管数目。

读写发送的时序

在这里插入图片描述
时序图分析:找开始点,结束点和转折点。
在最下面有参考的 bilibili网址,老师讲的特别好,所以就不再赘述。

代码阐述

我们这里用蓝桥杯竞赛提供的底层驱动参考代码。
.h 文件声明函数

#ifndef __DS1302_H
#define __DS1302_H

void Write_Ds1302(unsigned char temp);
void Write_Ds1302_Byte( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302_Byte( unsigned char address );
#endif
#include <reg52.h>
#include <intrins.h>
 
sbit SCK=P1^7;     
sbit SDA=P2^3;		
sbit RST = P1^3;   // DS1302复位												

void Write_Ds1302(unsigned  char temp) 
{
	unsigned char i;
	for (i=0;i<8;i++)     	
	{ 
		SCK=0;
		SDA=temp&0x01;
		temp>>=1; 
		SCK=1;
	}
}   

void Write_Ds1302_Byte( unsigned char address,unsigned char dat )     
{
 	RST=0;	_nop_();
 	SCK=0;	_nop_();
 	RST=1; 	_nop_();  
 	Write_Ds1302(address);	
 	Write_Ds1302(dat);		
 	RST=0; 
}

unsigned char Read_Ds1302_Byte ( unsigned char address )
{
 	unsigned char i,temp=0x00;
 	RST=0;	_nop_();
 	SCK=0;	_nop_();
 	RST=1;	_nop_();
 	Write_Ds1302(address);
 	for (i=0;i<8;i++) 	
 	{		
		SCK=0;
		temp>>=1;	
 		if(SDA)
 		temp|=0x80;	
 		SCK=1;
	} 
 	RST=0;	_nop_();
 	SCK=0;	_nop_();
	SCK=1;	_nop_();
	SDA=0;	_nop_();
	SDA=1;	_nop_();
	return (temp);			
}

需要特别注意的是,在写地址和数据前需要对总线初始化

RST=0;	_nop_();
 	SCK=0;	_nop_();
 	RST=1;	_nop_();

同时结束读操作时,需要对总线进行如下操作。

RST=0;	_nop_();
 	SCK=0;	_nop_();
	SCK=1;	_nop_();
	SDA=0;	_nop_();
	SDA=1;	_nop_();

如若没有则传输错误。

参考文献
DS1302芯片手册
https://www.bilibili.com/video/av37386236

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值