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

📄 ds1302.c

📁 51单片机的实时系统
💻 C
字号:
#include <reg52.h>
#include <ds1302.h>
#include <inc.h>
sbit  DS1302_CLK = P3^6;              //实时时钟时钟线引脚 
sbit  DS1302_IO  = P3^7;              //实时时钟数据线引脚 
sbit  DS1302_RST = P3^5;              //实时时钟复位线引脚
sbit  ACC0 = ACC^0;
sbit  ACC7 = ACC^7;
void InputByte(uchar d) 	            //实时时钟写入一字节(内部函数)
{ 
    uchar i;
    ACC = d;
    for(i=8; i>0; i--)
    {
        DS1302_IO = ACC0;           	//相当于汇编中的 RRC
        DS1302_CLK = 1;
        DS1302_CLK = 0;
        ACC = ACC >> 1; 
    } 
}

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

void Write1302(uchar ucAddr,
               uchar ucData)            //ucAddr: DS1302地址, ucData: 要写的数据
{
    DS1302_RST = 0;
    DS1302_CLK = 0;
    DS1302_RST = 1;
    InputByte(ucAddr);       	            // 写地址 
    InputByte(ucData);       	            // 写1Byte数据
    DS1302_CLK = 1;
    DS1302_RST = 0;
} 

uchar Read1302(uchar ucAddr)	        //读取DS1302某地址的数据
{
    uchar ucData;
    DS1302_RST = 0;
    DS1302_CLK = 0;
    DS1302_RST = 1;
    InputByte(ucAddr|0x01);                 //写地址 
    ucData = OutputByte();                  //读1Byte数据
    DS1302_CLK = 1;
    DS1302_RST = 0;
    return(ucData);
}

void DS1302_SetProtect(bit flag)            //是否写保护
{
	if(flag)
		Write1302(WriteProtect,0x10);
	else
		Write1302(WriteProtect,0x00);
}

void DS1302_SetTime(uchar Address, uchar Value)// 设置时间函数
{
	DS1302_SetProtect(0);
	Write1302(Address, ((Value/10)<<4 | (Value%10)));//变成bcd码 
}

void DS1302_GetTime(SYSTEMTIME *Time)
{
	uchar ReadValue;
	ReadValue = Read1302(DS1302_SECOND);
	Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
	ReadValue = Read1302(DS1302_MINUTE);
	Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
	ReadValue = Read1302(DS1302_HOUR);
	Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
	ReadValue = Read1302(DS1302_DAY);
	Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);	
	ReadValue = Read1302(DS1302_WEEK);
	Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
	ReadValue = Read1302(DS1302_MONTH);
	Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
	ReadValue = Read1302(DS1302_YEAR);
	Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);	
}

void DateToStr(SYSTEMTIME *Time)
{
	Time->DateString[0] = Time->Year/10 + '0';
	Time->DateString[1] = Time->Year%10 + '0';
	Time->DateString[2] = '-';
	Time->DateString[3] = Time->Month/10 + '0';
	Time->DateString[4] = Time->Month%10 + '0';
	Time->DateString[5] = '-';
	Time->DateString[6] = Time->Day/10 + '0';
	Time->DateString[7] = Time->Day%10 + '0';
	Time->DateString[8] = '\0';
}

void TimeToStr(SYSTEMTIME *Time)
{
	Time->TimeString[0] = Time->Hour/10 + '0';
	Time->TimeString[1] = Time->Hour%10 + '0';
	Time->TimeString[2] = ':';
	Time->TimeString[3] = Time->Minute/10 + '0';
	Time->TimeString[4] = Time->Minute%10 + '0';
	Time->TimeString[5] = ':';
	Time->TimeString[6] = Time->Second/10 + '0';
	Time->TimeString[7] = Time->Second%10 + '0';
	Time->DateString[8] = '\0';
}

void Initial_DS1302(void)
{
	uchar Second=Read1302(DS1302_SECOND);
	if(Second&0x80)		  
		DS1302_SetTime(DS1302_SECOND,0);
}
void my_settime(char *buf)
  {
  char *buff=buf;
  DS1302_SetTime(DS1302_SECOND, *(buff+5));
  DS1302_SetTime(DS1302_MINUTE,*(buff+4));
  DS1302_SetTime(DS1302_HOUR,*(buff+4));
  DS1302_SetTime(DS1302_WEEK,*(buff+3));
  DS1302_SetTime(DS1302_DAY,*(buff+2));
  DS1302_SetTime(DS1302_MONTH,*(buff+1));
  DS1302_SetTime(DS1302_YEAR,*buff);
  }
/*void DS1302_TimeStop(bit flag)           // 是否将时钟停止
{
	uchar Data;
	Data=Read1302(DS1302_SECOND);
	DS1302_SetProtect(0);
	if(flag)
		Write1302(DS1302_SECOND, Data|0x80);
	else
		Write1302(DS1302_SECOND, Data&0x7F);
}
/********************************************************************************
void BurstWrite1302(uchar *pWClock)	//往DS1302写入时钟数据(多字节方式)
{
    uchar i;
    Write1302(0x8e,0x00);         	// 控制命令,WP=0,写操作?
    DS1302_RST = 0;
    DS1302_CLK = 0;
    DS1302_RST = 1;
    InputByte(0xbe);        	// 0xbe:时钟多字节写命令
    for (i = 8; i>0; i--)     		//8Byte = 7Byte 时钟数据 + 1Byte 控制
    {
        InputByte(*pWClock); 	// 写1Byte数据
        pWClock++;
    }
    DS1302_CLK = 1;
    DS1302_RST = 0;
} 

void BurstRead1302(uchar *pRClock)	//读取DS1302时钟数据(时钟多字节方式)
{
    uchar i;
    DS1302_RST = 0;
    DS1302_CLK = 0;
    DS1302_RST = 1;
    InputByte(0xbf);             	// 0xbf:时钟多字节读命令 
    for (i=8; i>0; i--) 
    {
       *pRClock = OutputByte();   // 读1Byte数据 
       pRClock++;
    }
    DS1302_CLK = 1;
    DS1302_RST = 0;
}


********************************************************************************/
//#endif

⌨️ 快捷键说明

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