[C51代碼]DS1302驅動
#include "Atmel/AT89X51.h"
#include "link.h"
#include "ds1302.h"
/*******************變量定義********************/
uchar co
(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] =
主站蜘蛛池模板:
通化市|
广元市|
神木县|
永胜县|
德庆县|
德州市|
亚东县|
砀山县|
伊吾县|
通河县|
郧西县|
孝昌县|
兴宁市|
库尔勒市|
顺义区|
新疆|
宝鸡市|
图木舒克市|
广丰县|
鄂尔多斯市|
苏州市|
张掖市|
简阳市|
高唐县|
射阳县|
巧家县|
建湖县|
江孜县|
扶余县|
富民县|
九江市|
申扎县|
莲花县|
临高县|
桓仁|
阜新|
崇明县|
莆田市|
万源市|
易门县|
九龙县|