您的位置 首页 5G

[C51代码]DS1302驱动

/*********************ds1302.c**********************/#includeAtmel/AT89X51.h#includelink.h#includeds

/*********************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);
}
*/

/*********************ds1302.h**********************/
#ifndef __ds1302_h__
#define __ds1302_h__
#include
#include “Atmel/AT89X51.h”
#include “LINK.h”

/*******************宏界说********************/
#define WRITE_SECOND 0x80
#define WRITE_MINUTE 0x82
#define WRITE_HOUR 0x84
#define WRITE_DAY 0x86
#define WRITE_MONTH 0x88
#define WRITE_WEEK 0x8A
#define WRITE_YEAR 0x8C
#define WRITE_PROTECT 0x8E
#define READ_SECOND 0x81
#define READ_MINUTE 0x83
#define READ_HOUR 0x85
#define READ_DAY 0x87
#define READ_MONTH 0x89
#define READ_WEEK 0x8B
#define READ_YEAR 0x8D
#define BCD2DEC(X) (((X&0x70)/16)*10 + (X&0x0F)) //用于将BCD码转成十进制的宏
#define DEC2BCD(X) ((X/10)*16 + (X%10)) //用于将十进制转成BCD码的宏

/*******************端口界说********************/
sbit RST =P2^3;
sbit SCLK=P2^4;
sbit DIO =P2^5;

/****DS1302的声明函数****/
extern void DS1302Writebyte(uchar addr,uchar dat);
extern uchar DS1302Readbyte(uchar addr);
extern void DS1302Initial(void);
extern uchar WeekDay20(uchar y, uchar m, uchar d);
extern void DS1302Gettime(void);
extern void DS1302DataConvert(void);
extern void DS1302Disp(void);
extern void DS1302DataConvert(void);

/*********************变量界说**********************/
extern uchar DataArrayYear[5];
extern uchar DataArrayMonth[3];
extern uchar DataArrayDay[3];
extern uchar TimeArray[9];
extern uchar WeekArray[7][4];

typedef struct //界说的时刻类型结构体,悉数数为十进制
{
uchar Second;
uchar Minute;
uchar Hour;
uchar Week;
uchar Day;
uchar Month;
uchar Year;
}systemtime;

extern systemtime Nowtime;

#endif

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/5g/275355.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部