RTC实时时钟——DS1302

DS1302目录


一、DS1302简介

RTC(Real Time Clock):实时时钟,是一种集成电路,通常称为时钟芯片。现在流行的串行时钟电路很多,如DS1302、 DS1307、PCF8485等。

DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片 。主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。采用普通32.768kHz晶振。它可以对年、月、日、周、时、分、秒进行计时,且具有闰年补偿等多种功能。

引脚定义与推荐电路

DS1302的引脚排列,其中Vcc2为主电源,VCC1为后备电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768kHz晶振。 R S T ‾ \overline{RST} RST是复位/片选线,通过把 R S T ‾ \overline{RST} RST输入驱动置高电平来启动所有的数据传送。

引脚名 作用
VCC2 主电源
VCC1 备用电池
GND 电源地
X1、X2 32.768KHz晶振
R S T ‾ \overline{RST} RST 芯片使能
IO 数据输入/输出
SCLK 串行时钟

二、芯片手册

1.操作寄存器的定义

1、秒寄存器(80H和81H)的位7 (CH)为时钟暂停标志。

CH为0时,时钟振荡停止;

CH为1时,时钟开始运行。

2、控制寄存器(8EH 和8FH)的位7 (WP)为写保护位。

WP为0时,可对任何的时钟或RAM寄存器进行写操作;

WP为1时,禁止对任一寄存器进行写操作。

2.时序定义

dc1302.c

c 复制代码
#include <STC15F2K60S2.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_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 	SCK=0;	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 	RST=1; 	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_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_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 	SCK=0;	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 	RST=1;	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 	Write_Ds1302(address);
 	for (i=0;i<8;i++) 	
 	{		
		SCK=0;
		temp>>=1;	
 		if(SDA)
 		temp|=0x80;	
 		SCK=1;
	} 
 	RST=0;	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 	SCK=0;	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	SCK=1;	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	SDA=0;	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	SDA=1;	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	return (temp);			
}

ds1302.h

c 复制代码
#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

三、蓝桥杯实践

*将ds1302.c文件中改写成_nop_();nop ();nop ();nop ();nop ();nop ();nop ();nop();

c 复制代码
void Init_Ds1302(uchar hour,uchar min,uchar sec)
{
	Write_Ds1302_Byte(0x8e,0x00);  //关写保护,不然无法写数据
	Write_Ds1302_Byte(0x80,(sec/10)*16+sec%10);
	Write_Ds1302_Byte(0x82,(min/10)*16+min%10);
	Write_Ds1302_Byte(0x84,(hour/10)*16+hour%10);
	Write_Ds1302_Byte(0x8e,0x80);  //开启写保护
}

void Get_Ds1302()
{
	miao = Read_Ds1302_Byte(0x81);
	fen = Read_Ds1302_Byte(0x83);
	shi = Read_Ds1302_Byte(0x85);
	shi = (shi>>4)*10+(shi&0x0f);
	fen = (fen>>4)*10+(fen&0x0f);
	miao = (miao>>4)*10+(miao&0x0f);
}


调用说明:设置初始时间为8:30:00->Init_Ds1302(08,30,00);
相关推荐
西瓜籽@24 分钟前
STM32——毕设基于单片机的多功能节能窗控制系统
stm32·单片机·课程设计
lulu_gh_yu33 分钟前
数据结构之排序补充
c语言·开发语言·数据结构·c++·学习·算法·排序算法
~yY…s<#>2 小时前
【刷题17】最小栈、栈的压入弹出、逆波兰表达式
c语言·数据结构·c++·算法·leetcode
远翔调光芯片^138287988723 小时前
远翔升压恒流芯片FP7209X与FP7209M什么区别?做以下应用市场摄影补光灯、便携灯、智能家居(调光)市场、太阳能、车灯、洗墙灯、舞台灯必看!
科技·单片机·智能家居·能源
极客小张4 小时前
基于STM32的智能充电桩:集成RTOS、MQTT与SQLite的先进管理系统设计思路
stm32·单片机·嵌入式硬件·mqtt·sqlite·毕业设计·智能充电桩
EricWang13584 小时前
[OS] 项目三-2-proc.c: exit(int status)
服务器·c语言·前端
我是谁??4 小时前
C/C++使用AddressSanitizer检测内存错误
c语言·c++
希言JY5 小时前
C字符串 | 字符串处理函数 | 使用 | 原理 | 实现
c语言·开发语言
午言若5 小时前
C语言比较两个字符串是否相同
c语言
天行健PLUS6 小时前
【经验分享】六西格玛管理培训适合哪些人参加?
经验分享