📄 ds1302._h
字号:
//ICC-AVR 修改日期: 2006-11-06 15:38:44
//姓名:荣俊齐
// Target : M8
// Crystal: 1.0000Mhz
#define uchar unsigned char
/******************************************************************************
定义DS1302
********************************************************************************/
#define DS1302_RESET1 PORTC|=(1<<PC0)
#define DS1302_RESET0 PORTC&=~(1<<PC0)
#define DS1302_CLK1 PORTC|=(1<<PC1)
#define DS1302_CLK0 PORTC&=~(1<<PC1)
#define DS1302_READ_DATA PINC&0X04
#define DS1302_WRITE_DATA1 PORTC|=(1<<PC2)
#define DS1302_WRITE_DATA0 PORTC&=~(1<<PC2)
#define DS1302_DATA_OUTPUT DDRC|=(1<<PC2)
#define DS1302_DATA_INPUT DDRC&=~(1<<PC2)
/****************************************************************************
定义读写单元地址
*****************************************************************************/
//读
#define Rsec 0x81 //秒
#define Rmin 0x83 //分
#define Rhou 0x85 //时
#define Rdat 0x87 //日
#define Rmon 0x89 //月
#define Rwee 0x8b //周
#define Ryea 0x8d //年
//写
#define Wsec1 0x80 //秒
#define Wmin1 0x82 //分
#define Whou1 0x84 //时
#define Wdat1 0x86 //日
#define Wmon1 0x88 //月
#define Wwee1 0x8a //周
#define Wyea1 0x8c //年
int second,minute,hour,date,week,month,year; //读出后的时间存储单元
char WriteAddress[7]={Wyea1,Wmon1,Wdat1,Whou1,Wmin1,Wsec1,Wwee1}; //写地址
char WriteTime[7]={0x10,0x12,0x31,0x24,0x50,0x30,0x00};//写的时间
/******************************************************************************
定义DS1302初始化程序
********************************************************************************/
void DS1302_set(void)
{ char i;
DS1302_CLK0;
DS1302_RESET0;
for(i=0;i<8;i++)
{
NOP();
}
DS1302_RESET1;
}
/******************************************************************************
定义m8向DS1302发送程序
********************************************************************************/
void DS1302_Write(char x)
{
int i;
DS1302_CLK0;
DS1302_DATA_OUTPUT; //控制数据线
for(i=0;i<8;i++)
{ DS1302_CLK0; //输出
if((x&(1<<i)))
DS1302_WRITE_DATA1 ;
else
DS1302_WRITE_DATA0 ;
NOP();
DS1302_CLK1;
NOP();
}
DS1302_CLK0;
}
//单独矫正某个时间单元
void DS1302_WriteT(char ddr,char time)
{
DS1302_set();
DS1302_Write(ddr);
DS1302_Write(time);
}
/******************************************************************************
定义m8由DS1302接收程序
********************************************************************************/
uchar DS1302_Read(char xx)
{
uchar temp=0,k,n;
uchar temp1=0;
uchar temp2=0;
DS1302_set();
DS1302_Write(xx);
DS1302_DATA_INPUT; //释放数据线
DS1302_CLK0; //时钟线拉低
for(n=0;n<4;n++)
{ DS1302_CLK0; //时钟线拉低
NOP();
k=DS1302_READ_DATA; //读数据,从低位开始
if(k==0x04)
temp1|=(1<<n);
else
temp1&=~(1<<n);
DS1302_CLK1; //时钟线拉高
NOP();
}
for(n=0;n<3;n++)
{ DS1302_CLK0; //时钟线拉低
NOP();
k=DS1302_READ_DATA; //读数据,从低位开始
if(k==0x04)
temp2|=(1<<n);
else
temp2&=~(1<<n);
DS1302_CLK1; //时钟线拉高
NOP(); //60~120us
}
temp=10*temp1+temp2;
DS1302_CLK0; //时钟线拉低
return (temp);
}
/******************************************************************************
定义DS1302读出时间程序
********************************************************************************/
void DS1302_ReadTime(void)
{
second=(DS1302_Read(Rsec)%10);
minute=DS1302_Read(Rmin);
hour=DS1302_Read(Rhou);
date=DS1302_Read(Rdat);
month=DS1302_Read(Rmon);
year=DS1302_Read(Ryea);
}
/******************************************************************************
定义DS1302矫正时间程序
********************************************************************************/
void DS1302_WriteTime(void)
{char *ddr,*time;
ddr=WriteAddress;
time=WriteTime;
while(*ddr)
{
DS1302_WriteT(*ddr,*time);
ddr++;
time++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -