📄 ds1302.c
字号:
/*DS1302驱动程序 **********************************************/
/*版本 V1.1 **********************************************/
/*2007-11-15 **********************************************/
/*吾人 **********************************************/
/*DS1302控制寄存器*******************************************/
/*寄存器名--写--读--取值范围 --[7-----6--5---4--3--2--1--0]*/
/*秒 --80--81---00-59 --[CH----{10SEC }--{--SEC-- }]*/
/*分钟 --82--83---00-59 --[0 ----{10MIN }--{--MIN-- }]*/
/*小时 --84--85---0-12/23 --[12/24-0-10AP-HR-{ --HR-- }]*/
/*日期 --86--87---1-28/29/30-[0 ----0-{10DAT}-{-DATAE- }]*/
/*月份 --88--89---01-12 --[0-----0--0--10M-{-MONTH- }]*/
/*周日 --8A--8B---01-07 --[0-----0--0---0--0-{-DAY- }]*/
/*年份 --8C--8D---00-99 --[{ -10YEAR- }-{-YEAR- }]*/
/************************************************************/
#include <reg52.h>
#include <intrins.h>
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
#define ds1302_set0(x) x=0
#define ds1302_set1(x) x=1
sbit ds1302_rst=P3^7;
sbit ds1302_sclk=P3^5;
sbit ds1302_io=P3^6;
void ds1302_initial();
void ds1302_senddata(uchar dsend);
uchar ds1302_receivedata(void);
/*******************寄存器********************/
char Ds1302Reg[7]={0}; //ds1302内部日期寄存器 (00-06)
char Date[14]={0};
/*********************************************/
void ds1302_senddata(uchar dsend)
{
uchar i;
for(i=0;i<8;i++)
{
ds1302_io=(bit)(dsend&0x01);
ds1302_set1(ds1302_sclk);
dsend=dsend>>1;
ds1302_set0(ds1302_sclk);
}
}
uchar ds1302_receivedata(void)
{
uchar i,dat=0;
for(i=0;i<7;i++)
{
if(ds1302_io) dat=dat|0x80;
else dat=dat&0x7f;
ds1302_set1(ds1302_sclk);
dat=dat>>1;
ds1302_set0(ds1302_sclk);
}
if(ds1302_io) dat=dat|0x80;
else dat=dat&0x7f;
return dat;
}
void Ds1302Write(char data1,char data2)
{
ds1302_set1(ds1302_rst);
ds1302_senddata(data1);
ds1302_senddata(data2);
ds1302_set0(ds1302_rst);
}
char Ds1302Read(char Addr)
{
char DataReturn;
ds1302_set1(ds1302_rst);
ds1302_senddata(Addr);
DataReturn=ds1302_receivedata();
ds1302_set0(ds1302_rst);
return DataReturn;
}
void Ds1302ReadAll()
{
char i;
for(i=0;i<7;i++)
{
Ds1302Reg[i]=Ds1302Read(0x81|((i<<1)&0xfe));
}
}
void Ds1302DataConver()
{
char Counter=0;
Ds1302ReadAll();
//秒 分 时
Date[5]=Ds1302Reg[0]%0x10;
Date[4]=((Ds1302Reg[0]>>4)&0x07);
Date[3]=Ds1302Reg[1]%0x10;
Date[2]=(Ds1302Reg[1]>>4);
Date[1]=Ds1302Reg[2]%0x10;
Date[0]=((Ds1302Reg[2]>>4)&0x01);
//日 月
Date[9]=Ds1302Reg[3]%0x10;
Date[8]=((Ds1302Reg[3]>>4)&0x03);
Date[7]=Ds1302Reg[4]%0x10;
Date[6]=((Ds1302Reg[4]>>4)&0x01);
//星期
Date[10]=Ds1302Reg[5];
//年 基数 2000
Date[11]=Ds1302Reg[6]%0x10;
Date[12]=((Ds1302Reg[6]>>4)&0x0f);
for(Counter=0;Counter<13;Counter++)
Date[Counter]+='0';
}
void ds1302_initial()
{
ds1302_set0(ds1302_sclk);
ds1302_set0(ds1302_rst);
ds1302_set0(ds1302_io);
Ds1302Write(0x8e,0x00);
Ds1302Write(0x80,0x01);
Ds1302Write(0x82,0x00);
Ds1302Write(0x84,0x00);
Ds1302Write(0x86,0x00);
Ds1302Write(0x90,0xa9);
}
/*DS1302驱动结束******************************************/
/*先前版本存在一个小问题 说声抱歉了 这个已经在实际中通过*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -