导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→来帮帮忙呀!DS1302为什么返回的都是FF啊?[liuji10]

 *第36268篇: 来帮帮忙呀!DS1302为什么返回的都是FF啊?

  
楼 主:liuji10 2005年12月5日21:06
 来帮帮忙呀!DS1302为什么返回的都是FF啊?
今天实验了一片51与DS1302,我实验想先写入DS1302中时间,然后再读出来,可读出的都是FF,不知道怎么回事,是不是硬件就没有工作啊?因为手头没有逻辑笔和示波器也不知道,有没有人遇到过这个情况啊。我的DS1302引脚接法为VCC1接5V,VCC2悬空(不使用充电模式),X1,X2分别接32.768KHZ晶振的2端
我的程序如下:
#include  <reg51.h>  
sbit T_CLK = P2^2; /*实时时钟时钟线引脚 */
sbit T_IO = P2^1; /*实时时钟数据线引脚 */
sbit T_RST = P2^0; /*实时时钟复位线引脚 */
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
/********************************************************************
*
* 名称: v_RTInputByte
* 说明:
* 功能: 往DS1302写入1Byte数据
* 调用:
* 输入: ucDa 写入的数据
* 返回值: 无
***********************************************************************/
void v_RTInputByte(unsigned char ucDa)
{
unsigned char i;
ACC = ucDa;
for(i=8; i>  0; i--)
{
T_IO = ACC0;
T_CLK = 1;
T_CLK = 0;
ACC = ACC >  >   1;
}
}
/********************************************************************
*
* 名称: unsigned char uc_RTOutputByte
* 说明:
* 功能: 从DS1302读取1Byte数据
* 调用:
* 输入:
* 返回值: ACC
***********************************************************************/
unsigned char uc_RTOutputByte(void)
{
unsigned char i;
for(i=8; i>  0; i--)
{
ACC = ACC>  >  1;
ACC7=T_IO;
T_CLK = 1;
T_CLK = 0;
}
return(ACC);
}
/********************************************************************
*
* 名称: v_W1302
* 说明: 先写地址,后写命令/数据
* 功能: 往DS1302写入数据
* 调用: v_RTInputByte()
* 输入: ucAddr: DS1302地址, ucDa: 要写的数据
* 返回值: 无
***********************************************************************/
void v_W1302(unsigned char ucAddr, unsigned char ucDa)
{
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 :读取的数据
***********************************************************************/
unsigned char uc_R1302(unsigned char ucAddr)
{
unsigned char ucDa;
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码) 1B 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
void v_BurstW1302T(unsigned char *pSecDa)
{
unsigned char i;
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码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: ucDa :读取的数据
***********************************************************************/
void v_BurstR1302T(unsigned char *pSecDa)
{
unsigned char i;
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: 寄存器数据地址
* 返回值: 无
***********************************************************************/
void v_BurstW1302R(unsigned char *pReDa)
{
unsigned char i;
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: 寄存器数据地址
* 返回值: 无
***********************************************************************/
void v_BurstR1302R(unsigned char *pReDa)
{
unsigned char i;
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码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
void v_Set1302(unsigned char *pSecDa)
{
unsigned char i;
unsigned char ucAddr = 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码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
void v_Get1302(unsigned char ucCurtime[])
{
unsigned char i;
unsigned char ucAddr = 0x81;
for (i=0;i  <7;i++)
{
ucCurtime[i] = uc_R1302(ucAddr);/*格式为: 秒 分 时 日 月
星期 年 */
ucAddr += 2;
}
}
/***********************************************************************
*系统初始化
***********************************************************************/
void init_ds1302()//初始化ds1302
      {                    //先写地址后写命令字或数据
       v_W1302(0x8e, 0x80);//控制寄存器,关写保护位
       v_W1302(0x80, 0x00); //秒寄存器,CH位为0。秒的初值为00。
       }
void main()
{ unsigned char Curtime[8];
   unsigned char settime[7]={0x58,0x14,0x01,0x07,0x12,0x02,0x05};//秒,分钟,小时,星期,日,月,年
    init_ds1302();
    v_Set1302(settime);
    v_Get1302(Curtime);
 for(;;)
 {
     }
}

程序运行结果Curtime数组里的值为前七个是FF,后一个是00。这是怎么回事啊?

  
2楼:liuji10 2005年12月6日16:05
 没有人答复吗?上午已经烧了一片了,呜呜~~~~~~~~~~~
上午用逻辑笔测了一下,显示晶振能工作,可返回的值还都是ff,因为没有充电电池,我就只接了一个vcc1,vcc2悬空了,后来找个人帮忙,他非叫我把vcc2也接上电源,我把vcc2也接上5v,没一分钟,我就闻到糊味了。手头本来有2片,现在就一片了,也不敢试了,大家肯定有人弄过这个的,帮帮小弟把。
  
3楼:虚子心 2005年12月6日22:32
 到厂家网站下载说明和读写例子看看就知道如
到厂家网站下载说明和读写例子看看就知道如何读写了.也就知道VCC2该连接到那了.
第一次应该先写控制字让芯片工作

>>>>>>对该主题发表你的看法

本主题贴数3,分页: [第1页]


[上一篇主题]:我的单片机的AD只能输入0-3V的单极性信号,可是从传感器传来的信号为双极性-1.5到1.5该怎么办

[下一篇主题]:行业里杀出的一匹“黑马”无线智能家电