#include <reg51.h>
#include <absacc.h>
#include <math.h>
sbit DS1302_RST= P3^4; //实时时钟复位线引脚
sbit DS1302_CLK = P3^0; //实时时钟时钟线引脚
sbit DS1302_IO = P3^1; //实时时钟数据线引脚
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 Rst1302(void) //DS1302复位
{
DS1302_RST=1;
DS1302_CLK=0;
DS1302_RST=0;
}
void EndWr1302(void) //结束写操作
{
DS1302_CLK=1;
DS1302_RST=1;
}
void DS1302WriteByte(uchar 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;
}
}
uchar DS1302ReadByte(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);
}
void Write1302(uchar Addr, uchar Da) //Addr: DS1302地址, Da: 要写的数据
{
Rst1302();
DS1302WriteByte(Addr); // 地址,命令
DS1302WriteByte(Da); // 写1Byte数据
EndWr1302();
}
uchar Read1302(uchar Addr) //读取DS1302某地址的数据
{
uchar Data,k;
Rst1302();
DS1302WriteByte(Addr|0x01); // 地址,命令
Data=DS1302ReadByte(); // 读1Byte数据
EndWr1302();
k=((Data&0x70)>>4)*10+(Data&0x0f);
return(k);
}
void DS1302_SetProtect(bit flag) //是否写保护,如果为1,则写保护,为0,则写允许
{
if(flag)
Write1302(0x8E,0x80);
else
Write1302(0x8E,0x00);
}
void DS1302_Settime(uchar Address,uchar Value) // 设置时间函数
{
DS1302_SetProtect(0) ;
Write1302(Address, ((Value/10)<<4 | (Value%10)));
DS1302_SetProtect(1) ;
}