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

📄 ds1302.c

📁 时钟芯片DS1302的操作,包裹读写,设置时间
💻 C
字号:
/********************************************************************
函 数 名:DS1302_Write_Byte   
功    能:MCU向DS1302设备发送一个字节
说    明:主机:MCU;数据应在时钟下降沿发生变化,上升沿将数据写入DS1302内部移位寄存器 
调用函数:DS1302延时函数:DS1302_Delay
全局变量:无
入口参数:待发送的字节数据 tbData
返 回 值:无
设    计:CP
版本	:1           
***********************************************************************/
void DS1302_Write_Byte(tByte tbData)
   {
   tByte tbTempSendCount= 0; //临时变量,发送次数 
   // 一次发送一位数据
   for (tbTempSendCount = 0; tbTempSendCount < 8;tbTempSendCount++ )
     {
     	if(tbData&0x01==0x01)
      		pDs1302Io=1;                   
      	else 
      		pDs1302IO=0;
        pDs1302Sclk=1;
		DS1302_Delay();                    
     	pDs1302Sclk=0;//SCLK从高到低地跳变,传送一个字节
     	tbData=(tbData>>1);
   	 }
	}
/********************************************************************
函 数 名:DS1302_Read_Byte   
功    能:MCU从DS1302设备读取一个字节
说    明:主机:DS1302;数据应在时钟下降沿发生变化,即数据在下降沿从移位寄存器输出,上升沿IO口成高阻态
调用函数:DS1302延时函数:DS1302_Delay
全局变量:无
入口参数:无
返 回 值:接受的数据:tbTempReadresult
设    计:CP
版本	:1           
***********************************************************************/
tByte DS1302_Read_Byte(void)
{  
    tByte tbTempReadresult=0;  // 临时变量,用于返回读取值
    tByte tbTempSendCount=0;  //临时变量,发送次数 
    for(tbTempSendCount=0;tbTempSendCount<8;++tbTempSendCount)
        {
       tbTempReadresult=tbTempReadresult>>1;  //把前一次读取的数据右移一位,下次读取的数据保存到第7位
          if(pDs1302Io==1)                    //读取1byte的数据保持到tbTempReadresult中
           	tbTempReadresult|=0x80;
          else
           	tbTempReadresult&=0x7f;
            pDs1302Sclk=1;//SCLK从高到低地跳变,移位脉冲有效,传送一个字节
			DS1302_Delay(); 
        	pDs1302Sclk=0;
         }
         return(tbTempReadresult);
}
/********************************************************************
函 数 名:DS1302_Write   
功    能:MCU向DS1302一个特定地址tbAddress发送一个数据tbData
说    明:主机:MCU;先写地址,再写数据 
调用函数:DS1302写一个字节:DS1302_Write_Byte
全局变量:无
入口参数:待发送的地址 tbData;待发送的字节数据 tbData
返 回 值:无
设    计:CP
版本	:1           
***********************************************************************/
void DS1302_Write(tByte tbAddress,tByte  tbData)
{ 
	pDs1302Sclk=0;
	pDs1302Rst=1;
  	DS1302_Write_Byte(tbAddress); //将地址tbAddress写入DS1302,选择与之对应的寄存器;
  	DS1302_Write_Byte(tbData); //将tbData写入地址为tbAddress的寄存器;
	pDs1302Sclk=1;
	pDs1302Rst=0;
}
/********************************************************************
函 数 名:DS1302_Read   
功    能:MCU从DS1302一个特定地址tbAddress读取一个数据tbData
说    明:主机:DS1302;先写地址,再读数据;只有在SCLK为为低电平时,才能在RST置高电平 
调用函数:DS1302读取一个字节:DS1302_Read_Byte;DS1302写一个字节:DS1302_Write_Byte
全局变量:无
入口参数:无
返 回 值:接受的数据:tbTempReadresult
设    计:CP
版本	:1           
***********************************************************************/
void DS1302_Read(tByte tbAddress)
{ 
	tByte tbTempReadresult=0;  // 临时变量,用于返回读取值
	pDs1302Sclk=0;
	pDs1302Rst=1;
  	DS1302_Write_Byte(tbAddress); //将地址tbAddress写入DS1302,选择与之对应的寄存器;
  	tbTempReadresult=DS1302_Read_Byte(); //从地址为tbAddress的寄存器读取字节;
	pDs1302Sclk=1;
	pDs1302Rst=0;
}
/********************************************************************
函 数 名:DS1302_Write_Time   
功    能:MCU向DS1302发送时间
说    明:主机:MCU;
调用函数:DS1302读:DS1302_Write
全局变量:tbDS1302[];
入口参数:无
返 回 值:无
设    计:CP
版本	:1           
***********************************************************************/
void DS1302_Write_Time()
{ 
	DS1302_Write(0x8e,0);  //将控制寄存器设置为0,去掉写保护;
  	DS1302_Write(0x8c,tbDsYear); //设置年;
  	DS1302_Write(0x88,tbDsMonth);//设置月;
  	DS1302_Write(0x86,tbDsDay);  //设置日
  	DS1302_Write(0x8a,tbDsWeek); //设置星期几;
  	DS1302_Write(0x84,tbDsHour); //设置小时;
  	DS1302_Write(0x82,tbDsMinute); //设置分钟;
  	DS1302_Write(0x80,tbDsSecond); //设置秒;
  	DS1302_Write(0x8e,0x80);  //将控制寄存器设置为0x80,添加写保护;

}
/********************************************************************
函 数 名:DS1302_Read_Time   
功    能:MCU从DS1302读取时间
说    明:主机:DS1302; 
调用函数:DS1302写:DS1302_Write
全局变量:tbDS1302[];
入口参数:无
返 回 值:无
设    计:CP
版本	:1           
***********************************************************************/
void DS1302_Write_Time()
{ 
  	tbDsYear=DS1302_Read(0x8d); //读年;
  	tbDsMonth=DS1302_Read(0x89);//读月;
  	tbDsDay=DS1302_Read(0x87,tbDsDay);  //读日
  	tbDsWeek=DS1302_Read(0x8b); //读星期几;
  	tbDsHour=DS1302_Read(0x85); //读小时;
  	tbDsMinute=DS1302_Read(0x83); //读分钟;
  	tbDsSecond=DS1302_Read(0x81); //读秒;

}
/********************************************************************
函 数 名:DS1302_Init   
功    能:DS1302初始化
说    明:写入写保护,充电模式 
调用函数:DS1302读取一个字节:DS1302_Read_Byte;DS1302写一个字节:DS1302_Write_Byte;延时函数DS1302_Delay
全局变量:无
入口参数:无
返 回 值:无
设    计:CP
版本	:1           
***********************************************************************/
void DS1302_Init()
{ 
	tByte tbTempData=0;  //临时变量 ;
  	pDs1302Rst=0;    //设置DS1302_RST脚为低电平;
  	DS1302_Delay();
	pDs1302Sclk=0;
  	DS1302_Write(0x8e,0);  //将控制寄存器设置为0,去掉写保护;
  	DS1302_Write(0x90,0xa6); //写入充电模式;
  //1010表示使能第10个滴流充电器;
  //01表示在VCC1和VCC2之间接入一个二极管;
  //10表示在VCC1和VC2之间接入两个并联的电阻;
  	tbTempData=DS1302_Read(0x81); //读第二个积存器;
  	if((tbTempData & 0x80)!=0)
  	 	DS1302_Write(0x80,0);  
  	DS1302_Write(0x8e,0x80);   //将控制寄存器设置为0x80,添加写保护;
}
/********************************************************************
函 数 名:DS1302_Delay   
功    能:堰时几微妙
说    明: 
调用函数:无
全局变量:无
入口参数:无
返 回 值:无
设    计:CP
版本	:1           
***********************************************************************/
void DS1302_Delay(void)
	{
		_nop_();
		_nop_();
		_nop_();
		_nop_();
	}

⌨️ 快捷键说明

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