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

📄 ds1302.c

📁 MSP430 DS1302程序库
💻 C
📖 第 1 页 / 共 2 页
字号:
        temp1 >>=4;
        if(hourType == HOUR_24)  //24小时格式
        {
                if(temp1 == 0 || temp1 == 1)  //如果小时的十位为0或1时
                         if(temp0>9) return(0);
                else if(temp1 == 2)
                         if(temp0>3) return(0);
                else return(0);       //如果小时的十位越界,返回错误码0   
                }          
        else if(hourType == HOUR_12) //12小时格式 
        {
        	if(temp1 == 0)  //小时的十位为0
        	         if(temp0 > 9) return(0);
        	else if(temp1 == 1) //小时的十位为1
        	         if(temp0 > 2) return(0);
        	else return(0);    //小时的十位越界      
        	}                 
        //年  
        temp0 = dayData[6] & 0x0f;
        temp1 = dayData[6] & 0xf0;
        temp1 >>=4; 
        if(temp0 > 9 || temp1 > 9)  return(0);
        //星期
        temp0 = dayData[5] & 0x0f; 
        temp1 = dayData[5] & 0xf0;
        if(temp1 > 0)  return(0);
        if(temp0 > 7)  return(0);
        //月
        temp0 = dayData[4] & 0x0f;
        temp1 = dayData[4] & 0xf0;
        temp1 >>=4; 
        if(temp1==0) 
                if(temp0>9) return(0);
        else if(temp1==1)
                if(temp0>2) return(0);
        else return(0); 
        //日 
        temp0 = dayData[3] & 0x0f;
        temp1 = dayData[3] & 0xf0;
        temp1 >>=4;
        if(dayData[4] == 0x01 ||dayData[4] == 0x03 || dayData[4] == 0x05 ||
                 dayData[4] == 0x07 || dayData[4] == 0x08 || dayData[4] == 0x10
                       || dayData[4] == 0x12)     //为31天的月份
                       {
                       if(temp1==0 || temp1==1 || temp1==2) 
                              if(temp0>9) return(0);
                       else if(temp1==3)
                              if(temp0>1) return(0);
                       else return(0);
                       }
         else if(dayData[4] != 0x02) //为30天的月份,不包含特殊的2月
         {
         	if(temp1==0 || temp1==1 || temp1==2)
         	      if(temp0>9) return(0);
         	else if(temp1==3)
         	      if(temp0>0) return(0);      
         	}
          else   //对特殊的二月的进行判断
          { 
                if(dayData[6] % 4)  //如果不能整除,则为平年,平年的二月为28天
                {
                	
          	        if(temp1==0 || temp1==1)
          	               if(temp0>9) return(0);
          	        else if(temp1==2)
          	               if(temp0>8) return(0);
          	        else return(0);                  
                        } 
                else //闰年为29天
                {
           	        if(temp1==0 || temp1==1 || temp1==2)
          	               if(temp0>9) return(0);
          	        else return(0);
           	        }                                                      
           }
        if(hourType == HOUR_24) dayData[2] &=~BIT7;  //小时寄存器的第七位是24/12小时格式的选择
        else if(hourType == HOUR_12) dayData[2] |= BIT7;
        else return(0);   //如果不是所应设置的参数,则返回0错误
        
        if(AM_PM == HOUR_AM) dayData[2] &=~BIT5;  //上午模式
        else if(AM_PM == HOUR_PM) dayData[2] |= BIT5;  //下午模式
        else return(0);
        
        DS1302_WriteRegByte(DS1302_CmdRegW,0x00);   //禁止写保护
        
        for(i=0;i<7;i++)
        {
        	DS1302_WriteRegByte(addr,*dayData++);   //按秒,分,时,日,月,星期,年
        	                                         //的顺序依次写入日期寄存器
        	addr +=2;
        	}
        
        DS1302_WriteRegByte(DS1302_CmdRegW,0x80);   //启用写保护
        return(1);  //成功返回
	}


/****************************************************************************
* 名    称:DS1302_ReadDayData()
* 功    能:从DS1302读出日期数据
* 入口参数:*rDayData : 存储日期,从低到高分别存储 秒,分,时,日,月,星期,年
                        BCD码存储,时中不含格式信息,秒也不含振荡器禁止位
            *hourType : 存储小时是24/12小时制  HOUR_24/HOUR_12
            *AM_PM    : 存储小时是上午/下午模式     HOUR_AM/HOUR_PM       
* 出口参数:无
* 范    例: 
* 说    明: 此函数不受其它函数的影响
            在对DS1302读时,DS1302仍在工作,所以有可能读到数据会过时,所有需要定时
            考虑好读取
****************************************************************************/
void DS1302_ReadDayData(unsigned char *rDayData,unsigned char *hourType,unsigned char *AM_PM)
{
	unsigned char i;
	unsigned char addr = DS1302_DataRegR;   //日期读寄存器起始位置
	
	for(i=0;i<7;i++)
	{
		*rDayData++ = DS1302_ReadRegByte(addr);   //读入日期
		addr +=2;
	        }
	rDayData = rDayData - 7;  //将指针调整到初速位置,注意这一步
	//调整小时
	if(rDayData[2] & BIT7)
	{
		 *hourType = HOUR_12;  //如果第七位为1,则为12小时制
		 rDayData[2] &=~BIT7;  //将第七位调整为0
		 }
	else *hourType = HOUR_24;   //否则为24小时制
	
	if(rDayData[2] & BIT5)
	{
		*AM_PM = HOUR_PM;   //若第五位为1,则为下午模式
		rDayData[2] &=~BIT5;  //将第五位调整为0
	        }
	else *AM_PM = HOUR_AM;  //否则为上午模式
	
	//调整秒,秒寄存器的第七位是振荡器禁止位,舍弃此位
	rDayData[0] &=~BIT7; 
	
	}


/****************************************************************************
* 名    称:DS1302_OnOff()
* 功    能:DS1302振荡器工作允许或禁止
* 入口参数:ON_OFF : DS1302_ON  振荡器允许工作
                     DS1302_OFF 振荡器禁止工作                     
* 出口参数:0: 错误
            1: 正确
* 范    例: 
* 说    明: 振荡器的禁止位在秒寄存器的第7位,对其进行设置时,虽然但仍然将前一个时间的秒
            值写入秒寄存器,但仍会影响秒的精度
            关闭振荡器后会直接停止计时,下次开启时,从上次停止时开始
****************************************************************************/
unsigned char DS1302_OnOff(unsigned char ON_OFF)
{
	unsigned char secondP;   //保存秒的前一时间的值
	
	secondP = DS1302_ReadRegByte(DS1302_SecondRegR); //振荡器的禁止位在秒寄存器上
	                                                 //为了减小误差,保存当前的秒
	if(ON_OFF != DS1302_ON && ON_OFF != DS1302_OFF) return(0); //越界判断
	else if(ON_OFF == DS1302_ON) secondP &=~BIT7;  //禁止位为第7位,1为禁止,0为允许
	else secondP |=BIT7;
	
	DS1302_WriteRegByte(DS1302_CmdRegW,0x00);  //禁用写保护
	DS1302_WriteRegByte(DS1302_SecondRegW,secondP);   //写入禁止命令和原来的秒
	DS1302_WriteRegByte(DS1302_CmdRegW,0x80);  //启用写保护
	return(1);
	}


/****************************************************************************
* 名    称:DS1302_TrickleChargerSet()
* 功    能:设置DS1302绢流充电
* 入口参数:TCS : DS1302_TCSE 绢流充电使能
                  DS1302_TCSNE 绢流充电禁止
            DS : 二极管个数年的选择 DS1302_DS1 一个;  DS1302_DS2 两个;
            RS : VCC1与VCC2之间电阻的大小:
            	DS1302_RS1 2K;  DS1302_RS2 4K;  DS1302_RS3 8K;      
* 出口参数:0 : 错误   1 : 正确
* 范    例: DS1302_TrickleChargerSet(DS1302_TCSE,DS1302_DS1,DS1302_RS1);//绢流使能,一个二极管,2K电阻
* 说    明: 绢流充电寄存器位的定义 TCS TCS TCS TCS DS DS RS RS
            TCS 只能为1010才能使能绢流充电,其它组合皆禁止 此函数选用0xf0,参考头文件DS1302.h
            DS  为01(一个) 10(两个) 其它组合独立禁止绢流充电
            RS  为01(2K) 10(4K) 11(8K)  为00时独立禁止绢流充电
            IMAX = (5.0V - diode drop)/R1 = (5.0V - 0.7V) / 2kΩ = 2.2mA
            此函数不采用DS和RS禁止绢流充电,参考头文件,越界参数将返回错误码0
            此函数的行为不能保证,未硬件测试,数据结果正确写入与读出
****************************************************************************/
unsigned char DS1302_TrickleChargerSet(unsigned char TCS,unsigned char DS,unsigned char RS)
{
	unsigned char writeCmd;    //待写入的绢流充电控制字
	
	//越界判断
	if(TCS != DS1302_TCSE && TCS != DS1302_TCSNE) return(0);
	if(DS != DS1302_DS1 && DS != DS1302_DS2) return(0);
	if(RS != DS1302_RS1 && RS != DS1302_RS2 && RS != DS1302_RS3)
	         return(0);
	         
	writeCmd = TCS + DS + RS;     //构成命令字    
	         
	DS1302_WriteRegByte(DS1302_CmdRegW,0x00);  //禁用写保护
	DS1302_WriteRegByte(DS1302_TriChargerW,writeCmd);  //向绢流充电控制寄存器写入控制字 
	DS1302_WriteRegByte(DS1302_CmdRegW,0x80);  //启用写保护  
	
	return(1);      
	}

⌨️ 快捷键说明

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