📄 ds3231.c
字号:
#pragma DEBUG CODE
#include <reg51.h>
#include "clock.h"
#include <intrins.h>
sbit CLK_SDA=P3^4;
sbit CLK_SCL=P3^5;
extern unsigned char code MonthTable[13];
unsigned char xdata buf_clk[18];
Ststruct xdata Time_R;
Ststruct xdata Time_W;
extern unsigned int UseCount;
/********************************************/
void IIC_Start(void)
{ CLK_SDA=1;
CLK_SCL=1;
CLK_SDA=0;
CLK_SCL=0;
}
/********************************************/
void IIC_Stop(void)
{ CLK_SDA=0;
CLK_SCL=0;
CLK_SCL=1;
CLK_SDA=1;
}
/********************************************/
void IIC_Ack_S(bit ack) //确认接收
{
CLK_SDA=ack;
CLK_SCL=1;
CLK_SCL=0;
}
bit IIC_Ack_R(void)
{bit ack=0;
CLK_SCL=1;
if(CLK_SDA)
ack=1;
CLK_SCL=0;
return ack;
}
void IIC_Byte_S(unsigned char bytedata) //传送一个字节数据
{ unsigned char i=8;
do{
CLK_SDA=bytedata&0x80;
CLK_SCL=1;
bytedata<<=1;
CLK_SCL=0;
}while(--i);
}
unsigned char IIC_Byte_R(void) //接收一个字节数据
{ unsigned char x,i=8;
CLK_SDA=1;
do
{ CLK_SCL=1;
x<<=1;
if(CLK_SDA)
x++;
CLK_SCL=0;
}while(--i);
return(x);
}
unsigned char IIC_Muti_W(unsigned char xdata *p,unsigned char address,unsigned char i)
{
unsigned char sign=0;
IIC_Start();
if(CLK_TYPE)
IIC_Byte_S(0xd0);
else
IIC_Byte_S(0x64);
if(IIC_Ack_R())
sign+=0x01;
if(CLK_TYPE)
IIC_Byte_S(address);
else
IIC_Byte_S(address<<4);
if(IIC_Ack_R())
sign+=0x02;
while(i)
{
IIC_Byte_S(*p);
if(IIC_Ack_R())
sign+=0x04;
p++;
i--;
}
IIC_Stop();
return(sign);
}
unsigned char IIC_Muti_R(unsigned char xdata *p,unsigned char address,unsigned char i)
{
unsigned char sign=0;
IIC_Start();
if(CLK_TYPE)
IIC_Byte_S(0xd0);
else
IIC_Byte_S(0x64);
if(IIC_Ack_R())
sign+=0x01;
if(CLK_TYPE)
IIC_Byte_S(address);
else
IIC_Byte_S(address<<4);
if(IIC_Ack_R())
sign+=0x02;
IIC_Start();
if(CLK_TYPE)
IIC_Byte_S(0xd1);
else
IIC_Byte_S(0x65);
if(IIC_Ack_R())
sign+=0x04;
for(;;)
{
*p=IIC_Byte_R();
p++;
i--;
if(!i)
break;
IIC_Ack_S(0);
}
IIC_Ack_S(1);
IIC_Stop();
return(sign);
}
void initFreq(unsigned char x)
{
buf_clk[0]= x;
if(CLK_TYPE)
{
IIC_Muti_W(buf_clk,16,1);
buf_clk[0]= 0x20;
IIC_Muti_W(buf_clk,14,1);
}
else
{
IIC_Muti_W(buf_clk,7,1);
//tuijian 28,计时精度 老晶振为46
}
}
void initclock(void)
{
unsigned char count;
count = 10;
do{
if(IIC_Muti_R(buf_clk,0x0f,1))
{
UseCount = 5;
while(UseCount);
}
else
{
if (buf_clk[0] & 0x80)
{
buf_clk[0] = 0x00;
buf_clk[1] = 0x00;
buf_clk[2] = 0x12;
buf_clk[3] = 0x00;
buf_clk[4] = 0x01;
buf_clk[5] = 0x09;
buf_clk[6] = 0x04;
IIC_Muti_W(buf_clk,0,7);
}
if(CLK_TYPE)
{
buf_clk[0] = 0x20;
buf_clk[1] = 0x00; // 00101000
// buf_clk[2] = 0x00;
IIC_Muti_W(buf_clk,0x0e,2);
}
else
{
buf_clk[0] = 0x00;
buf_clk[1] = 0x28;
IIC_Muti_W(buf_clk,0x0e,2);
}
break;
}
}while(--count);
}
/***********************************************/
unsigned char bcd2bin(unsigned char BCD)
{
return((BCD/16)*10+BCD%16);
}
/***********************************************/
unsigned char bin2bcd(unsigned char BIN)
{
return((BIN/10)*16+BIN%10);
}
/***********************************************/
unsigned char getweek(void)
{unsigned char weekdays,i,j;
weekdays=Time_R.day+6;
j=0;
if(Time_R.month>6)
{j=6;
weekdays+=4;
}
for(i=j;i<Time_R.month;i++)
{weekdays+=MonthTable[i];
}
weekdays=Time_R.year+Time_R.year/4+weekdays;
if(Time_R.year%4==0&&Time_R.month<3)
weekdays--;
return(weekdays%7);
}
/***********************************************/
void readclock(void)
{
unsigned char count;
count = 10;
do{
if(IIC_Muti_R(buf_clk,0,7))
{
UseCount = 5;
while(UseCount);
}
else break;
}while(--count);
Time_R.second=bcd2bin(buf_clk[0]);
Time_R.minute=bcd2bin(buf_clk[1]);
Time_R.hour=bcd2bin(buf_clk[2]);
Time_R.day=bcd2bin(buf_clk[4]);
Time_R.month=bcd2bin(buf_clk[5]);
Time_R.year=bcd2bin(buf_clk[6]);
Time_R.century=20;
// Time.week=getweek();
// lunerchange();
// hejrachange();
}
/***********************************************/
void writeclock(void)
{
unsigned char count;
count = 10;
buf_clk[0]=bin2bcd(Time_W.second);
buf_clk[1]=bin2bcd(Time_W.minute);
buf_clk[2]=bin2bcd(Time_W.hour);
// buf_clk[3]=bin2bcd(Time_W.week);
buf_clk[4]=bin2bcd(Time_W.day);
buf_clk[5]=bin2bcd(Time_W.month);
buf_clk[6]=bin2bcd(Time_W.year);
do{
if(IIC_Muti_W(buf_clk,0,7))
{
UseCount = 5;
while(UseCount);
}
else break;
}while(--count);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -