新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 实时时钟芯片DS1302的C51程序列子

实时时钟芯片DS1302的C51程序列子

作者:时间:2011-03-14来源:网络收藏


/*********************************************************************/
/*实时时钟模块时钟芯片型号:DS1302*/
/*/
/*********************************************************************/
sbitT_CLK=P2^7;/*实时时钟时钟线引脚*/
sbitT_IO=P1^4;/*实时时钟数据线引脚*/
sbitT_RST=P1^5;/*实时时钟复位线引脚*/
/********************************************************************
*
*名称:v_RTInputByte
*说明:
*功能:往DS1302写入1Byte数据
*调用:
*输入:ucDa写入的数据
*返回值:无
***********************************************************************/
voidv_RTInputByte(ucharucDa)
{
uchari;
ACC=ucDa;
for(i=8;i>0;i--)
{
T_IO=ACC0;/*相当于汇编中的RRC*/
T_CLK=1;
T_CLK=0;
ACC=ACC>>1;
}
}
/********************************************************************
*
*名称:ucharuc_RTOutputByte
*说明:
*功能:从DS1302读取1Byte数据
*调用:
*输入:
*返回值:ACC
***********************************************************************/
ucharuc_RTOutputByte(void)
{
uchari;
for(i=8;i>0;i--)
{
ACC=ACC>>1;/*相当于汇编中的RRC*/
ACC7=T_IO;
T_CLK=1;
T_CLK=0;
}
return(ACC);
}
/********************************************************************
*
*名称:v_W1302
*说明:先写地址,后写命令/数据
*功能:往DS1302写入数据
*调用:v_RTInputByte()
*输入:ucAddr:DS1302地址,ucDa:要写的数据
*返回值:无
***********************************************************************/
voidv_W1302(ucharucAddr,ucharucDa)
{
T_RST=0;
T_CLK=0;
T_RST=1;
v_RTInputByte(ucAddr);/*地址,命令*/
v_RTInputByte(ucDa);/*写1Byte数据*/
T_CLK=1;
T_RST=0;
}
/********************************************************************
*
*名称:uc_R1302
*说明:先写地址,后读命令/数据
*功能:读取DS1302某地址的数据
*调用:v_RTInputByte(),uc_RTOutputByte()
*输入:ucAddr:DS1302地址
*返回值:ucDa:读取的数据
***********************************************************************/
ucharuc_R1302(ucharucAddr)
{
ucharucDa;
T_RST=0;
T_CLK=0;
T_RST=1;
v_RTInputByte(ucAddr);/*地址,命令*/
ucDa=uc_RTOutputByte();/*读1Byte数据*/
T_CLK=1;
T_RST=0;
return(ucDa);
}
/********************************************************************
*
*名称:v_BurstW1302T
*说明:先写地址,后写数据(时钟多字节方式)
*功能:往DS1302写入时钟数据(多字节方式)
*调用:v_RTInputByte()
*输入:pSecDa:时钟数据地址格式为:秒分时日月星期年控制
*8Byte(BCD码)1B1B1B1B1B1B1B1B
*返回值:无
***********************************************************************/
voidv_BurstW1302T(uchar*pSecDa)
{
uchari;
v_W1302(0x8e,0x00);/*控制命令,WP=0,写操作?*/
T_RST=0;
T_CLK=0;
T_RST=1;
v_RTInputByte(0xbe);/*0xbe:时钟多字节写命令*/
for(i=8;i>0;i--)/*8Byte=7Byte时钟数据+1Byte控制*/
{
v_RTInputByte(*pSecDa);/*写1Byte数据*/
pSecDa++;
}
T_CLK=1;
T_RST=0;
}
/********************************************************************
*
*名称:v_BurstR1302T
*说明:先写地址,后读命令/数据(时钟多字节方式)
*功能:读取DS1302时钟数据
*调用:v_RTInputByte(),uc_RTOutputByte()
*输入:pSecDa:时钟数据地址格式为:秒分时日月星期年
*7Byte(BCD码)1B1B1B1B1B1B1B
*返回值:ucDa:读取的数据
***********************************************************************/
voidv_BurstR1302T(uchar*pSecDa)
{
uchari;
T_RST=0;
T_CLK=0;
T_RST=1;
v_RTInputByte(0xbf);/*0xbf:时钟多字节读命令*/
for(i=8;i>0;i--)
{
*pSecDa=uc_RTOutputByte();/*读1Byte数据*/
pSecDa++;
}
T_CLK=1;
T_RST=0;
}
/********************************************************************
*
*名称:v_BurstW1302R
*说明:先写地址,后写数据(寄存器多字节方式)
*功能:往DS1302寄存器数写入数据(多字节方式)
*调用:v_RTInputByte()
*输入:pReDa:寄存器数据地址
*返回值:无
***********************************************************************/
voidv_BurstW1302R(uchar*pReDa)
{
uchari;
v_W1302(0x8e,0x00);/*控制命令,WP=0,写操作?*/
T_RST=0;
T_CLK=0;
T_RST=1;
v_RTInputByte(0xfe);/*0xbe:时钟多字节写命令*/
for(i=31;i>0;i--)/*31Byte寄存器数据*/
{
v_RTInputByte(*pReDa);/*写1Byte数据*/
pReDa++;
}
T_CLK=1;
T_RST=0;
}
/********************************************************************
*
*名称:uc_BurstR1302R
*说明:先写地址,后读命令/数据(寄存器多字节方式)
*功能:读取DS1302寄存器数据
*调用:v_RTInputByte(),uc_RTOutputByte()
*输入:pReDa:寄存器数据地址
*返回值:无
***********************************************************************/
voidv_BurstR1302R(uchar*pReDa)
{
uchari;
T_RST=0;
T_CLK=0;
T_RST=1;
v_RTInputByte(0xff);/*0xbf:时钟多字节读命令*/
for(i=31;i>0;i--)/*31Byte寄存器数据*/
{
*pReDa=uc_RTOutputByte();/*读1Byte数据*/
pReDa++;
}
T_CLK=1;
T_RST=0;
}
/********************************************************************
*
*名称:v_Set1302
*说明:
*功能:设置初始时间
*调用:v_W1302()
*输入:pSecDa:初始时间地址。初始时间格式为:秒分时日月星期年
*7Byte(BCD码)1B1B1B1B1B1B1B
*返回值:无
***********************************************************************/
voidv_Set1302(uchar*pSecDa)
{
uchari;
ucharucAddr=0x80;
v_W1302(0x8e,0x00);/*控制命令,WP=0,写操作?*/
for(i=7;i>0;i--)
{
v_W1302(ucAddr,*pSecDa);/*秒分时日月星期年*/

pSecDa++;
ucAddr+=2;
}
v_W1302(0x8e,0x80);/*控制命令,WP=1,写保护?*/
}
/********************************************************************
*
*名称:v_Get1302
*说明:
*功能:读取DS1302当前时间
*调用:uc_R1302()
*输入:ucCurtime:保存当前时间地址。当前时间格式为:秒分时日月星期年
*7Byte(BCD码)1B1B1B1B1B1B1B
*返回值:无
***********************************************************************/
voidv_Get1302(ucharucCurtime[])
{
uchari;
ucharucAddr=0x81;
for(i=0;i7;i++)
{
ucCurtime[i]=uc_R1302(ucAddr);/*格式为:秒分时日月
星期年*/
ucAddr+=2;
}
}

(综合电子论坛)


评论


相关推荐

技术专区

关闭