📄 ds1302.h
字号:
#ifndef _REAL_TIMER_DS1302_
#define _REAL_TIMER_DS1302_
/*Mini51板实时时钟接口*/
sbit DS1302_RT = P1^3;
sbit DS1302_CK = P1^4;
sbit DS1302_IO = P1^5;
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
#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
void DS1302_Input_Byte(unsigned char d) //实时时钟写入一字节(内部函数)
{
unsigned char i;
ACC = d;
for(i=8; i>0; i--)
{
DS1302_IO = ACC0; //相当于汇编中的 RRC
DS1302_CK = 1;
DS1302_CK = 0;
ACC = ACC >> 1;
}
//DS1302_IO = 0;//实物板需要该语句
}
unsigned char DS1302_Output_Byte(void) //实时时钟读取一字节(内部函数)
{
unsigned char i;
for(i=8; i>0; i--)
{
ACC = ACC >>1; //相当于汇编中的 RRC
ACC7 = DS1302_IO;
DS1302_CK = 1;
DS1302_CK = 0;
}
//DS1302_IO = 0;//实物板需要该语句
return(ACC);
}
void Write1302(unsigned char addr, unsigned char da) //ucAddr: DS1302地址, ucData: 要写的数据
{
DS1302_RT = 0;
DS1302_CK = 0;
DS1302_RT = 1;
DS1302_Input_Byte(addr); // 地址,命令
DS1302_Input_Byte(((da/10)<<4)|(da%10));// 写1Byte数据
DS1302_CK = 1;
DS1302_RT = 0;
}
unsigned char Read1302(unsigned char addr) //读取DS1302某地址的数据
{
unsigned char dat;
DS1302_RT = 0;
DS1302_CK = 0;
DS1302_RT = 1;
DS1302_Input_Byte(addr|0x01); // 地址,命令
dat = DS1302_Output_Byte(); // 读1Byte数据
DS1302_CK = 1;
DS1302_RT = 0;
return(dat);
}
void DS1302_Set_Protect(bit flag) //是否写保护
{
if(flag) Write1302(0x8E,0x10);
else Write1302(0x8E,0x00);
}
void DS1302_Set_Time(RTC_TIME *Time) // 设置时间函数
{
unsigned char ReadValue;
DS1302_Set_Protect(0);
Write1302(DS1302_MINUTE, Time->Minute);
Write1302(DS1302_HOUR, Time->Hour);
Write1302(DS1302_DAY, Time->Day);
Write1302(DS1302_MONTH,Time->Month);
Write1302(DS1302_YEAR,Time->Year);
Write1302(DS1302_WEEK,Time->Week);
DS1302_Set_Protect(1);
ReadValue = Read1302(DS1302_SECOND);//保持秒钟自然走钟
Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
}
void ds1302_init(void)
{
unsigned char Second=Read1302(DS1302_SECOND);
DS1302_Set_Protect(0);
if(Second&0x80)
Write1302(DS1302_SECOND,0);
DS1302_Set_Protect(1);
}
void DS1302_Get_Time(RTC_TIME *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);
}
void Date_To_Str(RTC_TIME *Time)
{
//str_buffx为全局变量
str_buff0[0] = '2';
str_buff0[1] = '0';
str_buff0[2] = Time->Year/10 + '0';
str_buff0[3] = Time->Year%10 + '0';
str_buff0[4] = '/';
str_buff0[5] = Time->Month/10 + '0';
str_buff0[6] = Time->Month%10 + '0';
str_buff0[7] = '/';
str_buff0[8] = Time->Day/10 + '0';
str_buff0[9] = Time->Day%10 + '0';
str_buff0[10] = ' ';
str_buff0[11] = 'W';
str_buff0[12] = 'e';
str_buff0[13] = 'e';
str_buff0[14] = 'k';
str_buff0[15] = Time->Week + '0';
}
void Time_To_Str(RTC_TIME *Time)
{
str_buff1[0] = Time->Hour/10 + '0';
str_buff1[1] = Time->Hour%10 + '0';
str_buff1[2] = ':';
str_buff1[3] = Time->Minute/10 + '0';
str_buff1[4] = Time->Minute%10 + '0';
str_buff1[5] = ':';
str_buff1[6] = Time->Second/10 + '0';
str_buff1[7] = Time->Second%10 + '0';
str_buff1[8] = ' ';
str_buff1[9] = ' ';
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -