⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds1302.h

📁 包含调试通过的DS1302和51单片机联合的程序
💻 H
字号:
/********************************************************************
				THE REAL TIMER DS1302 DRIVER LIB

  File Name:   DS1302.h
  Created:	Jiang Jian Jun     Date:	2003/7/21
  Modified:	Zhang Yu Xiang     Date:	2008/10/10
  Revision: 	1.1
  
********************************************************************/
#ifndef _DS1302_H_
#define _DS1302_H_

sbit  DS1302_CLK = P3^0;	//实时时钟时钟线引脚
sbit  DS1302_IO  = P3^1;	//实时时钟数据线引脚
sbit  DS1302_RST = P3^2;	//实时时钟复位线引脚
sbit  ACC0 = ACC^0;
sbit  ACC7 = ACC^7;

#define Time_24_Hour	0x00	//24时制控制	
#define Time_Start		0x00	//开始走时
#define Time_Stop		0x80	//停止走时

#define DS1302_SECOND	0x80	//DS1302各寄存器操作命令定义
#define DS1302_MINUTE	0x82
#define DS1302_HOUR		0x84
#define DS1302_WEEK		0x8A
#define DS1302_DAY		0x86
#define DS1302_MONTH	0x88
#define DS1302_YEAR		0x8C
#define DS1302_WRITE	0x8E
#define DS1302_POWER	0x90

#define BCD2DEC(X)	(((X&0x70)>>4)*10 + (X&0x0F))	//用于将BCD码转成十进制的宏
#define DEC2BCD(X)	((X/10)<<4 | (X%10))			//用于将十进制转成BCD码的宏

typedef struct __SYSTEMTIME__		//定义的时间类型结构体,全部数为十进制
{
	unsigned char Second;
	unsigned char Minute;
	unsigned char Hour;
	unsigned char Week;
	unsigned char Day;
	unsigned char Month;
	unsigned char Year;
}SYSTEMTIME;

//实时时钟写入一字节(内部函数)
void DS1302InputByte(unsigned char d)
{
    unsigned char i;
    ACC = d;
    for(i=8; i>0; i--)
    {
        DS1302_IO = ACC0;				//相当于汇编中的 RRC
        DS1302_CLK = 1;
        DS1302_CLK = 0;
        ACC = ACC >> 1;
    }
}

//实时时钟读取一字节(内部函数)
unsigned char DS1302OutputByte(void)
{
    unsigned char i;
    for(i=8; i>0; i--)
    {
        ACC = ACC >>1;					//相当于汇编中的 RRC
        ACC7 = DS1302_IO;
        DS1302_CLK = 1;
        DS1302_CLK = 0;
    }
    return(ACC);
}

//写DS1302,ucAddr: DS1302地址, ucData: 要写的数据
void Write1302(unsigned char ucAddr, unsigned char ucDa)
{
    DS1302_RST = 0;
    DS1302_CLK = 0;
    DS1302_RST = 1;
    DS1302InputByte(ucAddr);       	// 地址,命令
    DS1302InputByte(ucDa);       	// 写1Byte数据
    DS1302_CLK = 1;
    DS1302_RST = 0;
}

//读取DS1302某地址的数据
unsigned char Read1302(unsigned char ucAddr)
{
    unsigned char ucData;
    DS1302_RST = 0;
    DS1302_CLK = 0;
    DS1302_RST = 1;
    DS1302InputByte(ucAddr|0x01);        // 地址,命令
    ucData = DS1302OutputByte();         // 读1Byte数据
    DS1302_CLK = 1;
    DS1302_RST = 0;
    return(ucData);
}

//读取时间函数
void DS1302_GetTime(SYSTEMTIME *Time)
{
	unsigned char ReadValue;
	ReadValue = Read1302(DS1302_SECOND);
	Time->Second = BCD2DEC(ReadValue&0x7F);

	ReadValue = Read1302(DS1302_MINUTE);
	Time->Minute = BCD2DEC(ReadValue);

	ReadValue = Read1302(DS1302_HOUR);
	Time->Hour = BCD2DEC(ReadValue&0x7F);

	ReadValue = Read1302(DS1302_DAY);
	Time->Day = BCD2DEC(ReadValue);	

	ReadValue = Read1302(DS1302_WEEK);
	Time->Week = BCD2DEC(ReadValue);

	ReadValue = Read1302(DS1302_MONTH);	//这里有错误
	Time->Month = BCD2DEC(ReadValue);

	ReadValue = Read1302(DS1302_YEAR);
	Time->Year = BCD2DEC(ReadValue);	
}

//设置时间函数
void DS1302_SetTime(SYSTEMTIME *Time)
{
	Write1302(DS1302_WRITE,0x00);		//关闭写保护
	
	Write1302(DS1302_YEAR,DEC2BCD(Time->Year));
	Write1302(DS1302_MONTH,DEC2BCD(Time->Month));
	Write1302(DS1302_WEEK,DEC2BCD(Time->Week));
	Write1302(DS1302_DAY,DEC2BCD(Time->Day));
	Write1302(DS1302_HOUR,DEC2BCD(Time->Hour)|Time_24_Hour);
	Write1302(DS1302_MINUTE,DEC2BCD(Time->Minute));
	Write1302(DS1302_SECOND,DEC2BCD(Time->Second)|Time_Start);
	
	Write1302(DS1302_WRITE,0x80);		//打开写保护	
}

//初始化DS1302
void DS1302_Initial(void)
{
	Write1302(DS1302_WRITE,0x00);		//关闭写保护
	Write1302(DS1302_SECOND,Time_Stop);//停止计时
	Write1302(DS1302_HOUR,Time_24_Hour);//24时制
	Write1302(DS1302_POWER,0xA6);		//单二极管,4K电阻充电
//		Write1302(DS1302_SECOND,DEC2BCD(Time_Start));
	Write1302(DS1302_WRITE,0x80);		//打开写保护
}

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -