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

📄 da1302.h

📁 51单片机
💻 H
字号:
//#include <at89c51RB2.h>
#include <intrins.h>
//#include "ds1302.h"
//#include "lm3228.h"
//#include "hanzi.h"

#define uchar unsigned char


void Write1302(unsigned char ucAddr, unsigned char ucDa);
unsigned char Read1302(unsigned char ucAddr);
void LCD_prints(unsigned char *lcd_string); 
#define uchar unsigned char
#define DS1302_SECOND 0x80
#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_CONTROL 0x8e
typedef struct __SYSTEMTIME__
{
	unsigned char Second;
	unsigned char Minute;
	unsigned char Hour;
	unsigned char Week;
	unsigned char Day;
	unsigned char Month;
	unsigned char  Year;
	unsigned char DateString[9];
	unsigned char TimeString[9];
}SYSTEMTIME;	//定义的时间类型

sbit CLK =P3^0;
sbit IO_DATA =P3^1;
sbit RST =P3^3;
sbit  ACC0 = ACC^0;
sbit  ACC7 = ACC^7;
//从1302读取一个字节
uchar read_1302(void)
{
	uchar i,data_1302;
	
	for(i=0;i<8;i++)
	{	
		
		data_1302>>=1;
		if(IO_DATA)
		{
			data_1302|=0x80;
		}
		CLK=1;
		//nop();
		CLK=0;
	}
	return(data_1302);
}
//向1302写入一个字节
void write_1302(uchar data_1302)
{
	uchar i;
	
	for(i=0;i<8;i++)
	{
		
		data_1302>>=1;
		IO_DATA=CY;
		CLK=0;
		//nop();
		CLK=1;
		//nop();
		CLK=0;
	}
	
}
void DS1302InputByte(unsigned char d) 	//实时时钟写入一字节(内部函数)
{ 
    unsigned char i;
    ACC = d;
    for(i=8; i>0; i--)
    {
        IO_DATA = ACC0;  //相当于汇编中的 RRC 
        CLK =0;
        CLK = 1;
        CLK = 0;
        ACC = ACC >> 1; 
    } 
}
unsigned char DS1302OutputByte(void) 	//实时时钟读取一字节(内部函数)
{ 
    unsigned char i;
    for(i=8; i>0; i--)
    {
        ACC = ACC >>1;         			//相当于汇编中的 RRC 
        ACC7 = IO_DATA;
        CLK = 1;
        CLK = 0;
    } 
    return(ACC); 
}
//从1302的某地址读一个字节的数据
uchar read_byte_1302(uchar addr)
{
	uchar data_1302;
	RST=0;
	CLK=0;
	RST=1;
	write_1302(addr|0x01);
	data_1302=read_1302();
	CLK=1;
	RST=0;
	CLK=0;
	return (data_1302);
}
//向1302的某地址写入一个字节的数据
void write_byte_1302(uchar addr,uchar data_1302)
{
	RST=0;
	CLK=0;
	RST=1;
	write_1302(addr);
	write_1302(data_1302);
	CLK=1;
	RST=0;
	CLK=0;
}
void Write1302(unsigned char ucAddr, unsigned char ucDa)	//ucAddr: DS1302地址, ucData: 要写的数据
{
    RST = 0;
    CLK = 0;
    RST = 1;
    DS1302InputByte(ucAddr);       	// 地址,命令 
    DS1302InputByte(ucDa);       	// 写1Byte数据
    CLK = 1;
    RST = 0;
} 
void DS1302_SetProtect(bit flag)        //是否写保护
{
	if(flag)
		Write1302(0x8E,0x10);
	else
		Write1302(0x8E,0x00);
}

void DS1302_SetTime(unsigned char Address, unsigned char Value)        // 设置时间函数
{
	DS1302_SetProtect(0);
	write_byte_1302(Address, ((Value/10)<<4 | (Value%10))); 
}
//是否写保护
void protect_1302(bit flag)
{
	if(flag)
		write_byte_1302(DS1302_CONTROL,0x80);
	else
		write_byte_1302(DS1302_CONTROL,0x00);
}

//停止1302时钟
void stop_1302(void)
{
	write_byte_1302(DS1302_SECOND,0x80);
}
//启动1302时钟
void start_1302(void)
{
	write_byte_1302(DS1302_SECOND,0x00);
}

