#include "stdlib.h"
#include "Common.h"
#include "M051.h"
#include "DS1302.h"
#include "GlobalPar.h"
/*******************************************
º¯Êý£ºDS1302_Write
²ÎÊý£ºreg ¼Ä´æÆ÷µØÖ· Data Êý¾Ý
ÃèÊö£ºÏòDS1302ijµØַдÈëÒ»¸ö×Ö½ÚµÄÊý¾Ý
·µ»ØÖµ£ºÎÞ
*******************************************/
void DS1302_Write(uint8_t reg,uint8_t Data)
{
uint8_t i;
TSclk=0; //´®¿ÚʱÖÓ³õʼΪ0
__nop();__nop();__nop();__nop(); //ÑÓʱ4¸öʱÖÓÖÜÆÚ
TRst=1; //´®¿ÚƬѡÐźÅʹÄÜ
__nop();__nop();__nop();__nop();
for(i=0;i<8;i++) //ÏÈдÈëҪдÈëÊý¾ÝµÄ¼Ä´æÆ÷µØÖ·(8bit)
{
TSda=reg&0x1; //°´1bitÖð¸öдÈë(8bit)
TSclk=1; //´®¿ÚʱÖÓÉÏÉýÑØдÈë
__nop();__nop();__nop();__nop();
TSclk=0;
__nop();__nop();__nop();__nop();
reg>>=1; //µØÖ·Êý¾ÝÓÒÒÆ
}
for(i=0;i<8;i++) //ÔÙдÈëҪдÈë¸ÃµØÖ·µÄÊý¾Ý
{
TSda=Data&0x1; //°´1bitÖð¸öдÈëҪдÈë¸ÃµØÖ·µÄÊý¾Ý(8bit)
TSclk=1; //´®¿ÚʱÖÓÉÏÉýÑØдÈë
__nop();__nop();__nop();__nop();
TSclk=0;
__nop();__nop();__nop();__nop();
Data>>=1; //Êý¾ÝÓÒÒÆ
}
TRst=0; //´®¿ÚƬѡÐźÅÇå³ý
}
/*******************************************
º¯Êý£ºDS1302_Read
²ÎÊý£ºreg ¼Ä´æÆ÷µØÖ·
ÃèÊö£º´ÓDS1302ijµØÖ·¶Á³öÒ»¸ö×Ö½ÚµÄÊý¾Ý
·µ»ØÖµ£ºÎÞ
*******************************************/
uint8_t DS1302_Read(uint8_t reg)
{
uint8_t Data=0;
uint8_t i;
reg+=1; //µØÖ·¼Ä´æÆ÷ÖеÄLSBλÉèΪ1,¶Á
TSclk=0; //´®¿ÚʱÖÓÐźųõʼΪ0
__nop();__nop();__nop();__nop(); //ÑÓʱ4¸öʱÖÓÖÜÆÚ
TRst=1; //´®¿ÚƬѡÐźÅÖÃ1
__nop();__nop();__nop();__nop();
for(i=0;i<8;i++) //ÏÈдÈëҪȡÊý¾ÝËùÔڵļĴæÆ÷µØÖ·(8bit)
{
TSda=reg&0x1; //´ÓLSB¿ªÊ¼1bitÖð¸öдÈë
TSclk=1; //´®¿ÚʱÖÓÉÏÉýÑØдÈë
__nop();__nop();__nop();__nop();
TSclk=0;
__nop();__nop();__nop();__nop();
reg>>=1; //ÓÒÒÆһλ Ö±µ½8bitÈ«²¿Ð´Èë
}
for(i=0;i<8;i++) //¶Á³ö¸ÃµØÖ·ÉÏÒ»¸ö×ֽڵĴ洢Êý¾Ý(8bit)
{
Data>>=1; //ÿ½ÓÊÜ1bit,Êý¾ÝÓÒÒÆ£¬½ÓÊÕÏÂ1bit(½Ï¸ßλ)
if(TSda) Data|=0x80; //¸ÃλΪ¸ßµçƽ Èç:µØַΪ0x81(ÃëÖӼĴæÆ÷),¶Á²Ù×÷ ´æ´¢Êý¾ÝΪ0x59(Õñµ´Æ÷¹¤×÷+59s) ½ÓÊÕÕýÈ·
TSclk=1;
__nop();__nop();__nop();__nop();
TSclk=0; //´®¿ÚʱÖÓϽµÑضÁ³ö
__nop();__nop();__nop();__nop();
}
TRst=0; //´®¿ÚƬѡÐźÅÇå³ý
return(Data); //·µ»Ø¶Á³öÖµ
}
/*******************************************
º¯Êý£ºDS1302_Init
²ÎÊý£ºÎÞ
ÃèÊö£ºDS1302³õʼ»¯
·µ»ØÖµ£ºÎÞ
*******************************************/
void DS1302_Init(void)
{
uint8_t val;
val = DS1302_Read(DS1302_SEC_Reg); //¶ÁÈ¡ÃëÖӼĴæÆ÷
val &= 0x7f; //Êý¾Ý×î¸ßλÇåÁã
DS1302_Write(DS1302_CONTROL_Reg,0); //ÔÊÐíдÈë
DS1302_Write(DS1302_SEC_Reg,val); //´ò¿ª¾§Õñ,CH=0 Õñµ´Æ÷¹¤×÷ÔÊÐí
//DS1302_Write(DS1302_CHARGER_Reg,0xaa); //ä¸Á÷³äµç,TCS=1010 ʹÄÜä¸Á÷³äµç,DS=10 Ñ¡ÔñÁ½¸ö¶þ¼«¹Ü,RS=10 Ñ¡Ôñ4K Ohm µç×è
DS1302_Write(DS1302_CONTROL_Reg,0x80); //½ûֹдÈë
}
/******************************************
º¯Êý£ºDS1302_Fix
ÃèÊö£º¸üÐÂDS1302ʱ¼äµÄÉ趨ֵ(»ù×¼Öµ)
·µ»ØÖµ£ºÎÞ
*******************************************/
void DS1302_Fix(void)
{
uint8_t temp;
DS1302_Write(DS1302_CONTROL_Reg,0x00); //ÔÊÐíдÈë
DS1302_Write(DS1302_SEC_Reg,0x80); //ÃëÖӼĴæÆ÷Êý¾ÝÇåÁã,Õñµ´Æ÷Í£Ö¹,×¼±¸Ð´ÈëеÄʱ¼ä»ù×¼Öµ
//DS1302_Write(DS1302_CHARGER_Reg,0xaa); //ä¸Á÷³äµç,TCS=1010 ʹÄÜä¸Á÷³äµç,DS=10 Ñ¡ÔñÁ½¸ö¶þ¼«¹Ü,RS=10 Ñ¡Ôñ4K Ohm µç×è
temp=(SetupData[1]<<4)|SetupData[0]; DS1302_Write(DS1302_YEAR_Reg,temp); //дÈëеÄÄê·ÝÊý¾Ý
temp=(SetupData[3]<<4)|SetupData[2]; DS1302_Write(DS1302_MONTH_Reg,temp); //дÈëеÄÔ·ÝÊý¾Ý
temp=(SetupData[5]<<4)|SetupData[4]; DS1302_Write(DS1302_DATE_Reg,temp); //дÈëеÄÈÕÆÚÊý¾Ý
temp=(SetupData[8]<<4)|SetupData[7]; DS1302_Write(DS1302_HR_Reg,temp); //дÈëеÄʱÖÓÊý¾Ý
temp=(SetupData[10]<<4)|SetupData[9]; DS1302_Write(DS1302_MIN_Reg,temp); //дÈëеķÖÖÓÊý¾Ý
temp=(SetupData[12]<<4)|SetupData[11]; temp &= 0x7f;DS1302_Write(DS1302_SEC_Reg,temp); //дÈëеÄÃëÖÓÊý¾Ý,´ò¿ª¾§ÕñÕñµ´Æ÷¹¤×÷
DS1302_Write(DS1302_CONTROL_Reg,0x80); //½ûֹдÈë
}
/*********************************************
º¯Êý£ºReadDS1302Time
ÃèÊö£º¶Áȡijʱ¿ÌµÄʱ¼äÖµ
·µ»ØÖµ£ºÎÞ
*********************************************/
void ReadDS1302Time(void)
{
uint8_t Data;
Data=DS1302_Read(DS1302_YEAR_Reg); //¶ÁÈ¡´Ë¿ÌÄê·Ý
year0=Data&0x0f; //µÍλ
year1=Data>>4; //¸ßλ
Data=DS1302_Read(DS1302_MONTH_Reg); //¶ÁÈ¡´Ë¿ÌÔ·Ý
month0=Data&0x0f;
month1=(Data>>4)&0x01;
Data=DS1302_Read(DS1302_DATE_Reg); //¶ÁÈ¡´Ë¿ÌÈÕÆÚ
date0=Data&0x0f;
date1=(Data>>4)&0x03;
Data=DS1302_Read(DS1302_HR_Reg); //¶ÁÈ¡´Ë¿ÌʱÖÓ
hour0=Data&0x0f;
hour1=(Data>>4)&0x03;
Data=DS1302_Read(DS1302_MIN_Reg); //¶ÁÈ¡´Ë¿Ì·ÖÖÓ
minute0=Data&0x0f;
minute1=(Data>>4)&0x07;
Data=DS1302_Read(DS1302_SEC_Reg); //¶ÁÈ¡´Ë¿ÌÃëÖÓ
second0=Data&0x0f;
second1=(Data>>4)&0x07;
} |