📄 ds1302.c
字号:
/*********************************************************************************************/
/* 读入或写入 DATE(0--6) ,分别是:秒,分,时,日,月,年年 . */
/* 例如 写入 2003.02.14 08:34:12 (晶振11.0592MHz) */
/* date[0]=12;date[1]=34;date[2]=8;date[3]=14;date[4]=2;date[5]=3; */
/*********************************************************************************************/
#include <reg52.h>
#include <intrins.h>
/*-------------------------------------------------------------------------------------------*/
#define uchar unsigned char
#define uint unsigned int
/*-------------------------------------------------------------------------------------------*/
sbit SCLK=P1^0;
sbit IO=P1^1;
sbit REST=P1^2;
/*********************************************************************************************/
void date_write(uchar con1) // 串行写入
{
uchar i;
/*-------------------------------------------------*/
REST=1; // 片选
/*-------------------------------------------------*/
for (i=1;i<=8;i++) // 一次送8 BIT
{
SCLK=0;
if ((con1 & 0x01)==1) IO=1;else IO=0;
con1=_cror_(con1,1); // 移位
SCLK=1;
}
}
/*---------------------------------------------------------------------------*/
uchar data_read() // 串行读出
{
uchar j;
uchar data_ol,data_oh;
/*-------------------------------*/
REST=1;
/*-------------------------------*/
data_ol=0;
for(j=1;j<=4;j++) // 收低4 位
{
SCLK=0;
if (IO==1) data_ol |=0x10;
data_ol=_cror_(data_ol,1);
SCLK=1;
}
/*-----------------------------------------*/
data_oh=0;
for (j=1;j<=4;j++) // 收高4 位
{
SCLK=0;
if (IO==1) data_oh |=0x10;
data_oh=_cror_(data_oh,1);
SCLK=1;
}
/*-------------------------------*/
return(data_ol+data_oh*10); // 变成二进制数,送入数组
}
/*============================================================================*/
void write_ds1302(uchar *date) // 写入数据
{
uchar n;
/*--------------------------------------------------------------*/
if (date[0]>60) date[0]=0; // 限制在0秒
if (date[1]>60) date[1]=1; // 限制在1分
if (date[2]>24) date[2]=1; // 限制在1点
if ((date[3]>31)||(date[3]==0)) date[3]=1; // 限制1日
if ((date[4]>12)||(date[4]==0)) date[4]=1; // 限制在1月
/*--------------------------------------------------------------*/
/* 下一位表示星期,我们不用,再下位表示年,再补0 */
/*--------------------------------------------------------------*/
date_write(0x8e); // 写允许
date_write(0x00);
REST=0;
SCLK=0;
/*--------------------------------------------------------------*/
for (n=0;n<=6;n++)
{
date[n]=(date[n]/10)*0x10+date[n]%10; //高于10的倍数上移至高四位
}
/*--------------------------------------------------------------*/
date_write(0xbe); //串行发送连续写入命令
/*--------------------------------------------------------------*/
for (n=0;n<=4;n++) date_write(date[n]); //先不写星期和年
date_write(1); //星期一
date_write(date[5]); //星期写入年
date_write(0); //星期写入年
/*--------------------------------------------------------------*/
REST=0;
SCLK=0;
/*--------------------------------------------------------------*/
date_write(0x8e); // 写禁止
date_write(0x80);
REST=0;
SCLK=0;
/*--------------------------------------------------------------*/
}
/*============================================================================*/
void read_ds1302(uchar *date) //读到时间
{
uchar n;
/*--------------------------------------------------------------*/
date_write(0xbf);
for (n=0;n<=4;n++) date[n]=data_read(); //读前四位
n=data_read();
date[5]=data_read(); //读年(加上2000才是真实年份)
n=data_read();
/*--------------------------------------------------------------*/
REST=0;
SCLK=0;
/*--------------------------------------------------------------*/
}
/*----------------------------------------------------------------------------*/
void reset_ds1302() //初始化1302
{
/*--------------------------------------------------------------*/
date_write(0x8e); // 写允许
date_write(0x00);
REST=0;
SCLK=0;
/*--------------------------------------------------------------*/
date_write(0x80); // 启动震荡器
date_write(0x00);
REST=0;
SCLK=0;
/*--------------------------------------------------------------*/
date_write(0x90); // 设置备用电池充电电流
date_write(0xa5);
REST=0;
SCLK=0;
/*--------------------------------------------------------------*/
date_write(0x8e); // 写禁止
date_write(0x80);
REST=0;
SCLK=0;
/*--------------------------------------------------------------*/
}
/*********************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -