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

📄 ds1302._h

📁 DS1302
💻 _H
字号:
//ICC-AVR 修改日期: 2007-05-01 15:38:44
// CenWenJiao
// Target : M8
// Crystal: 1.0000Mhz
#define uchar   unsigned char  
/*cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
                        定义DS1302
ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc*/
#define DS1302_RESET1       PORTC|=(1<<PC0)  
#define DS1302_RESET0       PORTC&=~(1<<PC0)  
#define DS1302_CLK1         PORTC|=(1<<PC1)
#define DS1302_CLK0         PORTC&=~(1<<PC1) 
#define DS1302_READ_DATA    PINC&0X04
#define DS1302_WRITE_DATA1  PORTC|=(1<<PC2)
#define DS1302_WRITE_DATA0  PORTC&=~(1<<PC2) 
#define DS1302_DATA_OUTPUT  DDRC|=(1<<PC2)
#define DS1302_DATA_INPUT   DDRC&=~(1<<PC2) 

/*ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
                     定义读写单元地址
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc*/
//读
#define Rsec1  0x81            //秒
#define Rmin1  0x83            //分
#define Rhou1  0x85            //时
#define Rdat1  0x87            //日
#define Rmon1  0x89            //月
#define Rwee1  0x8b            //周
#define Ryea1  0x8d            //年
//写
#define Wsec  0x80            //秒
#define Wmin  0x82            //分
#define Whou  0x84            //时
#define Wdat  0x86            //日
#define Wmon  0x88            //月
#define Wwee  0x8a            //周
#define Wyea  0x8c            //年
uchar second,minute,hour,date,week,month,year;   //读出后的时间存储单元
char WriteAddress[7]={Wyea,Wmon,Wdat,Whou,Wmin,Wsec,Wwee};  //写地址
char    WriteTime[7]={0x08,0x12,0x31,0x23,0x50,0x30,0x00};//写的时间

uchar secondtl,secondth,minutetl,minuteth,hourtl,hourth;//定义时钟数据的高低位置
uchar datetl,dateth,monthtl,monthth,yeartl,yearth;
uchar second1,minute1,hour1,date1,week1,month1,year1;
/*cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
                        定义DS1302初始化程序
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc*/
void DS1302_set(void) 
{  char i;
   DS1302_CLK0;            
   DS1302_RESET0; 
   for(i=0;i<8;i++)
   {
     NOP();
   }
    DS1302_RESET1; 
}
/*cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
                        定义m8向DS1302发送程序
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc*/
void DS1302_Write(char x)
{
  int i;
 
  DS1302_CLK0;             
  DS1302_DATA_OUTPUT;              //控制数据线
 for(i=0;i<8;i++)
        {  DS1302_CLK0;             //输出
        if((x&(1<<i)))
            DS1302_WRITE_DATA1 ;
        else 
           DS1302_WRITE_DATA0 ;
	       NOP();
		DS1302_CLK1; 
		  NOP();
          }
  DS1302_CLK0;
}
//单独矫正某个时间单元
void DS1302_WriteT(char ddr,char time)
{
DS1302_set();
DS1302_Write(ddr);
DS1302_Write(time);
} 
/*CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
                        定义m8由DS1302接收程序
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC*/
uchar DS1302_Read(char addr) //XX
{  
  uchar i,temp,k;
  temp=0;
  DS1302_DATA_OUTPUT;
  DS1302_RESET0;
  DS1302_CLK0;         
  asm("nop");
  asm("nop");
  asm("nop");
  asm("nop");
  DS1302_RESET1;                  //时钟信号低时拉高RST初始化
  temp=addr;
  for(i=0;i<8;i++) 
  { 
  	if(temp&(1<<i)) 
  		 DS1302_WRITE_DATA1 ;  
  	else 
  		 DS1302_WRITE_DATA0 ;
    asm("nop");
    asm("nop"); 
  	DS1302_CLK1;             //时钟上升沿写入数据 	
	DS1302_CLK0;             //时钟拉低电平 
  }
   DS1302_DATA_INPUT;
//以上为写地址
 for(i=0;i<8;i++)
  { 
    k=(DS1302_READ_DATA);  //k=(T_PIN&T_IO);
  if(k==0X04)       //if(k==T_IO)
      temp|=(1<<i);
  else
  	  temp&=~(1<<i);
	    asm("nop");
       asm("nop"); 
   DS1302_CLK1;              //上升沿读出数据 
   DS1302_CLK0;             //时钟电平拉低 
  }
   DS1302_DATA_OUTPUT;
   DS1302_CLK0; 
   DS1302_RESET0;             //禁止DS1302 
 return(temp);
} 
//ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
void DataFenli(void)
{   
       secondtl=second&0x0f;	//分离秒   
	   secondth=(second>>4);
	  
	   minutetl=minute&0x0f;   //分离分钟
	   minuteth=(minute>>4);
	  
	   hourtl=hour&0x0f;      //分离小时
	   hourth=(hour>>4);
      
	   datetl=date&0x0f;      //分离日期
	   dateth=(date>>4);
	  
	   monthtl=month&0x0f;    //分离月份
	   monthth=(month>>4);
	  
	   yeartl=year&0x0f;     //分离年份
	   yearth=(year>>4);
}
/*cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
                        定义DS1302读出时间程序
ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc*/
void DS1302_ReadTime(void)
 {
   second=DS1302_Read(Rsec1);
   minute=DS1302_Read(Rmin1);
   hour=DS1302_Read(Rhou1);
   date=DS1302_Read(Rdat1);
   month=DS1302_Read(Rmon1);
   year=DS1302_Read(Ryea1);
  /* second=0x12;  用于测试分离程序
     minute=0x13;
     hour=0x16;
     date=0x30;
     month=0x05;
     year=0x07;*/
   DataFenli();
 }
/*cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
                        定义DS1302矫正时间程序
ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc*/
void DS1302_WriteTime(void)
{char *ddr,*time;
 ddr=WriteAddress;
 time=WriteTime;
 while(*ddr)
 {
 DS1302_WriteT(*ddr,*time);
 ddr++;
 time++;
 }
}
///////////////////////////////////////////////////////////////////////////////
//////////////////////////vc++ iccavr 20070502 program////////////////////////
/////////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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