📄 实时时钟芯片ds1302的c51程序列子.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0029)http://pic16.51.net/clock.htm -->
<HTML><HEAD><TITLE>实时时钟芯片DS1302的C51程序列子</TITLE>
<SCRIPT src="实时时钟芯片DS1302的C51程序列子.files/header.htm"></SCRIPT>
<META content="text/html; charset=gb2312" http-equiv=Content-Type>
<META content="MSHTML 5.00.3700.6699" name=GENERATOR>
<META content=FrontPage.Editor.Document name=ProgId></HEAD>
<BODY>
<TABLE border=1 height=592 width="79%">
<TBODY>
<TR>
<TD height=16 width="100%">
<P align=center><B>实时时钟芯片DS1302的C51程序列子</B></P></TD></TR>
<TR>
<TD height=564
width="100%">实时时钟模DS1302程序列子 <BR><BR> /*********************************************************************/<BR>/* 实时时钟模块 时钟芯片型号:DS1302 */<BR>/*/<BR>/*********************************************************************/<BR>sbit T_CLK = P2^7; /*实时时钟时钟线引脚 */<BR>sbit T_IO = P1^4; /*实时时钟数据线引脚 */<BR>sbit T_RST = P1^5; /*实时时钟复位线引脚 */<BR>/******************************************************************** <BR>*<BR>* 名称: v_RTInputByte<BR>* 说明: <BR>* 功能: 往DS1302写入1Byte数据<BR>* 调用:<BR>* 输入: ucDa 写入的数据 <BR>* 返回值: 无<BR>***********************************************************************/<BR>void v_RTInputByte(uchar ucDa) <BR>{ <BR>uchar i;<BR>ACC = ucDa;<BR>for(i=8; i>0; i--)<BR>{<BR>T_IO = ACC0; /*相当于汇编中的 RRC */<BR>T_CLK = 1;<BR>T_CLK = 0;<BR>ACC = ACC >> 1; <BR>} <BR>}<BR>/******************************************************************** <BR>*<BR>* 名称: uchar uc_RTOutputByte<BR>* 说明: <BR>* 功能: 从DS1302读取1Byte数据<BR>* 调用: <BR>* 输入: <BR>* 返回值: ACC<BR>***********************************************************************/<BR>uchar uc_RTOutputByte(void) <BR>{ <BR>uchar i;<BR>for(i=8; i>0; i--)<BR>{<BR>ACC = ACC >>1; /*相当于汇编中的 RRC */<BR>ACC7 = T_IO;<BR>T_CLK = 1;<BR>T_CLK = 0;<BR>} <BR>return(ACC); <BR>}<BR>/******************************************************************** <BR>*<BR>* 名称: v_W1302<BR>* 说明: 先写地址,后写命令/数据<BR>* 功能: 往DS1302写入数据<BR>* 调用: v_RTInputByte() <BR>* 输入: ucAddr: DS1302地址, ucDa: 要写的数据<BR>* 返回值: 无<BR>***********************************************************************/<BR>void v_W1302(uchar ucAddr, uchar ucDa)<BR>{<BR>T_RST = 0;<BR>T_CLK = 0;<BR>T_RST = 1;<BR>v_RTInputByte(ucAddr); /* 地址,命令 */<BR>v_RTInputByte(ucDa); /* 写1Byte数据*/<BR>T_CLK = 1;<BR>T_RST =0;<BR>} <BR>/******************************************************************** <BR>*<BR>* 名称: uc_R1302<BR>* 说明: 先写地址,后读命令/数据<BR>* 功能: 读取DS1302某地址的数据<BR>* 调用: v_RTInputByte() , uc_RTOutputByte()<BR>* 输入: ucAddr: DS1302地址<BR>* 返回值: ucDa :读取的数据<BR>***********************************************************************/<BR>uchar uc_R1302(uchar ucAddr)<BR>{<BR>uchar ucDa;<BR>T_RST = 0;<BR>T_CLK = 0;<BR>T_RST = 1;<BR>v_RTInputByte(ucAddr); /* 地址,命令 */<BR>ucDa = uc_RTOutputByte(); /* 读1Byte数据 */<BR>T_CLK = 1;<BR>T_RST =0;<BR>return(ucDa);<BR>}<BR>/******************************************************************** <BR>*<BR>* 名称: v_BurstW1302T<BR>* 说明: 先写地址,后写数据(时钟多字节方式)<BR>* 功能: 往DS1302写入时钟数据(多字节方式)<BR>* 调用: v_RTInputByte() <BR>* 输入: pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制<BR>* 8Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B 1B<BR>* 返回值: 无<BR>***********************************************************************/<BR>void v_BurstW1302T(uchar *pSecDa)<BR>{<BR>uchar i;<BR>v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/<BR>T_RST = 0;<BR>T_CLK = 0;<BR>T_RST = 1;<BR>v_RTInputByte(0xbe); /* 0xbe:时钟多字节写命令 */<BR>for (i=8;i>0;i--) /*8Byte = 7Byte 时钟数据 + 1Byte 控制*/<BR>{<BR>v_RTInputByte(*pSecDa);/* 写1Byte数据*/<BR>pSecDa++;<BR>}<BR>T_CLK = 1;<BR>T_RST =0;<BR>} <BR>/******************************************************************** <BR>*<BR>* 名称: v_BurstR1302T<BR>* 说明: 先写地址,后读命令/数据(时钟多字节方式)<BR>* 功能: 读取DS1302时钟数据<BR>* 调用: v_RTInputByte() , uc_RTOutputByte()<BR>* 输入: pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 <BR>* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B<BR>* 返回值: ucDa :读取的数据<BR>***********************************************************************/<BR>void v_BurstR1302T(uchar *pSecDa)<BR>{<BR>uchar i;<BR>T_RST = 0;<BR>T_CLK = 0;<BR>T_RST = 1;<BR>v_RTInputByte(0xbf); /* 0xbf:时钟多字节读命令 */<BR>for (i=8; i>0; i--) <BR>{<BR>*pSecDa = uc_RTOutputByte(); /* 读1Byte数据 */<BR>pSecDa++;<BR>}<BR>T_CLK = 1;<BR>T_RST =0;<BR>}<BR>/******************************************************************** <BR>*<BR>* 名称: v_BurstW1302R<BR>* 说明: 先写地址,后写数据(寄存器多字节方式)<BR>* 功能: 往DS1302寄存器数写入数据(多字节方式)<BR>* 调用: v_RTInputByte() <BR>* 输入: pReDa: 寄存器数据地址<BR>* 返回值: 无<BR>***********************************************************************/<BR>void v_BurstW1302R(uchar *pReDa)<BR>{<BR>uchar i;<BR>v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/<BR>T_RST = 0;<BR>T_CLK = 0;<BR>T_RST = 1;<BR>v_RTInputByte(0xfe); /* 0xbe:时钟多字节写命令 */<BR>for (i=31;i>0;i--) /*31Byte 寄存器数据 */<BR>{<BR>v_RTInputByte(*pReDa); /* 写1Byte数据*/<BR>pReDa++;<BR>}<BR>T_CLK = 1;<BR>T_RST =0;<BR>} <BR>/******************************************************************** <BR>*<BR>* 名称: uc_BurstR1302R<BR>* 说明: 先写地址,后读命令/数据(寄存器多字节方式)<BR>* 功能: 读取DS1302寄存器数据<BR>* 调用: v_RTInputByte() , uc_RTOutputByte()<BR>* 输入: pReDa: 寄存器数据地址<BR>* 返回值: 无<BR>***********************************************************************/<BR>void v_BurstR1302R(uchar *pReDa)<BR>{<BR>uchar i;<BR>T_RST = 0;<BR>T_CLK = 0;<BR>T_RST = 1;<BR>v_RTInputByte(0xff); /* 0xbf:时钟多字节读命令 */<BR>for (i=31; i>0; i--) /*31Byte 寄存器数据 */<BR>{<BR>*pReDa = uc_RTOutputByte(); /* 读1Byte数据 */<BR>pReDa++;<BR>}<BR>T_CLK = 1;<BR>T_RST =0;<BR>}<BR>/******************************************************************** <BR>*<BR>* 名称: v_Set1302<BR>* 说明: <BR>* 功能: 设置初始时间<BR>* 调用: v_W1302() <BR>* 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年 <BR>* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B<BR>* 返回值: 无<BR>***********************************************************************/<BR>void v_Set1302(uchar *pSecDa) <BR>{<BR>uchar i;<BR>uchar ucAddr = 0x80; <BR>v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/<BR>for(i =7;i>0;i--)<BR>{ <BR>v_W1302(ucAddr,*pSecDa); /* 秒 分 时 日 月 星期 年 */<BR><BR>pSecDa++;<BR>ucAddr +=2;<BR>}<BR>v_W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/<BR>}<BR>/******************************************************************** <BR>*<BR>* 名称: v_Get1302<BR>* 说明: <BR>* 功能: 读取DS1302当前时间<BR>* 调用: uc_R1302() <BR>* 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年 <BR>* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B<BR>* 返回值: 无<BR>***********************************************************************/<BR>void v_Get1302(uchar ucCurtime[]) <BR>{<BR>uchar i;<BR>uchar ucAddr = 0x81;<BR>for (i=0;i<7;i++)<BR>{<BR>ucCurtime[i] = uc_R1302(ucAddr);/*格式为: 秒 分 时 日 月 <BR>星期 年 */<BR>ucAddr += 2;<BR>}<BR>} <BR> </TD></TR></TBODY></TABLE>
<P align=center><A href="http://pic16.51.net/">成就网</A></P>
<P align=center><A href="http://xinxi.htm/">站长应聘</A></P>
<P align=center>email:<A
href="mailto:wodeshenri123456@163.com">wodeshenri123456@163.com</A></P>
<SCRIPT src="实时时钟芯片DS1302的C51程序列子.files/footer.htm"></SCRIPT>
</BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -