📄 ds1302.c
字号:
#include "main.h"
#include "ds1302.h"
#include "mcs51.h"
typedef struct Tag_TIME//数据结构
{
uchar SEC;//00-59,秒
uchar MIN;//00-59,分
uchar HR;//00-24,时
uchar DATE;//00-31(28,29,30).日期
uchar MONTH;//01-12,月
uchar DAY;//01-07,星期
uchar YEAR;//0-99,年
}TIME;
void DS1302_TIME_SET(TIME temp);//时钟设置
void DS1302_TIME_RD(TIME *temp);//读时钟
static void DS1302_STR_RD( uchar AddrCmd,uchar length,uchar *Str)//数据输出
{
uchar i =0;
uchar temp =0;
DS1302_SCLK =0;
DS1302_CS =0;
Delay1302(2);
DS1302_CS =1;
for(i=0;i<8;i++)//读数据之前先写入地址命令字节
{
DS1302_SCLK =0;
if(1&AddrCmd)//按位与
DS1302_IO =1;
else
DS1302_IO =0;
DS1302_SCLK =1;//时钟翻转
AddrCmd >>=1;
}
DS1302_IO =1;//读8位数据
while(length--)
{
for(i=0;i<8;i++)
{
DS1302_SCLK =0;
temp >>=1;
if(DS1302_IO)
temp |=0x80;//按位或
DS1302_SCLK =1;
}
*Str =temp;
Str++;
}
DS1302_CS =0;
Delay1302(2);
}
static void DS1302_STR_WR(uchar AddrCmd,uchar length,uchar *Str)//数据写入
{
uchar i,temp;
DS1302_SCLK =0;
DS1302_CS =0;
Delay1302(2);
DS1302_CS =1;
Delay1302(2);
for(i=0;i<8;i++)//写数据之前,先写入地址命令字节
{
DS1302_SCLK =0;
if(1&AddrCmd)
DS1302_IO =1;
else
DS1302_IO =0;
DS1302_SCLK =1;
AddrCmd >>=1;
}
while(length--)
{
temp =*Str;
Str++;
for(i=0;i<8;i++)
{
DS1302_SCLK =0;
if(1&temp)
DS1302_IO =1;
else
DS1302_IO =0;
DS1302_SCLK =1;
temp >>=1;
}
}
DS1302_CS =0;
Delay1302(2);
}
void DS1302_TIME_SET(TIME temp)//时钟设置
{
DS1302_STR_WR(DS1302_REG_SEC_WR,1,&temp.SEC);
DS1302_STR_WR(DS1302_REG_MIN_WR,1,&temp.MIN);
DS1302_STR_WR(DS1302_REG_HR_WR,1,&temp.HR);
DS1302_STR_WR(DS1302_REG_DATE_WR,1,&temp.DATE);
DS1302_STR_WR(DS1302_REG_MONTH_WR,1,&temp.MONTH);
DS1302_STR_WR(DS1302_REG_DAY_WR,1,&temp.DAY);
DS1302_STR_WR(DS1302_REG_YEAR_WR,1,&temp.YEAR);
}
void DS1302_TIME_RD(TIME *temp)//读时钟
{
DS1302_STR_RD(DS1302_REG_SEC_RD,1,&((*temp).SEC));
DS1302_STR_RD(DS1302_REG_MIN_RD,1,&((*temp).MIN));
DS1302_STR_RD(DS1302_REG_HR_RD,1,&((*temp).HR));
DS1302_STR_RD(DS1302_REG_DATE_RD,1,&((*temp).DATE));
DS1302_STR_RD(DS1302_REG_MONTH_RD,1,&((*temp).MONTH));
DS1302_STR_RD(DS1302_REG_DAY_RD,1,&((*temp).DAY));
DS1302_STR_RD(DS1302_REG_YEAR_RD,1,&((*temp).YEAR));
}
void Delay1302(unsigned int a){//延时函数 1MS/次
unsigned char i;
while( --a != 0){
for(i = 0; i < 125; i++);
}
}//i 从0加到125,CPU大概就耗时1毫秒
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -