高级会员
主题
回帖0
积分2289
阅读权限30
注册时间2008-11-17
最后登录1970-1-1
在线时间 小时
|
本帖最后由 飞雪008 于 2012-6-8 09:25 编辑
拿这个用用看,我以前在网上找的,还可以
//DS1302管脚定义
sbit T_CLK = P3^5;
sbit T_IO = P3^6;
sbit T_RST = P3^7;
sbit ACC0 = ACC^0;
sbit ACC1 = ACC^1;
sbit ACC2 = ACC^2;
sbit ACC3 = ACC^3;
sbit ACC4 = ACC^4;
sbit ACC5 = ACC^5;
sbit ACC6 = ACC^6;
sbit ACC7 = ACC^7;
//------------------------------------------------------------------------------------------
//时钟数据(7字节BCD码)格式为: 秒 分 时 日 月星期 年-----------------------------
unsigned char idata Time[7];//={0x30,0x42,0x23,0x18,0x06,0x04,0x09};
//------------------------------------------------------------------------------------------
bit flag; //flag-闰年标记
unsigned char idata second,minute,hour,day,month,week,year;
unsigned char BCD2HEX(unsigned char BCDChar);
unsigned char HEX2BCD(unsigned char HEXChar);
void WriteByteDS1302(unsigned char Data);
unsigned char ReadByteDS1302(void);
void WriteDS1302(unsigned char Addr,unsigned char Data);
unsigned char ReadDS1302(unsigned char Addr);
void Set(unsigned char sel,unsigned char selby);
void SetTime(unsigned char *pClock);
void ReadTime();
void WriteTime();
void StopTime();
void StartTime();
void bucang(void);
/*******************************************************************************************
* 函数名: BCD2HEX
* 功能描述:
* 入口参数: 无
* 出口参数: 无
*******************************************************************************************/
unsigned char BCD2HEX(unsigned char BCDChar)
{
unsigned char temp;
temp=(BCDChar/16*10+BCDChar%16);
return temp;
}
/*******************************************************************************************
* 函数名: HEX2BCD
* 功能描述:
* 入口参数: 无
* 出口参数: 无
*******************************************************************************************
unsigned char HEX2BCD(unsigned char HEXChar)
{
unsigned char temp;
temp=(HEXChar/10*16+HEXChar%10);
return temp;
}
/*******************************************************************************************
* 函数名: WriteByteDS1302
* 功能描述:
* 入口参数: 无
* 出口参数: 无
*******************************************************************************************/
void WriteByteDS1302(unsigned char Data)
{
unsigned char i;
ACC = Data;
for(i=8; i>0; i--)
{
T_IO = ACC0;
T_CLK = 1;
T_CLK = 0;
ACC = ACC >> 1;
}
}
/*******************************************************************************************
* 函数名: ReadByteDS1302
* 功能描述:
* 入口参数: 无
* 出口参数: 无
*******************************************************************************************/
unsigned char ReadByteDS1302(void)
{
unsigned char i;
for(i=8; i>0; i--)
{
ACC = ACC >>1;
ACC7 = T_IO;
T_CLK = 1;
T_CLK = 0;
}
return(ACC);
}
/*******************************************************************************************
* 函数名: WriteDS1302
* 功能描述:
* 入口参数: 无
* 出口参数: 无
*******************************************************************************************/
void WriteDS1302(unsigned char Addr,unsigned char Data)
{
T_RST = 0;
T_CLK = 0;
T_RST = 1;
WriteByteDS1302(Addr);
WriteByteDS1302(Data);
T_CLK = 1;
T_RST = 0;
}
/*******************************************************************************************
* 函数名: ReadDS1302
* 功能描述:
* 入口参数: 无
* 出口参数: 无
*******************************************************************************************/
unsigned char ReadDS1302(unsigned char Addr)
{
unsigned char Data;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
WriteByteDS1302(Addr);
Data = ReadByteDS1302();
T_CLK = 1;
T_RST = 0;
return(Data);
}
/*******************************************************************************************
* 函数名: Set
* 功能描述:
* 入口参数: 无
* 出口参数: 无
*******************************************************************************************/
void Set(unsigned char sel,unsigned char selby)
{
unsigned char address;
char item;
unsigned char max,min;
if(sel==0) {address=0x80; max=59;min=0;} //秒
if(sel==1) {address=0x82; max=59;min=0;} //分钟
if(sel==2) {address=0x84; max=23;min=0;} //小时
if(month==2)
if(flag==1)
{
if(sel==3) {address=0x86; max=28;min=1;}
}
else
{
if(sel==3) {address=0x86; max=27;min=1;}
}
else
{
if(month==1|month==3|month==5|month==7|month==8|month==10|month==12)
{
if(sel==3) {address=0x86; max=31;min=1;}
}
if(month==4|month==6|month==9|month==11)
{
if(sel==3) {address=0x86; max=30;min=1;}
}
}
if(sel==4) {address=0x88; max=12;min=1;} //月
if(sel==5) {address=0x8a; max=7; min=1;} //星期
if(sel==6) {address=0x8c; max=99;min=0;} //年
item=ReadDS1302(address+1)/16*10+ReadDS1302(address+1)%16;
if (selby==0) item++; else item--;
if(item>max) item=min;
if(item<min) item=max;
WriteDS1302(0x8e,0x00);
WriteDS1302(address,item/10*16+item%10);
WriteDS1302(0x90,0xa5);
WriteDS1302(0x8e,0x80);
}
/*******************************************************************************************
* 函数名: SetTime
* 功能描述:
* 入口参数: 无
* 出口参数: 无
*******************************************************************************************
void SetTime(unsigned char *pClock)
{
unsigned char h;
unsigned char Addr=0x80;
WriteDS1302(0x8e,0x00);
for(h=7; h>0; h--)
{
WriteDS1302(Addr,*pClock);
pClock++;
Addr+=2;
}
WriteDS1302(0x90,0xa5);
WriteDS1302(0x8e,0x80);
}
/*******************************************************************************************
* 函数名: ReadTime
* 功能描述:
* 入口参数: 无
* 出口参数: 无
*******************************************************************************************/
void ReadTime()
{
second = BCD2HEX(Time[0]=ReadDS1302(0x81));
minute = BCD2HEX(Time[1]=ReadDS1302(0x83));
hour = BCD2HEX(Time[2]=ReadDS1302(0x85));
day = BCD2HEX(Time[3]=ReadDS1302(0x87));
month = BCD2HEX(Time[4]=ReadDS1302(0x89));
year = BCD2HEX(Time[5]=ReadDS1302(0x8d));
week = BCD2HEX(Time[6]=ReadDS1302(0x8b));
}
/*******************************************************************************************
* 函数名: WriteTime
* 功能描述:
* 入口参数: 无
* 出口参数: 无
*******************************************************************************************
void WriteTime()
{
WriteDS1302(0x8e,0x00);
WriteDS1302(0x80,HEX2BCD(second));
WriteDS1302(0x82,HEX2BCD(minute));
WriteDS1302(0x84,HEX2BCD(hour));
WriteDS1302(0x86,HEX2BCD(day));
WriteDS1302(0x88,HEX2BCD(month));
WriteDS1302(0x8A,HEX2BCD(week));
WriteDS1302(0x8C,HEX2BCD(year));
WriteDS1302(0x90,0xa5);
WriteDS1302(0x8e,0x80);
}
/*******************************************************************************************
* 函数名: StopTime
* 功能描述:
* 入口参数: 无
* 出口参数: 无
*******************************************************************************************
void StopTime()
{
second = BCD2HEX(Time[0]=ReadDS1302(0x81));
WriteDS1302(0x8e,0x00);
WriteDS1302(0x80,HEX2BCD(second)|0x80);
WriteDS1302(0x90,0xa5);
WriteDS1302(0x8e,0x80);
}
/*******************************************************************************************
* 函数名: StartTime
* 功能描述:
* 入口参数: 无
* 出口参数: 无
*******************************************************************************************
void StartTime()
{
WriteDS1302(0x8e,0x00);
WriteDS1302(0x80,HEX2BCD(second)&0x7f);
WriteDS1302(0x90,0xa5);
WriteDS1302(0x8e,0x80);
}
/*****************************************************************************/
//设置1302的初始时间(自动初始化)
void Init_1302(void){//-设置1302的初始时间(2007年1月1日00时00分00秒星期一)
unsigned char f;
if(ReadDS1302(0xc1) != 0xaa){
WriteDS1302(0x8e,0x00);//允许写操作
WriteDS1302(0x8c,0x10);//年
WriteDS1302(0x8a,0x05);//星期
WriteDS1302(0x88,0x06);//月
WriteDS1302(0x86,0x11);//日
WriteDS1302(0x84,0x16);//小时
WriteDS1302(0x82,0x09);//分钟
WriteDS1302(0x80,0x00);//秒
WriteDS1302(0x90,0xa5);//充电
WriteDS1302(0xc0,0xaa);//写入初始化标志RAM(第00个RAM位置)
for(f=0;f<60;f=f+2){//清除闹钟RAM位为0
WriteDS1302(0xc2+f,0x00);
}
WriteDS1302(0x8e,0x80);//禁止写操作
}
} |
|