ds1302驱动

#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) ;
}
原文地址:https://www.cnblogs.com/crazyxu/p/2054167.html