⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds1302.c

📁 ds1302用于430单片机的程序。可以使用
💻 C
字号:
#include "msp430x14x.h"

#include "math.h"
#define uchar unsigned char
#define uint unsigned int
void  FllInit(); //CPU clock setup
uint DSSCLK=BIT2;
uint DSIO=BIT3;
uint DSRST=BIT4;
//时间显示设置
char DispTimeFlag;
uchar CurTime[8]={1,80,1,1,1,1,1},DownTime[8];
void DispDate(void),DispTime(void),GetTime(void),DS1302InputByte(unsigned char uchDa);
void Write1302(unsigned char uchAddr, unsigned char uchDa);
void Set1302(unsigned char *ptrSecDa);
unsigned char Read1302(unsigned char uchAddr),DS1302OutputByte(void);

main()
{
 WDTCTL = WDTPW + WDTHOLD;             // Stop WDT;
FllInit();
Set1302(CurTime);

 GetTime();
}

void FllInit()  //系统时钟设置 Rsel=5,Dco=3 Mod=0
{
 BCSCTL1=XT2OFF+RSEL2 + RSEL0 ; 
 DCOCTL=DCO0 + DCO1;//+ DCO2
 BCSCTL2=SELM0;
}

void Set1302(unsigned char *ptrSecDa) //初始时间格式为: 秒 分 时 日 月 星期 年
{
    unsigned char i,j;
    unsigned char uchAddr =0x80; 
    j=Read1302(0x8e)&0x80;
    if(j==0)    
      {
       Write1302(0x8e,0x00); /* 控制命令,WP=0,eanble write*/
       for(i =7;i>0;i--)
        {
         Write1302(uchAddr,*ptrSecDa);
         ptrSecDa++;
         uchAddr +=2;
        }
       Write1302(0x8e,0x80);   //WP=1,write protec
      }
}


void GetTime()                     //读取DS1302当前时间
{
  uchar i;
  uchar uchAddr=0x81;
  for(i=0;i<7;i++)
     {
      CurTime[i]=Read1302(uchAddr);//格式为: 秒 分 时 日 月 星期 年 
      uchAddr+=2;
     }
  uchAddr=0xd0;                    //存时间至1302RAM中
  Write1302(0x8e,0x00);          //允许写操作
  for(i=0;i<7;i++)
     {
       Write1302(uchAddr,CurTime[i]);
       uchAddr+=2;
     }
  Write1302(0x8e,0x80);          
  uchAddr=0xd1;
  for(i=0;i<7;i++)
    {
     DownTime[i]=Read1302(uchAddr);
     uchAddr+=2;
    }
 

}


unsigned char Read1302(unsigned char uchAddr)
{
      unsigned char uchDa;
      uchAddr |= BIT0;  //read address: bit0 is 1      
      P3DIR |= DSRST;
      P3DIR |= DSSCLK;
      P3OUT &= ~DSRST;
      P3OUT &= ~DSSCLK;
      _NOP();
      _NOP();
      P3OUT |= DSRST;
      _NOP();
      _NOP();
      DS1302InputByte(uchAddr);  //write address
      uchDa = DS1302OutputByte();   //read 1 Byte
      P3OUT |= DSSCLK;
      P3OUT &= ~DSRST;
      return(uchDa);
}      

void Write1302(unsigned char uchAddr, unsigned char uchDa)
{
     uchAddr &= 0xfe;   //write address: bit0 is 0
     P3DIR |= (DSRST+DSSCLK);
     P3OUT &= ~DSRST;    //first rst set 0
     P3OUT &= ~DSSCLK;   //sclk set 0
     _NOP();
     _NOP();
     P3OUT |=DSRST;         //then rst set 1, enable operate 1302
     _NOP();
     _NOP();
     _NOP();
     DS1302InputByte(uchAddr);  //firt write address
     DS1302InputByte(uchDa);    //then write data
     P3OUT |= DSSCLK;       //sclk set 1
     P3OUT &= ~DSRST;       
} 

void DS1302InputByte(unsigned char uchDa)
{ 
   unsigned char i;
   unsigned char uchWData;
   uchWData = uchDa;
   P3DIR|=(DSIO+DSSCLK);
   for(i=8;i>0;i--)
   {
      if ((uchWData&BIT0)==BIT0)
          P3OUT|=DSIO;
      else
          P3OUT&=~DSIO;       
      
      P3OUT&=~DSSCLK;       //data input as sclk rising
      _NOP();
      P3OUT |= DSSCLK;
      uchWData = uchWData >> 1; 
    } 
}


unsigned char DS1302OutputByte(void)
{ 
   unsigned char i,ReadData;
   P3DIR |= DSSCLK;
   P3DIR |= DSIO;
   P3OUT |= DSIO;
   P3DIR &= ~DSIO;   
   for(i=0;i<8;i++)
   {
       P3OUT|=DSSCLK;     //read from 1302 as sclk falling down
       _NOP(); 
       P3OUT&=~DSSCLK;  
       ReadData >>=1;
       if((P3IN&DSIO)==DSIO)
          ReadData|=BIT7;
       else
          ReadData &= ~BIT7;
    }                 
    return(ReadData); 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -