导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→用过DS1302实时时钟的朋友请帮忙,我的DS1302 就是

* 51664: 用过DS1302实时时钟的朋友请帮忙,我的DS1302 就是不起振

   taoganabc 
taoganabc发表的帖子 

 用过DS1302实时时钟的朋友请帮忙,我的DS1302 就是不起振
用过DS1302实时时钟的朋友请帮忙,我的DS1302 就是不起振,读出秒寄存器的数值为
0X80,用的是广州老赵的驱动,自己写几句主程序调试,就是不行,现在贴出程序,希望各
位指点,非常感谢!
 

帖子编号: 259339 发表用户:taogan    发表时间:2004-3-28 22:01:28     访问次
数:17 
文章内容: 

#include    <reg51.h>  
#define  uint unsigned  int
#define  uchar  unsigned  char
uchar    settime[7]={9,30,20,27,03,6,04};
uchar idata   rtime[7];         
sbit     T_CLK      = P2^5;   /*实时时钟时钟线引脚 */
sbit     T_IO       = P2^6;   /*实时时钟数据线引脚 */
sbit     T_RST      = P2^7;   /*实时时钟复位线引脚 */

sbit  ACC0 = ACC^0;
sbit  ACC7 = ACC^7;

/******************************************************************** 

 函 数 名:RTInputByte()
 功    能:实时时钟写入一字节
 说    明:往DS1302写入1Byte数据 (内部函数)
 入口参数:d 写入的数据 
 返 回 值:无  
 设    计:zhaojunjie           日    期:2002-03-19
 修    改:                     日    期: 
***********************************************************************/
void RTInputByte(uchar d) 

    uchar i;
    ACC = d;
    for(i=8; i>  0; i--)
    {
        T_IO = ACC0;           /*相当于汇编中的 RRC */
        T_CLK = 1;
        T_CLK = 0;
        ACC = ACC >  >   1; 
    } 
}
/******************************************************************** 

 函 数 名:RTOutputByte()
 功    能:实时时钟读取一字节
 说    明:从DS1302读取1Byte数据 (内部函数)
 入口参数:无  
 返 回 值:ACC
 设    计:zhaojunjie           日    期:2002-03-19
 修    改:                     日    期: 
***********************************************************************/
uchar RTOutputByte(void) 

    uchar i;
    for(i=8; i>  0; i--)
    {
        ACC = ACC >  >  1;         /*相当于汇编中的 RRC */
        ACC7 = T_IO;
        T_CLK = 1;
        T_CLK = 0;
    } 
    return(ACC); 
}
/******************************************************************** 

 函 数 名:W1302()
 功    能:往DS1302写入数据
 说    明:先写地址,后写命令/数据 (内部函数)
 调    用:RTInputByte() , RTOutputByte()
 入口参数:ucAddr: DS1302地址, ucData: 要写的数据
 返 回 值:无
 设    计:zhaojunjie           日    期:2002-03-19
 修    改:                     日    期: 
***********************************************************************/
void W1302(uchar ucAddr,uchar ucDa)
{
    T_RST = 0;
    T_CLK = 0;
    T_RST = 1;
    RTInputByte(ucAddr);       /* 地址,命令 */
    RTInputByte(ucDa);       /* 写1Byte数据*/
    T_CLK = 1;
    T_RST = 0;

/******************************************************************** 

 函 数 名:R1302()
 功    能:读取DS1302某地址的数据
 说    明:先写地址,后读命令/数据 (内部函数)
 调    用:RTInputByte() , RTOutputByte()
 入口参数:ucAddr: DS1302地址
 返 回 值:ucData :读取的数据
 设    计:zhaojunjie           日    期:2002-03-19
 修    改:                     日    期: 
***********************************************************************/
uchar R1302(uchar ucAddr)
{
    uchar ucData;
    T_RST = 0;
    T_CLK = 0;
    T_RST = 1;
    RTInputByte(ucAddr);             /* 地址,命令 */
    ucData = RTOutputByte();         /* 读1Byte数据 */
    T_CLK = 1;
    T_RST = 0;
    return(ucData);
}

/******************************************************************** 

 函 数 名:Set1302()
 功    能:设置初始时间
 说    明:先写地址,后读命令/数据(寄存器多字节方式)
 调    用:W1302()
 入口参数:pClock: 设置时钟数据地址 格式为: 秒 分 时 日 月 星期 年
                               7Byte (BCD码)1B 1B 1B 1B 1B  1B  1B
 返 回 值:无
 设    计:zhaojunjie           日    期:2002-03-19
 修    改:                     日    期: 
***********************************************************************/
void Set1302(uchar *pClock) 
{
    uchar i;
    uchar ucAddr = 0x80; 
    W1302(0x8e,0x00);           /* 控制命令,WP=0,写操作?*/
    for(i =7; i>  0; i--)
    { 
        W1302(ucAddr,*pClock);  /* 秒 分 时 日 月 星期 年 */ 
        pClock++;
        ucAddr +=2;
    }
    W1302(0x8e,0x80);           /* 控制命令,WP=1,写保护?*/
}
/******************************************************************** 

 函 数 名:Get1302()
 功    能:读取DS1302当前时间
 说    明:
 调    用:R1302() 
 入口参数:ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年 
                                        7Byte (BCD码)   1B 1B 1B 1B 1B  1B  1B
 返 回 值:无
 设    计:zhaojunjie           日    期:2002-03-19
 修    改:                     日    期: 
***********************************************************************/
void Get1302(uchar ucCurtime[]) 
{
    uchar i;
    uchar ucAddr = 0x81;
    for (i=0; i  <7; i++)
    {
        ucCurtime[i] = R1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */
        ucAddr += 2;
    }
}
/*//////////////////////////////////////////////////////////////////////*/

void main(void)
{   
      W1302(0x8e,0x00);           /* 控制命令,WP=0,写操作?*/
     Set1302( settime);
     W1302(0x80,0x00);          /*启动振荡器材*/
     for(;;)
     { Get1302( rtime);
     };
}



发表时间:2004年3月30日23:55:50

  
回复该帖

本主题共有 3 帖,分页:>>>>>该主题的所有内容[3]条

 *树形目录 只列出部分跟帖的标题以及简单的摘要信息 该主题的部分跟帖如下:

  51667.[详细]检查硬件是否正确,这个没有难度的。
摘要:检查硬件是否正确,这个没有难度的。......(34字)
- [nihaohong][1118次] 2004年3月31日

  51730.[详细]谢谢您!
摘要:......(无内容)
- [taoganabc][1091次] 2004年3月31日

[上一篇帖子]:检查硬件是否正确,这个没有难度的。
[下一篇帖子]:我现在要在AT91上移植UCOS2有哪位大虾做过AT91上移植UCOS2,恳请赐教,最好能给我一份源