📄 ds1302.c
字号:
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 + -