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

📄 ds1302.c

📁 C51编写的DS1302时钟芯片驱动程序
💻 C
字号:
/*********************************************************************************************/
/*                 读入或写入 DATE(0--6)  ,分别是:秒,分,时,日,月,年年 .                      */
/*                    例如  写入 2003.02.14 08:34:12  (晶振11.0592MHz)                       */
/*                date[0]=12;date[1]=34;date[2]=8;date[3]=14;date[4]=2;date[5]=3;            */
/*********************************************************************************************/
#include <reg52.h>
#include <intrins.h>
/*-------------------------------------------------------------------------------------------*/
#define uchar unsigned char
#define uint  unsigned int
/*-------------------------------------------------------------------------------------------*/
sbit SCLK=P1^0;
sbit IO=P1^1;
sbit REST=P1^2;
/*********************************************************************************************/
void date_write(uchar con1)            // 串行写入
{
	  uchar i;
      /*-------------------------------------------------*/
	  REST=1;                          // 片选 
      /*-------------------------------------------------*/
	  for (i=1;i<=8;i++)	           // 一次送8 BIT 
      {
	     SCLK=0;
	     if ((con1 & 0x01)==1) IO=1;else IO=0;
	     con1=_cror_(con1,1);         // 移位 
	     SCLK=1;
	  }
}
/*---------------------------------------------------------------------------*/
uchar data_read()                      // 串行读出
{
	 uchar j;
	 uchar data_ol,data_oh;
     /*-------------------------------*/
     REST=1;
     /*-------------------------------*/
     data_ol=0;
	 for(j=1;j<=4;j++)             // 收低4 位 
     {
	    SCLK=0;
	    if (IO==1) data_ol |=0x10;
	    data_ol=_cror_(data_ol,1);
	    SCLK=1;
	 }
     /*-----------------------------------------*/
	 data_oh=0;
	 for (j=1;j<=4;j++)            // 收高4 位 
     {
        SCLK=0;
	    if (IO==1) data_oh |=0x10;
	    data_oh=_cror_(data_oh,1);
	    SCLK=1;
	 }
     /*-------------------------------*/
     return(data_ol+data_oh*10); // 变成二进制数,送入数组 
}
/*============================================================================*/
void write_ds1302(uchar *date)                // 写入数据 
{
     uchar n;
     /*--------------------------------------------------------------*/
     if (date[0]>60) date[0]=0;       // 限制在0秒
     if (date[1]>60) date[1]=1;       // 限制在1分
     if (date[2]>24) date[2]=1;       // 限制在1点
     if ((date[3]>31)||(date[3]==0)) date[3]=1;       // 限制1日
     if ((date[4]>12)||(date[4]==0)) date[4]=1;       // 限制在1月
     /*--------------------------------------------------------------*/
	 /*         下一位表示星期,我们不用,再下位表示年,再补0		 */
     /*--------------------------------------------------------------*/
     date_write(0x8e);	       // 写允许  
     date_write(0x00);
     REST=0;
     SCLK=0;
     /*--------------------------------------------------------------*/
     for (n=0;n<=6;n++)
     {
        date[n]=(date[n]/10)*0x10+date[n]%10;   //高于10的倍数上移至高四位
     }
     /*--------------------------------------------------------------*/
	 date_write(0xbe);				            //串行发送连续写入命令
     /*--------------------------------------------------------------*/
	 for (n=0;n<=4;n++)	date_write(date[n]);	//先不写星期和年
	 date_write(1);								//星期一
	 date_write(date[5]);						//星期写入年
	 date_write(0);						        //星期写入年
     /*--------------------------------------------------------------*/
     REST=0;
     SCLK=0;
     /*--------------------------------------------------------------*/
     date_write(0x8e);	       // 写禁止 
     date_write(0x80);
     REST=0;
     SCLK=0;
     /*--------------------------------------------------------------*/
}
/*============================================================================*/
void read_ds1302(uchar *date)   //读到时间
{
     uchar n;
     /*--------------------------------------------------------------*/
     date_write(0xbf);
	 for (n=0;n<=4;n++) date[n]=data_read();   //读前四位
	 n=data_read();
	 date[5]=data_read();      //读年(加上2000才是真实年份)	
	 n=data_read();
     /*--------------------------------------------------------------*/
     REST=0;
     SCLK=0;
     /*--------------------------------------------------------------*/
}
/*----------------------------------------------------------------------------*/
void reset_ds1302()              //初始化1302
{
     /*--------------------------------------------------------------*/
     date_write(0x8e);            // 写允许  
     date_write(0x00);
     REST=0;
     SCLK=0;
     /*--------------------------------------------------------------*/
     date_write(0x80);           // 启动震荡器
     date_write(0x00);
     REST=0;
     SCLK=0;
     /*--------------------------------------------------------------*/
     date_write(0x90);           // 设置备用电池充电电流
     date_write(0xa5);
     REST=0;
     SCLK=0;
     /*--------------------------------------------------------------*/
     date_write(0x8e);	         // 写禁止 
     date_write(0x80);
     REST=0;
     SCLK=0;
     /*--------------------------------------------------------------*/
}
/*********************************************************************************************/

⌨️ 快捷键说明

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