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

📄 ds1302.h

📁 基于ADS编程环境下的时钟程序
💻 H
字号:
/********************************************************************************************************/
#include "config.h"
#include "view.h"
#ifndef __ds1302_H
#define __ds1302_H

//******************下为引脚连接关系********************
#define SCL_Ds1302        0x10000000            //p3.29
#define IO_Ds1302         0x08000000            //p3.28
#define RST_Ds1302        0x10000000            //p2.28

#define bit_data0        data_ds1302^0;
#define bit_data7        data_ds1302^7;
#define plag             0x00000000;

/********************************************************
   名称:delayns()
   功能:长软件延时
   入口参数:dly
   出口参数:无
*********************************************************/
void  delayns(uint32   dly)
{
  uint32  i;
  for(;dly>0;dly--);            //个性本身就是人性的突出表现,没什么好签的。
     for(i=0;i<500;i++);
 }   




//*******************************************************




/*static void i2c_nop_delay(INT16U k)
{
	while (k>0)
	{
		k--;
		usDelay(10);//10微秒
	}
}
*/

/////////////////////////////////////////
uint8 duankong[11]={0x3f,0x06,0x5b,0x4f,0x66, 
                    0x6d,0x7d,0x07,0x7f,0x6f};     //   
uint8 weikong[9]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//
uint8 display_buffer[13];//
//*************************************************************
uint8 bit_data,data_ds1302;

//**************************************************
void write_byte(uint8 data_ds1302) //写一字节数据
{
uint8 i;
for(i=0;i<8;i++)
   {
     IO2CLR = SCL_Ds1302;  // SCL_Ds1302=0;
     if(bit_data & 0x01)
     	{
     	IO2SET = IO_Ds1302;
     	 }
     else
     {
        IO2CLR = IO_Ds1302;
      }
  //    IO_Ds1302=bit_data0;
   		delayns(1);         //   _nop_();
     IO2SET = SCL_Ds1302;   // SCL_Ds1302=1;
      data_ds1302=data_ds1302>>1;
    }
}
//****************************************
void chongdian_en()  //涓流充电允许
{
 IO2CLR = SCL_Ds1302;  //SCL_Ds1302=0;
 delayns(1);         //_nop_();
 IO2SET = RST_Ds1302;    //RST_Ds1302=1;
 delayns(2);         //_nop_();_nop_();
write_byte(0x90);//涓流充电
write_byte(0xa4);//NO RECHARGE ROR BATTREY
}
//*********************************************
void send_yety()  //发送数据
{
 IO2CLR = SCL_Ds1302;  //SCL_Ds1302=0;
 delayns(1);         //_nop_();
 IO2SET = RST_Ds1302;    //RST_Ds1302=1;
 delayns(2);         //_nop_();_nop_();
write_byte(0x80);
write_byte(0x08); 
}
//************************************************************
void close_write_bit()  //关闭写保护位
{
  IO2CLR = SCL_Ds1302;  //SCL_Ds1302=0;
  delayns(1);         // _nop_();
  IO2SET = RST_Ds1302;    //RST_Ds1302=1;
  delayns(2);         // _nop_(); // _nop_();
  write_byte(0x8e);
  IO2CLR = IO_Ds1302;    //IO_Ds1302=0;
  write_byte(0x80);//CLOSE  WRITE PROTECT BIT   
 }       
//**************************************************************
void open_write_bit()  //打开写保护位
{
 IO2CLR = SCL_Ds1302;  //SCL_Ds1302=0;
 delayns(1);         //_nop_();
 IO2SET = RST_Ds1302;    //RST_Ds1302=1;
 delayns(2);         //_nop_();_nop_();
 write_byte(0x8e);
IO2CLR = IO_Ds1302;    //IO_Ds1302=0;
write_byte(0x00);
 }
//**************************************************************
void initial_ds1302()
{
close_write_bit();//关闭写保护位
 IO2CLR = RST_Ds1302;    //RST_Ds1302=0;
 delayns(1);         //_nop_();
 IO2CLR = SCL_Ds1302;  //SCL_Ds1302=0;
 chongdian_en();   //涓流充电
 IO2CLR = RST_Ds1302;    //RST_Ds1302=0;
 delayns(1);         //_nop_();
 IO2CLR = SCL_Ds1302;  //SCL_Ds1302=0;
 send_yety();      //发送数据
 IO2CLR = RST_Ds1302;    //RST_Ds1302=0;
 delayns(1);         //_nop_();
 IO2CLR = SCL_Ds1302;  //SCL_Ds1302=0;
}
//******************************************************
uint8 read_ds1302(uint8 command)//读DS1302数据
{
 uint8 i;
 data_ds1302=(command<<1)|0x81;
 IO2CLR = SCL_Ds1302;  //SCL_Ds1302=0;
 delayns(1);         //_nop_();
 IO2SET = RST_Ds1302;    //RST_Ds1302=1;
 for(i=0;i<8;i++)
    {
      IO2CLR = SCL_Ds1302;  //SCL_Ds1302=0;
	if(bit_data & 0x01)
     	{
     	IO2SET = IO_Ds1302;
     	 }
     else
     {
        IO2CLR = IO_Ds1302;
      } //     IO_Ds1302=bit_data0;
       delayns(1);         //_nop_();
       IO2SET = SCL_Ds1302;   //SCL_Ds1302=1;
       data_ds1302=data_ds1302>>1;
     } 
 IO2SET = SCL_Ds1302;   //SCL_Ds1302=1;
 for(i=0;i<8;i++)
    {
       data_ds1302=data_ds1302>>1;
       IO2CLR = SCL_Ds1302;  //SCL_Ds1302=0;
       delayns(1);			  //_nop_();
     if( PINSEL2 & 0x08000000 != 0)
     	{
     	IO2SET = bit_data7;
     	 }
     else
     {
        IO2CLR = bit_data7;
      }       
 //     bit_data7 =IO_Ds1302;
       IO2SET = SCL_Ds1302;   //SCL_Ds1302=1;
    }
IO2CLR = RST_Ds1302;    //RST_Ds1302=0;
delayns(1);         // _nop_();
IO2CLR = SCL_Ds1302;  //SCL_Ds1302=0;
return(data_ds1302);
}
//**********************************************************
void write_ds1302(uint8 address,int8 numb)
//写入时分秒
{
 int8 i;
 IO2CLR = RST_Ds1302;    //RST_Ds1302=0;
 IO2CLR = SCL_Ds1302;  //SCL_Ds1302=0;
 IO2CLR = RST_Ds1302;    //RST_Ds1302=0;
 IO2SET = RST_Ds1302;    //RST_Ds1302=1;

 data_ds1302=address;
 for(i=0;i<8;i++)
  {
    IO2CLR = SCL_Ds1302;  //SCL_Ds1302=0;
    if(bit_data & 0x01)
     	{
     	IO2SET = IO_Ds1302;
     	 }
     else
     {
        IO2CLR = IO_Ds1302;
      }
 //   IO_Ds1302=bit_data0;
    delayns(1);         //_nop_();
    IO2SET = SCL_Ds1302;   //SCL_Ds1302=1;
    data_ds1302=data_ds1302>>1;
  }
 data_ds1302=numb;
 for(i=0;i<8;i++)
  {
    IO2CLR = SCL_Ds1302;  //SCL_Ds1302=0;
    if(bit_data & 0x01)
     	{
     	IO2SET = IO_Ds1302;
     	 }
     else
     {
        IO2CLR = IO_Ds1302;
      }
   // IO_Ds1302=bit_data0;
    delayns(1);         //_nop_();
    IO2SET = SCL_Ds1302;   //SCL_Ds1302=1;
    data_ds1302=data_ds1302>>1;
  }
  IO2CLR = RST_Ds1302;    //RST_Ds1302=0;
 IO2SET = SCL_Ds1302;   //SCL_Ds1302=1;
}
//*******************************************************
void read_time()//读时分秒,读数据时操作地址为奇数。
{
uint8 second,minute,hour,date,month,week,year,d;
// EA=0;
 second=0;//读秒地址
 d=read_ds1302(second);
 display_buffer[12]=d&0x0f;
 display_buffer[11]=d>>4;

 minute=1;//读分地址
 d=read_ds1302(minute);
 display_buffer[10]=d&0x0f;
 display_buffer[9]=(d>>4);

 hour=2;//读小时地址
 d=read_ds1302(hour);
 display_buffer[8]=d&0x0f;
 display_buffer[7]=d>>4;

 date=3;//读日地址
 d=read_ds1302(date);
 display_buffer[6]=d&0x0f;
 display_buffer[5]=d>>4;

 month=4;//读月地址
 d=read_ds1302(month);
 display_buffer[4]=d&0x0f;
 display_buffer[3]=d>>4;

 year=6;//读年地址
 d=read_ds1302(year);
 display_buffer[2]=d&0x0f;
 display_buffer[1]=d>>4;

 week=5;//读星期地址
 d=read_ds1302(week);
 display_buffer[0]=d&0x0f;

// EA=1;
}
//*********************************************************
void set_time()	//时间设置,写数据时操作地址为偶数。
{
  uint8 data, temp;
  open_write_bit();

  temp=display_buffer[0];
  write_ds1302(0x8A,temp);//星期地址,数据

  temp=(display_buffer[1]<<4)|display_buffer[2];
  write_ds1302(0x8C,temp);//年地址,数据
 
  temp=(display_buffer[3]<<4)|display_buffer[4];
  write_ds1302(0x88,temp);//月地址,数据

  temp=(display_buffer[5]<<4)|display_buffer[6];
  write_ds1302(0x86,temp);//日地址,数据

  temp=(display_buffer[7]<<4)|display_buffer[8];
  write_ds1302(0x84,temp);//小时地址,数据

  temp=(display_buffer[9]<<4)|display_buffer[10];
  write_ds1302(0x82,temp);//分地址,数据

  temp=(display_buffer[11]<<4)|display_buffer[12];
  write_ds1302(0x80,temp);//秒地址,数据
  close_write_bit();
}
//*****************************************
void time_init()	//时间设置,写数据时操作地址为偶数。
{
ShowWeek(12,2,(display_buffer[0]=0x04));   //星期
ShowDate(3,2,(display_buffer[1]=0x00));   //年
ShowDate(4,2,(display_buffer[2]=0x06));
ShowDate(6,2,(display_buffer[3]=0x01));   //月
ShowDate(7,2,(display_buffer[4]=0x00));
ShowDate(9,2,(display_buffer[5]=0x01));   //日
ShowDate(10,2,(display_buffer[6]=0x03));
display_buffer[7]=0x01;   //时
display_buffer[8]=0x05;
display_buffer[9]=0x05;   //分
display_buffer[10]=0x08;
display_buffer[11]=0x00;   //秒
display_buffer[12]=0x00;
}
/**********************************************/
/**********************************************/
//void  display()
//**********************************************************
/*******************************************************
*名称:main
*功能:控制ds1302
*******************************************************/
void ds1302 (void)
{
PINSEL2 = PINSEL2 & 0xC7FFFFFF;      //设置引脚连接GPIO

PINSEL1 = PINSEL1 & 0xCFFFFFFF;      //设置引脚连接GPIOinitial_ds1302();//上电启用,否则不走时

time_init();
delayns(6000);
set_time();

while(1)
  {
      read_time();//读取当前时/分秒,放在数组中          
  }
}
#endif
//********************************************

/***********************************************/

⌨️ 快捷键说明

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