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

📄 ds1302.c

📁 C8051F340单片机读写时钟芯片DS1302程序
💻 C
字号:
/*
*********************************************************************************************************
* DS1302 Driver for C8051F340 MCU	
* version 1.0
* File : DS1302.c
* By   : ZJP		2008/07/28
*********************************************************************************************************
*/
#include "C8051F340.h"
#include <stdio.h>
#include <absacc.h>
#include <init.h>

unsigned char  my_second,my_minute,my_hour;
unsigned char  my_date,my_month,my_year;
unsigned char  my_week;

sbit time_clock= P2^5;
sbit time_ce = P1^4;
sbit time_data = P1^5;

/*========== 读ds1302 地址为0时是秒,地址为1时是分,地址为2时是小时=============*/
//3是日期,4是月,5是星期,6是年,7是控制//
unsigned char read_time(unsigned char address)
{
   unsigned char commend;
   unsigned char kk;   
   unsigned char my_data;   
   time_clock=0;
   time_clock=0;  
   time_ce=0;
   time_ce=0;   
   time_ce=1;
   time_ce=1; 
   address<<=1;  
   commend=address+0x81;    //  高位为1是使能读写,低位为1是读操作     
   for(kk=0;kk<8;kk++)
   {     
   time_data=(bit)(commend&0x01);     
   time_clock=1;
   time_clock=1;
   commend>>=1;   
   time_clock=0;
   time_clock=0; 
   }
   my_data=0;    
   for(kk=0;kk<7;kk++)
   {    
    if(time_data==1) my_data += 0x80;
    time_clock=1;
    time_ce=1;
    my_data>>=1;
    time_clock=0;
	time_clock=0;
	   
   }
   if(time_data==1) my_data += 0x80;
   time_clock=1;
   time_clock=1;
   time_clock=0;   
   time_clock=0; 
   time_ce=0;
      
   return my_data;    
}  
 /*========== 写ds1302 =============*/ 
void write_time(unsigned char address,unsigned char number)
{
   unsigned char kk,outime_data;   
    time_clock=0;
    time_clock=0;
    time_ce=0;
    time_ce=1;   
    time_ce=1;
    address<<=1;
    outime_data=address+0x80;  //  高位为1是使能读写,低位为0是写操作   
     for(kk=0;kk<8;kk++)
    {
     time_data=(bit)(outime_data&0x01);
      time_clock=1;
      time_clock=1;
     outime_data>>=1;     
     time_clock=0;
	 time_clock=0;

    }
     outime_data=number;
     for(kk=0;kk<8;kk++)
     {     
     time_data=(bit)(outime_data&0x01);     
     time_clock=1;
      time_clock=1;
     outime_data>>=1;
     time_clock=0;
     time_clock=0;
     } 
     time_clock=0;
     time_ce=0;   
}
 
void corr_time(unsigned char *pda)
{
  unsigned char temp;
  unsigned char my_time;
  unsigned char set_year=*(pda-6);              //初始化数据的正确
  unsigned char set_week=*(pda-5); 
  unsigned char set_month=*(pda-4);
  unsigned char set_date=*(pda-3);
  unsigned char set_hour=*(pda-2);
  unsigned char set_minute=*(pda-1);
  unsigned char set_second=*pda;  

      time_ce=0;
      time_ce=0;
      for(temp=0;temp<10;temp++); 
      if( set_second>59)  set_second=0;      
      write_time(7,0);                          //写入命令
      my_time=( set_second/10)*16+ set_second%10;   //转换成秒的格式 	         	
      write_time(0,my_time);                    //将当前的秒写入到芯片
       
      if( set_minute>59)  set_minute=0;      
      write_time(7,0);                          //写入命令
      my_time=(set_minute/10)*16+ set_minute%10;   //转换成分的格式 	         	
      write_time(1,my_time);                    //将当前的分写入到芯片
      
      if( set_hour>24)  set_hour=0;                  //小时从0到23
      write_time(7,0);                           //写入命令
      my_time=( set_hour/10)*16+ set_hour%10;         //换算成BCD数写入
      write_time(2,my_time);                     //将当前的小时写入到芯片
            
      write_time(7,0);                           //写入命令
      my_time=( set_date/10)*16+ set_date%10;         //换算成BCD数写入
      write_time(3,my_time);
           
      write_time(7,0);                           //写入命令
      my_time=( set_month/10)*16+ set_month%10;         //换算成BCD数写入
      write_time(4,my_time);

      write_time(7,0);                           //写入命令
      my_time=( set_week/10)*16+ set_week%10;         //换算成BCD数写入
      write_time(5,my_time);

      if( set_year<07)  set_year=07;                  //
      write_time(7,0);                           //写入命令
      my_time=( set_year/10)*16+ set_year%10;         //换算成BCD数写入
      write_time(6,my_time);      
  	
}
//======================================================//
//得到系统时间,输出返回当前的时间
//========================================================//
void get_time(unsigned char *curtime)
{
    my_second=read_time(0);            //读时间
  	my_second=(my_second&0x0f)+((my_second&0x70)>>4)*10;   //秒,秒时间的格式转换;
    my_minute=read_time(1); 
    my_minute=(my_minute&0x0f)+((my_minute&0x70)>>4)*10;   //分,分时间格式转换;  
  	my_hour=read_time(2);                                  
    my_hour=(my_hour&0x0f)+((my_hour&0x30)>>4)*10;   //时;换算成十进制数
    my_year=read_time(6);            //读时间 
	my_year=(my_year&0x0f)+((my_year&0x70)>>4)*10;   //; 
    my_month=read_time(4); 
    my_month=(my_month&0x0f)+((my_month&0x70)>>4)*10;   //月,格式转换;  
  	my_date=read_time(3);                                  
    my_date=(my_date&0x0f)+((my_date&0x30)>>4)*10;   //日期;换算成十进制数
	my_week=read_time(5);                                  
    my_week=(my_week&0x0f)+((my_week&0x70)>>4)*10;   //日期;换算成十进制数
	*curtime=my_second;
	*(curtime+1)=my_minute;
	*(curtime+2)=my_hour;
	*(curtime+3)=my_date;
	*(curtime+4)=my_month;
	*(curtime+5)=my_week;
	*(curtime+6)=my_year;
}

⌨️ 快捷键说明

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