ds1302.c

来自「用pic单片机做的一个温度计 实现实时时钟显示和存储」· C语言 代码 · 共 319 行

C
319
字号

#include<p18f452.h>  
#include"delays.h"


#define i_ocontrol  TRISBbits.TRISB6        //定义数据控制(输入输出)
#define i_o         PORTBbits.RB6            //定义ds0302的数据口
#define scl         PORTBbits.RB5        //定义ds0302的时钟口
#define rst         PORTBbits.RB7             //定义ds0302的复位口


 char y;
 char z;

 char year;    //年
 char month;   //月
 char date;    //日
 char day;     //星期
 char hour;    //小时
 char minute;  //分钟
 char second;  //秒 
//******************************************
void inttial_ds1302(void)
{ 

   PORTB&=0x1F	;                 
   TRISB&=0x1F;
}
//****************************************************
void DS1302_Write(char reg,char date)
{

  char i;
  inttial_ds1302();
  i_ocontrol=0;
   Nop();
   Nop();
  scl=0;
   Nop();
   Nop();
  i_o=0;
   Nop();
   Nop();
  rst=0;
   Nop();
   Nop();
  rst=1;
   Nop();
   Nop();
  for (i=0;i<8; i++)
  {

   if(reg&0x01)       i_o=1; 
   else               i_o=0;
     Nop();
     Nop();
   scl=1;
     Nop();
     Nop();
   scl=0;
     Nop();
     Nop();
   reg>>=1;
  }
  for (i=0;i<8; i++)
  {

   if(date&0x01)       i_o=1; 
   else                i_o=0;
     Nop();
     Nop();
   scl=1;
     Nop();
     Nop();
   scl=0;
     Nop();
     Nop();
   date>>=1;
  }
  rst=0;
     Nop();
     Nop();
  i_ocontrol=1;
     Nop();
     Nop();

}

//*******************************************************
char DS1302_Read(char reg)
{ 

  char date;
  char i;
  inttial_ds1302();
  reg+=1;
  i_ocontrol=0;
      Nop();
      Nop();
  scl=0;
      Nop();
      Nop();
  i_o=0;
      Nop();
      Nop();
  rst=0;
      Nop();
      Nop();
  rst=1;
      Nop();
      Nop();
   for (i=0;i<8; i++)
  {
      if(reg&0x01)       i_o=1; 
      else               i_o=0;
        Nop();
        Nop();
     scl=1;
        Nop();
        Nop();
     scl=0;
        Nop();
        Nop();
     reg>>=1;
  }

      Nop();
      Nop();
  i_ocontrol=1;
   for (i=0;i<8; i++)
  {   
      date>>=1;
       if(i_o)            date|=0x80;
      scl=1;
        Nop();
        Nop();
      scl=0;
        Nop();
        Nop();
     
  }     
    rst=0;
        Nop();
        Nop();
    i_ocontrol=0;
    return date;

}
//******************************************************

void ds1302_initial(char yeartp, char monthtp, char datetp,char daytp, char hourtp, char minutetp, char secondtp)
{
   char temp;
   char high;
   char low;
   DS1302_Write(0x8e,0x00);
   DS1302_Write(0x80,0x80);
   DS1302_Write(0x90,0xa9);

   high = 0;
   low  = 0;
   temp = 0;
   high = yeartp/10;
   low  = yeartp%10;
   temp = (high << 4 )+ low;
   DS1302_Write(0x8c,temp); //年

   high = 0;
   low  = 0;
   temp = 0;
   high = monthtp/10;
   low  = monthtp%10;
   temp = (high << 4) + low; 
   DS1302_Write(0x88,temp); //月

   high = 0;
   low  = 0;
   temp = 0;
   high = datetp/10;
   low  = datetp%10;
   temp = (high << 4)+ low;   
   DS1302_Write(0x86,temp); //日   

   high = 0;
   low  = 0;
   temp = 0;
   high = daytp/10;
   low  = daytp%10;
   temp = (high << 4)+ low;   
   DS1302_Write(0x8A,temp); //星期  


   high = 0;
   low  = 0;
   temp = 0;
   high = hourtp/10;
   low  = hourtp%10;
   temp = (high << 4) + low;  
   DS1302_Write(0x84,temp); //时

   high = 0;
   low  = 0;
   temp = 0;
   high = minutetp/10;
   low  = minutetp%10;
   temp =( high << 4) + low; 
   DS1302_Write(0x82,temp); //分

   high = 0;
   low  = 0;
   temp = 0;
   high = secondtp/10;
   low  = secondtp%10;
   temp = (high << 4) + low; 
   DS1302_Write(0x80,temp); //秒
   DS1302_Write(0x8e,0x80);//打开写保护
}
//****************************************  
void read_time(void)
{
   char data;
   char high;
   char low;
    data  =DS1302_Read(0x8c);//年
    low   = data&0x0f;
    high  = (data>>4);
    year  = high*10 + low;

    data  = DS1302_Read(0x88);//月
    low   = data&0x0f;
    high  = (data>>4);
    month = high*10 + low;

    data  = DS1302_Read(0x86);//日
    low   = data&0x0f;
    high  = (data>>4);
    date  = high*10 + low;

   
    data  = DS1302_Read(0x8A);//星期
    low   = data&0x0f;
    high  = (data>>4);
    day= high*10 + low;

    data  = DS1302_Read(0X84);//时
    low   = data&0x0f;
    high  = (data>>4);
    hour  = high*10 + low;


    data  = DS1302_Read(0X82);//分
    low   = data&0x0f;
    high  = (data>>4);
    minute= high*10 + low;

    data  = DS1302_Read(0X80);//秒
    low   = data&0x0f;
    high  = (data>>4);
    second= high*10 + low;
    delays(100,100);
} 

/*****************************************************************************
 ******函 数 名 称 :  h_to_number()
 ******函 数 功 能 :  提取十六进制字符
 ******输       入 :  无
 ******输       出 :  无
 ******备注        : 
 ******************************************************************************/
void h_to_number(char x)
{  
   char m;
   m=x;
   
   y=m/10+48;
   z=m%10+48;
 
}   








































⌨️ 快捷键说明

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