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

📄 ds1302.c

📁 AVR单片机通过模拟SPI串口通信的方式对DS1302进行读写操作。
💻 C
字号:
//ds1302写字节
void ds1302_wr_bye(unsigned char addr,unsigned char data)
{
  unsigned char i,j;
  DDRD|= 0b01110000; //设置PD4/PD5/PD6为输出
  PORTD&=0b10001111; 
  PORTD|=0b01000000; 
  for(i=0;i<8;i++)	 
  {
	j=(addr>>i)&0b00000001;
	if(j==0) 
	   PORTD&=0b11011111;  
	else 
	   PORTD|=0b00100000;   
	_NOP();
	PORTD|=0b00010000;		
	_NOP();
	PORTD&=0b11101111;		
  }
  for(i=0;i<8;i++)	        
  {
	j=(data>>i)&0b00000001;
	if(j==0) 
	   PORTD&=0b11011111;    
	else 
	   PORTD|=0b00100000;    
	_NOP();
	PORTD|=0b00010000;		 
	_NOP();
	PORTD&=0b11101111;		 
  }
  PORTD&=0b10001111;         
}

//ds1302读字节
unsigned char ds1302_rd_bye(unsigned char addr)
{
  unsigned char i,j;
  unsigned char data=0;
  DDRD|= 0b01110000; 
  PORTD&=0b10001111; 
  PORTD|=0b01000000; 
  for(i=0;i<8;i++)	 
  {
	j=(addr>>i)&0b0010000;
	if(j==0) 
	   PORTD&=0b11010011;    
	else 
	   PORTD|=0b00100000;    
	_NOP();
	PORTD|=0b00110000;		 
	_NOP();
	PORTD&=0b11101111;		 
  } 
  DDRD|= 0b01010000; 
  DDRD&= 0b11011111; 
  PORTD|=0b00100000; 
  for(i=0;i<8;i++)
  {
    j=(PIND&0b00110000)<<2;
	data=(data>>1)|j;
    PORTD|=0b00110000; 
	_NOP();
    PORTD&=0b11101111;    
  }
  PORTD&=0b10111111;   
  data=data/16*10+data%16;
  return(data);  
}

//时钟芯片初始化
void clock_initialization()          
{ 
  unsigned char i;
  DDRD|=0x70;  //设置PD4/PD5/PD6为输出
  PORTD&=0x8f; //sclk=0,i/o=0,rst=0
  ds1302_wr_bye(0x8E,0x00);                                     //控制命令,WP=0,写操作    
  ds1302_wr_bye(0x90,0x05);                                     //禁止充电,选择2k电阻,1个二极管
  ds1302_wr_bye(0x8E,0x80);                                     //控制命令,WP=1,写保护  
}

//读时钟芯片程序
void read_clock()           
{
  unsigned char *p;
  p=(unsigned char *)&clock;
  *p++=ds1302_rd_bye(addr_year_rd);		     //读年
  *p++=ds1302_rd_bye(addr_month_rd);		 //读月
  *p++=ds1302_rd_bye(addr_day_rd);		     //读日
  *p++=ds1302_rd_bye(addr_hr_rd);		     //读时
  *p++=ds1302_rd_bye(addr_min_rd);		     //读分	  
  *p++=ds1302_rd_bye(addr_sec_rd);		     //读秒
}

//校正时钟芯片程序
void write_clock()             
{
  unsigned char *p;
  p=(unsigned char *)&clock;
  ds1302_wr_bye(addr_project_wr,0x00);       //控制命令,WP=0,写操作 
  switch(row)
  {
   case 0:
    ds1302_wr_bye(addr_year_wr,*(p+row));          //写入年 
   break;
   case 1:
    ds1302_wr_bye(addr_month_wr,*(p+row));         //写入月
   break;
   case 2:
    ds1302_wr_bye(addr_day_wr,*(p+row));           //写入日
   break;
   case 3:
    ds1302_wr_bye(addr_hr_wr,*(p+row));        	 //写入时(24小时模式)
    break;
   case 4:
    ds1302_wr_bye(addr_min_wr,*(p+row));           //写入分
   break;
   case 5:
    ds1302_wr_bye(addr_sec_wr,*(p+row));           //写入秒(ch=0)
   break;  
  }
 ds1302_wr_bye(addr_project_wr,0x80);       //控制命令,WP=1    
}

⌨️ 快捷键说明

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