微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > [C51代码]DS1302驱动

[C51代码]DS1302驱动

时间:11-10 来源:互联网 点击:
/*********************ds1302.c**********************/

#include "Atmel/AT89X51.h"
#include "link.h"
#include "ds1302.h"
/*******************变量定义********************/
uchar code WeekTab[] = { //闰年月星期表
(3 < 5) + 31,//1月
(6 < 5) + 29,//2月
(0 < 5) + 31,//3月
(3 < 5) + 30,//4月
(5 < 5) + 31,//5月
(1 < 5) + 30,//6月
(3 < 5) + 31,//7月
(6 < 5) + 31,//8月
(1 < 5) + 30,//9月
(4 < 5) + 31,//10月
(0 < 5) + 30,//11月
(2 < 5) + 31 //12月
};

uchar DataArrayYear[5];
uchar DataArrayMonth[3];
uchar DataArrayDay[3];
uchar TimeArray[9];
uchar WeekArray[7][4]={"Mon.","Tue.","Wed.","Thu.","Fri.","Sat.","Sun."};

systemtime Nowtime;
/****************************************************************
*函数功能:写入数据到ds1302
*入口参数:数据uchar Content
*出口参数:无
****************************************************************/
void DS1302Write_f(uchar Content )
{
uchar i ;
for( i = 8 ; i > 0 ; i-- )
{
if( Content & 0x01 )
{
DIO=0x01;
}
else
{
DIO=0x00;
}
Content >>= 1 ;
SCLK=1;
SCLK=0;
}
}

/****************************************************************
*函数功能:读取ds1302的数据
*入口参数:无
*出口参数:uchar ReadValue
****************************************************************/
uchar DS1302Read_f( void )
{
uchar i, ReadValue ;
DIO=1;
for( i = 8 ; i > 0 ; i-- )
{
ReadValue >>= 1 ;
if( DIO )
{
ReadValue |= 0x80 ;
}
else
{
ReadValue &= 0x7f ;
}
SCLK=1;
SCLK=0;

}
return ReadValue ;
}
/****************************************************************
*函数功能:从DS1302指定的地址写入一个字节的内容
*入口参数:要写入数据的地址:Address
写入数据的具体值:Content
*出口参数:无
****************************************************************/
void DS1302Writebyte( uchar Address, uchar Content )
{
RST=0;
SCLK=0;
RST=1;
DS1302Write_f( Address ) ;
DS1302Write_f( Content ) ;
RST=0;
SCLK=1;
}
/****************************************************************
*函数功能:从DS1302指定的地址读出一个字节的内容
*入口参数:要读出数据的地址:Address
*出口参数:uchar ReadValue
****************************************************************/
uchar DS1302Readbyte( uchar Address )
{
uchar ReadValue ;
RST=0;
SCLK=0;
RST=1;
DS1302Write_f( Address );
ReadValue = DS1302Read_f();
RST=0;
SCLK=1;
return ReadValue ;
}
/****************************************************************
*函数功能:读取DS1302时间
*入口参数:无
*出口参数:无
****************************************************************/
void DS1302Gettime(void)
{
Nowtime.Year = BCD2DEC(DS1302Readbyte(READ_YEAR)); //年
Nowtime.Month = BCD2DEC(DS1302Readbyte(READ_MONTH)); //月
Nowtime.Day = BCD2DEC(DS1302Readbyte(READ_DAY)); //日
Nowtime.Week = BCD2DEC(DS1302Readbyte(READ_WEEK)); //周
Nowtime.Hour = BCD2DEC(DS1302Readbyte(READ_HOUR)); //时
Nowtime.Minute = BCD2DEC(DS1302Readbyte(READ_MINUTE)); //分
Nowtime.Second = BCD2DEC(DS1302Readbyte(READ_SECOND)); //秒
}
/****************************************************************
*函数功能:周数调整函数
*入口参数:年:y ;月:m ;日:d
*出口参数:周几uchar week
****************************************************************/
/*****************周数调整函数*******************/
uchar WeekDay20(uchar y, uchar m, uchar d)
{
uchar week, day;
day = WeekTab[m - 1]; //月表
week = day >> 5; //月星期数
day &= 0x1f; //月天数
if((m < 3) && (y & 0x03))
{ //平年
if (m == 2) day--; //平年月天数
week++; //平年月表+1
}
y = y + (y >> 2); //年+年/4
week = (week + y + d + 2) % 7; //(星期=年+年/4+月表+2日)%7
return week; //返回星期
}
/****************************************************************
*函数功能:初始化写入DS1302时钟寄存器的值(主程序中只需调用一次即可)
*入口参数:无
*出口参数:无
****************************************************************/
void DS1302Initial(void)
{
if(DS1302Readbyte( 0xc1)!= 0xf0 )
{
DS1302Writebyte( WRITE_PROTECT,0x00) ; //允许写操作
DS1302Writebyte( WRITE_YEAR, 0x09 ) ; //年
DS1302Writebyte( WRITE_WEEK, 0x05 ) ; //星期
DS1302Writebyte( WRITE_MONTH, 0x05 ) ; //月
DS1302Writebyte( WRITE_DAY, 0x16 ) ; //日
DS1302Writebyte( WRITE_HOUR, 0x14 ) ; //小时
DS1302Writebyte( WRITE_MINUTE, 0x41 ) ; //分钟
DS1302Writebyte( WRITE_SECOND, 0x00 ) ; //秒
DS1302Writebyte( 0x90, 0x00 ) ; //不充电
DS1302Writebyte( 0xc0, 0xf0 ) ; //判断是否初始化一次标识写入
DS1302Writebyte( WRITE_PROTECT, 0x80 ) ; //禁止写操作
DS1302Writebyte( 0xc1, 0xf0 );
}
}
/****************************************************************
*函数功能:数据转换成ASCII码
*入口参数:无
*出口参数:无
****************************************************************/
void DS1302DataConvert(void)
{
DS1302Gettime();
DataArrayYear[0] =2;
DataArrayYear[1] =0;
DataArrayYear[2] =Nowtime.Year/10+0;
DataArrayYear[3] =Nowtime.Year%10+0;
DataArrayYear[4] =\0;
DataArrayMonth[0] =Nowtime.Month/10+0;
DataArrayMonth[1] =Nowtime.Month%10+0;
DataArrayMonth[2] =\0;
DataArrayDay[0] =Nowtime.Day/10+0;
DataArrayDay[1] =Nowtime.Day%10+0;
DataArrayDay[2] =\0;
TimeArray[0] =Nowtime.Hour/10+0;
TimeArray[1] =Nowtime.Hour%10+0;
TimeArray[2] =:;
TimeArray[3] =Nowtime.Minute/10+0;
TimeArray[4] =Nowtime.Minute%10+0;
TimeArray[5] =:;
TimeArray[6] =Nowtime.Second/10+0;
TimeArray[7] =Nowtime.Second%10+0;
TimeArray[8] =\0;
}
/****************************************************************
*函数功能:数据转换送LCD显示
*入口参数:无
*出口参数:无
****************************************************************/
/*void DS1302Disp(void)
{
DS1302DataConvert();
LCDDispListChar(0,0,DataArrayYear);
DispMychar(4,0,0);
LCDDispListChar(5,0,DataArrayMonth);
DispMychar(7,0,1);
LCDDispListChar(8,0,DataArrayDay);
DispMychar(10,0,2);
LCDDispListChar(12,0,WeekArray[WeekDay20(Nowtime.Year,Nowtime.Month,Nowtime.Day)-1]);
LCDDispListChar(0,1,"Time:");
LCDDispListChar(6,1,TimeArray);
}
*/

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top