//读1302的时间序列
void read_data(uchar *j)
{
	uchar i;
	RST=0;
	CLK=0;
	RST=1;
	write_1302(0xbf);
	for(i=0;i<8;i++)
	{
		*(j)=read_1302();
		j++;
		
	}
	CLK=1;
	RST=0;
	CLK=0;
}
//写1302的时间序列
void write_data(uchar *j)
{
	uchar i;
	RST=0;
	CLK=0;
	RST=1;
	write_1302(0xbe);
	for(i=0;i<8;i++)						 
	{
		write_1302(*j);
		j++;
	}
	CLK=1;
	RST=0;
	CLK=0;
}	
//显示时间

void BurstRead1302(unsigned char *pRClock)	//读取DS1302时钟数据(时钟多字节方式)
{
    unsigned char i;
    RST = 0;
    CLK = 0;
    RST = 1;
    DS1302InputByte(0xbf);             	// 0xbf:时钟多字节读命令
    
    for (i=8; i>0; i--) 
    {
       *pRClock = DS1302OutputByte();   // 读1Byte数据 
       pRClock++;
       
    }
    CLK = 1;
    RST = 0;
	CLK = 0;
}
void inttostring(unsigned char time,unsigned char *str)
{
  *str++=time/10 + '0';
  *str++=time%10 + '0';
  *str='\0';
}
DS1302_GetTime(SYSTEMTIME *Time)
{  

    /* unsigned char 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);*/

   
    unsigned char temp[8];
	unsigned char ReadValue;
    BurstRead1302(temp);
    ReadValue=temp[0];
	Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
	ReadValue=temp[1];
	Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
	ReadValue = temp[2];
	Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
	ReadValue = temp[3];
	Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);	
	ReadValue = temp[5];
	Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
	ReadValue = temp[4];
	Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
	ReadValue = temp[6];
	Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);	
			 
/*
	unsigned char time1[10]={58,59,5,6,3,4,90,80};
	unsigned char ReadValue;
  BurstRead1302(time1);

  time1[0]=((time1[0]&0x70)>>4)*10 + (time1[0]&0x0F);
  inttostring(time1[0],shuju);
  LCD_prints(&shuju[0]);
  time1[1]=((time1[1]&0x70)>>4)*10 + (time1[1]&0x0F);
  inttostring(time1[1],shuju);
  LCD_prints(&shuju[0]);
  time1[2]=((time1[2]&0x70)>>4)*10 + (time1[2]&0x0F);
  inttostring(time1[2],shuju);
  LCD_prints(&shuju[0]);
  time1[3]=((time1[3]&0x70)>>4)*10 + (time1[3]&0x0F);
  inttostring(time1[3],shuju);
  LCD_prints(&shuju[0]);
  time1[4]=((time1[4]&0x70)>>4)*10 + (time1[4]&0x0F);
  inttostring(time1[4],shuju);
  LCD_prints(&shuju[0]);
  time1[5]=((time1[5]&0x70)>>4)*10 + (time1[5]&0x0F);
  inttostring(time1[5],shuju);
  LCD_prints(&shuju[0]);
  time1[6]=((time1[6]&0x70)>>4)*10 + (time1[6]&0x0F);
  inttostring(time1[6],shuju);
  LCD_prints(&shuju[0]);
  time1[7]=((time1[7]&0x70)>>4)*10 + (time1[7]&0x0F);
  inttostring(time1[7],shuju);
  LCD_prints(&shuju[0]);
*/	

 /*   ReadValue=time1[0];
	Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
	ReadValue=time1[1];
	Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
	ReadValue = time1[2];
	Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
	ReadValue = time1[3];
	Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);	
	ReadValue = time1[5];
	Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
	ReadValue = time1[4];
	Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
	ReadValue = time1[6];
	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';
}
unsigned char Read1302(unsigned char ucAddr)	//读取DS1302某地址的数据
{
    unsigned char ucData;
    RST = 0;
    CLK = 0;
    RST = 1;
    DS1302InputByte(ucAddr|0x01);        // 地址,命令 
    ucData = DS1302OutputByte();         // 读1Byte数据
    CLK = 1;
    RST = 0;
    CLK = 0;
    return(ucData);
}
void Initial_DS1302(void)
{
	unsigned char Second=Read1302(DS1302_SECOND);
	if(Second&0x80)		  
		DS1302_SetTime(DS1302_SECOND,0);
}


//设置时间
void set_time(uchar *time)
{
	protect_1302(0);														//清除写保护
																			//写预设时间
	write_data(time);
	
	start_1302();															 //启动1302

	protect_1302(1);														  //开启写保护
}


/* //显示星期
void display_week(uchar lowaddr,uchar highaddr)
{
							  //显示星期几
}
//显示“现在时间”
void display_currenttime(uchar lowaddr,uchar highaddr)
{
	
}	    */

⌨️ 快捷键说明

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