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

📄 ds1302.c

📁 我自己编写的atmega16的ds1302源程序
💻 C
字号:
#include<iom16v.h>
#include<macros.h> 
#include "ds1302.h"
unsigned char INITDATE[8]={0x55,	//55秒
						   0x59,	//59分
						   0x23,	//23时  24小时制
						   0x31,	//21日
						   0x12,	//08月
						   0x02,	//星期2
						   0x07,	//2007年
						   0x80		//写保护
						  };
/********************************************************************  
 函 数 名:RTInputByte() 
 功    能:实时时钟写入一字节 
 说    明:往DS1302写入1Byte数据 (内部函数) 
 入口参数:d 写入的数据  
 返 回 值:无   
 ***********************************************************************/ 
void RTInputByte(unsigned char  x)  
{  
    unsigned char  i,j; 
    for(i=0; i<8;i++) 
    { 
  	   if(x&(1<<i))
	    DS1302_PORT|=(1<<DS1302_DATA);
 	   else 
	    DS1302_PORT&=~(1<<DS1302_DATA);  
	   DS1302_PORT|=(1<<DS1302_CLK);
	   for(j=0; j<5;j++);
 	   DS1302_PORT&=~(1<<DS1302_CLK);
	   for(j=0; j<5;j++);                   
    }  
} 
/********************************************************************  
 函 数 名:RTOutputByte() 
 功    能:实时时钟读取一字节 
 说    明:从DS1302读取1Byte数据 (内部函数) 
 入口参数:无   
 返 回 值:ACC 
 ***********************************************************************/ 
unsigned char RTOutputByte(void)  
{  
    unsigned char i,k,data,j; 
	DS1302_DDR&=~(1<<DS1302_DATA);
	for(j=0; j<5;j++); 
    for(i=0; i<8; i++) 
    {           
      k=(DS1302_PIN&(1<<DS1302_DATA));    //读数据,从低位开始  
      if(k)  
        data|=(1<<i);  
      else  
        data&=~(1<<i);  
      DS1302_PORT|=(1<<DS1302_CLK);
	  for(j=0; j<5;j++);
      DS1302_PORT&=~(1<<DS1302_CLK);
	  for(j=0; j<5;j++); 
    }  
	DS1302_DDR|=(1<<DS1302_DATA);
	return(data);  
} 

void BCDtoASCII(unsigned char cBCD,unsigned char *pstr)
{
	unsigned char i,j;
	i=cBCD>>4;
	j=cBCD&0x0F;
	*pstr++=i+0x30;
	*pstr=j+0x30;
}
/********************************************************************  
 函 数 名:W1302() 
 功    能:往DS1302写入数据 
 说    明:先写地址,后写命令/数据 (内部函数) 
 调    用:RTInputByte() , RTOutputByte() 
 入口参数:ucAddr: DS1302地址, ucData: 要写的数据 
 返 回 值:无 
 ***********************************************************************/ 
void W1302(unsigned char ucAddr, unsigned char ucDa) 
{   
    DS1302_PORT&=~(1<<DS1302_RST);  // RST  to L 
    DS1302_PORT&=~(1<<DS1302_CLK);  // CLK  to L 
    DS1302_PORT|=(1<<DS1302_RST);  // RST  to H 

    RTInputByte(ucAddr);       /* 地址,命令 */ 
    RTInputByte(ucDa);         /* 写1Byte数据*/ 

    DS1302_PORT|=(1<<DS1302_CLK); //CLK  to H 
	DS1302_PORT&=~(1<<DS1302_RST); //RST  to L  

} 
/********************************************************************  
 函 数 名:R1302() 
 功    能:读取DS1302某地址的数据 
 说    明:先写地址,后读命令/数据 (内部函数) 
 调    用:RTInputByte() , RTOutputByte() 
 入口参数:ucAddr: DS1302地址 
 返 回 值:ucData :读取的数据 
***********************************************************************/ 
unsigned char R1302(unsigned char ucAddr) 
{ 
    unsigned char ucData;    
    DS1302_PORT&=~(1<<DS1302_RST);  // RST  to L 
    DS1302_PORT&=~(1<<DS1302_CLK);  // CLK  to L 
    DS1302_PORT|=(1<<DS1302_RST);  // RST  to H 
    RTInputByte(ucAddr);             /* 地址,命令 */ 
    ucData = RTOutputByte();         /* 读1Byte数据 */ 
    DS1302_PORT|=(1<<DS1302_CLK); //CLK  to H 
    DS1302_PORT&=~(1<<DS1302_RST); //RST  to L
	return(ucData); 
} 
void init_1302()
{ 
  DS1302_DDR|=(1<<DS1302_RST);
  DS1302_DDR|=(1<<DS1302_CLK);
  DS1302_DDR|=(1<<DS1302_DATA);
  W1302(0x8e,0x00);      //关闭寄存器写保护
  W1302(0x90,0x00);	    //写充电寄存器
  W1302(0x80,0x00);      //秒寄存器停止位置0,时钟启动,初值设为0
  
    //设置时间
    W1302(0x80,INITDATE[0]);
    W1302(0x82,INITDATE[1]);
    W1302(0x84,INITDATE[2]);
    W1302(0x86,INITDATE[3]);
    W1302(0x88,INITDATE[4]);
    W1302(0x8a,INITDATE[5]);
	W1302(0x8c,INITDATE[6]);
	W1302(0x8e,INITDATE[7]);
	 //设置时间
}

⌨️ 快捷键说明

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